运行 pdflatex elsarticle 所需的最少次数

运行 pdflatex elsarticle 所需的最少次数

运行pdflatex一次

\documentclass{elsarticle}%%% version 3.1 from CTAN
\begin{document}
\begin{frontmatter}
\author[1]{Johann Sebastian Bach}
\author[2]{Ludwig van Beethoven\corref{cor2}}
\cortext[cor2]{Corresponding author}%
\address[1]{Thomaskirche, Leipzig}
\address[2]{Zentralfriedhof Wien}
\end{frontmatter}
\end{document}

产生以下输出:

第一次运行的输出

如您所见,两位作者的标签均为 1,贝多芬先生后面的上标星号缺失。您需要第二次运行pdflatex才能更正此问题。

但是,pdflatex总是至少运行两次并不是您想要的:这会浪费您的时间,尤其是在处理大型论文时,而pdflatex如果上次运行有正确的 .aux 文件,运行一次可能就足够了。我查看了 .log 文件和控制台输出,试图发现一些关于是否需要第二次重新运行的提示,但我找不到任何有用的信息。我之前检查是否需要重新运行的方法是说类似

MESSAGE_FOR_RERUN := '(LaTeX Warning: Label\(s\) may have changed\. Rerun to get cross\-references right\.)|(LaTeX Warning: There were undefined references\.)|(LaTeX Warning: Citation [^[:cntrl:]]* on page [0-9]* undefined on)|(Package natbib Warning: There were undefined citations\.)|(\(mparhack\) *Rerun to get them right\.)'

在 makefile 的开头

for i in $(SOURCES); do \
  $(PDFLATEX) $$i ; \
done
if (egrep $(MESSAGE_FOR_RERUN) $(OBJECTS)); then \
  for i in $(SOURCES); do $(PDFLATEX) $$i ; done; \
fi

(其中变量被适当地定义)在 makefile 的规则中。(当然,在非 MWE 中,您可能还需要运行一些 sed、awk、rm、bibtex、bibtex8、biber、makeglossaries、makeindex、xindy、dvi2ps、zip、chmod 或神知道什么,但其他程序的这些细节都与此无关。)

当然,您可以拥有latexmk\usepackage[mainaux]{rerunfilecheck}完成这项工作,但我想知道:您能否继续通过 makefile 以以前的方式执行此操作,如果可以,那么在日志文件中搜索哪个字符串?

答案1

只是将我的评论收集成一个答案。

简单的.log文件解析不能保证足以检测出必要的重新运行。重新运行警告之所以.log出现,是因为 LaTeX 设置了一种启发式方法,当\labels和引用(可能还有其他一些东西)看起来需要再次运行 LaTeX 时,它会发出警告。但软件包没有义务使用这些受监控的机制,它们可能会自行处理。

问题中的代码就是此类代码的典型示例。相关标签是用自定义\Newlabel命令(而不是\newlabel)写出的,并且没有代码可以检测这些标签的更改。

.log事实上,第一次和第二次运行的文件之间唯一相关的区别是

No file <jobname>.aux.

对比

(<jobname>.aux)

以及所调用的文件是否<jobname>.spl被加载。

现在很容易构建一个示例,其中.log文件保持不变(除了时间和内存信息),但输出仍然需要另一个 LaTeX 运行。

  1. 取题目中的例子,编译两遍。
  2. 添加第三位作者:\author[3]{Antonín Dvořák}带地址\address[3]{Vyšehrader Friedhof}
  3. 编译一次参见德沃夏克 (Dvořák) 的脚注“1”。
  4. 再次编译得到“C“。

在步骤 3 和步骤 4 之间,.log文件保持不变,除了日期/时间信息、内存使用情况和字体信息的行号。但是,这些变化都不表明需要再次运行 LaTeX。

因此,除非您使用的软件包在 LaTeX 端内置了某种启发式方法,可以仔细检查是否需要重新运行并在中发出警告.log,否则仅凭该.log文件不足以决定是否重新运行 LaTeX。

这就是为什么还要监视辅助文件的变化的原因之一latexmk。如果辅助文件在运行之间是稳定的,那么输出也应该是稳定的。事实上,在上面的例子中,在步骤 3 的 LaTeX 运行中\Newlabel{3}{c}添加到文件中。因此,在步骤 3 的运行之前和之后是不同的,但步骤 4 中的运行不会改变文件。(当然,有些情况下即使文件发生变化也不需要重新运行,例如因为没有使用 new s。因此不能保证对于给定的文档,生成的构建周期是最短的。此外,还存在文件永远不会稳定的情况:.aux.aux.aux.aux\label.aux避免使用 biblatex ibid 引用样式进行无限次编译?

rerunfilecheck您在问题中提到的包使得.aux在 LaTeX 运行之间监视文件成为可能。特别是,.aux比较当前 LaTeX 运行之前和之后的文件哈希值。如果哈希值发生变化,则表明重新运行可能会有用,并且您会收到以下形式的警告

Package rerunfilecheck Warning: File `<jobname>.aux' has changed. Rerun.

Package rerunfilecheck Info: Checksums for `<jobname>.aux':
(rerunfilecheck)             Before: AE406B0DDBF18055292F1343793AC8CB;63
(rerunfilecheck)             After:  ED9C2E0E40AE4680FD0E58AB745EA3BF;80.

另一方面,如果.aux稳定,则报告

Package rerunfilecheck Info: File `<jobname>.aux' has not changed.
(rerunfilecheck)             Checksum: ED9C2E0E40AE4680FD0E58AB745EA3BF;80.

因此,rerunfilecheck您的任务只是减少到解析该包的重新运行警告。

也许可以重做rerunfilecheckmakefile 中的外部操作。

  • 对当前进行哈希处理.aux并记住哈希值。
  • 运行 LaTeX。
  • 对新的哈希进行计算.aux并与旧哈希进行比较。
  • 如果哈希值不同,则重新运行。

我怀疑这是否值得付出努力,但它可能是 Bash 脚本编写的一项很好的学术练习(并不是说我知道如何真正完成这项任务)。

相关内容