要把 .tex 文件变成 PDF,需要在终端运行编译命令。pdflatex、lualatex、xelatex、latex,以及日文用的 platex / uplatex 都是“LaTeX”,但你选择的命令会决定底层运行的 引擎,进而决定输出格式(PDF 还是 DVI)以及可用的字体和字符范围。本页是各命令的实用地图,也列出实际会输入的常用选项。
命令名选择引擎
LaTeX 是 格式(命令体系),实际处理它的 引擎(程序)是另一回事。命令名表示两者的组合:pdflatex 是“pdfTeX 引擎 + LaTeX 格式”,lualatex 是“LuaTeX + LaTeX”,依此类推。调用方式都相同:把源文件作为参数传入即可;.tex 扩展名可以省略。
pdflatex document.tex # → document.pdf, document.aux, document.log
lualatex document # 拡張子は省略可 / extension optional
xelatex document.tex运行命令会生成主体输出(.pdf 或 .dvi),并生成若干辅助文件:保存交叉引用和目录信息的 .aux,记录处理过程的 .log 等。要确定编号、引用和目录,通常需要 用同一命令运行两次(第一遍把编号写入 .aux,第二遍再读回正文)。latexmk 等构建工具会自动化这种多遍处理。完整流程会在“从源码到 PDF”中说明。
直接输出 PDF 的三个命令
pdflatex、lualatex、xelatex 都会直接生成 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 / 字体 |
|---|---|---|---|
pdflatex | pdfTeX | 直接 PDF | TeX 字体;快速,兼容性很好 |
lualatex | LuaTeX | 直接 PDF | 系统字体 + Unicode + Lua |
xelatex | XeTeX | PDF(内部经由 .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 选项更改。
# 日本語: 組版 → 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-error | 以 file:line: 形式报告错误(适合 IDE 集成) |
-output-directory=DIR | 把输出写入已存在的目录 |
-jobname=NAME | 设置输出文件的基本名称 |
-shell-escape | 允许通过 \write18 运行外部命令(见注意) |
-draftmode | 不写出 PDF,快速检查(pdfTeX / LuaTeX) |
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;速度快且兼容性高。 - 想直接使用系统字体 —
lualatex或xelatex。 - 需要只能经由 DVI 的机制 —
latex(→dvipdfmx/dvips)。
实际使用中,与其手动把这些命令输入两次,通常会交给 latexmk 等构建工具;它会按需要运行足够次数,甚至处理 DVI 转换。若想进一步了解引擎本身的差异,请阅读“选择引擎与格式”。
提交前的编译命令检查
- 先单独测试命令: 在终端运行一次所选命令,如
pdflatex、lualatex、uplatex等,确认失败不是编辑器特有的问题。 - 提交默认选项: 加上
-halt-on-error -file-line-error -interaction=nonstopmode,让 CI 和日志指向第一个真正的错误。 - 日文 PDF 路线判断: upLaTeX 使用
uplatex后接dvipdfmx;LuaLaTeX 则直接输出 PDF。不要无意中混用两条路线。 - 日志阅读方式: 不要只看
.log末尾,而要从第一个!开始读,这样才能回到引发连锁错误的命令。