¿Cuándo y cómo se evalúan los comandos en el argumento de \ AtBeginDocument?

Oct 03 2020

Esta pregunta está motivada como una continuación de esta , donde encontré un problema con diferencias sutiles en el orden de ejecución entre un usepackagecomando y AtBeginDocument. Para simplificar la discusión, reproduciré el código principal aquí:

\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}

Parafraseando un comentario que publiqué en respuesta a la respuesta allí, mi suposición de la nomenclatura era que \AtBeginDocumentse comportaría como una macro de preprocesador en C o algo similar a eso, es decir, se expandiría y evaluaría de manera perezosa cuando se ejecutara (al comienzo de el documento). Sin embargo, el problema con el que me encontré fue causado por ejecutar un \usepackagecomando en el preámbulo de mi documento después de que \AtBeginDocumentse llamara en mi archivo cls, y se resolvió cuando moví la usepackagellamada anterior AtBeginDocument, lo que indica que está ejecutando los comandos inmediatamente pero de alguna manera retrasa su efecto hasta \begin{document}. Específicamente, este orden llevó a cleverefno saber cómo hacer referencia a las ecuaciones en las leyendas de las figuras copiadas en lof:

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

mientras que el intercambio de esos dos comandos solucionó ese problema. Entonces, mi pregunta es, ¿cómo \AtBeginDocumentfunciona y qué suposiciones puedo hacer sobre cuándo se evalúan sus argumentos y cuándo se harán evidentes sus efectos secundarios?

Respuestas

6 JosephWright Oct 03 2020 at 12:02

Los tokens agregados usando \AtBeginDocumentaparecen exactamente en el orden en que se agregan, por lo que reordenar el preámbulo marca la diferencia. Desde la última versión de látex (01/10/2020) hay un nuevo mecanismo de enganche que permite la reordenación basado en reglas de clasificación: \AddToHook{begindocument}. Sin embargo, como se comentó, \AtBeginDocumento el nuevo \AddToHook{begindocument}equivalente no debe usarse para nada tipográfico. Para eso, debe usar \AddToHook{begindocument/end}con un nuevo formato LaTeX o cargar etoolboxy usar \AfterEndPreamblehook.