为什么现代 TeX 变体不支持浮点运算?

为什么现代 TeX 变体不支持浮点运算?

我知道,在 TeX 被设计出来的时候,并没有一个浮点计算的单一标准。但是,现在有了 IEEE 754。为什么没有任何 TeX 变体支持它?

诚然,有 LuaTeX,但 IEEE 754 早在其之前就很流行了,所以这个问题是合理的。

答案1

回答这样的问题很困难,因为“为什么不”的记录通常比“为什么”的记录更难获得。然而,我们可以重建一个合理的事件链。

Knuth 编写 TeX 是为了解决一个特定问题:排版计算机编程艺术虽然他确实使 TeX 成为图灵完备的,但他创建文档的模型非常接近于 TeX 输入与排版:查看源代码TeXbook例如,显然存在一种“解析”信息的方法。Knuth 的用例也基本上不是那些可能使用 FPU 之类的东西的用例。因此,他没有在这个领域扩展 TeX 也就不足为奇了。

(这与提及向后兼容性一样重要。添加新的原语总是有可能破坏某些东西,正如某些用户无疑会\fpexpr自己定义的那样。但是,像 TeX90 这样的档案稳定产品中更大的风险是任何更改都可能在其他地方带来新的错误:“如果它没有坏,就不要修复它”是一个指导思想。)

Knuth 之后的引擎开发人员都有他们感兴趣的特定问题。至关重要的是,这些问题往往是我们不能很容易在排版本身之外解决。浮点工作实际上不属于该范围:对于任何“严肃”的东西,人们可能合理地期望在专业工具中进行预处理。

如果我们回顾一下引擎开发的主要努力,我们就会发现,将添加 FPU 作为特定目标的可能性不大。按照大致的时间顺序来看这些想法

  • e-TeX 增加了一些支持 TeX 编程的通用思想(\protected、新的寄存器范围、ETC。) 是基于 TeX90 中已有的思想构建的。这里至关重要的是,虽然\numexpr添加了 等,但它们提供了一些运算符(+-*/, ),只有括号()不直接映射到现有的原语。FPU 必须覆盖更多
  • e-TeX 还添加了“接近”排版的代码,例如将寡妇/孤儿控制扩展到多行,添加\middleETC。:所有这些都离所需的 FPU 支持非常遥远
  • pdfTeX 添加了直接 PDF 输出,同时还包含各种实用程序附加功能,其中大多数都是来自支持库的想法的琐碎展示(例如经过的时间)
  • XeTeX(及之前的项目)扩展了 TeX 以支持 Unicode:专注于字符范围,并包括处理各种脚本的想法
  • XeTeX 还增加了对系统字体的支持:同样,与 FPU 工作无关
  • LuaTeX 完成了上述工作,并使用 Lua 公开了 TeX 的内部结构:添加 FPU 是集成后者的结果,但并不是这些努力的主要驱动力

因此,总的来说,我们可以看到,对于实际从事引擎工作的人来说,在 LuaTeX 之前没有明显的地方可以添加 FPU。此外,用户社区也几乎没有推动。人们可以在宏中执行一系列近似操作,例如,请参阅包trig,它将支持浮点数以进行一般排版。做更复杂的工作往往最好被视为专业工具的工作:排版好看的结果很棒,但如果你想做更多的分析,你可能需要一种交互式的方法。诸如此类的包pgfplots确实使使用 TeX 进行这种类型的工作变得更容易(这是我的工作流程),但在人们可能指出的一系列复杂排版挑战之外,FPU 支持相当小众。

(我认为还值得注意的是,如果没有一些库支持,实现全方位的 FP 函数将不是一件容易的事:这是我的l3fp工作经验。这项工作对引擎开发专家的吸引力可能不大:在宏观层面上进行这项工作是一项有趣的智力挑战!)

答案2

归根结底,这是为了打破向后兼容的神圣性,Donald Knuth 本人在视频中对此进行了很好的解释。稳定性对于 TeX 的重要性

相关内容