Sie sind hier

Unterschiedliche Funktionsweise von \AfterPackage und \AfterAtEndOfPackage

Hallo!

Die unterschiedliche Funktionsweise von \AfterPackage und \AfterAtEndOfPackage wird in der KOMA-Script–Anleitung gut erklärt. Im Zuge einiger Tests bin ich jedoch noch auf einen weiteren Unterschied gestoßen. Dieser tritt zutage, wenn \AfterPackage und \AfterAtEndOfPackage nach dem Laden eines bestimmten Pakets, aber noch vor einem zweiten Versuch, ebendieses Paket zu laden, verwendet werden:

\documentclass{scrartcl}
 
\typeout{Try to load package ...}
 
\usepackage{lmodern}
 
\typeout{Loaded package.}
 
\AfterPackage{lmodern}{%
  \typeout{This is \protect\AfterPackage.}%
}
 
\AfterAtEndOfPackage{lmodern}{%
  \typeout{This is \protect\AfterAtEndOfPackage.}%
}
 
\typeout{Try to load package ...}
 
\usepackage{lmodern}
 
\typeout{Package already loaded.}
 
\begin{document}
 
\end{document}

In der Terminalausgabe findet sich erwartungsgemäß keine „Botschaft“ von \AfterPackage, sehr wohl jedoch eine von \AfterAtEndOfPackage, und zwar nach dem zweiten Versuch, das lmodern-Paket zu laden.

Meine Frage lautet nun: Ist dieses Verhalten von \AfterAtEndOfPackage beabsichtigt, i.e. ein Feature, welches man bei Bedarf ausnützen könnte?

MfG, Michael

Bild von Markus Kohm

Das Verhalten ist tatsächlich kein Fehler, sondern logische Konsequenz des so spät wie irgend möglich Ausführens. Das passiert übrigens auch bei \AfterPackage!, wenn das Laden des angegebenen Pakets bereits begonnen hat (und eventuell auch bereits beendet wurde).

Nachdem ich bereits unzählige Varianten von \AfterPackage implementiert habe, könne ich aber wohl auch noch eine Variante von \AfterAtEndOfPackage implementieren, die das anders macht. Wobei ich dann wahrscheinlich auch noch eine weitere Variante von \AfterPackage implementieren muss, weil bisher \AfterPackage! eben dieses \AfterEndOfPackage verwendet (und dann eben noch eine Variante benötigt würde, die beispielsweise \AfterAtEndOfPackage) verwendet.

Und frag mich bitte nicht nach dem Sinn dieser unzähligen Varianten. Die meisten davon habe ich auf Zuruf implementiert. Ich verwende nur extrem wenige davon selbst, um in KOMA-Script Workarounds für Kompatibilitätsprobleme anderer Pakete mit KOMA-Script zu implementieren.

Danke für die Erklärung!

Bild von Markus Kohm

Brauchst Du nun noch eine Variante von \AfterEndOfPackage, die nichts tut, wenn das Paket bereits geladen ist?

…obwohl ich mir ohne Weiteres vorstellen kann, dass eine solche Variante und vor allem eine Variante, die nach dem vollständigen Laden eines Pakets genau so wie \AfterPackage* arbeitet, ihre Anwender finden würden.

In meiner aktuellen Anwendung ist die Funktionsweise von \AfterAtEndOfPackage eigentlich optimal.

Bild von Markus Kohm

Einfach so aus Lust und Laune implementiere ich das nicht. Wenn es nämlich noch funktionieren soll, wenn das Paket (oder für \AfterAtEndOfClass die Klasse) gerade geladen wird, dann bedeutet die Implementierung schon einen gewissen Aufwand. Solange es also niemand nachfragt …

Comments for "Unterschiedliche Funktionsweise von \AfterPackage und \AfterAtEndOfPackage" abonnieren