什么是 TeX / LaTeX

TeX 的起点,是一叠令人失望的清样。1977 年春天,高德纳翻开自己那本《计算机程序设计艺术》第 2 卷第 2 版的清样,大失所望:出版社从铅字排版改成了照相排版,而他最看重的公式部分变得很难看。他决定自己写一套排版系统,本以为几个月就能收工,结果花了十年。那套系统就是 TeXLaTeX 既不是 TeX 的后继者,也不是它的竞争对手,而是运行在 TeX 引擎之上的宏包——一大批用 TeX 自身语言写成的命令。本页说明这两者究竟是什么、为什么要写结构而不是外观,并且不加吹嘘地讲清楚谁适合、谁不适合使用 LaTeX。

TeX 是什么:从一叠清样中诞生的排版引擎

TeX 是一个程序:它读入一份写着命令的文本文件,然后以远小于一个点的精度算出每个字符、每条线该落在页面的哪个位置。排版本来是印刷业的说法——一个个拣出铅字拼成印版——而 TeX 把这项工作搬到了计算机上。它的作者是斯坦福大学的计算机科学家 高德纳(Donald Knuth)。他 1977 年 5 月写下的第一份设计备忘录以 TEXDR.AFT 之名保存了下来,后来作为一章收进他的《Digital Typography》一书。第一个能跑起来的版本出现在 1978 年。

因为高德纳的目标是把公式排漂亮,TeX 的每个细节都近乎偏执。它会自动处理词内 断词连字符AVTo 这类字母对的 字距微调(kerning)、把 fifl 铸成单个字形的 连字(ligature),以及防止段落首行或末行被孤零零丢在另一页的 孤行控制——这些都不需要你开口。尤其是断行:TeX 不是一行一行地填,而是通盘考虑整个段落,挑出总代价最小的一组断点,所以在段末加一个字符都可能改变首行的折行位置。正是这份彻底,让学术出版至今仍然跑在 TeX 上。

还有一个事实最能体现 TeX 的性格:它的版本号被设计成收敛到 π。每次更新只在小数点后多加一位,TeX Live 2024 里的 TeX 自称 3.141592653。高德纳宣布,在他去世之后版本号将永久固定为 π,此后任何改动都要算作缺陷。它的姊妹程序、字体系统 Metafont 则按同样的道理收敛到自然对数的底 e。这个关于版本号的玩笑,已经被认认真真地维持了四十多年。

terminal
$ tex --version
TeX 3.141592653 (TeX Live 2024)
kpathsea version 6.4.0

TeX 和 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 的安装目录里甚至能查到 latexpdflatex 指向同一个可执行文件,但那个实验留给讲经典 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 的分工完全是同一个思路。

latex
\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 上,分别就叫 pLaTeXupLaTeX。该选哪个引擎,是「如何选择引擎」那一页要认真回答的实务问题,这里只给个大致方向:以英文为主用 pdflatex,想直接用系统里已有的字体用 lualatexxelatex,写日文用 uplatexlualatex

名称实际是什么主要用在哪里
tex高德纳的引擎本体,配 plain TeX 格式用来弄清原理;日常写文档不用它
latexLaTeX 格式,输出 DVI经由 DVI 的经典路线;也是日文工作流的底座
pdflatexpdfTeX 引擎 + LaTeX,直接输出 PDF拉丁文字文档的默认选择,也是经受检验最多的一个
uplatexupTeX 引擎 + LaTeX,输出 DVI日文论文的常规选择,擅长竖排和日文避头尾规则
xelatexXeTeX 引擎 + LaTeX,支持 Unicode 与系统字体想直接按名字指定 OpenType 字体时
lualatexLuaTeX 引擎 + 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 上都一样,十年前写的源文件也一样。凡是把「日后可复现」当作要求的场合——科研、公文档案——这个性质几乎无可替代。接下来,就动手做出真正的一页吧。