LaTeX 编译原理与指令指南

写 LaTeX 和用 Word 最大的区别在于:它更像是在写代码。既然是代码,就少不了编译环节。从一个 .tex 文本文件到一个精美的 PDF,中间到底发生了什么?为什么有那么多不同的编译命令(pdflatex, xelatex, lualatex)?

这篇笔记带你快速厘清 LaTeX 的编译流程,从此告别盲试编译器的痛苦。

为什么 LaTeX 需要编译?

在 Word 中,排版引擎是实时运行的。而在 LaTeX 中,你写的是“指令”(内容+格式标记),只有通过编译器处理这些指令,计算出每个字符的位置、断行、分页,最终才能生成文档。

一图速懂:编译流程

LaTeX 的编译往往不是一次完成的,特别是涉及交叉引用(目录、图表索引)和参考文献时。



graph TD;
  A["源码 (main.tex)"] --> B["编译器 (Engine)"];
  B -- "第一次运行" --> C["中间文件 (.aux, .toc, .log)"];
  C --> D["辅助工具 (BibTeX/Biber)"];
  D -- "处理参考文献" --> E["参考文献数据 (.bbl)"];
  E --> B;
  B -- "第二次运行" --> F["PDF (半成品: 引用可能未更新)"];
  B -- "第三次运行" --> G["最终 PDF"];
  
  style A fill:#f9f,stroke:#333,stroke-width:2px
  style G fill:#9f9,stroke:#333,stroke-width:2px

  • .tex: 你的源代码。
  • .aux: 记录章节、引用等信息的辅助文件。
  • .log: 编译日志,报错时看这里。
1
2
3
4
xelatex main.tex
bibtex main
xelatex main.tex
xelatex main.tex

为什么需要编译这么多次?

LaTeX 编译器就像一个只会从头读到尾的抄写员,而不是像 Word 那样拥有上帝视角。

  1. 第一遍(摸底):抄写员通读全文。遇到“生成目录”的命令时,他不知道后面有几章,只能先空着。但他会把沿途遇到的章节标题和页码记在一个“小本本”(.aux 文件)上。
  2. 中间步骤(处理文献):专门的图书管理员(BibTeX)查看小本本上引用了哪些书,从数据库中把书找出来排版好,生成“书单”(.bbl 文件)。
  3. 第二遍(填空):抄写员再次通读。这次他手里拿着小本本和书单,把目录和参考文献填进去了。
  4. 第三遍(校准)问题来了——因为插入了目录和书单,文章变长了,原本在第 5 页的内容被挤到了第 6 页!所以必须再读一遍,根据最新的页码修正目录和引用跳转。

常见编译器(Engine)对比

虽然统称 LaTeX,但实际上有多个不同的“引擎”在工作。选择哪一个,主要取决于你的语言需求字体需求

1. pdflatex

  • 特点: 老牌、速度快、稳定。
  • 输出: 直接生成 PDF。
  • 缺点: 对 Unicode(尤其是中文)支持较弱,需要繁琐的配置;不支持直接插入 .eps 图片(现代版已部分解决)。
  • 适用场景: 纯英文的数学/计算机论文,或者期刊会议模板指定要求使用。
  • 常用指令:
    • pdflatex -synctex=1 -interaction=nonstopmode main.tex
    • -synctex=1: 开启同步功能,让 PDF 阅读器(如 Skim, SumatraPDF)能反向跳转回代码行,方便修改。
    • -interaction=nonstopmode: 遇到错误不暂停,继续“硬着头皮”编译。这对于 IDE 尤其重要,防止因为一个小错误导致整个编译进程卡死。

2. xelatex (推荐)

  • 特点: 基于 Unicode,对中文字体支持极好。可以直接调用操作系统里的字体(如微软雅黑、SimSun)。
  • 输出: 生成 PDF。
  • 优点: 配合 ctex 宏包,是撰写中文文档的首选。
  • 适用场景: 中文文档、简历、需要使用特殊系统字体的设计类文档。
  • 常用指令:
    • xelatex -synctex=1 -interaction=nonstopmode -file-line-error main.tex
    • -file-line-error: 让报错信息格式化为“文件:行号:错误”,类似编程语言的编译报错,方便 IDE 抓取和定位。
    • 其他参数同上。
  • 避坑: 如果你在 Linux/WSL 下使用 ctex 宏包配合 xelatex,记得安装中文字体(如 fonts-arphic-uming),或者配置 fontset

3. lualatex

  • 特点: xelatex 的继任者,集成了 Lua 脚本引擎。
  • 优点: 内存管理更现代化,支持用 Lua 脚本控制排版逻辑,功能最强。
  • 缺点: 编译速度相对较慢。
  • 适用场景: 需要复杂编程逻辑的高级排版,或者 xelatex 无法满足的边缘情况。
  • 常用指令:
    • lualatex -synctex=1 -interaction=nonstopmode -file-line-error main.tex
    • 参数含义与 xelatex 完全一致。

4. latexmk (自动化神器)

  • 特点: 这不是一个编译器,而是一个 Perl 脚本,用来自动管理编译次数。它会自动判断是否需要运行 BibTeX,是否需要再次运行 LaTeX 来修正页码。
  • 强烈推荐: 现代 IDE(Overleaf, VS Code LaTeX Workshop)默认都在用它。
  • 常用指令:
    • latexmk -xelatex -synctex=1 -interaction=nonstopmode -file-line-error -outdir=build main.tex
    • -xelatex: 指定使用 xelatex 引擎进行编译(默认通常是 pdflatex)。
    • -outdir=build: 把生成的乱七八糟的中间文件(.aux, .log, .fls)都扔到 build 文件夹里,保持根目录清爽,只留下源码和最终 PDF。
    • 其他参数直接透传给底层引擎(如 xelatex)。

常见辅助指令

除了主编译器,你可能还会用到这些:

  • bibtex / biber: 用于处理 .bib 参考文献文件。
    • 流程通常是:latex -> bibtex -> latex -> latex
  • makeindex: 用于生成索引(Index)。

懒人神器:latexmk

手动敲 xelatex -> bibtex -> xelatex -> xelatex 这一套连招实在太累了。这时候你就需要 latexmk

它是一个 Perl 脚本,能自动分析依赖关系。它知道什么时候该运行 bibtex,什么时候该重新编译以修正交叉引用,直到文件完全稳定。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 自动探测并编译(默认生成 pdf)
latexmk -pdf main.tex

# 指定使用 xelatex 引擎(推荐中文使用)
latexmk -xelatex main.tex

# 实时预览模式(修改保存后自动编译,类似前端的 hot reload)
latexmk -pvc -xelatex main.tex

# 编译完清理垃圾文件 (.aux, .log 等)
latexmk -c

# 推荐使用
latexmk -xelatex -synctex=1 -interaction=nonstopmode -file-line-error -outdir=build main.tex