Don Knuth 在开发 TeX 时的主要目标之一(除了创建高质量文档这一显而易见的目标之外)是 100% 的平台独立性。在一个系统上生成的文档应该总是在任何机器上编译时总是完全相同。换行符或分页符绝不应该被改变。因此,TeX 程序的编写非常谨慎,以确保绝对不会访问任何内部使用的浮点值,并且那些实际上可能使用平台相关代码的部分不会影响排版。
现在,据我所知,这个目标在 XeTeX 中被打破了,因为它将“单词”交给了底层依赖于平台的字体机制,然后从那里取回字体字形和相对水平和垂直位置。然后使用它们来计算换行符,这样就可以生成示例,其中文档在从一个平台移动到另一个平台时会显示不同的换行符和/或分页符。
我不知道 LuaTeX 如何实现 Opentype 支持,也许这里的方法不同。但对于 LuaTeX,我相信平台依赖性可能通过访问或多或少通用的 TeX 内部可访问性发挥作用(即使是 Don 故意因为使用浮点算法而保持不可访问的那些)。
所以我的主要问题是:我的理解正确吗?
那么子问题将是:
- 有人经历过 XeTeX 的平台依赖性吗?
- LuaTeX字体支持同样的“危险”吗?
答案1
LuaTeX OpenType 支持完全使用 Lua 代码实现(正如 Khaled 所写),这意味着只要使用相同的字体文件,它就与平台无关。
但请注意,这通常是仅有的字体属于可移植 TeX 发行版(如 TeXLive)的情况。LuaTeX 还允许使用系统安装的字体,这些字体通常不仅在竞争操作系统之间略有不同,而且在某个特定操作系统的不同版本(甚至更新)之间也略有不同。
LuaTeX 不使用任何系统字体库,甚至不使用字体配置。
无论如何,如果满足以下条件,LuaTeX 文档应该是独立于平台的:
- 底层平台提供 IEEE754 双精度浮点数以及 64 位整数值(但如果没有这个,luatex 可执行文件可能甚至无法编译。xetex 和 pdftex 也不会)。
- 所有使用的运行时(TeX、Lua、字体、模式等)文件都是相同的。
- 没有使用明确执行与平台相关的操作的 Lua 或 TeX 代码。
最后一点很难给出明确的答案。然而,这种情况对于 pdfTeX 甚至传统 TeX 都同样存在。在 LuaTeX 中这一点更明显,但在 LuaTeX 中编写与平台相关的文档并不难任何其他 TeX 和类 TeX 引擎。
答案2
在引擎层面,LuaTeX完全独立于平台。OpenType 字体处理不是由引擎本身完成的,但它为宏包提供了足够的钩子和模块,以便宏包自己实现它。
- ConTeXt 实现了其 OpenType文本布局和字体管理完全用 Lua 编写,因此它也依赖于平台。
- LuaLaTeX 以其文本布局来自 ConTeXt 的代码及其自己的字体管理(在 Lua 中也是如此),因此同样适用。
- 其他宏包可以使用其中任意一个或者自己编写。
在特克斯所有字体处理都由引擎本身完成:
- 字体管理(搜索和定位系统范围的字体)部分依赖于系统,它使用 Mac 上的 Apple 特定 API 和 FontConfig 来列出和定位字体。
- 开放类型和石墨文本布局由外部跨平台库完成(在 TeX Live 中,它们静态链接到二进制文件)。航空空运文本布局仅可通过 Apple API 在 Mac 上使用,因为它是一项 Apple 独有的技术,没有跨平台实现。
- XeTeX 使用外部库实现其他功能,例如单词之间不使用空格的脚本的换行、字体映射和输入编码。
答案3
Knuth 为保留行和分页符花了很多心思。但是(冒着劫持此主题的风险)我认为,现在保持精确分页的重要性已经不如 30 年前了。现在更重要的是拥有一个可以随时重新排列并可在不同设备上使用的结构化文档。值得庆幸的是,TeX 现在可能也是最结构化的书写系统。:-)
因此,我们或许应该更多地关注内容的结构和可重用性,而不是它在不同设备上的呈现一致性。
答案4
Knuth 担心任何明确称自己为“TeX”的程序都应该通过测试。但 XeTeX 和其他程序并不称自己为“TeX”。作为 TeX 的近亲,人们当然对通用行为有所期待。但 XeTeX 具有许多 TeX 所不具备的重要功能,因此它当然在这些方面不符合 TeX 标准。具体来说,使用 XeTeX 扩展的文档(例如 Unicode 输入)在 TeX 中会出错,但在 XeTeX 中编译时却非常完美。
因为它们不假装是 TeX,所以 XeTeX 和 LuaTeX 不受任何道德要求,可以产生与 TeX 相同的输出,或者通过旅行测试。