\AtEndDocument

Aus goLaTeX

\AtEndDocument ist eine LaTeX-Kern-Anweisung, um Code erst während \end{document} auszuführen.

Verwendung

Syntax

\AtEndDocument{Code}

Parameter

{Code}
Der Code, der innerhalb von \end{document} auszuführen ist.

Beschreibung

Der über \AtEndDocument angegebene Code wird ganz am Anfang von \end{document} expandiert und ausgeführt. Die Verwendung von \AtEndDocument innerhalb des Arguments von \AtEndDocument ist prinzipiell möglich. Im Gegensatz zu beispielsweise \AtBeginDocument darf \AtEndDocument nicht nur in der Dokumentpräambel aufgerufen werden.

Zum Zeitpunkt der Expansion und Ausführung von Code ist das finale \clearpage noch nicht ausgeführt, die letzte Seite ist also u. U. noch nicht beendet und letzte Gleitumgebungen sind u. U. noch nicht ausgegeben. Man darf sich – zumindest als Klassen- oder Paketautor – darauf andererseits aber auch nicht verlassen, weil natürlich der Anwender durchaus ein \clearpage am Ende des Dokuments haben kann, ein anderes Paket eine solche Anweisung per \AtEndDocument ausgeführt haben könnte und auch die Seite zufällig durch andere Umstände bereits ausgegeben sein könnte. Das wäre beispielsweise auch dann der Fall, wenn die letzte Anweisung vor \end{document} ein \include wäre, bzw. nach dem letzten \include keine Seite mehr auszugeben wäre.

Der Umstand, dass man nicht weiß, ob bei Ausführung des Arguments von \AtEndDocument noch eine Seite ausgegeben wird oder nicht, hat übrigens auch Einfluss darauf, ob das Schreiben von Labels o. ä. in die aux-Datei überhaupt noch erfolgt. Beachtet der Paketautor dies nicht, so können daraus sogar Fehlfunktionen entstehen (siehe Beispiele).

Beispiele

% Dieses Beispiel ist nicht verallgemeinerbar, wie die weiteren
% Beispiele zeigen werden!
\documentclass{article}
\usepackage{blindtext}
\AtEndDocument{\par\noindent\rule{\textwidth}{2pt}\par}
\begin{document}
\blinddocument
\end{document}

Im Beispiel wird am Ende des Dokuments eine dicke horizontale Linie gesetzt. Wie problematisch die Verwendung von \AtEndDocument für dergleichen ist, zeigt sich jedoch, wenn man beispielsweise Paket lastpage verwendet:

% Dieses Beispiel veranschaulicht ein Problem und sollte nicht
% als Vorlage für eine Lösung dienen!
\documentclass{article}
\usepackage{blindtext}
\usepackage{lastpage}
\AtEndDocument{\par
  \begin{center}
    \rule{\textwidth}{2pt}\par 
    Die letzte Seite ist \pageref{LastPage}.\par
    \rule{\textwidth}{1pt}
  \end{center}\par
}
\begin{document}
\blinddocument
\end{document}

Hier wird der in Linien eingeschlossene Text auf einer eigenen Seite ausgegeben und die dabei angegebene Seitenzahl der angeblich letzten Seite ist ebenfalls nicht korrekt. Die Ursache dafür ist, dass das Paket selbst per \AtEndDocument ein \clearpage ausführt. Zwar lässt sich die Ausgabe im Beispiel korrigieren, indem man lastpage erst nach der \AtEndDocument-Anweisung lädt, aber dies ist keine allgemeine Lösung – insbesondere nicht für Paketautoren.

Ein ähnliches Problem ergibt sich, wenn noch nicht alle Gleitumgebungen ausgegeben sind:

% Dieses Beispiel veranschaulicht ein Problem und sollte nicht
% als Vorlage für eine Lösung dienen!
\documentclass{article}
\usepackage{mwe}
\AtEndDocument{\par\noindent\rule{\textwidth}{2pt}\par}
\begin{document}
\begin{figure}[ht]% Hier fehlt p als Möglichkeit!
  \includegraphics[height=.9\textheight,width=\textwidth]{example-image}
  \caption{Eine Beispielabbildung}
\end{figure}
\blinddocument
\end{document}

Hier wird die Linie vor der final gesetzten Abbildung ausgegeben.

Verwandte Befehle

\AtBeginDocument, \AtEndOfPackage, \AtBeginDvi, \BeforeClosingMainAux (KOMA-Script), \AfterReadingMainAux (KOMA-Script), \AfterPreamble (etoolbox), \AtEndPreamble (etoolbox), \AfterEndPreamble (etoolbox), \AfterEndDocument (etoolbox)

Verweise

Die Anweisung ist in den LaTeX-Quellen in Datei ltmiscen.dtx definiert und zusätzlich zu source2e.pdf in „LaTeX2ε for class and package writers” dokumentiert.

Links