(La)TeX 中的“扩展”是什么意思?

(La)TeX 中的“扩展”是什么意思?

你可以经常 关于expanding宏或当宏执行扩张,有时关于扩张. 但这在英语中是什么意思?

答案1

TeX 基于宏扩展。当您输入类似的内容时\mbox{abc},您就是在告诉 TeX 执行可能非常复杂的命令序列。

的情况\mbox其实并不那么复杂,因为定义是

% latex.ltx, line 4573:
\long\def\mbox#1{\leavevmode\hbox{#1}}

这基本上意味着

  1. 当您找到 时\mbox,寻找一个参数(可以包含\par,因为\long

  2. \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

相关内容