<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% ======================================================================
% scrlfile-de.tex
% Copyright (c) Markus Kohm, 2001-2022
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c of the license.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX 
% version 2005/12/01 or later and of this work.
%
% This work has the LPPL maintenance status "author-maintained".
%
% The Current Maintainer and author of this work is Markus Kohm.
%
% This work consists of all files listed in MANIFEST.md.
% ======================================================================
%
% Chapter about scrlfile of the KOMA-Script guide
% Maintained by Markus Kohm
%
% ============================================================================

\KOMAProvidesFile{scrlfile-de.tex}%
                 [$Date: 2022-07-17 12:36:46 +0200 (So, 17. Jul 2022) $
                  KOMA-Script guide (chapter: scrlfile)]

\chapter{PaketabhÃ¤ngigkeiten mit \Package{scrlfile} 
  beherrschen}
\labelbase{scrlfile}

\BeginIndexGroup
\BeginIndex{Package}{scrlfile}

Die EinfÃ¼hrung von \LaTeXe{} brachte 1994 eine Menge Neuerungen im Umgang mit
\LaTeX-Erweiterungen. So stehen dem Paketautor heute eine ganze Reihe von
Befehlen zur VerfÃ¼gung, um festzustellen, ob ein anderes Paket oder eine
bestimmte Klasse verwendet wird und ob dabei bestimmte Optionen zur Anwendung
kommen. Der Paketautor kann selbst andere Pakete laden oder diesen Optionen
mit auf den Weg geben fÃ¼r den Fall, dass sie spÃ¤ter noch geladen werden. Es
bestand daher die Hoffnung, dass es kÃ¼nftig unerheblich wÃ¤re, in welcher
Reihenfolge Pakete geladen werden. Diese Hoffnung hat sich leider nicht
erfÃ¼llt.

%\section{Die Sache mit den PaketabhÃ¤ngigkeiten}
%\seclabel{dependency}
%\begin{Explain}
Immer\textnote{Problem} hÃ¤ufiger definieren unterschiedliche Pakete den
gleichen Befehl neu oder um. Dabei ist es dann sehr entscheidend, in welcher
Reihenfolge die Pakete geladen werden. Manchmal ist das fÃ¼r den Anwender kaum
zu Ã¼berschauen. Teilweise ist es auch notwendig, in irgendeiner Form auf das
Laden eines anderen Pakets zu reagieren.

Nehmen\textnote{Beispiel} wir als einfaches Beispiel das Laden des
\Package{longtable}-Pakets bei Verwendung von \KOMAScript{}. Das
\Package{longtable}-Paket definiert seine eigene Form von
TabellenÃ¼berschriften. Diese passen perfekt zu den Standardklassen. Sie passen
aber Ã¼berhaupt nicht zu den Voreinstellungen fÃ¼r die TabellenÃ¼berschriften von
\KOMAScript{} und reagieren auch nicht auf die entsprechenden MÃ¶glichkeiten
der Konfiguration. Um dieses Problem zu lÃ¶sen, mÃ¼ssen die Befehle von
\Package{longtable}, die fÃ¼r die TabellenÃ¼berschriften zustÃ¤ndig sind, von
\KOMAScript{} umdefiniert werden. Allerdings sind die \KOMAScript{}-Klassen
bereits abgearbeitet, wenn das Paket geladen wird.

UrsprÃ¼nglich\textnote{ursprÃ¼nglicher Ansatz} bestand die einzige %
\iffalse% Umbruchkorrektur
MÃ¶glichkeit, dieses Problem zu lÃ¶sen %
\else%
LÃ¶sungsmÃ¶glichkeit %
\fi%
darin, die Umdefinierung mit Hilfe von \Macro{AtBeginDocument} auf einen
spÃ¤teren Zeitpunkt zu verschieben. Will der Anwender die entsprechende
Anweisung jedoch selbst umdefinieren, so sollte er dies eigentlich ebenfalls
in der PrÃ¤ambel tun. Das kann er jedoch nicht, weil \KOMAScript{} ihm dabei in
die Quere kommt. Er mÃ¼sste die Umdefinierung also ebenfalls mit Hilfe von
\Macro{AtBeginDocument} durchfÃ¼hren.

Aber\textnote{Potential} eigentlich mÃ¼sste \KOMAScript{} die Abarbeitung gar
nicht auf den Zeitpunkt von \Macro{begin}\PParameter{document} verschieben. Es
wÃ¼rde genÃ¼gen, wenn sie bis unmittelbar nach dem Laden von \Package{longtable}
verzÃ¶gert werden kÃ¶nnte. Leider fehlen entsprechende Anweisungen im
\LaTeX-Kern. Das Paket \Package{scrlfile} bringt hier Abhilfe.

Ebenso\textnote{weitere Anwendungen} wÃ¤re es denkbar, dass man vor dem Laden
eines bestimmten Pakets gerne die Bedeutung eines Makros in einem Hilfsmakro
retten und nach dem Laden des Pakets wieder restaurieren will. Auch das geht
mit \Package{scrlfile}.

Die Anwendung von \Package{scrlfile} ist nicht auf die AbhÃ¤ngigkeit von
Paketen beschrÃ¤nkt. Auch AbhÃ¤ngigkeiten von anderen Dateien, die mit
\Macro{input} oder \Macro{InputIfFileExists} geladen werden, kÃ¶nnen
berÃ¼cksichtigt werden.%
\iffalse% Stimmt so nur noch bedingt
So kann beispielsweise dafÃ¼r gesorgt werden, dass das nicht unkritische Laden
einer Datei wie \File{french.ldf} automatisch zu einer Warnung fÃ¼hrt.%
\fi

Obwohl das Paket in erster Linie fÃ¼r andere Paketautoren interessant sein
dÃ¼rfte, gibt es durchaus auch Anwendungen fÃ¼r normale \LaTeX-Benutzer. Deshalb
sind in diesem Kapitel auch fÃ¼r beide Gruppen Beispiele aufgefÃ¼hrt.
%\end{Explain}

\begin{Declaration}
  \Option{withdeprecated}
\end{Declaration}
Mit\ChangedAt{v3.32}{\Package{scrlfile}} \LaTeX{} 2020-10-01 steht ein
komplett neuer \emph{Hook}-Mechanismus zur VerfÃ¼gung. Statt Makros des
\LaTeX-Kerns umzudefinieren, macht \Package{scrlfile} ab Version 3.32 davon
auch Gebrauch. Dazu lÃ¤dt es das interne Paket
\Package{scrlfile-hook}\IndexPackage[indexmain]{scrlfile-hook}. Bei Ã¤lteren
\LaTeX-Versionen wird dagegen je\ChangedAt{v3.35}{\Package{scrlfile}}
 nach Kernel-Version das interne Paket
\Package{scrlfile-hook-3.34}\IndexPackage[indexmain]{scrlfile-hook-3.34}
beziehungsweise \Package{scrlfile-patcholdkernel}%
\IndexPackage[indexmain]{scrlfile-patcholdkernel} verwendet. Da mit dem neuen
Mechanismus in \LaTeX{} jedoch keine identische FunktionalitÃ¤t zu erreichen
war, wurden einige Anweisungen von \Package{scrlfile} als veraltet
markiert. DarÃ¼ber hinaus wurde die Gelegenheit genutzt, den Wildwuchs an
Befehlsvarianten zu ordnen. Sollte ein Anwender eine Klasse oder Pakete
verwenden, die noch auf den dadurch nicht mehr unterstÃ¼tzten Befehlen
basieren, so kann vor \Package{scrlfile} vor dem Laden der Klasse mit
\begin{lstcode}
  \RequirePackage[withdeprecated]{scrlfile}
\end{lstcode}
geladen werden. \Package{scrlfile} emuliert dann zusÃ¤tzlich einige der
veralteten Befehle in einer Weise, die in den meisten FÃ¤llen ausreichend sein
sollte. In jedem Fall sollte jedoch der Autor der entsprechenden Klasse oder
des entsprechenden Pakets verstÃ¤ndigt werden, damit dieser eine Anpassung an
die aktuelle Version von \Package{scrlfile} oder direkt an \LaTeX{} ab Version
2021-11-15 vornimmt.%
%
\EndIndexGroup


\section{Aktionen vor und nach dem Laden}
\seclabel{macros}

Mit \Package{scrlfile} kÃ¶nnen vor und nach dem Laden von Dateien Aktionen
ausgelÃ¶st werden. Bei den dazu verwendeten Befehlen wird zwischen allgemeinen
Dateien, Klassen und Paketen unterschieden.


\begin{Declaration}
  \Macro{BeforeFile}\Parameter{Datei}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterFile}\Parameter{Datei}\OParameter{Label}\Parameter{Anweisungen}
\end{Declaration}%
Mit Hilfe von \Macro{BeforeFile} kann dafÃ¼r gesorgt werden, dass die
\PName{Anweisungen} vor dem nÃ¤chsten Laden einer bestimmten \PName{Datei}
ausgefÃ¼hrt werden. Vergleichbar arbeitet \Macro{AfterFile}. Nur werden die
\PName{Anweisungen} hier erst nach dem Laden der \PName{Datei}
ausgefÃ¼hrt. Wird die Datei nie geladen, so werden die \PName{Anweisungen} in
beiden FÃ¤llen natÃ¼rlich auch nie ausgefÃ¼hrt. Bei \PName{Datei} sind etwaige
Dateiendungen wie bei \Macro{input} als Teil des Dateinamens anzugeben.

Um die FunktionalitÃ¤t fÃ¼r \LaTeX{} vor Version 2020-10-01 bereitstellen zu
kÃ¶nnen, bedient sich \Package{scrlfile-patcholdlatex} der bekannten
\LaTeX-Anweisung \Macro{InputIfFileExists}. Diese\textnote{Achtung!} wird
hierzu umdefiniert.  Falls die Anweisung nicht die erwartete Definition hat,
gibt \Package{scrlfile-patcholdlatex} eine Warnung aus.  Dies geschieht fÃ¼r
den Fall, dass die Anweisung bereits von einem inkompatiblen Paket umdefiniert
wurde.

Bei\ChangedAt{v3.32}{\Package{scrlfile}}\IndexCmd{AddToHook} \LaTeX{} ab
Version 2020-10-01 wird von \Package{scrlfile-hook} hingegen
\Macro{AddToHook}\PParameter{file/before/\PName{Datei}}\OParameter{Label}\Parameter{Anweisungen}
beziehungsweise
\Macro{AddToHook}\PParameter{file/after/\PName{Datei}}\OParameter{Label}\Parameter{Anweisungen}
verwendet. NÃ¤heres zur Bedeutung des optionalen Arguments \PName{Label} ist
der zugehÃ¶rigen Anleitung zur \LaTeX-Kern-Anweisung \Macro{AddToHook} zu
entnehmen. Empfohlen wird in der Regel der Verzicht auf das optionale
Argument. Bei Ã¤lteren \LaTeX-Versionen wird dieses ohnehin ignoriert.
  
Die Anweisung \Macro{InputIfFileExists} wird von \LaTeX{} immer verwendet,
wenn eine Datei geladen werden soll. Dies geschieht unabhÃ¤ngig davon, ob die
Datei mit \Macro{LoadClass}, \Macro{documentclass}, \Macro{usepackage},
\Macro{RequirePackage}, \Macro{include} oder vergleichbaren Anweisungen
geladen wird. Lediglich
% Umbruchkorrektur: listings korrigieren
\begin{lstcode}
  \input foo
\end{lstcode}
lÃ¤dt die Datei \texttt{foo} ohne Verwendung von \Macro{InputIfFileExists}. Sie
sollten daher stattdessen immer
% Umbruchkorrektur: listings korrigieren
\begin{lstcode}
  \input{foo}
\end{lstcode}
verwenden. Beachten Sie die Klammern um den Dateinamen!%
%
\EndIndexGroup


\begin{Declaration}
  \Macro{BeforeClass}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{BeforePackage}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
\end{Declaration}%
Diese beiden Befehle arbeiten vergleichbar zu
\DescRef{\LabelBase.cmd.BeforeFile} mit dem einen Unterschied, dass die
\PName{Klasse} beziehungsweise das \PName{Paket} mit seinem Namen und nicht
mit seinem Dateinamen angegeben wird. Die Endungen Â»\File{.cls}Â« und
Â»\File{.sty}Â« entfallen hier also.

Es ist zu beachten\important{Achtung!}, dass hier von \Package{scrlfile-hook}
ebenfalls \PValue{file} und nicht \PValue{class} respektive \PValue{package}
fÃ¼r den Hook verwendet wird. Nur so ist sichergestellt, dass die AusfÃ¼hrung
der \PName{Anweisungen} bereits im Kontext der Klasse beziehungsweise des
Pakets erfolgt. Zur Bedeutung des optionalen Arguments \PName{label} sei
wiederum auf die Anleitung der \LaTeX-Kernanweisung
\Macro{AddToHook}\IndexCmd{AddToHook} verwiesen. Empfohlen wird in der Regel
der Verzicht auf das optionale Argument. Bei Ã¤lteren \LaTeX-Versionen wird
dieses ohnehin ignoriert.%
\EndIndexGroup


\begin{Declaration}
  \Macro{AfterClass}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterClass*}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterAtEndOfClass}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterAtEndOfClass*}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterPackage}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterPackage*}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterAtEndOfPackage}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
  \Macro{AfterAtEndOfPackage*}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
\end{Declaration}%
Die\important[i]{\Macro{AfterClass}\\\Macro{AfterPackage}} Anweisungen
\Macro{AfterClass} und \Macro{AfterPackage} arbeiten weitgehend wie
\DescRef{\LabelBase.cmd.AfterFile}, mit dem winzigen Unterschied, dass die
\PName{Klasse} beziehungsweise das \PName{Paket} mit seinem Namen und nicht
mit seinem Dateinamen angegeben wird. Die Endungen Â»\File{.cls}Â« und
Â»\File{.sty}Â« entfallen hier also.

Bei\important[i]{\Macro{AfterClass*}\\\Macro{AfterPackage*}} den
Sternvarianten \Macro{AfterClass*} und \Macro{AfterPackage*} gibt es eine
zusÃ¤tzliche FunktionalitÃ¤t. Wurde oder wird die entsprechende Klasse oder das
entsprechende Paket bereits geladen, so werden die \PName{Anweisungen} nicht
nach dem nÃ¤chsten Laden, sondern unmittelbar ausgefÃ¼hrt.

Code,\ChangedAt{v3.09}{\Package{scrlfile}}%
\important[i]{\Macro{AfterAtEndOfClass}\\\Macro{AfterAtEndOfPackage}}
dessen AusfÃ¼hrung per \Macro{AtEndOfClass}\IndexCmd{AtEndOfClass} oder
\Macro{AtEndOfPackage}\IndexCmd{AtEndOfPackage} innerhalb der Klasse
respektive des Pakets verzÃ¶gert wird, wird allerdings erst danach
ausgefÃ¼hrt. Mit \Macro{AfterAtEndOfClass} beziehungsweise
\Macro{AfterAtEndOfPackage} wird dagegen sichergestellt, dass
\PName{Anweisungen} erst nach solchem Code ausgefÃ¼hrt wird.

Auch\ChangedAt{v3.32}{\Package{scrlfile}}%
\important[i]{\Macro{AfterAtEndOfClass*}\\\Macro{AfterAtEndOfPackage*}}
hierzu gibt es Sternvarianten, die dafÃ¼r sorgen, dass \PName{Anweisungen}
sofort ausgefÃ¼hrt werden, falls die Klasse beziehungsweise das Paket bereits
vollstÃ¤ndig geladen ist. Wird eine Klasse oder ein Paket gerade geladen, so
wird die AusfÃ¼hrung wie bei der Version ohne Stern verzÃ¶gert.

Es ist zu beachten, dass \Package{scrlfile-hook} fÃ¼r \Macro{AfterClass},
\Macro{AfterPackage} und deren Sternvarianten einen \PValue{file/after}-Hook
verwendet. Dagegen setzen \Macro{AfterAtEndOfClass} und dessen Sternvariante
einen \PValue{class/after}-Hook und \Macro{AfterAtEndOfPackage} und dessen
Sternvariante entsprechend einen \PValue{package/after}-Hook. Zur Bedeutung
des optionalen Arguments \PName{label} sei wiederum auf die Anleitung der
\LaTeX-Kernanweisung \Macro{AddToHook}\IndexCmd{AddToHook}
verwiesen. Empfohlen wird in der Regel der Verzicht auf das optionale
Argument. Bei Ã¤lteren \LaTeX-Versionen wird dieses ohnehin ignoriert.

\begin{Example}
  Als Beispiel fÃ¼r Paket- oder Klassenautoren will ich zunÃ¤chst
  erklÃ¤ren, wie \KOMAScript{} selbst Gebrauch von den neuen
  Anweisungen macht. Dazu findet sich beispielsweise in \Class{scrbook}
  Folgendes:
\begin{lstcode}
  \AfterPackage{hyperref}{%
    \@ifpackagelater{hyperref}{2001/02/19}{}{%
      \ClassWarningNoLine{scrbook}{%
        You are using an old version of the hyperref 
        package!\MessageBreak%
        This version has a buggy hack in many 
        drivers,\MessageBreak%
        causing \string\addchap\space to behave 
        strangely.\MessageBreak%
        Please update hyperref to at least version
        6.71b}%
    }%
  }
\end{lstcode}
  Alte Versionen von \Package{hyperref} definierten ein Makro von
  \Class{scrbook} in einer Weise um, die mit neueren Versionen
  von \KOMAScript{} nicht mehr funktioniert. Neuere Versionen von
  \Package{hyperref} unterlassen dies, wenn sie eine neuere Version
  von \KOMAScript{} erkennen. FÃ¼r den Fall, dass \Package{hyperref}
  zu einem spÃ¤teren Zeitpunkt geladen wird, sorgt also \Class{scrbook}
  dafÃ¼r, dass unmittelbar nach dem Laden des Pakets Ã¼berprÃ¼ft wird, ob
  es sich um eine vertrÃ¤gliche Version handelt. Falls dies nicht der
  Fall ist, wird eine Warnung ausgegeben.

  An anderer Stelle findet sich in drei der \KOMAScript-Klassen folgendes:
\begin{lstcode}
  \AfterPackage{caption2}{%
    \renewcommand*{\setcapindent}{%
\end{lstcode}% }}
  Nach dem Laden von \Package{caption2} und nur falls das Paket
  geladen wird, wird hier die \KOMAScript{} eigene Anweisung
  \DescRef{maincls.cmd.setcapindent} umdefiniert. Der Inhalt der Umdefinierung
  ist fÃ¼r dieses Beispiel unerheblich. Es sei nur erwÃ¤hnt, dass
  \Package{caption2} die Kontrolle Ã¼ber die
  \DescRef{maincls.cmd.caption}-Anweisung Ã¼bernimmt und daher die normale
  Definition von \DescRef{maincls.cmd.setcapindent} keinerlei Wirkung mehr
  hÃ¤tte. Die Umdefinierung verbessert dann die Zusammenarbeit mit dem
  veralteten \Package{caption2}.

  Es gibt aber auch Beispiele fÃ¼r den sinnvollen Einsatz der neuen
  Anweisungen durch normale Anwender. Angenommen, Sie erstellen ein
  Dokument, aus dem sowohl eine PS-Datei mit \LaTeX{} und dvips als auch
  eine PDF-Datei mit \mbox{pdf\LaTeX} erstellt werden soll. Das Dokument soll
  auÃŸerdem Hyperlinks aufweisen. Im Tabellenverzeichnis haben Sie
  EintrÃ¤ge, die Ã¼ber mehrere Zeilen gehen. Nun gibt es zwar mit
  \mbox{pdf\LaTeX} bei der PDF-Ausgabe keine Probleme, da dort Links
  umbrochen werden kÃ¶nnen. Bei Verwendung des
  \Package{hyperref}-Treibers fÃ¼r dvips oder
  \mbox{hyper\TeX} ist dies jedoch nicht
  mÃ¶glich. In diesem Fall hÃ¤tten Sie gerne, dass bei
  \Package{hyperref} die Einstellung \Option{linktocpage} verwendet
  wird. Die Entscheidung, welcher Treiber geladen wird, wird von
  \Package{hyperref} automatisch getroffen.

  Alles weitere kann nun \DescRef{\LabelBase.cmd.AfterFile} Ã¼berlassen werden:
\begin{lstcode}[moretexcs={hypersetup}]
  \documentclass{article}
  \usepackage[ngerman]{babel}
  \usepackage{scrlfile}
  \AfterFile{hdvips.def}{\hypersetup{linktocpage}}
  \AfterFile{hypertex.def}{\hypersetup{linktocpage}}
  \usepackage{hyperref}
  \begin{document}
  \listoffigures
  \clearpage
  \begin{figure}
    \caption{Dies ist ein Beispiel mit einer
      Abbildungsunterschrift, die mehrere Zeile
      umfasst und bei der trotzdem auf die
      Verwendung des optionalen Arguments verzichtet
      wurde.}
  \end{figure}
  \end{document}
\end{lstcode}
  Egal, ob nun der \Package{hyperref}-Treiber \Option{hypertex} oder
  \Option{dvips} zur Anwendung kommt, wird die dann nÃ¼tzliche Einstellung
  \Option{linktocpage} verwendet. Wenn Sie jedoch mit \mbox{pdf\LaTeX} eine
  PDF-Datei erstellen, wird darauf verzichtet, da dann der
  \Package{hyperref}-Treiber \File{hpdftex.def} verwendet wird. Das bedeutet,
  dass weder die Treiberdatei \File{hdvips.def} noch \File{hypertex.def}
  geladen wird.
\end{Example}
\iffalse% Umbruchkorrekturtext (der besser nicht mehr verwendet wird!)
Ãœbrigens\textnote{Tipp!} kÃ¶nnen Sie das Laden von \Package{scrlfile} und die
obigen Anweisungen \DescRef{\LabelBase.cmd.AfterFile} auch in Ihre private
\File{hyperref.cfg} (siehe oben) einfÃ¼gen. Verwenden Sie dabei jedoch zum
Laden des Pakets besser \Macro{RequirePackage} anstelle von
\Macro{usepackage} (siehe \cite{latex:clsguide}). Die neuen Zeilen mÃ¼ssen in
obigem Beispiel unmittelbar nach der \Macro{ProvidesFile}-Zeile, also
unbedingt vor der AusfÃ¼hrung der Optionen \Option{dvips} oder \Option{pdftex},
eingefÃ¼gt werden.%
\fi%
Ãœbrigens\textnote{Tipp!} kann \Package{scrlfile} auch bereits vor
\DescRef{maincls.cmd.documentclass}\IndexCmd{documentclass} geladen werden. In
diesem Fall ist allerdings \Macro{RequirePackage}\IndexCmd{RequirePackage}
anstelle von \DescRef{maincls.cmd.usepackage} zu verwenden (siehe
\cite{latex:clsguide}).%
\EndIndexGroup


\begin{Declaration}
  \Macro{BeforeClosingMainAux}\Parameter{Anweisungen}
  \Macro{AfterReadingMainAux}\Parameter{Anweisungen}
\end{Declaration}
\iffalse% Umbruchkorrektur
Diese Anweisungen unterscheiden sich in einem Detail von den zuvor erklÃ¤rten
Anweisungen. Jene ermÃ¶glichen Aktionen vor und nach dem Laden von Dateien. Das
ist hier nicht der Fall. %
\fi%
Paketautoren haben des Ã–fteren das Problem, dass sie Anweisungen in die
\File{aux}-Datei schreiben wollen, nachdem die letzte Seite des Dokuments
ausgegeben wurde. Dazu wird -- in Unkenntnis der dadurch verursachten Probleme
-- hÃ¤ufig Code wie der folgende eingesetzt:
\begin{lstcode}[escapechar=\$]
  \AtEndDocument{%$\textnote{Nicht nachmachen!}$
    \if@filesw
      \write\@auxout{\protect\writethistoaux}%
    \fi
  } 
\end{lstcode}
Dies ist jedoch keine wirkliche LÃ¶sung. Wurde die letzte
Seite vor \Macro{end}\PParameter{document} bereits ausgegeben, so fÃ¼hrt obiges
zu keiner Ausgabe in die \File{aux}-Datei. WÃ¼rde man zur LÃ¶sung dieses
Problems nun ein \Macro{immediate} vor \Macro{write} setzen, so hÃ¤tte man das
umgekehrte Problem: wurde die letzte Seite bei
\Macro{end}\PParameter{document} noch nicht ausgegeben, so wird
\Macro{writethistoaux} zu frÃ¼h in die \File{aux}-Datei geschrieben. Man sieht
daher hÃ¤ufig auch LÃ¶sungsversuche wie:
\begin{lstcode}[escapechar=\$]
  \AtEndDocument{%$\textnote{Nicht nachmachen!}$
    \if@filesw
      \clearpage
      \immediate\write\@auxout{\protect\writethistoaux}%
    \fi
  } 
\end{lstcode}
Diese LÃ¶sung hat jedoch den Nachteil, dass damit die Ausgabe der letzten Seite
erzwungen wird. Eine Anweisung wie
\begin{lstcode}
  \AtEndDocument{%
    \par
    \vspace*{\fill}%
    Hinweis am Ende des Dokuments.
    \par
  }
\end{lstcode}
fÃ¼hrt dann nicht mehr dazu, dass der Hinweis am Ende der letzten Seite des
Dokuments ausgegeben wird, sie wÃ¼rde stattdessen am Ende der nÃ¤chsten Seite
ausgegeben. Gleichzeitig wÃ¼rde \Macro{writethistoaux} wieder eine Seite zu
frÃ¼h in die \File{aux}-Datei geschrieben.

Die beste LÃ¶sung des Problems wÃ¤re nun, wenn man unmittelbar in die
\File{aux}-Datei schreiben kÃ¶nnte, nachdem das finale
\DescRef{maincls.cmd.clearpage} innerhalb von \Macro{end}\PParameter{document}
ausgefÃ¼hrt, aber bevor die \File{aux}-Datei geschlossen wird. Dies ist das
Ziel von \Macro{BeforeClosingMainAux}:
\begin{lstcode}
  \BeforeClosingMainAux{%
    \if@filesw
      \immediate\write\@auxout{\protect\writethistoaux}%
    \fi
  }
\end{lstcode}
Das ist auch dann erfolgreich, wenn das finale \DescRef{maincls.cmd.clearpage}
innerhalb von \Macro{end}\PParameter{document} tatsÃ¤chlich zu keiner Ausgabe
einer Seite mehr fÃ¼hrt oder wenn -- sei es korrekt verwendet oder in
Unkenntnis der oben erlÃ¤uterten Probleme -- \DescRef{maincls.cmd.clearpage}
innerhalb einer \Macro{AtEndDocument}-Anweisung zum Einsatz kam.

Es gibt jedoch fÃ¼r \Macro{BeforeClosingMainAux} eine EinschrÃ¤nkung: Im
Argument \PName{Anweisungen} sollte keine Satzanweisung verwendet
werden. Es darf also mit \Macro{BeforeClosingMainAux} kein zusÃ¤tzliches
Material gesetzt werden! Wird diese EinschrÃ¤nkung nicht beachtet, so ist das
Ergebnis ebenso unvorhersehbar wie bei den gezeigten Problemen mit
\Macro{AtEndDocument}.

Die Anweisung \Macro{AfterReadingMainAux}\ChangedAt{v3.03}{\Package{scrlfile}}
fÃ¼hrt sogar \PName{Anweisungen} nach dem SchlieÃŸen und Einlesen der
\File{aux}-Datei innerhalb von \Macro{end}\PParameter{document} aus. Dies ist
nur in einigen wenigen, sehr seltenen FÃ¤llen sinnvoll, beispielsweise, wenn
man statistische Informationen in die \File{log}-Datei schreiben will, die
erst nach dem Einlesen der \File{aux}-Datei gÃ¼ltig sind, oder zur
Implementierung zusÃ¤tzlicher
\mbox{\emph{Rerun}}-\mbox{Auf"|forderungen}. Satzanweisungen sind an dieser
Stelle noch kritischer zu betrachten als bei \Macro{BeforeClosingMainAux}.%
%
\EndIndexGroup


\section{Dateien beim Einlesen ersetzen}
\seclabel{replace}

In den bisherigen Abschnitten wurden Anweisungen erklÃ¤rt, mit denen es mÃ¶glich
ist, vor oder nach dem Einlesen einer bestimmten Datei, eines bestimmten
Pakets oder einer Klasse Aktionen auszufÃ¼hren. Es ist mit \Package{scrlfile}
aber auch mÃ¶glich, eine ganz andere Datei als die angeforderte einzulesen.

\begin{Declaration}[0]
  \Macro{ReplaceInput}\Parameter{Dateiname}\Parameter{Ersatzdatei}
\end{Declaration}
Mit\ChangedAt{v2.96}{\Package{scrlfile}} dieser Anweisung wird eine Ersetzung
der Datei mit dem als erstes angegebenen \PName{Dateiname} definiert. Wenn
\LaTeX{} anschlieÃŸend angewiesen wird, diese Datei zu laden, wird stattdessen
\PName{Ersatzdatei} geladen. Die Definition der Ersatzdatei wirkt sich auf
alle Dateien aus, die vom Anwender oder intern von \LaTeX{} mit Hilfe von
\Macro{InputIfFileExists} geladen werden.

Bei\ChangedAt{v3.32}{\Package{scrlfile}} Verwendung eines \LaTeX-Version bis
2020-04-01 muss dass Paket \Package{scrlfile-patcholdlatex} dazu die Anweisung
\Macro{InputIfFileExists} umdefinieren. Bei Verwendung von \LaTeX{} ab Version
2020-10-01 wird hingegen von \Package{scrlfile-hook} die interne
\LaTeX-Anweisung \Macro{declare@file@substitution} verwendet. Das
\LaTeX{}-Team bittet darum, eine derartige Dateiersetzung nur vorzunehmen,
wenn es keine andere MÃ¶glichkeit gibt, zu dem gewÃ¼nschten Ergebnis zu
gelangen, beispielsweise wenn eine solche Ersetzung zum Erhalt der
KompatibilitÃ¤t unabdingbar ist und dabei die \PName{Ersatzdatei} die gleiche
FunktionalitÃ¤t bereitstellt.

\begin{Example}
  Sie wollen, dass anstelle der Datei \File{\Macro{jobname}.lot}, die Datei
  \File{\Macro{jobname}.tol} geladen wird. Dazu verwenden Sie:
\begin{lstcode}
  \ReplaceInput{\jobname.lot}{\jobname.tol}
\end{lstcode}
  Wenn Sie nun zusÃ¤tzlich \File{\Macro{jobname}.tol} auch noch durch
  \File{\Macro{jobname}.tlo} ersetzen:
\begin{lstcode}
  \ReplaceInput{\jobname.tol}{\jobname.tlo}
\end{lstcode}
  dann wird \File{\Macro{jobname}.lot} am Ende durch
  \File{\Macro{jobname}.tlo} ersetzt. Es wird also die komplette
  Ersetzungskette abgearbeitet.

  Einer Ersetzung im Kreis:
\begin{lstcode}
  \ReplaceInput{\jobname.lot}{\jobname.tol}
  \ReplaceInput{\jobname.tol}{\jobname.lot}
\end{lstcode}
  wÃ¼rde jedoch zu einem Fehler fÃ¼hren. Es ist also nicht mÃ¶glich, eine einmal
  ersetzte Datei wieder durch ihren Ursprung zu ersetzen.
\end{Example}

Theoretisch wÃ¤re es auch mÃ¶glich, auf diesem Wege ein Paket durch ein anderes
oder eine Klasse durch eine andere zu ersetzen. Es wird jedoch empfohlen, fÃ¼r
das Ersetzen eines Pakets oder einer Klasse die nachfolgenden Anweisungen zu
verwenden. Bei Ã¤lteren \LaTeX-Versionen ist dies sogar zwingend.%
\EndIndexGroup


\begin{Declaration}
  \Macro{ReplaceClass}\Parameter{Klasse}\Parameter{Ersatzklasse}
  \Macro{ReplacePackage}\Parameter{Paket}\Parameter{Ersatzpaket}
\end{Declaration}
Eine\ChangedAt{v2.96}{\Package{scrlfile}}\textnote{Achtung!} Klasse oder ein
Paket sollte niemals mit Hilfe der oben erklÃ¤rten Anweisung
\DescRef{\LabelBase.cmd.ReplaceInput} ersetzt werden. Stattdessen sollte fÃ¼r
Paketersetzungen \Macro{ReplacePackage} und fÃ¼r Klassenersetzungen
\Macro{ReplaceClass} verwendet werden. Es ist zu beachten, dass wie bei
\Macro{documentclass} und \Macro{usepackage} der Name der Klasse oder des
Pakets und nicht deren kompletter Dateiname anzugeben ist.

Die Ersetzung funktioniert fÃ¼r Klassen, die mit \Macro{documentclass},
\Macro{LoadClassWithOptions} oder \Macro{LoadClass} geladen werden. FÃ¼r Pakete
funktioniert die Ersetzung beim Laden mit \Macro{usepackage},
\Macro{RequirePackageWithOptions} und \Macro{RequirePackage}.

Es\textnote{Achtung!} ist zu beachten, dass die \PName{Ersatzklasse} oder das
\PName{Ersatzpaket} mit denselben Optionen geladen wird, mit denen die
ursprÃ¼nglich geforderte Klasse oder das ursprÃ¼nglich geforderte Paket geladen
wÃ¼rden. Wird ein Paket oder eine Klasse durch ein Paket oder eine Klasse
ersetzt, die eine geforderte Option nicht unterstÃ¼tzt, wÃ¼rde das zu den
Ã¼blichen Warnungen und Fehlern fÃ¼hren.

Damit Klassen mit \Macro{ReplaceClass} ersetzt werden kÃ¶nnen, ist es natÃ¼rlich
erforderlich \Package{scrlfile} vor der Klasse zu laden. Dazu ist
\Macro{RequirePackage}\IndexCmd{RequirePackage} anstelle von
\DescRef{maincls.cmd.usepackage} zu verwenden (siehe \cite{latex:clsguide}).

Bei\ChangedAt{v3.32}{\Package{scrlfile}} Verwendung eines \LaTeX-Version bis
2020-04-01 muss dass Paket \Package{scrlfile-patcholdlatex} die internen
Anweisung \Macro{@onefilewithoptions} und \Macro{@loadwithoptions}
umdefinieren. Bei Verwendung von \LaTeX{} ab Version 2020-10-01 wird hingegen
von \Package{scrlfile-hook} die interne \LaTeX-Anweisung
\Macro{declare@file@substitution} verwendet. Das \LaTeX{}-Team bittet darum,
eine derartige Ersetzung nur vorzunehmen, wenn es keine andere MÃ¶glichkeit
gibt, zu dem gewÃ¼nschten Ergebnis zu gelangen, beispielsweise wenn eine solche
Ersetzung zum Erhalt der KompatibilitÃ¤t unabdingbar ist und dabei die
\PName{Ersatzpaket} beziehungsweise \PName{Ersatzklasse} die gleiche
FunktionalitÃ¤t bereitstellt.%
\EndIndexGroup


\begin{Declaration}
  \Macro{UnReplaceInput}\Parameter{Datei}
  \Macro{UnReplacePackage}\Parameter{Paket}
  \Macro{UnReplaceClass}\Parameter{Klasse}
\end{Declaration}
Eine\ChangedAt{v3.12}{\Package{scrlfile}} Ersetzung kann auch wieder
aufgehoben werden. Dabei sollten Ersetzungen von Dateien immer mit
\Macro{UnReplaceInput}, Ersetzungen von Paketen mit \Macro{UnReplacePackage}
und Ersetzungen von Klassen mit \Macro{UnReplaceClass} aufgehoben werden. Nach
der Aufhebung der Ersetzung fÃ¼hren Ladebefehle fÃ¼r die entsprechende
\PName{Datei}, das entsprechende \PName{Paket} oder die entsprechende
\PName{Klasse} dann wieder dazu, dass die \PName{Datei}, das \PName{Paket}
oder die \PName{Klasse} selbst anstelle der Ersatzdatei, des Ersatzpakets oder
der Ersatzklasse geladen wird.%
\EndIndexGroup


\section{Dateien gar nicht erst einlesen}
\seclabel{prevent}

Gerade\ChangedAt{v3.08}{\Package{scrlfile}} in Klassen und Paketen, die
innerhalb von Firmen oder Instituten verwendet werden, findet man hÃ¤ufig, dass
sehr viele Pakete nur deshalb geladen werden, weil die Anwender diese Pakete
oft verwenden. Wenn es dann mit einem dieser automatisch geladenen Pakete zu
einem Problem kommt, muss man irgendwie das Laden des problematischen Pakets
verhindern. Auch hier bietet \Package{scrlfile} eine einfache LÃ¶sung.

\begin{Declaration}
  \Macro{PreventPackageFromLoading}\OParameter{Stattdessencode}
                                   \Parameter{Paketliste}
  \Macro{PreventPackageFromLoading*}\OParameter{Stattdessencode}
                                    \Parameter{Paketliste}
\end{Declaration}
Wird diese Anweisung\ChangedAt{v3.08}{\Package{scrlfile}} vor dem
Laden eines Pakets mit \Macro{usepackage}\IndexCmd{usepackage},
\Macro{RequirePackage}\IndexCmd{RequirePackage} oder
\Macro{RequirePackageWithOptions}\IndexCmd{RequirePackageWithOptions}
aufgerufen, so wird das Laden des Pakets effektiv verhindert, falls es in
der \PName{Paketliste} zu finden ist.
%
\begin{Example}
  Angenommen, Sie arbeiten in einer Firma, in der alle Dokumente mit
  Latin~Modern erzeugt werden. In der Firmenklasse, \Class{firmenci}, befinden
  sich daher die Zeilen:
\begin{lstcode}
  \RequirePackage[T1]{fontenc}
  \RequirePackage{lmodern}
\end{lstcode}
  Nun wollen Sie zum ersten Mal ein Dokument mit
  X\kern-.125em\lower.5ex\hbox{\reflectbox{E}}\LaTeX{} oder \LuaLaTeX{}
  setzen. Da beim hierbei empfohlenen Paket \Package{fontspec} ohnehin
  Latin-Modern voreingestellt ist und das Laden von \Package{fontenc} eher
  stÃ¶rend wÃ¤re, wollen Sie das Laden beider Pakete verhindern. Sie laden die
  Klasse deshalb nun in Ihrem eigenen Dokument wie folgt:
\begin{lstcode}
  \RequirePackage{scrlfile}
  \PreventPackageFromLoading{fontenc,lmodern}
  \documentclass{firmenci}
\end{lstcode}
\end{Example}
Wie im Beispiel zu sehen ist, kann man das Paket \Package{scrlfile} auch
bereits vor der Klasse laden. In diesem Fall muss das Laden dann aber mit
Hilfe von \Macro{RequirePackage}\IndexCmd{RequirePackage} erfolgen, da
\Macro{usepackage} vor \Macro{documentclass} verboten ist (siehe
\cite{latex:clsguide}).

Wird eine leere \PName{Paketliste} angegeben oder wird ein Paket angegeben,
das bereits geladen ist, gibt \Macro{PreventPackageFromLoading} eine
Warnung aus, wÃ¤hrend
\Macro{PreventPackageFromLoading*}\ChangedAt{v3.12}{\Package{scrlfile}}
lediglich einen entsprechenden Hinweis in die Log-Datei schreibt.

Das optionale Argument\ChangedAt{v3.12}{\Package{scrlfile}} kann verwendet
werden, wenn anstelle des Ladens des Pakets etwas anderes getan werden
soll. Innerhalb des \PName{Stattdessencode}s dÃ¼rfen jedoch keine anderen
Pakete und keine Dateien geladen werden. Zum Laden eines anderen Pakets siehe
\DescRef{\LabelBase.cmd.ReplacePackage} in \autoref{sec:scrlfile.replace} auf
\DescPageRef{\LabelBase.cmd.ReplacePackage}. Beachten\textnote{Achtung!} Sie
bitte auch, dass der \PName{Stattdessencode} mehrfach ausgefÃ¼hrt wird, falls
Sie versuchen, das Paket mehrfach zu laden!%
\EndIndexGroup


\begin{Declaration}
  \Macro{StorePreventPackageFromLoading}\Parameter{\textMacro{Anweisung}}
  \Macro{ResetPreventPackageFromLoading}
\end{Declaration}
\Macro{Anweisung} wird mit
\Macro{StorePreventPackageFromLoading}\ChangedAt{v3.08}{\Package{scrlfile}}
als die aktuelle Liste der Pakete definiert, fÃ¼r die das Laden verhindert
werden soll. Dagegen setzt
\Macro{ResetPreventPackageFromLoading}\ChangedAt{v3.08}{\Package{scrlfile}}
die Liste der Pakete, fÃ¼r die das Laden verhindert werden soll, zurÃ¼ck. Danach
kÃ¶nnen wieder alle Pakete geladen werden.
\begin{Example}
  Angenommen, Sie sind innerhalb eines Pakets unbedingt auf das Laden eines
  anderen Pakets angewiesen und wollen nicht, dass der Anwender das Laden
  dieses Pakets mit
  \DescRef{\LabelBase.cmd.PreventPackageFromLoading}%
  \IndexCmd{PreventPackageFromLoading}
  verhindern kann. Also setzen Sie die Paketliste fÃ¼r die Ausnahmen zuvor
  zurÃ¼ck:
\begin{lstcode}
  \ResetPreventPackageFromLoading
  \RequirePackage{foo}
\end{lstcode}
  Allerdings hat dies den Nachteil, dass ab diesem Zeitpunkt die komplette
  Ausnahmeliste des Anwenders verloren ist. Also speichern Sie die Liste
  zunÃ¤chst zwischen und reaktivieren sie spÃ¤ter wieder:
\begin{lstcode}
  \newcommand*{\Users@PreventList}{}%
  \StorePreventPackageFromLoading\Users@PreventList
  \ResetPreventPackageFromLoading
  \RequirePackage{foo}
  \PreventPackageFromLoading{\Users@PreventList}
\end{lstcode}
  Es ist zu beachten, dass\textnote{Achtung!} \Macro{Users@PreventList} durch 
  die Anweisung \Macro{StorePreventPackageFromLoading} auch definiert
  werden wÃ¼rde, wenn diese bereits anderweitig definiert wÃ¤re. Eine vorhandene
  Definition wÃ¼rde also ohne RÃ¼cksicht Ã¼berschrieben werden. In diesem
  Beispiel wurde deshalb mit einem vorherigen \Macro{newcommand*}
  sichergestellt, dass in dem Fall zur Sicherheit eine Fehlermeldung
  ausgegeben wird.
\end{Example}
An dieser Stelle sei darauf hingewiesen, dass Sie bei Manipulationen an der mit
\Macro{StorePreventPackageFromLoading} zwischengespeicherten Liste selbst die
Verantwortung fÃ¼r eine korrekte Wiederherstellbarkeit tragen. So muss die
Liste unbedingt mit Komma separiert sein, sollte keine Leerzeichen oder
Gruppenklammern enthalten und muss voll expandierbar sein.%

Beachten\textnote{Achtung!} Sie bitte, dass
\Macro{ResetPreventPackageFromLoading} den \PName{Stattdessencode} fÃ¼r ein
Paket nicht lÃ¶scht, sondern nur vorÃ¼bergehend dessen AusfÃ¼hrung nicht mehr
erfolgt.%
\EndIndexGroup


\begin{Declaration}
  \Macro{UnPreventPackageFromLoading}\Parameter{Paketliste}
  \Macro{UnPreventPackageFromLoading*}\Parameter{Paketliste}
\end{Declaration}
Statt\ChangedAt{v3.12}{\Package{scrlfile}} die Liste der Pakete, fÃ¼r die das
Laden verhindert werden soll, komplett zurÃ¼ckzusetzen, kann man auch
einzelne oder mehrere Pakete gezielt von dieser Liste entfernen. Die
Sternvariante des Befehls lÃ¶scht auÃŸerdem den \PName{Stattdessencode}, der fÃ¼r
das Paket gespeichert ist. Falls die Verhinderungsliste beispielsweise aus
einer gespeicherten Liste wiederhergestellt wird, wird dann der
\PName{Stattdessencode} trotzdem nicht mehr ausgefÃ¼hrt.%
%
\begin{Example}
  Angenommen, Sie wollen zwar verhindern, dass ein Paket \Package{foo}
  geladen wird, wollen aber nicht, dass ein eventuell bereits gespeicherter
  \PName{Stattdessencode} ausgefÃ¼hrt wird. Stattdessen soll nur Ihr neuer
  \PName{Stattdessencode} ausgefÃ¼hrt werden. Dies ist wie folgt mÃ¶glich:
\begin{lstcode}
  \UnPreventPackageFromLoading*{foo}
  \PreventPackageFromLoading[%
    \typeout{Stattdessencode}%
  ]{foo}
\end{lstcode}
  FÃ¼r die Anweisung \Macro{UnPreventPackageFromLoading*} ist es unerheblich,
  ob das Paket zuvor Ã¼berhaupt vom Laden ausgenommen war.

  NatÃ¼rlich kÃ¶nnen Sie die Anweisung indirekt auch nutzen, um den
  \PName{Stattdessencode} aller Pakete zu lÃ¶schen:
\begin{lstcode}
  \StorePreventPackageFromLoading\TheWholePreventList
  \UnPreventPackageFromLoading*{\TheWholePreventList}
  \PreventPackageFromLoading{\TheWholePreventList}
\end{lstcode}
  Die Pakete werden dann zwar noch immer nicht geladen, ihr
  \PName{Stattdessencode} existiert aber nicht mehr und wird nicht mehr
  ausgefÃ¼hrt.%
\end{Example}%
\EndIndexGroup
%\ExampleEndFix % Am Ende des Kapitels nicht ausfÃ¼hren
%
\EndIndexGroup

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "scrguide-de.tex"
%%% coding: utf-8
%%% ispell-local-dictionary: "de_DE"
%%% eval: (flyspell-mode 1)
%%% End:
</pre></body></html>