我目前正在研究如何在辅助文件中发生更改时从 Latex 生成重新编译警告,并发现这解决方案。
然而我发现它相当令人困惑,它使用:
\AtEndDocument{\def\newreference#1#2{...}}
在我看来,它只是重新定义了宏\newreference#1#2
(其中#1
并#2
扩展到周围宏给出的参数)。但是我不知道从哪里\newreference#1#2
“调用”(扩展?使用?)来实际进行检查。
我试着看看分类指南并且在auxfile 已读取。但两者都没有帮助(显然辅助文件仅在读取,\begin{document}
所以这不能解释它)。
答案1
\enddocument
这就是latex.ltx
:
\def\enddocument{%
\let\AtEndDocument\@firstofone
\@enddocumenthook
\@checkend{document}%
\clearpage
\begingroup
\if@filesw
\immediate\closeout\@mainaux
\let\@setckpt\@gobbletwo
\let\@newl@bel\@testdef
\@tempswafalse
\makeatletter \@@input\jobname.aux
\fi
\@dofilelist
\ifdim \font@submax >\fontsubfuzz\relax
\@font@warning{Size substitutions with differences\MessageBreak
up to \font@submax\space have occurred.\@gobbletwo}%
\fi
\@defaultsubs
\@refundefined
\if@filesw
\ifx \@multiplelabels \relax
\if@tempswa
\@latex@warning@no@line{Label(s) may have changed.
Rerun to get cross-references right}%
\fi
\else
\@multiplelabels
\fi
\fi
\endgroup
\deadcycles\z@\@@end}
\def\@testdef #1#2#3{%
\def\reserved@a{#3}\expandafter \ifx \csname #1@#2\endcsname
\reserved@a \else \@tempswatrue \fi}
如果@filesw
为真(您没有调用\nofiles
),则 LaTeX 将关闭主.aux
文件( ),但经过一些重新定义后,再次\immediate\closeout\@mainaux
读取主文件: 。.aux
\makeatletter \@@input\jobname.aux
上面的重新定义很重要,因为它检查是否\label
与其定义相匹配。鲍里斯的密码\newreference
尝试通过类似于 LaTeX 重新定义的方式重新定义来执行相同的操作\@newl@bel
(通过\let\@newl@bel\@testdef
)。
答案2
软件包rerunfilecheck
会计算辅助文件的 MD5 哈希值(DVI 或 PDF 模式下的 pdfTeX/LuaTeX),并在文档末尾(晚于\AtEndDocument
,此时.aux
文件仍处于打开状态)对其进行比较。请参阅软件包
atveryend
以了解后续钩子。
例子:
\documentclass{article}
\usepackage[aux]{rerunfilecheck}
\begin{document}
\tableofcontents
\section{Hello}
\end{document}
第一次运行:
Package rerunfilecheck Warning: File `test.aux' has changed. Rerun.
Package rerunfilecheck Warning: File `test.toc' has changed. Rerun.