请参阅以下示例:
\documentclass{article}
\begin{document}
\def\a{1}
\def\b{\def\a{2}}
\def\c{\b}
\c\a
\end{document}
在扩展阶段,\def
,其参数文本和替换文本不会被扩展。那么在这个阶段,TeX 处理器如何知道\c
,\a
是一个宏呢?
并且 token 被一个接一个地展开,所以我有
\c\a ==>
\b 1 ==>
\def\a{2} 1
但输出是2
。如果我不考虑这些事情的话,这是正确且正常的输出,但显然我对扩展阶段和执行阶段有一些误解。
答案1
当 TeX 扩展标记并找到宏时,它会在吸收参数(如果宏指定了参数)后,用宏的替换文本替换它。然后它从替换文本中的第一个标记重新开始。
因此,您的代码的步骤如下
\c\a
\b\a
\def\a{2}\a
<do the assignment>
\a
2
为了补充上述描述,当 TeX 发现它必须执行分配(此处\def
)时,它会吸收所需的标记,将分配存储在内存中并从输入流中删除这些标记。
因此,\a
直到它成为输入流中的第一个标记时才会进行检查,除非使用 修改扩展顺序\expandafter
。
你会得到 1
\expandafter\c\a
进一步调用\a
,将会提供 2。
答案2
扩展是深度优先的,也就是说,在扩展\c
之前会完全扩展,所以它会像这样:\a
\c\a ==>
\b\a ==>
\def\a{2}\a ==>
2