Quando e come vengono valutati i comandi nell'argomento di \ AtBeginDocument?

Oct 03 2020

Questa domanda è motivata in seguito a questa , in cui mi sono imbattuto in un problema con sottili differenze nell'ordine di esecuzione tra un usepackagecomando e AtBeginDocument. Per semplificare la discussione, riproduco qui il codice principale:

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

Parafrasando un commento che ho pubblicato in risposta alla risposta, la mia ipotesi dalla denominazione era che si \AtBeginDocumentsarebbe comportata come una macro del preprocessore in C o qualcosa di simile, cioè sarebbe stata pigramente espansa e valutata quando veniva eseguita (all'inizio di il documento). Tuttavia, il problema in cui mi sono imbattuto è stato causato dall'esecuzione di un \usepackagecomando nel preambolo del mio documento dopo che è \AtBeginDocumentstato chiamato nel mio file cls ed è stato risolto quando ho spostato la usepackagechiamata sopra AtBeginDocument, indicando che sta eseguendo immediatamente i comandi ma in qualche modo ne ritarda l'effetto fino a \begin{document}. Nello specifico, questo ordine ha portato a cleverefnon sapere come fare riferimento alle equazioni nelle didascalie delle figure copiate in lof:

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

considerando che lo scambio di questi due comandi ha risolto il problema. Quindi la mia domanda è: come \AtBeginDocumentfunziona e quali ipotesi posso effettivamente fare su quando i suoi argomenti vengono valutati e quando i loro effetti collaterali diventeranno evidenti?

Risposte

6 JosephWright Oct 03 2020 at 12:02

I token aggiunti utilizzando \AtBeginDocumentappaiono esattamente nell'ordine in cui vengono aggiunti, motivo per cui il riordino del preambolo fa la differenza. Dall'ultimo rilascio LaTeX (2020/10/01) c'è un nuovo meccanismo di aggancio che permette riordino basato su regole di ordinamento: \AddToHook{begindocument}. Tuttavia, come commentato, \AtBeginDocumento il nuovo \AddToHook{begindocument}equivalente non dovrebbe essere usato per qualsiasi cosa sia stata stampata. Per questo, dovresti usarlo \AddToHook{begindocument/end}con un nuovo formato LaTeX o caricare etoolboxe usare \AfterEndPreamblehook.