我以为我已经理解了扩展的原理......但显然不是!
\def\a{AAA}
\def\b{BBB}
\expandafter\detokenize\expandafter{\a\b}
我认为 2\expandafter
会分别存储\detokenize
和{}
,然后扩展\a
到AAA
和\b
扩展到BBB
。因此,经过一轮扩展后,我们将得到:
\detokenize{AAABBB}
因此输出应该只是“AAABBB”。但事实并非如此。我的错误在哪里?
答案1
\expandafter
只存储一个标记。因此扩展顺序为\expandafter
- \expandafter
- \a
。
此后,一切都恢复并\detokenize
执行。
这就是为什么你有时会看到疯狂的连续\expandafter
:为了反转扩展顺序n你基本需要的代币2^n-1 \expandafter
\expandafter
s. 至少你之前不需要,\detokenize
因为它会启动扩展来寻找它的参数。
所以
\detokenize\expandafter\expandafter\expandafter{\expandafter\a\b}
给出你需要的扩展顺序:\expandafter
- \expandafter
- \expandafter
- \b
。恢复后有
\detokenize\expandafter{\a BBB}
最终得到期望的输出。
如果你对始终完全扩展内容感兴趣{}
(无论它们是什么),你通常不能。根据具体情况,可能会有其他选择。因此,如果这个答案不是你想要的,请详细说明。