当 LaTeX 项目团队从 Leslie Lamport 手中接管 LaTeX 的维护工作时,LaTeX2e 被计划作为一个中间版本,以解决当时的 LaTeX2.09 的一些问题。‘e’(或者正确地说是 ε)表示 LaTeX2.09 与当前版本之间的微小变化,而长期计划则集中在 LaTeX3 上。正如我们所知道的那样,这一计划显得相当乐观,我们今天依然在使用 LaTeX2e:至少,它仍然以这样的方式自我声明。
LaTeX3 的计划在 1990 年代初由团队提出,目的是通过一个更清晰的底层编程框架重新实现 LaTeX,并明确区分用户界面、设计功能和编程。很多这些想法在早期就做了原型开发,编程层的一个版本早于 LaTeX2e 定稿就已经创建。然而,性能问题是一个大障碍:是的,作为开发者你可以测试这些功能,但那基本上就是一切。同时,一些想法尚未完全准备好:在 e-TeX(pdfTeX 扩展等)出现之前,引擎的功能较少,虽然 Knuth 的 TeX 是一款非常出色的软件,但 LaTeX3 的一些想法将其推到了极限。
因此,LaTeX2e 于 1994 年发布,开发集中于很多年的宏包开发。这意味着“LaTeX3”成为了一个有趣的想法:被讨论过,但看起来并没有什么(可见的)实现。
“ LaTeX3” 的开发从未停止,当然只是它们的重点从最初的目标(新内核)转移到基于 LaTeX2e 的扩展和构建。结果是 CTAN 上的 l3in2e
和 xpackages
等捆绑包,尽管它们都被标记为实验性质。
当我在 2009 年加入 LaTeX 项目团队时,事情大体上是这样的。然而,环境已经发生了变化:计算机变得更强大,e-TeX 和 pdfTeX 扩展得到了广泛应用,开发变得更加容易。这意味着,LaTeX3 的一些想法,特别是编程语言(expl3)可以在实际文档中使用:特别是 fontspec
宏包就是用 expl3 编写的,功能也很完善。我学习并用 expl3 写了 siunitx
的第二个版本。
同时,我在团队中的一些初期工作是让 expl3 达到“实验性”不再是真的实验:你可以在宏包中使用它,并且能够确保代码在版本之间持续工作。团队初期的另一个重要任务是让我们能够在任何平台(Linux、macOS 和 Windows)上轻松地发布,包括 expl3 和 LaTeX2e 内核的发布。
到 2020 年,关于编程层(expl3)的核心工作已经取得了稳定和良好的性能,我们希望能够依赖它来进行内核开发。因此,我们迈出了将 expl3 加载到 LaTeX2e 内核的步伐,在 LaTeX News 中有一个相当晦涩的描述:“改进了 expl3 的加载时间”。随后,xparse 和 xtemplate 也(大部分)被加入到内核中,巩固了那些被证明只是实验的部分功能。
有了这些功能之后,新的想法如钩子管理和重新实现旧的功能(如列表)变得可能:其中一些功能目前只有在使用 \DocumentMetadata
作为“标记”时才会激活。对于更新的文档,这意味着许多 LaTeX3 的想法已经被使用:编程层、文档命令的创建(原本来自 xparse 的 \NewDocumentCommand
)以及模板(最初来自 xtemplate 并用于更新列表代码等)。
内核中也有一些更微妙的变化,例如更新命令以使用 UTF-8,增强更多引擎鲁棒性等。综合起来,2024 年的 LaTeX2e 与 1994 年的版本相比,已经有了显著的变化,但你依然可以依赖 LaTeX 一直以来的长期稳定性。
虽然永远不会有一个独立的“ LaTeX3” 格式,但 1990 年代初期 LaTeX 项目团队首次探索的那些想法,现在已经在 LaTeX 内核中实现,并且被用于发布更新版的 LaTeX,能够生成可访问的文档,更广泛地将定制功能带入内核。因此,虽然你可能永远不会说自己在使用“ LaTeX3”,但如果你使用 LaTeX,你今天已经在使用这些功能了。