为什么 \expandafter 没有展开整个 { } 组?

为什么 \expandafter 没有展开整个 { } 组?

我以为我已经理解了扩展的原理......但显然不是!

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

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

我认为 2\expandafter会分别存储\detokenize{},然后扩展\aAAA\b扩展到BBB。因此,经过一轮扩展后,我们将得到:

\detokenize{AAABBB}

因此输出应该只是“AAABBB”。但事实并非如此。我的错误在哪里?

答案1

\expandafter只存储一个标记。因此扩展顺序为\expandafter- \expandafter- \a

此后,一切都恢复并\detokenize执行。

这就是为什么你有时会看到疯狂的连续\expandafter:为了反转扩展顺序n你基本需要的代币2^n-1 \expandafter\expandafters. 至少你之前不需要,\detokenize因为它会启动扩展来寻找它的参数。

所以

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

给出你需要的扩展顺序:\expandafter- \expandafter- \expandafter- \b。恢复后有

\detokenize\expandafter{\a BBB}

最终得到期望的输出。

如果你对始终完全扩展内容感兴趣{}(无论它们是什么),你通常不能。根据具体情况,可能会有其他选择。因此,如果这个答案不是你想要的,请详细说明。

相关内容