运行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 运行。
- 取题目中的例子,编译两遍。
- 添加第三位作者:
\author[3]{Antonín Dvořák}
带地址\address[3]{Vyšehrader Friedhof}
- 编译一次参见德沃夏克 (Dvořák) 的脚注“1”。
- 再次编译得到“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
您的任务只是减少到解析该包的重新运行警告。
也许可以重做rerunfilecheck
makefile 中的外部操作。
- 对当前进行哈希处理
.aux
并记住哈希值。 - 运行 LaTeX。
- 对新的哈希进行计算
.aux
并与旧哈希进行比较。 - 如果哈希值不同,则重新运行。
我怀疑这是否值得付出努力,但它可能是 Bash 脚本编写的一项很好的学术练习(并不是说我知道如何真正完成这项任务)。