LaTeX 格式

pdflatexlualatexplatex……命令名称看起来很相似,容易造成混乱,但每个命令实际上都是 “格式”和“引擎”的组合。 格式是预编译的宏包;引擎是实际运行它的程序。 LaTeX 就是这样一种格式,它运行在几个不同的引擎之上。此页面沿着该轴对 LaTeX2e、pLaTeX/upLaTeX、LuaLaTeX 和 XeLaTeX 进行排序。

格式与引擎

引擎是读取 .tex 文件并对其进行排版的可执行文件(TeX、pdfTeX、XeTeX、LuaTeX、e-pTeX 等)。相比之下,格式是宏的巨大集合 - \documentclass\section 和其他宏 - 提前读入并预编译到单个转储(.fmt 文件)。启动时,引擎会立即加载 .fmt,从而避免每次运行时重新定义每个宏。

所以“LaTeX”是格式的名称,而不是引擎的名称。相同的 LaTeX 格式可以在不同的引擎上运行,并且您键入的命令会编码您想要的引擎+格式pdflatex表示“pdfTeX引擎+LaTeX格式”; lualatex 的意思是“LuaTeX 引擎 + LaTeX 格式”。

LaTeX 不是唯一的格式。 Knuth 自己的基本 plain TeX 和 ConTeXt 完全是其他格式。此页面缩小到最广泛使用的一个 - LaTeX - 并逐步介绍您可以运行它的主要引擎。

LaTeX (2e)

今天,“LaTeX”几乎毫无例外地意味着LaTeX2e。它是 Leslie Lamport 的 LaTeX 宏的当前版本,现在由 LaTeX 项目维护,于 1994 发布。 2e 意味着对早期 LaTeX 2.09 的“小修改”,这是向长期计划的 LaTeX3 迈进的一个临时步骤。

但 LaTeX3 从未作为一个独立的新内核实现;相反,它的工作作为 expl3(LaTeX3 编程层) 分层在 LaTeX2e 之上。自 2020 expl3 默认情况下作为格式的一部分加载以来,它越来越多地在内核内部使用来实现新功能。结果是:我们仍然每天运行普通的 LaTeX2e,但其内部结构不断通过 LaTeX3 技术进行现代化改造。

LaTeX2e 内核现在定期每年两次(大约六月和十一月)更新。最新的稳定版本是 2025-11-01(于 2025 年 11 月发布),下一个稳定版本的开发预版本 2026-06-01 已经在进行测试。创作模型是一致的:选择顶部带有 \documentclass 的文档类,在前导码中进行包加载和配置,直到 \begin{document},然后编写正文 - 熟悉的“类 + 前导码”模型。

pdfTeX 引擎上运行这种格式是最经典、标准的配对。相同的 pdfTeX 按输出目标分为两个命令:latexDVI 模式下运行 pdfTeX 并发出中间 DVI 格式(稍后通过单独的工具转换为 PDF),而 pdflatex 让 pdfTeX 直接发出 PDF。对于当今主要是西方文本的文档,pdflatex 是事实上的默认值。

pLaTeX / upLaTeX

pLaTeXupLaTeX 将 LaTeX 格式放在为日语排版构建的引擎上。日本特有的工作——竖写、注音(注音)、日文行文——由 pTeX 系列引擎处理,最初是在 ASCII Corporation 扩展的。在当前的 TeX Live 中,platexuplatex 都在 e-upTeX 基础上运行,但 platex 保留 pLaTeX 兼容的字符处理,而 uplatex 作为面向 Unicode 的 upLaTeX 格式运行。

该系列 始终输出 DVI,然后使用 dvipdfmx 将日语轴承 DVI 转换为 PDF — 一个两步管道(uplatex file.tex 后跟 dvipdfmx file.dvi)。将其与 upmendex 配对以获得日本索引。对于文档类,Haruhiko Okumura 的 jsarticle/jsbook(用于 pLaTeX)及其 Unicode 对应项(例如 ujarticle)很常见,最近的 JIS X 4051 一致 jlreq 也是如此。

platexuplatex 之间的区别较少是可执行基础,而更多的是 格式级字符处理platex 保留传统的 pTeX 样式行为,以向后兼容 pLaTeX 资产。 uplatex 假定 Unicode 并可以很好地处理日语与朝鲜文或西里尔文的混合。对于新的日语论文,uplatex 是标准选择。

何时使用它:当日本社团或出版商为 pLaTeX 提供类或风格时,或者当您想要 pTeX 成熟的日语作文(竖写等)时,pLaTeX/upLaTeX 是不错的选择。相反,如果您想按原样使用系统字体或直接倒入 Unicode,则 LuaLaTeX-ja (如下)更适合。

LuaLaTeX

LuaLaTeX 将 LaTeX 格式放在 LuaTeX 引擎上;命令是 lualatex。 LuaTeX 是一个源自 pdfTeX 的引擎,它直接处理 Unicode 输入,并且可以加载通过 fontspec 包安装在 OS 上的 OpenType / TrueType 系统字体。它直接生成PDF,没有中间格式。

顾名思义,其特点是Lua 脚本语言嵌入在引擎中。使用 \directlua{...},您可以编写 Lua 来深入 TeX 的内部,从而使曾经困难的扩展变得更加容易。日语排版由 luatexja 包处理,提供与 pLaTeX 同等的组合,同时保留系统字体和 Unicode。

这种现代性就是为什么 LaTeX 团队越来越多地指出 LuaLaTeX 作为现代引擎,并推荐它作为新项目的默认引擎。它的缺点是速度:编译比 pdflatexxelatex 更重(有时大约比 XeLaTeX 慢两倍)。如果您想要一个能够处理日语、多语言文本、精细字体处理和编程排版的引擎,LuaLaTeX 是第一个候选者。

XeLaTeX

XeLaTeX 将 LaTeX 格式放在 XeTeX 引擎上;命令是 xelatex。与 LuaLaTeX 一样,它支持 Unicode 输入 和通过 fontspec 直接使用系统字体。对于输出,它通过其内置的 xdvipdfmx (从 dvipdfmx 派生的驱动程序)生成 PDF

XeLaTeX 的优点是简单。对于“我只想使用我的系统字体”,它往往比 LuaLaTeX 更容易配置并且编译更快。它的字体选择感觉与操作系统自己的字体名称查找很接近,因此尝试一个又一个字体名称很简单。另一方面它缺乏Lua的深度可编程性,新开发的重心已经转移到LuaTeX。

命令备忘单

即使使用相同的 LaTeX 格式,命令名称也决定了其背后的引擎、输出格式以及字体的工作方式。在下表中,从命令名称开始从左到右阅读。

命令引擎输出Unicode / 系统字体
latexpdfTeX(DVI模式)DVI → 需要转换否(需要输入等)
pdflatexpdfTeXPDF(直接)否(需要输入等)
platexe-upTeX(pLaTeX 兼容性运行时)DVI → dvipdfmx日本人;旧字体
uplatexe-upTeXDVI → dvipdfmx内部Unicode;旧字体
lualatexLuaTeXPDF(直接)是 — fontspec / luatexja
xelatexXeTeXPDF(通过 xdvipdfmx)是的 — fontspec

从实际命令来看,发出PDF的引擎直接一步完成,而基于DVI的引擎则增加了一个转换步骤。

terminal
# pdfTeX: PDF を直接出力 / emits PDF directly
$ pdflatex main.tex      # → main.pdf

# LuaTeX: PDF を直接出力 / emits PDF directly
$ lualatex main.tex      # → main.pdf

# upLaTeX: DVI を出力し、dvipdfmx で PDF へ変換
# upLaTeX emits DVI, then dvipdfmx converts to PDF
$ uplatex main.tex       # → main.dvi
$ dvipdfmx main.dvi      # → main.pdf

选择哪一个

下面是一个粗略的指南。详细的标准——速度、包兼容性、日本情况等等——在“选择引擎”页面上进行了探讨。

  • 主要是西方文本,快pdflatex。最成熟,具有最广泛的软件包支持。
  • 日语论文/所需的现有课程uplatex(或需要时 platex)。 DVI → dvipdfmx
  • 现代万能引擎,包括日语lualatex。 Unicode + 系统字体 + luatexja
  • 轻松使用系统字体xelatex。配置简单,编译速度更快。

选择后,将其冻结在项目中

发动机的选择不能随心情而改变。对于论文,一旦标题页、目录、图、表格和参考书目正确构建,将构建过程冻结在 README 或 .latexmkrc 中。将文档从 lualatex 中途移动到 uplatex 会同时更改字体选择、日语处理、PDF 路线以及通常的参考书目处理。如果您要切换,请先测试小样本中的每个功能,然后再返回完整的手稿。

冻结时,不仅要记录命令,还要记录日志的第一行This is LuaHBTeX ...This is XeTeX ...This is e-upTeX ... 等行显示了实际的发动机和 TeX Live 年份。在协作中,当“同一命令”给出不同的输出时,比较这一行可以快速将编辑器设置问题与 TeX Live 或格式差异分开。