跳至内容
Topos Uranos

摘要

本课讲授如何稳妥地编译文档,以及如何修正出错的地方。它说明编译是分遍进行的,为什么交叉引用和目录需要第二遍,以及 latexmk 如何在 Texmaker 和终端中自动重复编译。它讲授如何阅读日志文件:日志在哪里,如何阅读一条错误,包括以感叹号开头的那一行、它的行号和被一分为二的上下文,以及错误与警告、与盒子溢出提示有何区别。它逐一介绍最常见的错误及其真实的提示信息、引擎的交互模式,以及一套调试策略:先读第一个错误,把源文件对半分割,把问题缩减为最小示例,清除辅助文件,搜索提示信息的原文。最后介绍值得留意的警告。

学习目标

  1. 说明为什么含有交叉引用或目录的文档需要编译不止一遍,并用 latexmk 编译它。
  2. 阅读日志中的一条错误,指出它的提示信息、引擎发现它的那一行以及该行中的确切位置。
  3. 根据提示信息认出最常见的错误,并把每一种错误与其可能的原因联系起来。
  4. 当错误的真正原因不在所指出的那一行时,通过先读第一个错误并把源文件对半分割来找到它。
  5. 区分需要修正的警告和可以忽略的警告。

编译做了什么

引擎只把源文件从头到尾读一遍,边读边排出每一页。这种只读一遍的方式带来一个后果:当第二页出现对第五节的引用,或者第一页的目录要列出尚未读到的各节时,引擎还无法知道它们对应哪个编号或哪一页。LaTeX 的解决办法是分遍工作。每一遍中,它把每个标签(用 \label 设置的标签)的编号和页码记入 .aux 文件,把各节标题记入 .toc 文件;下一遍开始时读取这些文件,使用记下的内容。由此可知,第一次编译时引用显示为两个问号,目录是空的,只要再编译一次就会补全。如果某处修改使编号发生移动,可能还需要第三遍;参考文献则如其所在单元将要说明的那样,在各遍之间再加入一个程序 Biber。

手工数遍数既繁琐又容易遗漏。latexmk 正是为此而设的,它随各发行版一起提供:它运行引擎,检查日志和辅助文件,重复编译,或调用 Biber,直到一切不再变化。它的选项 -lualatex 指定使用 LuaLaTeX,选项 -c 删除辅助文件而保留 PDF。

例题在终端中使用 latexmk

第一条命令用 LuaLaTeX 按需要的次数编译 thesis.tex;第二条清除辅助文件。

终端
$ latexmk -lualatex thesis.tex$ latexmk -c thesis.tex

在 Texmaker 中,快速构建的预设序列之一使用 latexmk(LatexMk + View PDF);在配置对话框的命令列表中,把 latexmk 的命令改为 latexmk -lualatex -synctex=1 -interaction=nonstopmode %.tex,使它使用 LuaLaTeX 并保持与 PDF 的同步。