历史与许可证

TeX 的版本号目前是 3.141592653,下一次修错还会在末尾添一位数字。它趋近的是圆周率 π——一个永远到不了的数。本页接着起源故事往下讲:高德纳把 TeX 写完之后发生了什么。冻结、LaTeX 的交接棒,以及 LPPL 这个许可证究竟要求什么。LaTeX 是免费的,商业用途也随意;但这份「自由」的形状既不完全像 GPL,也不完全像 MIT,而差别的由来才是最有意思的地方。

为什么 TeX 的版本号趋近于 π

因为 1990 年高德纳在 TUGboat 上那篇《The Future of TeX and METAFONT》里宣布停止开发 TeX,此后只修正别人报上来的错误。与此同时他定下了一条规矩:每修一次,就在号码末尾添一位数字。于是 3.14 → 3.141 → 3.1415 一路逼近 π,却按其构造永远到不了。版本号本身就成了一句声明——这是一件只会渐近于完成的作品。而三十多年里它只长了寥寥几位,这件事本身就是稳定程度的量度。

shell
# measured on a TeX Live 2024 install
$ tex --version | head -1
TeX 3.141592653 (TeX Live 2024)

$ pdftex --version | head -1
pdfTeX 3.141592653-2.6-1.40.26 (TeX Live 2024)

耐人寻味的是,后继引擎并没有丢掉这个号码,而是把它接了下来。上面那行 pdfTeX 3.141592653-2.6-1.40.26 的读法是「高德纳那个被冻结的 TeX 3.141592653,外面叠了 pdfTeX 自己的 1.40.26」。拒绝改写底座上的号码,本身就是一句誓词:里面的 TeX 一个字都没动过。高德纳写下过,他去世时号码将被定为 π 并从此永远冻结——用他自己的话说,那是「在我身后所做的、绝对最后一次改动」。那一刻仍然存在的错误不会被修,而是升格为特性。同门的 METAFONT 也照此办理,只是它趋近的是自然对数的底 e

这份稳定的决心有多认真,看高德纳付出的「赏金」就明白了。凡在 TeX 或 METAFONT 代码里找到错误的人都能领赏,起价是十六进制里的一美元,也就是 2.56 美元,此后每年翻一番,直到 327.68 美元封顶。他造了一套「找到错误越晚越值钱」的机制,而报告仍旧枯竭了。正是这种程度的较真,才让几十年前的稿子今天原样排得出来,也才让 TeX 被称作计算机排版史上的一个不动点。

那么被冻结的「TeX」究竟指什么?1984 至 1986 年间,高德纳出版了五卷本的 Computers & Typesetting:A 卷是使用指南 The TeXbook;B 卷是 TeX: The Program,把 TeX 自身的源码排成了一本书;C、D 两卷是字形设计程序 METAFONT 对应的两册;E 卷则是 Computer Modern Typefaces,收录 Computer Modern 字族的设计。把程序源码当作书籍出版 的念头就在这里,也正因如此,「冻结」并非比喻。连查错都按几十年一次的间隔排定:继 2021 年的纪念版之后,下一次定在 2028 年,再往后是 2037 年、2047 年。

现在是谁在维护 LaTeX

一支叫 LaTeX 项目(LaTeX Project) 的小团队。LaTeX 本身出自 Leslie Lamport 之手,但维护与开发的责任在 1989 年转到了 Frank Mittelbach 身上,他与 Chris Rowley、Rainer Schöpf 组成的团队在 1994 年发布了 LaTeX 2ε。今天说「LaTeX」指的就是这个 2ε,更早的 LaTeX 2.09 已属于历史。TeX Live 目录里那份 legal.txt 至今仍把 Lamport、Mittelbach、Rowley、Schöpf、David Carlisle 等人列为著作权人——这条谱系就写在发行版自己的文件里。

曾被当作「下一代独立格式」谈论的 LaTeX3,作为产品从未出现。取而代之的是,它的编程层 expl3 被并进了 LaTeX 2ε 内部,如今内核在启动时就把它读进来。所以运行 pdflatex 时,日志开头会打出两行横幅——格式本身的版本,和 L3 编程层的版本。LaTeX 2ε 现在按每年 6 月 1 日和 11 月 1 日发布带日期的版本,日期本身就是版本名。

log
% the two banner lines a TeX Live 2024 run prints
LaTeX2e <2023-11-01> patch level 1
L3 programming layer <2024-02-20>

一年更新两次,听上去像是在威胁旧稿,但设计的方向恰恰相反。内核自带一套叫 latexrelease回滚机制:写上 \RequirePackage[2020-02-02]{latexrelease},内核就重现那个日期时的行为。这是特意留给「在审稿里来回好几年的论文」和「十年后还要重新编译的学位论文」的后门。TeX 那边冻结,LaTeX 这边继续更新却能重放自己的过去——分工非常清楚。

想自称「TeX」需要什么条件

高德纳的许可证归结为一句话:随便改,但改完的东西不许叫 TeX。源文件 tex.web 自己就写着,若改动了这个程序,其结果不应再称为 TeX。只有通过 TRIP 测试的实现才配用这个名字——那是一套故意刁难的折磨测试,逐字符地把输出与参照结果比对。这份许可证的发明之处在于:「TeX」根本不是产品名,它被当作一纸兼容性保证书来使用。

这条规矩在现实里留下的证据,就在日语 TeX 上。ASCII 公司做的日语引擎叫 pTeX,它的 Unicode 后继者叫 upTeX,两者都不自称「TeX」。既然改了 TeX,就得改名字——规矩直接变成了实现的名字。至于商标,美国境内的「TeX」由 美国数学会(AMS) 持有,1984 年提出申请。这是防御性持有,为的是不让无关的人抢注,所以你不必在文档里加上「TeX 是……的商标」这类声明。

LPPL 究竟是一份要求什么的许可证

LPPL(LaTeX Project Public License) 的核心要求是:改动版必须自报是改动版。人们常说「LPPL 强制你改文件名」,但对现行版本而言这并不准确。TeX Live 目录里那份 texmf-dist/doc/latex/base/lppl.txtLPPL 1.3c(2008-05-04),其第 6 条 a 项要求的是:替换用的组件在交互使用时,必须清晰无歧义地表明自己是修改过的版本——对文件名本身只字未提。它也不是 GPL 那样强制公开源码的机制。它守护的是使用者一侧的信任,即「写着 article.cls 的就是真正的 article.cls」这个前提。

那么「改文件名」的说法从何而来?因为旧版本里真的这么写过。同一个 doc/latex/base/ 目录下还放着 lppl-1-2.txt,其条件 3 明明白白地写着:不得以原文件名分发修改后的文件。这一条引发了「它究竟算不算自由软件」的长期争论,2003 年甚至让 Debian 重新考虑如何收录 LaTeX。LPPL 1.3 放宽了这道约束,要求从「改名字」转为「声明自己是改动版」。不过改名依然是推荐做法,CTAN 上那些名字拧得有点怪的衍生宏包,就是这套文化的遗风。

条款要求什么实务上怎么满足
LPPL 1.3c 2原样分发完整未改动的副本,始终允许无需任何动作
LPPL 1.3c 6a替换组件必须清楚表明自己是改动版\ProvidesClass 的版本串里写明
LPPL 1.3c 6b以显眼的方式说明改了什么在文件头注释或 CHANGES 文件里留下变更记录
LPPL 1.3c 6c不得让人以为原作者会为你的版本提供支持把联系方式与报错去处换成自己的
LPPL 1.3c 6d要么一并分发原本,要么说明如何取得在 README 里写上 CTAN 上的对应页面即可
LPPL 1.2 3不得以原文件名分发改动版(旧版)1.3 已撤销;但改名仍属推荐做法

想把改过的类文件发出去时怎么做

对只写稿子的人来说,许可证几乎没有实务上的意义。用 LaTeX 做出 PDF、投出去、拿去卖、公开发表,本身都不需要额外授权。许可证真正露面的时刻,只有重新分发 .cls.sty 的时候——把实验室模板改好传给学弟,把会议类文件动一动发给合作者。那一刻要做的有三件事:给它自己的名字、写清楚你改过、指明原本从哪来。这三件事基本就覆盖了 LPPL 第 6 条。

latex
% labthesis.cls -- derived from thesis.cls, distributed under the LPPL
% Changes are logged in CHANGES; the original is on CTAN.
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{labthesis}[2026/04/01 v1.2 local fork of thesis.cls]
\LoadClass[a4paper]{article}
  • 保留上游文件,用 labthesis.cls 这类专属名字来分发自己的版本。不覆盖原文件才是关键。
  • \ProvidesClass 的版本串里注明这是衍生版,该行会打进日志,第 6 条 a 项顺带就满足了。
  • 提交论文源码包时,把许可证文本与改动过的 .sty.cls 一并放进去。多数投稿系统会原样存档你上传的东西。
  • 正文与图表的著作权跟 TeX 的许可证毫无关系,由投稿处、出版社或所属机构的规定决定。别把两者混为一谈。

再补一句日语这边的情况:pLaTeX / upLaTeX 那套宏并不走 LPPL,而是 BSD 许可证。本地安装里 plcore.ltx 的开头并排写着两行——「Copyright (c) 2010 ASCII MEDIA WORKS」与「Copyright (c) 2016-2020 Japanese TeX Development Community」——从 ASCII 到 日本 TeX 开发社区 的交接就记在文件内部。jlreq.cls 同样是 BSD,两条款版。也就是说,动日语环境时 LPPL 与 BSD 是混在一起的,而最低限度的义务是保留著作权声明。