LuaTeX 是一个 TeX 引擎,它扩展了 pdfTeX 并嵌入了 Lua 脚本语言。您可以在排版中调用 Lua 程序,并直接进入 TeX 构建的材料 - 正是这种开放性使其被广泛视为 TeX 的未来。您将其调用为 lualatex,它会本地处理 Unicode 和 OpenType 字体。
LuaTeX 是什么
LuaTeX 由 Taco Hoekwater、Hartmut Henkel、Hans Hagen 等人开发。它脱胎于 ConTeXt 和东方 TeX 世界,目标是“开放且可配置”的 TeX,建立在 pdfTeX 的基础上,同时保持向下兼容性。因为 pdfTeX 是它的基础,所以它直接输出 PDF 并继承 e-TeX 扩展和 pdfTeX 的大部分排版机制。
现在,大部分 pdfTeX 遗产都是通过三个接口原语(\pdfextension、\pdfvariable 和 \pdffeedback)实现的,它们采用关键字和参数,因此可以在不调整核心引擎的情况下扩展功能。在日常使用 LaTeX 包中可以消除这种差异,因此您很少手动编写这些原语。
另一个支柱是嵌入式 Lua 5.3 解释器。将 \directlua{...} 写入 .tex 文件中,其中的 Lua 代码立即运行。输入本身是 UTF-8。对于字体,您可以直接使用 fontspec 选择系统或 OpenType 字体,就像在 XeTeX 中一样 — 但加载是由 LuaTeX 自己的基于 Lua 的加载器 (luaotfload) 完成的。
将 Lua 嵌入文档中
\directlua{...} 立即运行 Lua 代码。从 Lua 中,您调用 tex.print(...),其输出会反馈到 TeX 的输入流中并照常排版。这是一个可以使用 lualatex 编译的最小文档:它使用 Lua 计算 2 的 10 次方并将结果放入文本中。
\documentclass{article}
\begin{document}
Two to the tenth power is
\directlua{tex.print(2^10)}.
\end{document}编译这个集合“二的十次方是 1024”。相反,同级命令 \latelua{...} 当它所在的页面被运出时运行。这适合必须等到页码和最终坐标确定后的工作——例如在 PDF 上绘图或附加注释。
由于原始 \directlua 对大括号和特殊字符很挑剔,因此实际上 luacode 包及其 luacode 环境允许您逐字安全地编写更长的 Lua 代码。
回调——挂钩排版
LuaTeX 的真正威力在于它的回调。 TeX 用节点构建文本 - 字符、框和粘合(可拉伸空间)串成链接列表 - 并且通过注册回调,您可以在每个这样的时刻调用自己的 Lua 函数,可以自由地检查和重写该节点列表。实际上,您可以安全地进入发动机内部。
常用的回调包括以下几种。每次 TeX 读取输入行时,process_input_buffer 都会触发,接收字符串并返回字符串。 pre_linebreak_filter 为您提供节点列表就在段落被分成几行之前,而 post_linebreak_filter 则为您提供列表就在之后。 ligaturing 和 kerning 对应于连字和字距调整构建阶段。
| 打回来 | 当它着火时 |
|---|---|
process_input_buffer | 当读取每个输入行时;用于预处理 |
pre_linebreak_filter | 段落被破坏之前的节点列表 |
post_linebreak_filter | 换行后的节点列表 |
ligaturing / kerning | 连字和字距调整阶段 |
您可以通过 Lua 中可见的一组表来驱动这些操作。 tex 是 TeX 内部状态(寄存器和维度)的窗口,node 创建、遍历和释放节点,token 处理标记(TeX 的最小含义单位),font 处理字体数据,status 处理运行时信息。即使像 luaotfload 这样的高级字体机制也是在这些之上用 Lua 编写的。
字体 — 使用 fontspec 选择它们
与 XeTeX 一样,在 LuaTeX 中加载 fontspec 包可以让您直接命名系统上安装的 OpenType / TrueType 字体。 \setmainfont 选择正文字体,\setsansfont 和 \setmonofont 用于无衬线和等宽字体。
\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\begin{document}
This text is set in an OpenType font, with ligatures like ffi.
\end{document}luaotfload 在幕后进行加载。它是 ConTeXt 的 Plain TeX 和 LaTeX 字体加载器的改编版,公开了 OpenType 功能,例如连字、旧式数字和小写大写字母;它旨在与 XeTeX 兼容,并由 LaTeX 团队的 Latex3 小组维护。
在当前发行版中,lualatex 命令实际上调用 LuaHBTeX,这是嵌入 HarfBuzz 的 LuaTeX 变体(自 TeX Live 2020 年起捆绑)。这将复杂脚本(阿拉伯语、印度语等)所需的成形机制置于引擎本身内部。
内置 MetaPost
LuaTeX 内置 MPlib - 将 MetaPost 绘图引擎打包为库 - 因此它可以在与编译相同的过程中生成 MetaPost 图形,而无需调用外部程序。从 LaTeX 开始,luamplib 包公开了这一点,让您可以直接在 mplibcode 环境中编写 MetaPost 代码。
日语 — LuaTeX-ja
日语排版由 LuaTeX-ja (包 luatexja)处理。它通过回调在 Lua 端重新实现了 pTeX 所拥有的日语排版技术 — 垂直书写、由 JFM(日语字体规格) 驱动的字符间距和标点符号处理,以及日语和西方文本之间的间距。这开辟了一条通往日语 LaTeX 的现代路线,与 pLaTeX/upLaTeX 不同。
使用 luatexja-fontspec,您也可以选择 fontspec 风格的日文字体。 LuaTeX-ja 需要 LuaTeX 1.10.0 或更高版本以及相当新的 luaotfload。如果 pdfLaTeX 一侧的 upLaTeX 是“成熟标准”,那么 LuaLaTeX 与 LuaTeX-ja 是今天重新开始时的明智选择。
需要注意的是:LuaHBTeX 的 HarfBuzz 整形和 LuaTeX-ja 的垂直书写/CID 机制应该仔细组合。 LuaTeX-ja 手册警告说,通过 HarfBuzz 定义的日语字体可能会产生不需要的结果。对于日语散文,首先使用 TeX Live 捆绑的 Harano Aji 字体和标准设置构建 PDF;在手稿中使用 OpenType 功能或 HarfBuzz 选项之前,仅在小测试中引入它们。
LuaJITTeX 和 LuaMetaTeX
LuaJITTeX 是链接 LuaJIT(一种在运行时将代码转换为机器代码的即时编译器)的变体,而不是普通的 Lua。 Lua 运行速度更快,但 LuaJIT 仍然固定在 Lua 5.1 语言级别(主线 LuaTeX 为 5.3)并且维护较少。除了 Lua 执行量非常大的特殊情况外,大多数用户都可以使用普通的 LuaTeX 得到很好的服务。
另一个后继者是 LuaMetaTeX,它是对 LuaTeX 的精简改造——“精简而平均”——支撑着现代 ConTeXt (LMTX / MkXL)。它带来了新的数学排版和许多新的基元,采用Lua 5.4线,自2023年起以TeX Live发货。分工:LuaTeX用于LaTeX工作,LuaMetaTeX用于最新的ConTeXt。
权衡
XeTeX 和 LuaTeX 都处理 Unicode 和 OpenType,但它们的字符不同。 XeTeX 依靠操作系统的文本布局机制来提供便利,而 LuaTeX 则更加灵活,因为一切都可以从 Lua 控制。代价是它在历史上一直比 XeTeX 稍微慢一些(近年来差距已经缩小)。
- 首先是 Unicode / OpenType。 UTF-8 输入和
fontspec是标准。 - 可编程。 使用 Lua 和回调,您可以进入排版本身。
- 独立。 MetaPost (MPlib) 是内置的,因此图形不需要外部调用。
- 支持日语。 LuaTeX-ja 提供完整的日语排版、垂直书写和 JFM。
- 具有前瞻性。 LaTeX 团队以 LuaTeX 为目标进行新开发。
总体而言,LuaLaTeX 正在成为新 Unicode / OpenType 工作流程的默认设置,其中可编程性很重要。旧的划分仍然保留:XeLaTeX(如果您只是想要简单的字体),pdfLaTeX(用于快速的主要是英语的工作)。选择哪个引擎位于“选择引擎”页面上。
启动 LuaLaTeX 文档
如果您选择 LuaLaTeX,请从 Unicode 源、fontspec 开始,对于日语,则从 luatexja 开始。在保留 pdfLaTeX-era inputenc / fontenc 的情况下进行迁移会产生警告和重复的字体设置。首先制作一个小样本,练习正文字体、日语字体、数学和参考书目,然后将其用作手稿模板。
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec}
\setmainjfont{Harano Aji Mincho}
\setsansjfont{Harano Aji Gothic}
\begin{document}
LuaLaTeX で日本語の本文と数式 $E=mc^2$ を同じ経路で組みます。
\end{document}该示例使用 TeX Live 附带的 Harano Aji 字体,因此它不依赖于 OS 特定的字体。对于协作和 CI,首先确保 PDF 使用此类捆绑字体进行构建,然后仅在需要时切换到实验室或出版商所需的字体。