TeX 的起点,是一叠令人失望的清样。1977 年春天,高德纳翻开自己那本《计算机程序设计艺术》第 2 卷第 2 版的清样,大失所望:出版社从铅字排版改成了照相排版,而他最看重的公式部分变得很难看。他决定自己写一套排版系统,本以为几个月就能收工,结果花了十年。那套系统就是 TeX。LaTeX 既不是 TeX 的后继者,也不是它的竞争对手,而是运行在 TeX 引擎之上的宏包——一大批用 TeX 自身语言写成的命令。本页说明这两者究竟是什么、为什么要写结构而不是外观,并且不加吹嘘地讲清楚谁适合、谁不适合使用 LaTeX。
TeX 是什么:从一叠清样中诞生的排版引擎
TeX 是一个程序:它读入一份写着命令的文本文件,然后以远小于一个点的精度算出每个字符、每条线该落在页面的哪个位置。排版本来是印刷业的说法——一个个拣出铅字拼成印版——而 TeX 把这项工作搬到了计算机上。它的作者是斯坦福大学的计算机科学家 高德纳(Donald Knuth)。他 1977 年 5 月写下的第一份设计备忘录以 TEXDR.AFT 之名保存了下来,后来作为一章收进他的《Digital Typography》一书。第一个能跑起来的版本出现在 1978 年。
因为高德纳的目标是把公式排漂亮,TeX 的每个细节都近乎偏执。它会自动处理词内 断词连字符、AV 和 To 这类字母对的 字距微调(kerning)、把 fi 和 fl 铸成单个字形的 连字(ligature),以及防止段落首行或末行被孤零零丢在另一页的 孤行控制——这些都不需要你开口。尤其是断行:TeX 不是一行一行地填,而是通盘考虑整个段落,挑出总代价最小的一组断点,所以在段末加一个字符都可能改变首行的折行位置。正是这份彻底,让学术出版至今仍然跑在 TeX 上。
还有一个事实最能体现 TeX 的性格:它的版本号被设计成收敛到 π。每次更新只在小数点后多加一位,TeX Live 2024 里的 TeX 自称 3.141592653。高德纳宣布,在他去世之后版本号将永久固定为 π,此后任何改动都要算作缺陷。它的姊妹程序、字体系统 Metafont 则按同样的道理收敛到自然对数的底 e。这个关于版本号的玩笑,已经被认认真真地维持了四十多年。
$ tex --version
TeX 3.141592653 (TeX Live 2024)
kpathsea version 6.4.0TeX 和 LaTeX 怎么读
末尾的 X 不是拉丁字母,而是希腊字母 χ(chi)。TeX 取自希腊语 τέχνη(technē,技艺、艺术)的前三个字母,高德纳自己写道,它应当按德语 ach 或苏格兰语 loch 中的 ch 来发音。所以英语世界读得接近「tech」,而在日本长期也读作 「tef」。LaTeX 则「LAY-tech」「LAH-tech」「LAY-teks」都有人说,从来没有定论。它和材料乳胶(latex)毫无关系。那个字母忽高忽低的标志同出一源,在正文里写 \LaTeX 就会排出这个形状。
LaTeX 是什么:一个宏包,而不是另一个程序
LaTeX 并不是一个不同于 TeX 的程序。 TeX 自带宏功能——用已有命令定义新命令的机制——而 LaTeX 就是仅用这套机制写成的一大批命令。当你运行 pdflatex 时,启动的并不是「LaTeX 这个可执行文件」,而是预先装载了整套 LaTeX 命令的 TeX 引擎。把这一点搞错,后面遇到「引擎」和「格式」这两个词时必然会晕。在 TeX Live 的安装目录里甚至能查到 latex 和 pdflatex 指向同一个可执行文件,但那个实验留给讲经典 TeX 和讲 LaTeX 格式的页面。
写下这批宏的是 莱斯利·兰波特(Leslie Lamport),后来以分布式系统研究闻名的计算机科学家。1980 年代前期,他在 SRI International 任职时为自己的文档积累了一套 TeX 宏,随后公开发布,那就是 LaTeX 的起点。1985 年他以 LaTeX 2.09 为自己亲手维护的最后一版画上句号,次年即 1986 年在 Addison-Wesley 出版了手册《LaTeX: A Document Preparation System》。名字里的 La,就是 Lamport 的 La。
今天说「LaTeX」,几乎一定指的是 LaTeX2e,由弗兰克·米特尔巴赫为首的 LaTeX Project 团队在 1994 年 6 月 1 日正式发布。原因在一手资料《LaTeX News》第 1 期里写得很清楚:LaTeX 2.09 的派生版本泛滥,各站点不得不同时保留带 NFSS 和不带 NFSS 的 LaTeX、SLiTeX、AmSLaTeX,于是干脆把它们重新收拢进同一个格式。文档第一行从 \documentstyle 变成 \documentclass 正是那时的事——人人最先敲下的那条命令,其实是 1994 年那次统一的产物。长期开发的下一代 LaTeX3 始终没有成为独立产品:2018 年之后,它作为 LaTeX2e 内核中的 expl3 编程层随内核一起发布,如今多数宏包都写在这一层之上。
写「意义」而不是「外观」:与文字处理软件的根本分歧
在 LaTeX 文档里,你不会为了做一个标题而写「14 磅粗体、上方留 3.5 行空白」。你写的是 \section{Introduction}——只声明它是一个节标题这个事实。那么字号和间距在哪里?在类文件里。打开 TeX Live 2024 的 article.cls,第 302 行写着 \@startsection{section}{1}{\z@}{-3.5ex ...}{2.3ex ...}{\normalfont\Large\bfseries}:上方留 3.5ex、下方留 2.3ex,用 \Large 加粗排出来。这些数字在你的稿件里一次也不会出现。 所以把 article 换成期刊自带的类文件,全部标题就会照期刊的规定改过来,而你一个字都不用动。这和网页上 HTML 与 CSS 的分工完全是同一个思路。
\documentclass{article}
\begin{document}
\section{Introduction}
The body says what the text \emph{is}, never how it should look.
\[ E = mc^2 \]
\end{document}这种分工在文档变长之后才真正见效。编号完全不用你自己敲:放上 \label 和 \ref,「见图 3.2」的编号和页码就会自动填好;中途插进一张图把所有编号都挤歪了,它们也会自己改正。目录、索引、参考文献同样由这套机制生成。反过来说,一旦你开始手动把标题加粗、自己敲编号,那就是在放弃 LaTeX 最擅长的部分。当然也有代价:你没法一边打字一边看结果。 写、编译、看 PDF——这个来回就是 LaTeX 的工作节奏,在习惯之前,它明显比文字处理软件慢。
TeX、LaTeX、pdfLaTeX、upLaTeX、LuaLaTeX 有什么区别
名字之所以这么多,是因为它们是两样东西的乘积:引擎(真正干活的程序)和格式(命令体系)。引擎有 TeX、pdfTeX、XeTeX、LuaTeX、pTeX/upTeX;格式有 plain TeX、LaTeX、ConTeXt。pdflatex 就是「pdfTeX 引擎 + LaTeX 格式」,uplatex 就是「upTeX 引擎 + LaTeX 格式」——名字本身就是那个乘法。把 LaTeX 装在日文引擎 pTeX、upTeX 上,分别就叫 pLaTeX 和 upLaTeX。该选哪个引擎,是「如何选择引擎」那一页要认真回答的实务问题,这里只给个大致方向:以英文为主用 pdflatex,想直接用系统里已有的字体用 lualatex 或 xelatex,写日文用 uplatex 或 lualatex。
| 名称 | 实际是什么 | 主要用在哪里 |
|---|---|---|
tex | 高德纳的引擎本体,配 plain TeX 格式 | 用来弄清原理;日常写文档不用它 |
latex | LaTeX 格式,输出 DVI | 经由 DVI 的经典路线;也是日文工作流的底座 |
pdflatex | pdfTeX 引擎 + LaTeX,直接输出 PDF | 拉丁文字文档的默认选择,也是经受检验最多的一个 |
uplatex | upTeX 引擎 + LaTeX,输出 DVI | 日文论文的常规选择,擅长竖排和日文避头尾规则 |
xelatex | XeTeX 引擎 + LaTeX,支持 Unicode 与系统字体 | 想直接按名字指定 OpenType 字体时 |
lualatex | LuaTeX 引擎 + LaTeX,可用 Lua 从内部扩展 | 今天新开项目就选它;日文用 luatexja |
谁适合用 LaTeX,谁不适合
一句话:文档越是篇幅长、结构深、反复修订,LaTeX 就越占便宜。公式多、章节层级深、图表和参考文献数以十计、每投一处就得换一套体例、和合作者在 Git 上看差异——这些条件越多,自动化带来的收益就越大。在物理、数学、计算机科学领域它实际上就是标准:预印本服务器 arXiv 建议以 LaTeX 源码投稿,维基百科的公式也用 LaTeX 记法书写。
反过来说,也有明显不划算的场合。凡是要把元素摆到任意位置的活儿——单页传单、海报——用排版设计软件更快也更可控。如果合作者清一色只用 Word,来回转换的成本会把自动化省下的时间吃光。如果明天就要交稿而你从没碰过 LaTeX,今天请用 Word:这门技术要花几天才能上手,而那几天不能靠借来的时间去付。「用了 LaTeX 文档就会变漂亮」这个说法并不准确。 准确的说法是:只要把结构写对,你就不必再做调格式的活儿。
- 文档里公式很多,那基本不用犹豫,选 LaTeX。 公式排版的质量至今没有别的工具追得上。
- 如果投稿方提供了 LaTeX 类文件,就用它。 关于体例的一切争论会直接消失。
- 如果这份文档要和合作者一起养好几年,纯文本的好处就显出来了。 在 Git 里能读懂差异,十年后照样打得开。
- 如果目标只是做一页的版面设计,坦然换个工具。 把东西摆到指定坐标,正是 LaTeX 最不擅长的事。
- 只是想先试试的话,别装软件,直接在浏览器里跑。 在搭环境这一步放弃,是最可惜的。
最后说说 TeX 能存活四十多年的实务理由。它是免费的开源软件——你可以读它的源码、改它、拿它做的东西去卖。输入是扩展名为 .tex 的纯文本,所以任何编辑器都能写,grep 能搜,脚本能生成,Git 能看差异。宏包的总仓库 CTAN(Comprehensive TeX Archive Network)上聚集着数千个扩展,多数「能不能做到这个」的问题,早已有人给出了答案。而且同样的输入给出同样的输出:在 Windows、macOS、Linux 上都一样,十年前写的源文件也一样。凡是把「日后可复现」当作要求的场合——科研、公文档案——这个性质几乎无可替代。接下来,就动手做出真正的一页吧。