[texhax] combining adjacent macros

Henry Kannapell hnk at cs.stanford.edu
Tue May 26 01:05:52 CEST 2009


> > I am a novice Tex user, but would like to find a method of combining
> > adjacent macros that I define in a style sheet.
> >
> > \newcommand\hyph{\emph{(hyph.)} %% hyphenated
> > \newcommand\var{\emph{(var.)} %% variation
> > \newcommand\slang{\emph{(slang)} %% slang term
> >
> > In some cases, however, I have more than one tag. What I would  
> like to  do is
> > then have a pair of adjacent macros expand like this:
> >
> > \hyph\var -> (hyph., var)
> >
> > I think I could create a recursive macro which checks the second   
> command,
> > and if it is in the same group of macros (there are perhaps 9   
> that I have
> > defined), combine them. But that would be 9 different   
> definitions, with 9
> > different checks in each one - surely there is a  better solution  
> than that.
> >
> > A general solution would be able to deal with an unlimited number of
> > adjacent macros. And, it should be able to define a group  
> composed of  the 9
> > macros, and do the recursion based on the group, not each   
> individual macro.
>
> The important question is: are these used in a place where it is
> always safe to look at the next character or command?  Things can
> get messy looking ahead to see an alignment separator (&).  If they
> are safe in general, are they safe to take a macro argument?  That
> means they are never used right before }, or certain other contexts.
>
> Here is my suggestion.  Expand the next token and look for a  
> consistent
> command name.  (Yes, \@ifnextchar can test commands.)
>
> \makeatletter
>
> \newcommand\cwtag[1]{%
>   \cwtag at start \let\cwtag at start\relax % start and locally  
> disable restart
>   \emph{#1}%
>   \expandafter\cwtag at tail
> }
>
> \newcommand\cwtag at tail{%
>  \@ifnextchar\cwtag{\cwtag at join}{\cwtag at stop}%
>  }
> \newcommand\cwtag at start{\begingroup (}
> \newcommand\cwtag at join{,\ }
> \newcommand\cwtag at stop{)\endgroup}
>
> \makeatother
>
> \newcommand\hyph{\cwtag{hyph.} %% hyphenated
> \newcommand\var{\cwtag{var.} %% variation
> \newcommand\slang{\cwtag{slang} %% slang term
> ...
>
> -- 
> Donald Arseneau                          asnd at triumf.ca


Thanks, that is it exactly!

For other newbies like me:
1) the " at " in the command names is replaced by the "@" symbol
2) the last three newcommands have an extra "}" needed at the end




More information about the texhax mailing list