什么是 TeX?
TeX 不是什么
TeX 绝对不是一种格式。
TeX 是什么?
那么 TeX 到底是什么呢?正如哈姆雷特1 所说,这就是问题所在。让我们尽可能简洁地回答它。
想象我们有一种编程语言,它仅由两个基础命令(称为 控制序列 或 原语),\a 和 \b 组成。在这门语言中,我们可以编写用于文档(书籍、文章等)排版的程序。我们把这门语言称为 (L1)。为了以特定方式执行这些程序,我们需要一个能够解释该语言命令的引擎。
现在假设在为某个文档编写排版程序时,我们发现子序列 \a \b \a 出现得相当频繁。同时假设在我们的语言中还有另一个原语 \def,它允许我们定义子程序或宏。我们把这门语言称为 (L2)。在这种情况下,我们可以在程序开头定义宏 \def\c{\a \b \a},并将每一次出现的子序列替换为 \c,以提升可读性并减少代码量。
现在,如果我们想排版另一份文档,而该文档的程序中同样频繁出现这个命令序列,就需要再次定义该宏。但假设我们的引擎能够将 \c 宏加载到内部状态中,并将该状态保存为二进制文件(转储),随后在处理每个需要 \c 宏的文档的排版程序之前,自动加载(“叠加”在 (L2) 语言的命令集合之上)。我们将这种由 \c 宏扩展的原语集合称为 格式。于是,我们的格式就是低层原语语言 (L2) 的一种 宏扩展。
引擎还包含许多内部寄存器或 内部参数,可以通过控制序列访问。除了宏定义之外,一个格式还可以包含这些参数的初始化表达式。
恰好 Donald E. Knuth 定义了一种类似 (L2) 的语言,但拥有更为庞大的原语集合,他把它称为 TeX。他还创建了一个能够理解(且至今仍然能够理解)TeX 语言的引擎,并同样称之为 TeX。
值得庆幸的是,这并不是他唯一的贡献。他还提出了宏扩展或格式,称为 Plain TeX,使得编写程序更加便利。TeX 最初的原语集合有时被称为 VirTeX(“Vir” 取自 “virgin”),从形式上讲,考虑到内部参数的默认值,它同样也是一种格式。
因此,一方面,TeX 是一种编程语言;另一方面,它是一个能够解释该语言的解释器引擎;第三,TeX 还是一个更广义的概念,指代整个排版系统。
这里唯一需要说明的是,实际上正在排版的文本字符本身也是命令,它们会迫使 TeX 引擎按照当前输入编码并使用当前字体设置(这些设置同样可以通过控制序列调节)来输出相应的字符。因此,在定义宏时,也可以使用普通字符。
我们希望从此以后,你不再对 “What is TeX?”(什么是 TeX?)这一问题感到困惑。
威廉·莎士比亚的《哈姆雷特,丹麦王子悲剧史》中的字符。 ↩︎