AtEndDocument 的目的{\def}

AtEndDocument 的目的{\def}

我目前正在研究如何在辅助文件中发生更改时从 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.

相关内容