Quand et comment les commandes de l'argument \ AtBeginDocument sont-elles évaluées?
Cette question est motivée dans le prolongement de celle-ci , où j'ai rencontré un problème avec des différences subtiles dans l'ordre d'exécution entre une usepackagecommande et AtBeginDocument. Pour simplifier la discussion, je vais reproduire le code principal ici:
\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}
Pour paraphraser un commentaire que j'ai posté en réponse à la réponse, mon hypothèse à partir de la dénomination était que \AtBeginDocumentse comporterait comme une macro de préprocesseur en C ou quelque chose de similaire, c'est-à-dire qu'elle serait paresseusement développée et évaluée lorsqu'elle était exécutée le document). Cependant, le problème que j'ai rencontré a été causé par l'exécution d'une \usepackagecommande dans le préambule de mon document après avoir \AtBeginDocumentété appelé dans mon fichier cls, et il a été résolu lorsque j'ai déplacé l' usepackageappel ci-dessus AtBeginDocument, indiquant qu'il exécute immédiatement les commandes mais retarde en quelque sorte leur effet jusqu'au \begin{document}. Plus précisément, cet ordre a conduit à cleverefne pas savoir comment se référer aux équations dans les légendes des figures copiées dans lof:
\AtBeginDocument{...}
\usepackage{cleveref}
alors que l'échange de ces deux commandes a résolu ce problème. Ma question est donc la suivante: comment \AtBeginDocumentfonctionne-t-il et quelles hypothèses puis-je faire sur le moment où ses arguments sont évalués et quand leurs effets secondaires deviendront apparents?
Réponses
Les jetons ajoutés en utilisant \AtBeginDocumentapparaissent exactement dans l'ordre dans lequel ils sont ajoutés, c'est pourquoi la réorganisation du préambule fait une différence. De la dernière version de LaTeX (01/10/2020) il y a un nouveau mécanisme de crochet qui permet de réordonnancement en fonction des règles de tri: \AddToHook{begindocument}. Cependant, comme indiqué, \AtBeginDocumentou le nouvel \AddToHook{begindocument}équivalent ne doit pas être utilisé pour quelque chose de typé. Pour cela, vous devez utiliser \AddToHook{begindocument/end}avec un nouveau format LaTeX ou charger etoolboxet utiliser \AfterEndPreamblehook.