何时以及如何评估 \AtBeginDocument 参数中的命令?

何时以及如何评估 \AtBeginDocument 参数中的命令?

这个问题是为了跟进这个,我遇到了一个问题,usepackage命令和的执行顺序之间存在细微的差异AtBeginDocument。为了简化讨论,我将在此处重现主要代码:

\documentclass{report}
\AtBeginDocument{\listoffigures}
\usepackage{cleveref}
\begin{document}
\begin{figure} \caption{This caption cross-references \cref{eqn}.} \label{fig} \end{figure}
\begin{equation} F = ma \label{eqn}\end{equation}
\end{document}

释义我发表的评论针对那里的答案,我从命名中假设它将\AtBeginDocument表现得像 C 中的预处理器宏或类似的东西,即它将在运行时(在文档开头)被延迟扩展和评估。但是,我遇到的问题是由于在我的 cls 文件中调用了\usepackage之后在文档序言中运行命令而引起的,当我将调用移到上面时它得到了解决,这表明它立即执行命令但以某种方式延迟了它们的效果直到。具体来说,这个顺序导致不知道如何引用复制到中的图形标题中的方程式:\AtBeginDocumentusepackageAtBeginDocument\begin{document}clevereflof

\AtBeginDocument{...}
\usepackage{cleveref}

而交换这两个命令可以解决这个问题。所以我的问题是,它是如何\AtBeginDocument工作的,我实际上可以对何时评估它的参数以及何时它们的副作用显现做出什么假设?

答案1

使用 添加的标记\AtBeginDocument按其添加的顺序出现,这就是重新排序序言会产生影响的原因。从最新的 LaTeX 版本 (2020-10-01) 开始,有一个新的钩子机制,允许根据排序规则重新排序:\AddToHook{begindocument}。但是,正如评论所说,\AtBeginDocument或新的\AddToHook{begindocument}等效项不应用于任何排版。为此,您应该使用\AddToHook{begindocument/end}新的 LaTeX 格式或加载etoolbox并使用\AfterEndPreamble钩子。

相关内容