pdfLaTeX、XeLaTeX、LuaLaTeX、upLaTeX — 您应该使用哪一个?本页正是针对该问题的实用决策指南。它以建议开头,然后剖析推动选择的因素,最后以切换引擎的比较表和注释结束。
快速推荐
在详细介绍之前,这里是按目的进行的首选选择 - 对于大多数人来说,这些就足够了。回想一下“LaTeX 格式”页面,每个名称都是一个引擎(处理程序)与格式(LaTeX,命令系统)的组合。下面我们通过您实际输入的命令(pdflatex 等)来给出它们。
- 西方文本(英语/欧洲语言),最简单的路径,最大的包兼容性→pdfLaTeX(
pdflatex)。它是 LaTeX 事实上的标准,拥有最多的文档和现有技术。 - 您想要使用系统的 OpenType 字体,处理 Unicode/多语言文本,并保持简单 → XeLaTeX (
xelatex)。fontspec使非日语多语言工作变得轻松。 - 系统字体和 Unicode 加上可编程、细粒度控制和面向未来 → LuaLaTeX (
lualatex)。您可以从 Lua 进行形状排版,LaTeX 团队将其视为未来标准。 - 日文→upLaTeX(
uplatex)是主流、安全的选择; LuaLaTeX + luatexja 是现代的 Unicode 本地路由(但速度较慢)。jlreq类适用于其中任何一个。
一句话:pdfLaTeX 适合西文,XeLaTeX 或 LuaLaTeX 需要系统字体或 Unicode,upLaTeX 或 LuaLaTeX 适合日文。 对于没有特殊要求的新项目,从 pdfLaTeX(西文)或 upLaTeX(日文)开始是安全的选择;如果您希望长期将所有内容统一在 Unicode 上,那么 LuaLaTeX 值得选择。
写作前五项检查
当您从提交的目标和源材料开始,而不是从个人品味出发时,引擎的选择会更安全。论文可能继承实验室模板,期刊论文可能需要类文件,技术手册可能由 CI 或读者的机器编译。在写第一个真正的段落之前检查这五点,这样你就可以避免以后重写几十页。
- 首先遵守提交目标:如果类文件或指令名称为
uplatex、pdflatex、lualatex或其他引擎,则使用它。 - 决定如何处理日语:继承的日语模板通常指向 upLaTeX;新的 Unicode/OpenType 设置指向 LuaLaTeX +
luatexja。 - 检查参考书目和索引工具:BibTeX 与 Biber 和 mendex 与 upmendex 影响
latexmk设置。 - 查看图形和字体:继承的 EPS 或 PSTricks 倾向于 DVI 路线,而 PDF/PNG 图形和 OpenType 字体则倾向于 pdfLaTeX、LuaLaTeX 或 XeLaTeX。
- 冻结构建:在
.latexmkrc或 README 中编写命令,以便协作者和 CI 可以重现相同的 PDF。
推动选择的因素
当快速答案不适合时——或者当您想知道原因时——这里一一列出了轴。他们中的大多数人都会回到引擎如何处理字体和字符编码。
字体。 pdfTeX 使用 TeX 的传统字体模型:TFM(TeX 字体规格)加上 Type1/PK 字体。它不能简单地指向安装在 OS 上的普通字体。 XeTeX 和 LuaTeX 的区别最为明显 - 它们可以直接使用系统上已有的 TrueType / OpenType 字体,通过 fontspec 包命名,例如\setmainfont{Times New Roman}。 fontspec 需要 XeTeX 或 LuaTeX;它在 pdfLaTeX 下不起作用。
Unicode 输入。 XeTeX 和 LuaTeX 内部是 Unicode-native,并按原样采用 UTF-8 源。 pdfTeX 也是如此,自 2018 年 LaTeX 版本使用 UTF-8 作为默认输入编码(因此不再需要 \usepackage[utf8]{inputenc}) - 但在内部它仍然映射到 8 位字体编码(T1 等),因此哪些字符起作用取决于您的 fontenc 和字体,并且您不能自由键入任意 Unicode 或直接CJK。对于轻松输入多语言文本和符号来说,XeTeX/LuaTeX 具有优势。
软件包兼容性。 这是人们忽略的实际陷阱。有些软件包是特定于引擎的。例如,fontspec 和 unicode-math 仅限 XeTeX/LuaTeX。相反,pstricks 在 DVI 路由的 pdfLaTeX 和 XeLaTeX 下工作,但通常不在 LuaLaTeX 下工作。 microtype(下)的部分内容也倾向于 pdfTeX/LuaTeX。不兼容性也以另一种方式运行:按照旧教程编写的源代码可能无法在较新的引擎上编译。基本规则是先检查您的模板或日志类需要哪个引擎。
速度。差异是真实且明显的。通常的排序是 pdfTeX 最快,XeTeX 居中,LuaTeX 最慢。 LuaTeX 承担启动 Lua VM 并通过 HarfBuzz 调整字体的开销,并且在大型、字体较多的文档上,它的运行速度比 pdfLaTeX 慢三倍以上(在简单文档上差距很小)。一次真正的写作过程涉及数百次重新编译,加起来就多了。
微型排版。 microtype 软件包的 字符突出 和 字体扩展 明显提升了西方文本的外观。这里的引擎差异很大:突出适用于所有三个,但仅在 pdfTeX 和 LuaTeX 上支持字体扩展,而不是 XeTeX。字间距和字距调整仅限 pdfTeX,禁用连字适用于 pdfTeX/LuaTeX,字母间距适用于所有三个。对于最佳的西方输出,pdfLaTeX 或 LuaLaTeX 是安全的选择。
图形/ PDF 功能和可编程性。 每个引擎都通过 graphicx 导入 PNG、JPEG 和 PDF,并且 \includegraphics 在它们之间的行为大致相同(pdfLaTeX 自动转换 EPS)。 LuaTeX 的独特优势是通过 Lua 进行控制:您可以连接排版通道,或读取外部数据来构建表格 - 这些在宏中是尴尬的。它还与包括 fontspec 和 unicode-math 在内的现代软件包堆栈完美搭配,这就是它被称为“面向未来”的原因。
CJK / 日语的特殊情况。 正确设置日语 — 垂直书写、换行规则 (kinsoku)、日语和西方文本之间的间距 — 需要专用的机器。长期默认的是 pTeX 系列引擎 (uplatex),它使用日语 JFM(字体规格),稳定且快速。现代替代方案 LuaLaTeX + luatexja 可以处理 Unicode 中的所有内容,并让您自由使用系统字体,但正如 TeX Wiki 明确指出的那样,排版时间比 XeLaTeX、upLaTeX 或 pLaTeX 更长(LuaJITTeX 回购时间约为 1.3 倍)。另请注意,直接 CJK 字体选择使用 luatexja-fontspec 而不是普通的 fontspec。 jlreq 类(基于日语排版的 JIS 要求构建)在 platex、uplatex 或 lualatex 下运行并自动检测引擎。专用的日语页面涵盖了其余部分。
用一个小的试用文件来决定
更改论文或提交草稿中的引擎可以同时移动字体、图形、参考书目和换行符,从而隐藏问题的原因。如有疑问,请在真正开始写作之前制作一个一页的试用文件,并使用候选引擎编译相同的材料。不仅检查它是否编译,还检查日志中的警告、PDF 中的字体嵌入、图形处理以及协作者是否可以重现这些步骤。
# 欧文の候補 / Western candidates
pdflatex engine-test.tex
lualatex engine-test.tex
xelatex engine-test.tex
# 日本語 upLaTeX の候補 / Japanese upLaTeX candidate
uplatex engine-test.tex
dvipdfmx engine-test.dvi- 如果目标模板存在,请使用该模板进行测试。空白文件成功并不能证明提交设置有效。
- 包括一张图、一个显示的方程和一项参考书目,因此该试验代表了真实手稿的缩影。
- 选择后,将引擎固定在
.latexmkrc或 README 中,并避免随意使用不同的引擎编译项目。 - 比较 PDF;如果换行符或字体不同,请在项目中留下选择的原因。
对照表
四个主要选择,沿着决定轴排列。命令名称是最左边的列。对于 microtype,突出和膨胀分别显示(破折号表示无支撑)。
| 命令 | Unicode / 系统字体 | microtype | 速度 | 主要用途 |
|---|---|---|---|---|
pdflatex | 否(TFM/Type1;UTF-8 输入正常,但映射为 8 位) | 突出 是 / 扩展 是 | 最快 | 西方违约;最广泛的兼容性 |
xelatex | 是(OpenType 直接通过 fontspec) | 突出 是 / 扩展 否 | 中间 | 轻松多语言 / OpenType |
lualatex | 是(fontspec,加上 Lua 控制) | 突出 是 / 扩展 是 | 最慢 | 现代/未来;日语来自 luatexja |
uplatex | 日语经 JFM(DVI 路线); UTF-8输入 | 数量有限,仅限西餐部分 | 快速地 | 日本报纸;稳定的默认值 |
将表格视为指南,而不是结论。 pdfLaTeX,搭配\usepackage[T1]{fontenc}以及合适的西文字体包,将多种欧洲语言完美地衬托在一起;即使在 XeLaTeX 上,microtype 突出仍然适用。少将其解读为“可以/不能”的二元关系,而更多地解读为努力与润色之间的平衡。
切换引擎注意事项
即使来自相同的源,中途切换引擎也可能会改变结果。以下是人们实际遇到的障碍。
字体和编码设置更改。 pdfLaTeX 主食 \usepackage[utf8]{inputenc} 和 \usepackage[T1]{fontenc} 在 XeLaTeX/LuaLaTeX 上是不必要的,通常被省略(它们内部是 Unicode);您可以使用 fontspec 和 \setmainfont 来代替。将 pdfLaTeX 前导码直接传递给 XeLaTeX 可能会产生警告或与字体相关的错误。
% pdfLaTeX 向け(旧来)/ for pdfLaTeX (traditional)
% \usepackage[utf8]{inputenc}
% \usepackage[T1]{fontenc}
% XeLaTeX / LuaLaTeX 向け / for XeLaTeX / LuaLaTeX
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes} % OS / TeX のフォントを名前で指定microtype 的行为有所不同。相同的 \usepackage{microtype} 在每个引擎上产生不同的效果 - 例如,在 XeLaTeX 上,字体扩展完全关闭。一旦移动到 XeLaTeX,在 pdfLaTeX 下调整的布局可能会略有变化(行长、中断位置)。
软件包可用性更改。 某些软件包在目标引擎上停止工作(或首先变得可用)。如果将基于 PSTricks 的图形移动到 LuaLaTeX,它们将不会运行(那里不支持 pstricks);相反,fontspec 和 unicode-math 在 pdfLaTeX 上不可用。期刊和出版商模板通常假定特定的引擎,因此首先遵循该引擎是安全的举措。
对于日语,整个 CJK-font 设置发生变化。 upLaTeX(pTeX 系列)和 LuaLaTeX + luatexja 在日语字体的命名方式及其嵌入方式方面有所不同。预计引擎迁移对日本文档的影响会比对西方文档的影响更大。有关具体的命令等效项,请参阅“编译命令”页面。