[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