编译命令

要把 .tex 文件变成 PDF,需要在终端运行编译命令。pdflatexlualatexxelatexlatex,以及日文用的 platex / uplatex 都是“LaTeX”,但你选择的命令会决定底层运行的 引擎,进而决定输出格式(PDF 还是 DVI)以及可用的字体和字符范围。本页是各命令的实用地图,也列出实际会输入的常用选项。

命令名选择引擎

LaTeX 是 格式(命令体系),实际处理它的 引擎(程序)是另一回事。命令名表示两者的组合:pdflatex 是“pdfTeX 引擎 + LaTeX 格式”,lualatex 是“LuaTeX + LaTeX”,依此类推。调用方式都相同:把源文件作为参数传入即可;.tex 扩展名可以省略。

terminal
pdflatex document.tex      # → document.pdf, document.aux, document.log
lualatex document          # 拡張子は省略可 / extension optional
xelatex  document.tex

运行命令会生成主体输出(.pdf.dvi),并生成若干辅助文件:保存交叉引用和目录信息的 .aux,记录处理过程的 .log 等。要确定编号、引用和目录,通常需要 用同一命令运行两次(第一遍把编号写入 .aux,第二遍再读回正文)。latexmk 等构建工具会自动化这种多遍处理。完整流程会在“从源码到 PDF”中说明。

直接输出 PDF 的三个命令

pdflatexlualatexxelatex 都会直接生成 PDF。它们的差异在于 Unicode 与字体处理方式,以及速度。

pdflatex 使用 pdfTeX 引擎。pdfTeX 是 Hàn Thế Thành 在研究 微排版(行末字符伸入页边、细微字宽伸缩等)的博士工作中对 TeX 的扩展;其核心特性是不经过 DVI 直接生成 PDF。它在三者中历史最长,与既有宏包兼容性最好,编译也最快。代价是输入本质上按字节处理,没有原生 Unicode 或系统字体支持(现代 LaTeX 默认接受 UTF-8 输入,但字体仍限于 TeX 自身体系)。

lualatex 使用 LuaTeX 引擎。它从一开始就以 UTF-8 为前提,并可通过 fontspec 包直接使用系统中安装的 OpenType/TrueType 字体。它最大的特点是内嵌脚本语言 Lua,可以深入干预排版处理本身。它被视为 LaTeX 的标准发展方向;日文排版由 luatexja 包处理。

xelatex 使用 XeTeX 引擎(Jonathan Kew 约在 2004 年开发)。它也支持 Unicode 和系统字体,但实现更依赖外部库,与 LuaTeX 很不同。内部并不是直接写出 PDF,而是生成扩展 DVI 格式的 .xdv 文件,再由随附的 xdvipdfmx 自动转换成 PDF。加上 -no-pdf 可在转换前的 .xdv 阶段停止。

命令引擎输出Unicode / 字体
pdflatexpdfTeX直接 PDFTeX 字体;快速,兼容性很好
lualatexLuaTeX直接 PDF系统字体 + Unicode + Lua
xelatexXeTeXPDF(内部经由 .xdv)系统字体 + Unicode

输出 DVI 的 latex 命令

普通的 latex 命令在今天的 TeX Live 中会以 DVI 模式运行 pdfTeX 引擎,输出的不是 PDF,而是 .dvi 文件。DVI(device-independent)是不依赖具体输出设备的中间格式;它本身不便查看或打印,因此要 dvipdfmx 转成 PDF,或用 dvips 转成 PostScript。与 pdflatex 直接输出 PDF 相比,这是一种把“排版”和“生成 PDF”分开的两步流程。

为什么今天还使用 DVI?一是有些旧机制只能经由 DVI 工作(例如 PSTricks 的一部分),二是如下一节所述,日文排版传统上经由 DVI。如果想用 LuaTeX 输出 DVI,请使用 dvilualatex。从 DVI 转换的细节在“DVI 转换工具”页面中说明。

日文命令 — platex / uplatex

platex 是运行在面向日文排版的 pTeX 引擎上的 pLaTeX(由 ASCII 公司开发,如今为 e-pTeX)。它能正确处理竖排、日文行距与禁则处理(*kinsoku*),以及日文与西文之间的间距。输出为 DVI。默认输入编码因环境而异(Shift_JIS / EUC-JP / UTF-8);加上 -kanji=utf8 会按 UTF-8 读取。不过 pTeX 能直接处理的字符范围仅限 ASCII + JIS X 0208。

uplatex 是运行在 upTeX 引擎(田中琢爾开发)上的 upLaTeX,其内部处理 基于 Unicode。默认输入为 UTF-8,并且能直接处理 JIS X 0208 之外的字符(罕见人名汉字、完整 CJK 统一汉字等)而无需额外宏包,因此成为 现代日文论文的标准选择。它的输出也为 DVI,输入编码可用 -kanji 选项更改。

terminal
# 日本語: 組版 → DVI → PDF / Japanese: typeset → DVI → PDF
uplatex -kanji=utf8 document.tex   # → document.dvi
dvipdfmx document.dvi              # → document.pdf

(u)platex 生成的 DVI 通过 dvipdfmx 转成 PDF(TeX Live 中的 dvipdfmx 已支持 upTeX)。近年的 TeX Live 默认输入为 UTF-8,因此 -kanji=utf8 往往可以省略;但显式写出可避免环境差异带来的意外。若要可靠处理无 BOM 的 UTF-8,可在 uplatex 上同时使用 -no-guess-input-enc。另外,使用 lualatex + luatexja 可以不经 DVI,直接从日文源文件生成 PDF。

实际常用的选项

选项要放在源文件名 之前 传给命令。下面这些可在 pdfTeX / XeTeX / LuaTeX 命令中共通使用:

选项作用
-synctex=1输出 SyncTeX 数据,使编辑器与 PDF 可以相互跳转
-interaction=nonstopmode遇到错误也不暂停,继续运行到结束(batchmode 更安静)
-halt-on-error在第一个错误处停止处理
-file-line-errorfile:line: 形式报告错误(适合 IDE 集成)
-output-directory=DIR把输出写入已存在的目录
-jobname=NAME设置输出文件的基本名称
-shell-escape允许通过 \write18 运行外部命令(见注意)
-draftmode不写出 PDF,快速检查(pdfTeX / LuaTeX)
terminal
pdflatex -synctex=1 -interaction=nonstopmode -halt-on-error -file-line-error document.tex

输出格式方面,pdfTeX 和 LuaTeX 可用 -output-format=dvi|pdf 切换(XeTeX 则用 -no-pdf 停在 .xdv)。-shell-escape 要特别小心minted(代码高亮)和某些绘图包需要它来调用外部程序,但它也允许文档运行任意 shell 命令;不要对不可信源文件启用。

到底该用哪一个

  • 新的日文文档uplatex(→ dvipdfmx),或 lualatex + luatexja
  • 主要是英文 / 西文文本pdflatex;速度快且兼容性高。
  • 想直接使用系统字体lualatexxelatex
  • 需要只能经由 DVI 的机制latex(→ dvipdfmx / dvips)。

实际使用中,与其手动把这些命令输入两次,通常会交给 latexmk 等构建工具;它会按需要运行足够次数,甚至处理 DVI 转换。若想进一步了解引擎本身的差异,请阅读“选择引擎与格式”。

提交前的编译命令检查

  • 先单独测试命令: 在终端运行一次所选命令,如 pdflatexlualatexuplatex 等,确认失败不是编辑器特有的问题。
  • 提交默认选项: 加上 -halt-on-error -file-line-error -interaction=nonstopmode,让 CI 和日志指向第一个真正的错误。
  • 日文 PDF 路线判断: upLaTeX 使用 uplatex 后接 dvipdfmx;LuaLaTeX 则直接输出 PDF。不要无意中混用两条路线。
  • 日志阅读方式: 不要只看 .log 末尾,而要从第一个 ! 开始读,这样才能回到引发连锁错误的命令。