答案1
TeX 基于宏和宏扩展。当您输入类似的内容时\mbox{abc}
,您就是在告诉 TeX 执行可能非常复杂的命令序列。
的情况\mbox
其实并不那么复杂,因为定义是
% latex.ltx, line 4573:
\long\def\mbox#1{\leavevmode\hbox{#1}}
这基本上意味着
当您找到 时
\mbox
,寻找一个参数(可以包含\par
,因为\long
)\mbox{<argument>}
用。。。来代替\leavevmode\hbox{<argument>}
这还没有结束:也是\leavevmode
一个宏
% latex.ltx, line 492:
\def\leavevmode{\unhbox\voidb@x}
因此 TeX 会适时地用 替换\leavevmode
,\unhbox\voidb@x
最终的输入相当于写成
\unhbox\voidb@x\hbox{abc}
(在 的情况下\mbox{abc}
)。路到此结束,因为\unhbox
和\hbox
是原始命令不会扩展,但会传递到下一阶段;\voidb@x
只是一个数字的别名(准确地说是一个盒子寄存器索引,并且该寄存器包含一个空盒子)。
用户并不关心这些有关原始命令的细节:程序员有责任向用户提供一套用于常见排版任务的命令。
宏如下\chapter
宏很多不止这些。它检查可能的*
(未编号的章节)或可选的参数(标题条目)并吸收强制参数(章节标题)。然后它执行\cleardoublepage
从新页面开始的命令(如果twoside
有效,则为奇数页),留下一些垂直空间,步进章节号的计数器,排版章节标题,为目录做注释,留下一些其他垂直空间并设置下一段不缩进。实际上,它做的事情不止这些,但所有这些都用一个简单的
\chapter{Title}
输入。大的优点在于程序员可以改变动作的每个细节\chapter
,从而可以在不改变用户语法的情况下制作出不同的章节样式。
每次 TeX 发现一些用以下方式定义的命令时\def
,它就会执行此扩展,即吸收定义中声明的参数,并用替换文本宏。然后它重新开始尝试扩展它所呈现的第一个标记。如果不是宏(或可扩展原语之一),它会用它执行一些排版/簿记操作:排版一个单词、步进计数器、在辅助文件中写一个注释等等。
有人可以写一本关于宏扩展和 TeX/LaTeX 宏的书。事实上,我就写了。;)
你从来没见过\def
?嗯,很正常!你可能被告知应该用 定义一个个人命令,\newcommand
这是真的!然而,\newcommand
本身是一个宏,它执行了很多其他任务,最终将输入简化为 的某个格式良好的标记列表\def
。