Latex宏展开练习
在The TeXBook的练习20.2中有这样一个问题:
下面给出的宏\puzzle 的定义, 展开后是什么?
\def\a{\b}
\def\b{A\def\a{B\def\a{C\def\a{\b}}}}
\def\puzzle{\a\a\a\a\a}
答案是ABCAB,这个展开过程很别扭,但是通过这个例子却可以很好的理解Latex的宏展开机制。其展开过程如下:
1. \puzzle 展开得到 \a\a\a\a\a
2. 展开第一个\a得 \b[\a\a\a\a] (中括号中的是待展开内容,下同)
3. 继续展开\b得 A\def\a{B\def\a{C\def\a{\b}}}[\a\a\a\a]
4. A后面是一个新的定义,把\a定义为{B\def\a{C\def\a{\b}}}而宏定义,在使用前是不会有展开动作的,例如最开始的\def\a{\b},没有使用\a之前,就不会展开。因此下一步继续展开中括号里的第一个\a。展开得到
\def\a{B\def\a{C\def\a{\b}}} (这是一个新的宏定义,覆盖了前面对\a的定义)
AB\def\a{C\def\a{\b}}[\a\a\a]
现在\a又被重新定义了,
\def\a{C\def\a{\b}} (这是一个新的宏定义,覆盖了前面对\a的定义)
AB[\a\a\a]
继续展开\a.展开得到:
ABC\def\a{\b}[\a\a]
再次重新定义了\a,继续展开
\def\a{\b} (这是一个新的宏定义,覆盖了前面对\a的定义)
ABC\b[\a]代入\b得
ABCA\def{\a{B\def\a{C\def\a{\b}}}}[\a]
\def{\a{B\def\a{C\def\a{\b}}}}(这是一个新的宏定义,覆盖了前面对\a的定义)
ABCA[\a]
ABCAB\def\a{C\def\a{\b}}
此时得到ABCAB,以及一个新的宏定义:
\def\a{C\def\a{\b}}

浙公网安备 33010602011771号