Addylee

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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}}

posted on 2009-05-27 21:28  独孤求真  阅读(443)  评论(0)    收藏  举报