![LaTeX3 与纯 Lua](https://linux22.com/image/246130/LaTeX3%20%E4%B8%8E%E7%BA%AF%20Lua.png)
在过去的近两年里,我通过阅读这个网站学到了很多关于 LaTeX3(我之前认为它是一个过时的白日梦)和 LuaTeX(我之前完全不知道它)的知识。正如我所之前说过,TeX 本身是一种糟糕的编程语言,虽然是一个很好的排版引擎,但即使作为一个排版引擎,它受到限制作为一种语言。简而言之,我所说的这两种情况的意思是,它没有提供一种简单的方法来操纵它自己的数据表示。其他人则也有这个问题,有时它可以解决使用 LuaTeX,它为编程环境开放了很多内部功能。
据我了解,LaTeX3 还在 TeX 中提供了很多编程工具,目的是使软件包的创建和维护更加可靠。Joseph Wright 有解释了这个至少在一个地方(因此可能还有更多地方)。这些是“算法”工具,而 LuaTeX 开发的方向似乎是“数据结构”工具。当然,Lua 也是一种通用编程语言,因此也提供了非常好的算法工具。
我的问题:
既然有 LuaTex 可用,为什么还要使用 LaTeX3 编程而不是 Lua?
我知道 LuaTeX 现在处于实验阶段,但 LaTeX3 也是如此。我也知道,因此 LuaTeX 不一定会被“普通人”使用,但它是 pdfTeX 的最终继任者,pdfTeX 现在是主要 TeX 发行版中的默认引擎。由于 TeX 是一种糟糕的编程语言,LaTeX3 仍将遭受恼人的扩展问题、缺乏算术能力、变量差(或至少是穷人的变量)等问题。然而,Knuth 本人已经写过了如果有更好的语言可用,他会使用这种语言。现在“我们”正在将 Lua 插入 TeX 可执行文件中,似乎已经找到了这种替代方案(讽刺的是,该链接是关于基于 Python 的 PyTeX 的)。
既然这\directlua
是可行的,我不明白为什么将所有“函数”宏(不直接存储文本的宏)挂接到该原语中,然后在 Lua 中完成所有编程不是更好的选择。循环、变量、递归等都可以以一种易于理解的方式完成。LaTeX3 的开发中似乎投入了大量精力来管理编程语言及其使用。因此,我再次询问:
为什么要使用 LaTeX3 来编程?为什么不将其开发转变为用 Lua 编写的 LuaTeX 的 LaTeX 样式文档设计库的开发呢?
这向我提出了一个相关的问题:
LuaTeX 和 LaTeX3 的分离是否是 Ahmed Musa 在评论中描述的开发人员之间缺乏沟通的结果(或至少是产物)?这个答案? 这两个项目之间有何合作以减少重复工作?
(一个更奇特的想法是实现每一个就 Lua 和各种内部排版参数而言, TeX 是原始的,除了\directlua
它本身之外,因此完全将 TeX 的编程方面与排版方面分开。那么 TeX 本身将成为 LuaTeX 之上的“宏包”,人们将不再受其奇怪的设计选择的束缚。然而,对于为什么应该或不应该这样做,答案可能太长了,我无法要求。)
我个人并不认为这个网站的内容过于博客化,我希望其他人也同意这一点。至少,考虑到这里的专业知识的汇聚,这里似乎是提出问题的最佳场所。
我接受了 Frank Mittelbach 的回答,尽管所有答案都非常有用,因为我认为它最直接地触及了所有要点。有一件事是它和 Joseph Wright 的答案都没有直接说出来的,那就是 ConTeXt做至少在某种程度上可以进行 Lua 编程,但它并不能解决所有算法问题,因为 LuaTeX 实际上并没有重写 TeX 的底层,而是缝合了一个可以与它们交互的 Lua 层。
我想对我的问题的一行答案是,我对 LuaTeX 的期望比它的现实要宏伟得多,就像我的“幻想”想法一样。
答案1
(我想我可以被称为其中一个团队的成员;-) 这是我的观点)
我曾想过不参与这场争论,但或许,最终还是需要说些澄清的话,或者说,表达一些想法。
LaTeX3 与纯 Lua
首先,我认为这是一个错误的问题:LaTeX3 与 LuaTeX 有不同的目标,这些目标很可能仍然是一个未实现的白日梦,但如果是这样,它们也不太可能通过纯 Lua 来解决。
因此,如果有人想沿着这样的思路展开争论,那么它应该更像是“为什么 LaTeX3 使用基于 eTeX 的底层编程语言,而不是基于 LuaTeX,因为 LuaTeX 的很多功能可以以“更简单”的方式提供?”
但 LaTeX3 实际上有三到四个不同的级别
- 底层引擎
- 编程级别
- 排版元素层
- 设计器界面基础层
- 文档表示层
例如请参阅我在 TUG 2011 上的演讲:http://www.latex-project.org/papers/
以下是架构结构的草图:
所选的底层引擎(目前是任何带有 e-TeX 扩展的 TeX 引擎)。编程级别是我们所说的“expl3”,如果您说“LaTeX3”,我猜您指的是这个(我有时也会这么说)。但是,它只是上图中的底部框。更有趣的部分是那些高于编程级别的部分(很大程度上是一个白日梦,但现在编程级别的基础已经稳定,进展顺利)。而对于这部分,没有与 Lua 进行比较。
既然有 LuaTeX 可用,为什么还要使用 LaTeX3 编程而不是 Lua?
要构建上层,极其重要的是要有一个稳定的底层基础。正如@egreg 在聊天中提到的:将 2.09 中的软件包情况与 2e 中的软件包情况进行比较。一旦有了标准协议来构建和接口包,生产力就会大大提高。然而,2e 中的底层编程水平过去和现在仍然是一团糟,这使得很多事情变得非常复杂,而且往往无法以可靠的方式完成。因此需要一个更好的底层编程层。
但是,该编程层建立在 eTeX 上,并不是因为 eTeX 是更优秀的引擎(它与 TeX 相比,但与其他扩展(无论是 Lua 还是其他引擎)相比并不相同),而是因为它是一个随处可用的稳定基础。
因此,eTeX + expl3 是 LaTeX3 团队可以依赖的编程层,不会进一步开发和更改(除了我们)。它也是 TeX 世界中每个人都可以立即使用的基础,具有与所有正在使用的引擎都实现 eTeX 扩展相同的功能级别。
任何对底层引擎进行更大程度的修改/改进都会妨碍构建上层。确实,有些事情可能行不通,有些事情可能更难解决,但我们正在研究的任务(嗯,我正在研究)大多数与该层非常独立。
举几个例子:
自动进行复杂页面布局的良好算法尚不存在(作为算法),因此 Lua 不会在这里帮助您,除非有人先提出这样的算法。
像“棺材”这样的东西,是在思考如何接近“设计”,这里的重要性在于如何思考它,而不是如何实现它(这是其次的)——参见有没有更简单的方法来浮动对象和设置边距?或者LaTeX3 和穷人的棺材举些例子
话虽如此,一旦 LuaTeX 变得与 eTeX 类似(或至少是 LuaTeX 的一个子集),就有充分的理由替换底层引擎和程序层实现。但这不是重点(目前)。
为什么要使用 LaTeX3 来编程?为什么不将其开发转变为用 Lua 编写的 LuaTeX 的 LaTeX 样式文档设计库的开发呢?
有可能。但前提是“LuaTeX”不再是移动目标(因为上面的 LaTeX3 已经足够成为移动目标了)。
旁注:@PatrickGundlach 在他的回答中推测,LaTeX3 的目标是向后兼容。错误的。那些在 LaTeX2e 兼容性问题上对你大加指责的人在这里却有不同的想法。我们不相信 2e 无法解决的有趣开放问题能够以任何形式或形式通过文档兼容的方式用 LaTeX3 解决。
输入兼容:可能。但是对于旧文档的输出兼容性,如果你想做正确的事情,那就没有机会了。
但无论如何,这并不是支持或反对有朝一日使用 LuaTeX 引擎实现我们正在研究的想法的论据。
LuaTeX 和 LaTeX3 的分离是否是 Ahmed Musa 在该答案的评论中所描述的开发人员之间缺乏沟通的结果(或至少是产物)?这两个项目之间有什么样的合作来减少重复劳动?
正如我试图解释的那样,一开始就没有太多的重叠。在 ConTeXt 即 LaTeX 层面上,概念思想的重叠要多得多。
一个更加奇妙的想法是,除了 \directlua 本身之外,用 Lua 和各种内部排版参数来实现每个原语,从而将 TeX 的编程方面与排版方面完全分离。
这将我们带入一个完全不同的讨论层面,即基于 LuaTeX 或其他任何东西,可能是一种完全不同的排版引擎方法吗?这是一个非常有趣的想法,但正如 @Patrick 所解释的那样,让 TeX 进行排版,并用另一种语言完成其他所有工作,并不意味着一切就此结束。到目前为止,无论是 NTS 还是其他任何概念,这些概念都失败了,因为从根本上说(我认为),我们还没有掌握如何为 TeX 宏方法提出一个成功而不同的模型(尽管在某些地方看起来很丑陋)。
答案2
Patrick 和 Frank 都给出了很好的答案:我想补充一些补充观点,这些观点似乎太长了,不适合评论。
其中一个重要方面expl3
是,它可以用于现在编写 LaTeX2e 软件包(“l3in2e”方法)。例如,我自己的siunitx
软件包就是一个例子,我不想让它只支持 LuaTeX。一个特别重要的方面是xparse
,它被证明受到相当多用户的欢迎,这些用户可能并不关心编程内部原理。LaTeX3 代码的这种使用取决于能否与目前可用的各种引擎一起使用。
第二个方面是 LuaTeX 并不意味着您根本不需要 TeX 编程。TeX 仍然在进行排版,但也会进行参数抓取之类的操作。(关于后者,我曾就此问题询问过 ConTeXt 人员,因为我对旧的参数逐字问题感到疑惑。)因此,即使您决定只使用 LuaTeX,改进 TeX 编程仍然是一个好主意。现在,在这种情况下,您需要的结构的性质无疑会有所不同,但您也不能简单地忽略它。
最后,还有一些实际的考虑。很多工作expl3
是在 LuaTeX 开始之前完成的,或者肯定是在它开始达到更稳定的状态之前。所以expl3
现在从 Lua 迁移到 Lua 并不会真正减少我们需要做的工作今天,正如 Frank 所说,这主要是关于更高层次的问题。在我看来,需要做的很多事情似乎与语言的选择相对不敏感:切换到 Lua 似乎不太可能会突然加速开发。
答案3
(我不是任何一个队的成员,这是我的观点。)
LaTeX3 不仅提供了更好的输出例程,还提供了编程工具,例如著名的快速排序算法(参见l3prg.sty
)。显然,用 Lua 编写会更好(对于我们大多数人而言)。或者考虑字符串操作/正则表达式。这也可以在 Lua 中处理。但严格来说,并不需要 Lua 来实现这一点。
为什么要使用 LaTeX3 来编程?为什么不将其开发转变为用 Lua 编写的 LuaTeX 的 LaTeX 样式文档设计库的开发呢?
据我了解,LaTeX3 的主要目标之一是保持向后兼容性。虽然其他文档方法在当今世界肯定很受欢迎(例如使用 CSS 格式的 XML 排版),但它们会破坏现有文档。这不是 LaTeX3 团队想要的。
这两个项目之间有什么样的合作以减少重复工作?
我看不出这两个项目之间有多少交流。LaTeX3 旨在“与所有具有 eTeX 扩展的引擎一起工作”。这意味着不必使用任何特定于引擎的代码(即:在不同引擎下表现不同的功能)。因此,显然不需要 LuaTeX 特定代码。
一个更加奇妙的想法是,除了 \directlua 本身之外,用 Lua 和各种内部排版参数来实现每个原语,从而将 TeX 的编程方面与排版方面完全分离。
Lua 不进行任何宏扩展/替换,您需要 TeX 来实现。不可能将所有工作委托给 Lua,您需要 LuaTeX 的 TeX 部分。
另一方面,LaTeX 和 Lua 都提供控制结构,例如循环或 if/then/else 子句(LaTeX3 甚至更多)。因此你根本不需要 Lua。如果你混合使用 Lua 和 TeX 的控制结构,编程会变得丑陋,因为你需要在 TeX 和 Lua 之间来回切换。目前这只能通过协程但将来可能会更容易。
LuaTeX 在 LaTeX 中的强大功能在于对(预)排版材料的操作。
答案4
如果我有办法,我会喜欢一个全新的系统,采用经过深思熟虑的作者方法、模板设计器方法和程序员方法。重要的是,任何新系统都必须得到所有人的认可,作为前进的方向,并且新系统必须能够完成用户今天使用 LaTeX 可以做的任何事。也就是说,它需要访问现有 LaTeX 和 CTAN 的所有排版功能和特性。
在其首次出现时,它应该已经编译到 LaTeX 本身中。如今,我们有足够的处理能力来接受这种额外的阶段实现。最终,随着几十年的流逝,核心部分将被替换,TeX 内部结构本身也将淡出历史,取而代之的是更直接的排版引擎。
唉呀,事情并非如此……