[texhax] controlling expansion

Heiko Oberdiek heiko.oberdiek at googlemail.com
Thu Feb 28 14:27:04 CET 2013


On 28.02.2013 12:22, Neal H. Walfield wrote:
> Hi,
>
> I'm writing a macro that compares the value of a parameter.  I'm
> currently using \ifx to do this as follows:
>
>    \documentclass{article}
>
>    \def\dosomething#1{
>      \def\empty{}
>      \def\arg{#1}
>      \ifx\empty\arg
>        empty
>      \else
>        not empty
>      \fi}
>
>    \begin{document}
>
>    1: \dosomething{}
>
>    2: \dosomething{1}
>
>    \edef\foo{\dosomething{}}
>    3: \foo
>
>    \end{document}
>
> This breaks if the caller uses \edef: \empty is expanded.  However, if
> I protect \empty and \arg with a \noexpand, then bare uses (such as 1
> and 2 in my above example) don't work:
>
>    ! Use of \noexpand doesn't match its definition.
>    \dosomething #1-> \def \noexpand \empty
>                                          {} \def \noexpand \arg {#1}
> 					\ifx \em...
>    l.18 \edef\foo{\dosomething{}
>
> What is the "right way" to compare argument values such that the macro
> can (but need not) be used in an \edef context?

e-TeX's (usually enabled in latex) \detokenize helps:

\newcommand{\dosomething}[1]{%
   \ifx\expandafter\relax\detokenize{#1}\relax
     empty
   \else
     not empty
   \fi
}

Yours sincerely
   Heiko Oberdiek


More information about the texhax mailing list