关于TeX扩展的问题

关于TeX扩展的问题

请参阅以下示例:

\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

相关内容