![Texlive 的 TeX 与 Knuth 的 TeX](https://linux22.com/image/434719/Texlive%20%E7%9A%84%20TeX%20%E4%B8%8E%20Knuth%20%E7%9A%84%20TeX.png)
来自 texmf.cnf:
% But don't parse the first line if invoked as"tex", since we want that
% to remain Knuth-compatible. The src_specials and
% file_line_error_style settings, as well as the options -enctex,
% -mltex, -8bit, etc., also affect this, but they are all off by default.
parse_first_line.tex = f
parse_first_line.initex = f
由于存在使 TeX 与 Knuth 版本兼容的设置,这意味着 texlive 附带的 tex 版本与 Knuth 的原始版本不同。
但据我所知,TeX 的许可证规定,如果你修改了程序,就必须更改名称。那么为什么 texlive 发布的程序被允许称为 TeX?
答案1
(这个问题已经在评论中得到回答,但发布只是为了让它脱离未回答状态……)
如果您理解 Knuth 对 TeX 的许可/限制/偏好的动机,那么它会更有意义:这些“规则”的精神主要在于使用一个名为 TeX/ 的程序tex
(使用不同的计算机/操作系统/发行版)应该为相同的输入文档产生相同的排版输出。
1977-78 年,Knuth 在斯坦福大学 (SAIL) 编写了 TeX(最初是为自己编写的)并开始讨论,之后其他人也对在其他地方使用它产生了兴趣,许多人将 SAIL 代码翻译到自己的环境中;本质上是重写了他们自己的 TeX 实现。如果你看看拖船,有来自各个地方(大学等)的“站点报告”,描述了他们在运行自己版本的 TeX 时的成功和失败——其中一些还描述了他们自己的“额外”功能,如新单位或附加类别代码!
这里的风险在于,不同的系统可能会在开发过程中对 TeX 进行自己的调整(更改默认字体或纸张大小,或添加新的原语/功能,或更改 TeX 在某些特殊情况下的行为方式),因此如果有人将其发送paper.tex
到另一个系统,它可能会开始产生不同的结果(例如,不同的换行符和分页符)。为了避免此类问题,Knuth 在 1981-82 年用 Pascal 的一个子集(当时最广泛使用的语言,尽管编译器的质量各不相同:因此是子集)重写了 TeX,以便它具有“可移植性”,并且每个人的系统都可以基于相同的代码构建。
如果你看看TeX 源代码第 2 节中提到了各种实现以及更改和重命名的限制 [强调添加]:
作者在 1977 年末和 1978 年初设计并编写了 TeX 的完整版本;该程序与其原型一样,是用 SAIL 语言编写的 […] 作者在 1981 年末和 1982 年初编写了 TeX82 程序,它还吸收了 1979 年在 MESA 中实现 TeX 的思想,该程序由 […]
另一方面,WEB 描述可以扩展无需改变 TeX82 本身的核心,而且程序的设计使得此类扩展并不十分困难。此处定义的横幅字符串应更改为每当 TeX 进行任何修改时,这样就可以清楚地TeX 的版本当问题出现时,可能就是罪魁祸首。
如果这个程序被修改,那么最终的系统不应该被称为“TeX”;官方名称“TeX”本身是为完全兼容的软件系统。有一种称为“TRIP 测试”的特殊测试套件可用于帮助确定某个特定的实现是否值得被称为“TeX”[参见斯坦福计算机科学报告 CS1027,1984 年 11 月]。
上面的最后两段话可能看起来相互矛盾(可以有带有不同标志的 TeX“版本”,但程序一定不能改变?),但事实并非如此:最后一段带有“完全兼容”的文字是关于 TeX 的排版输出不会改变,而之前一段文字是关于必须对 TeX 进行更改(无需修改tex.web
)以使 TeX 适应不同的操作系统。
问题所问的正是这样的新功能:使用此文件foo.tex
:
%&latex
\documentclass{article}
\begin{document}
Hello
\end{document}
运行如下pdftex foo.tex
:
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) (preloaded format=latex)
因此您可以看到它加载的是latex
格式(而不是格式pdftex
,如果缺少第一行,它就会加载格式)。(类似地,%&xelatex
在第一行上并调用xetex
。)如果此功能也适用于tex
,那么有人可能会依赖此功能,然后转移到另一个未实现此功能的系统,并得出tex
不稳定的结论。因此,此功能对 已禁用tex
,并且(由于此功能对用户不可见)底层二进制文件恰好在其深处的某个地方包含从未访问过的代码来解析要加载的格式的第一行并不重要tex
。程序已“更改”,但这被视为可以接受,因为更改不会影响用户。
这是什么TRIP 手册说:
事实上,我认为一个程序必须满足两个标准才有资格被称为 TeX:(1) 编写者必须对它在自己的安装中运行的方式感到满意;(2) 程序必须产生正确的结果
TRIP.TEX
。[…] 但是,我不希望有错误的模仿者冒充 TeX 处理器,因为用户希望 TeX 在不同的机器上产生相同的结果。
文件的限制tex.web
也存在,但是范围要窄得多:
只要不修改此文件,就可以无限制地复制和重新分发此文件。允许修改,但前提是生成的文件不名为 tex.web。(WEB 系统通过辅助文件提供更改;主文件应保持不变。)
(顺便说一句,2021 年之前的说法略有不同:
仅当 (1) 您是 DE Knuth,或 (2) 您完全不更改副本时,才允许复制此文件。(WEB 系统通过辅助文件提供更改;主文件应保持完整。)
—我想它被改变是为了让它更清楚。)
总结一下:
tex.web
不允许直接修改,但可以通过变更文件(如etex.ch
)添加更改或重命名文件(如pdftex.web
和xetex.web
)。一个程序(以
tex.web
更改文件开始,甚至完全独立的实现)只有当它产生与 TeX “相同的结果”时才可以称为“TeX”(特别是使用严格的 TRIP 测试进行验证)。但请注意,这里的“相同”意味着:二进制文件不需要完全相同(当然一般来说也不可能完全相同),
各种资源(内存、字符串数量等)超出的限制可能不同(不确定这实际上记录在哪里,但显然是这种情况……),
甚至用户界面也可以改变;考虑一下这个问题“TeX 的一些实现”或者 Doug McKenna 的“JSBox”TeX 实现(他自己私有的)可以说通过了 TRIP 测试,尽管它的输出是完全不同另请参阅 Knuth 的声明“我从未打算控制特定系统上的用户交互方面”2008 年的 TeX 调整。