为什么 latexmk 编译我的 latex 文件两次

为什么 latexmk 编译我的 latex 文件两次

我发现一些只需要一次编译的简单文档在使用时会编译两次latexmk -lualatex

$ latexmk -lualatex Homework_5.tex
Rc files read:
  /home/firestar/.latexmkrc
Latexmk: This is Latexmk, John Collins, 7 Jan. 2023. Version 4.79.
No existing .aux file, so I'll make a simple one, and require run of *latex.
Latexmk: applying rule 'lualatex'...
Rule 'lualatex':  Reasons for rerun
Category 'other':
  Rerun of 'lualatex' forced or previously required

------------
Run number 1 of rule 'lualatex'
------------
------------
Running 'lualatex  -recorder  "Homework_5.tex"'
------------
...
...
Changed files or newly in use/created:
  Homework_5.aux

------------
Run number 2 of rule 'lualatex'
------------
------------
Running 'lualatex  -recorder  "Homework_5.tex"'
------------
Output written on Homework_5.pdf (2 pages, 86722 bytes).
Transcript written on Homework_5.log.
Latexmk: Getting log file 'Homework_5.log'
Latexmk: Examining 'Homework_5.fls'
Latexmk: Examining 'Homework_5.log'
Latexmk: Log file says output to 'Homework_5.pdf'
Latexmk: All targets () are up-to-date

但我仍然找不到为什么它重新运行 lualatex 以及如何阻止它重新运行 lualatex

我发现非常简单的文档只需编译一次,但我不知道是什么触发了重新运行编译。

这是一个将编译两次的示例:家庭作业_5.tex

这是我的 latexmkrc:

sub asy {return system("asy '$_[0]'");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");

答案1

第二次运行的原因是 .aux 文件最后一行发生了变化。最后一行给出了文档中最后一页的编号。在下一次运行 lualatex 时,编译会读取 .aux 文件。它加载的文档或包可以使用有关最后一页的信息,例如,在文档的前面引用它。

在从原始状态第一次运行 lualatex 之前,latexmk 会制作一个简单的 .aux 文件,适用于没有交叉引用等的简单单页文档:

\relax
\gdef \@abspage@last{1}

由于文档长达两页,第一次编译会生成一个 .aux 文件,其中 被1替换2。Latexmk 不知道文档是否实际使用了最后一页的信息;如果文档确实使用了该信息,那么第一次编译将使用错误的信息。因此,在发现 .aux 文件被第一次运行 lualatex 更改后,latexmk 会第二次运行 lualatex。.aux 文件中没有进一步的更改,因此不需要进一步运行 lualatex。

在运行 lualatex 之前,latexmk 并不知道文档中的页数,因此无法提供更好的初始 .aux 文件。此外,较长的文档通常有各种交叉引用。带有方程式的文档(如 OP 的文档)通常带有编号的方程式。这些都需要至少第二次运行 *latex。

笔记假设你现在对文档做了一个小改动,但这个改动不会改变页数,也不会导致 aux 文件发生其他变化。那么下次调用 latexmk 时,如果 .aux 文件没有被删除,它将只运行一次 lualatex。

相关内容