处理方式与流程 (DVI/PDF)

LaTeX 在您键入时不会显示结果。您编写一个纯文本 .tex 文件并编译它以获得 PDF - 一个“写入,然后立即处理整个事情”模型。有两种路线:一种通过中间 DVI 文件,另一种直接生成 PDF。

为什么不是 WYSIWYG

TeX 通过一次查看整个段落来优化换行。因此,在段落末尾添加单个字符可能会更改其第一行的中断位置。每次击键都要重做一次,成本太高了。

因此,TeX 使用批处理,而不是在您键入时重新绘制的 WYSIWYG 文字处理器 - 它一次即可排版整个文档。您放弃了实时预览,但获得了全局最佳的排版、整个文档的一致格式以及纯文本实现的自动化。

从源到输出:两条路线

引擎处理您编写的 .tex。有两个输出系列。在现代路线上,pdfTeX、XeTeX 和 LuaTeX 直接生成 PDF。 XeTeX 和 LuaTeX 特别读取 Unicode 输入,并且可以使用系统上已安装的 OpenType 字体。

旧路由 上,引擎首先发出 DVI 文件。 DVI 代表“独立于设备”——页面的纯粹描述,不依赖于任何特定的输出设备。 dvi 驱动程序 然后将其转换:dvipdfmx 到 PDF、dvips 到 PostScript、dvisvgm 到 SVG。渲染到屏幕的驱动程序称为 dvi 查看器。日语格式 pLaTeXupLaTeX 使用此 DVI 路由。

terminal
# Direct PDF (modern engines)
lualatex document.tex        # → document.pdf

# Via DVI (legacy route, e.g. Japanese upLaTeX)
uplatex  document.tex        # → document.dvi
dvipdfmx document.dvi        # → document.pdf

作为例外,pdfLaTeX 保留旧的(主要是非 Unicode)输入样式,但直接输出 PDF,而不输出 DVI。它有助于将“DVI 与直接 PDF”和“Unicode / 系统字体与否”视为两个单独的轴。

引擎输出输入和字体图片格式
latexDVI(需要 dvi 驱动程序)主要是ASCIIEPS, PS
pdflatexPDF(直接)有限UnicodePNG、JPG、PDF(EPS 自动转换)
xelatexPDF(直接)Unicode,系统OpenType(fontspec)PNG、JPG、PDF、EPS
lualatexPDF(直接)Unicode,系统字体,LuaPNG、JPG、PDF、EPS

帮助文件和“编译两次”规则

除了 PDF 之外,编译还会生成帮助文件,例如 .aux(标签和参考数据)、.toc(目录)和 .log(记录)。交叉引用和目录 需要两遍:第一遍将数字和位置(“第 3 章在哪一页?”)写入 .aux,第二遍将它们读回以填充 \ref 和内容列表。

因此,当您在输出中看到 ?? 或类似“重新运行以获得正确的交叉引用”之类的警告时,解决方法就是再次编译。参考书目(BibTeX/biber)和索引(makeindex)添加了更多通道。

构建停止时去哪里查看

当构建停止时,读取 .log 中的**第一个错误,而不是 PDF。 TeX 尝试在第一个问题之后继续,因此接下来的十几个错误通常只是后果。 ! Undefined control sequence 通常表示命令拼写错误或缺少软件包; File ... not found 指向图像、类或包查找; LaTeX Warning: Label(s) may have changed 表示需要再次运行。通过出现消息的管道阶段进行诊断。

  • 如果只有交叉引用错误,请先让 latexmk 重新运行,然后再删除 .aux.toc 文件。
  • 如果缺少图像,请检查路线是否为直接 PDF 或 DVI,并相应地选择图像格式。
  • 仅当陈旧的帮助程序文件是可能的原因时,才删除 .aux.toc.out 和朋友。

停止计算通过次数 — latexmk 和编辑

用手计算通行证是很乏味的。 latexmk 监视像 .aux 这样的文件,并根据需要多次重新运行引擎,在需要时调用 BibTeX/biber 和 makeindex,并在输出稳定后停止。默认情况下,在决定循环之前,它会重复最多五次($max_repeat = 5);这个上限足以容纳几乎所有真实的文件。

terminal
latexmk -lualatex document.tex   # LuaLaTeX, as many passes as needed
latexmk -pdf     document.tex     # pdfLaTeX
latexmk -c                        # clean .aux/.log and friends

VS Code (LaTeX Workshop)、TeXShop 和 Overleaf 等编辑器和服务通常会在后台调用 latexmk,因此您只需按“编译”即可。当启用 SyncTeX 时,您可以单击在源中的一行和 PDF 中的匹配点之间跳转。