16

I thought I had understood the principle of expansion ... but apparently not!

\def\a{AAA}
\def\b{BBB}   

\expandafter\detokenize\expandafter{\a\b}

I thought that the 2 \expandafter would store \detokenize and {} resp. and then expand \a into AAA and \b into BBB. Therefore after one round of expansion, we would have:

\detokenize{AAABBB}

and thus the output should be simply "AAABBB". But it is not the case. Where is my mistake?

Martin Scharrer
  • 262,582
Loic Rosnay
  • 8,167
  • 2
    Question titles must summaries the question. Please avoid titles which would fit 1000 largely different questions. – Martin Scharrer Jun 09 '12 at 08:58
  • 4
    \expandafter jumps over one token, expands once the following one (if it's expandable, otherwise nothing happens) and vanishes. – egreg Jun 09 '12 at 09:20
  • You might be looking for \expandnext from etextools, which in your case could be used as \expandnext\detokenize\a\b. – dgs Jun 09 '12 at 10:41

1 Answers1

20

\expandafter stores exactly one token. So the expansion order is \expandafter-\expandafter-\a.

After this everything is restored and \detokenize is executed.

This is the reason why you sometimes see crazy successions of \expandafter: To reverse the expansion order of n tokens you basically need 2^n-1 \expandafters. At least you don't need \expandafter before \detokenize because it will initiate expansion looking for its argument.

So

\detokenize\expandafter\expandafter\expandafter{\expandafter\a\b}

gives the expansion order you need: \expandafter-\expandafter-\expandafter-\b. After restoring there is

\detokenize\expandafter{\a BBB}

finally yielding the desired output.

In case your're interested in always fully expanding the contents of {} (whatever they are), you can't (in general). Depending on a concrete context, there may be alternatives. So if this answer is not what you were looking for, please elaborate.