1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
|
\ProvidesFile{datladen.tex}[2003/04/10 KOMA-Script Anleitung]
% =========================================================================
% datladen.tex
% Copyright (c) 2001-2002 Markus Kohm and the authors.
%
% This file is part of the LaTeX2e KOMA-Script-Bundle
%
% This file can be redistributed and/or modified under the terms of
% the LaTeX Project Public License Version 1.0 distributed together
% with this file. See LEGAL.TXT or LEGALDE.TXT.
%
% This bundle is written specialy for use at german-language. So the main
% documentation is german. There may also be an english documentation. See
% readme.txt, if you search for it.
% -------------------------------------------------------------------------
% datladen.tex
% Copyright (c) 2001-2002 Markus Kohm und bei den weiteren Autoren.
%
% Diese Datei ist Teil des LaTeX2e KOMA-Script-Pakets.
%
% Diese Datei kann nach den Regeln der LaTeX Project Public Licence
% Version 1.0, wie sie zusammen mit dieser Datei verteilt wird,
% weiterverbreitet und/oder modifiziert werden. Siehe dazu auch
% LEGAL.TXT oder LEGALDE.TXT.
%
% Dieses Paket ist fuer den deutschen Sprachraum konzipiert. Daher ist
% auch diese Anleitung komplett in Deutsch. Moeglicherweise existiert
% auch eine englische Version der Anleitung. Falls Sie eine solche
% benoetigen, schauen Sie bitte in liesmich.txt nach, ob eine solche
% vorhanden ist.
% =========================================================================
%
% Modul: datladen.tex
% Autoren: Markus Kohm (MJK) <markus.kohm@gmx.de>
% Inhalt: Anleitung zu scrlfile, dem Paket fuer hooks vor und nach
% dem Laden anderer Pakete
% Sprache: Deutsch
% Zeichensatz der Kommentare:
% US-ASCII
%
\chapter{Paketabhngigkeiten mit \Package{scrlfile} beherrschen}
\label{cha:scrlfile}
\BeginIndex{Package}{scrlfile}
\section{Die Sache mit den Paketabhngigkeiten}
\label{sec:scrlfile.dependency}
\begin{Explain}
Die Einfhrung von \LaTeXe{} brachte 1994 eine Menge Neuerungen im
Umgang mit \LaTeX-Erweiterungen. So stehen dem Paketautor heute eine
ganze Reihe von Befehlen zur Verfgung, 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, fr
den Fall, dass sie spter noch geladen werden. Es bestand daher die
Hoffnung, dass es knftig unerheblich wre, in welcher Reihenfolge
Pakete geladen werden. Diese Hoffnung hat sich leider nicht erfllt.
Immer hufiger 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 fr den
Anwender kaum zu berschauen. In manchen Fllen ist es auch
notwendig, einfach nur in irgendeiner Form auf das Laden eines
anderen Paketes zu reagieren. Auch das ist nicht immer ganz einfach.
Nehmen wir als einfaches Beispiel das Laden des
\Package{longtable}-Paketes bei Verwendung von \KOMAScript{}. Das
\Package{longtable}-Paket definiert seine eigene Form von
Tabellenberschriften. Diese passen perfekt zu den
Tabellenberschriften der Standardklassen. Sie passen aber berhaupt
nicht zu den Voreinstellungen fr die Tabellenberschriften von
\KOMAScript{} und reagieren auch nicht auf die entsprechenden
Mglichkeiten der Konfiguration. Um dieses Problem zu lsen, mssen
die Befehle von \Package{longtable}, die fr die
Tabellenberschriften zustndig sind, von \KOMAScript{} umdefiniert
werden. Allerdings sind die \KOMAScript{}-Klassen bereits
abgearbeitet, wenn das Paket geladen wird.
Bisher bestand die einzige Mglichkeit, dieses Problem zu lsen
darin, die Umdefinierung mit Hilfe von \Macro{AtBeginDocument} auf
einen spteren Zeitpunkt zu verschieben. Will der Anwender die
entsprechende Anweisung jedoch selbst umdefinieren, so sollte er
dies eigentlich ebenfalls in der Prambel tun. Das kann er jedoch
nicht, weil \KOMAScript{} ihm dabei in die Quere kommt. Er msste
die Umdefinierung also ebenfalls mit Hilfe von
\Macro{AtBeginDocument} durchfhren.
Aber eigentlich msste \KOMAScript{} die Abarbeitung gar nicht auf
den Zeitpunkt von \Macro{begin}\PParameter{document} verschieben. Es
wrde gengen, wenn sie bis unmittelbar nach dem Laden von
\Package{longtable} verzgert werden knnte. Leider fehlen
entsprechende Anweisungen im \LaTeX-Kern. Das Paket
\Package{scrlfile} bringt hier Abhilfe.
Ebenso wre es denkbar, dass man vor dem Laden eines bestimmten
Paketes gerne die Bedeutung eines Makros in einem Hilfsmakro retten
und nach dem Laden des Paketes wieder restaurieren will. Auch das
geht mit \Package{scrlfile}.
Die Anwendung von \Package{scrlfile} ist nicht auf die Abhngigkeit
von Paketen beschrnkt. Auch Abhngigkeiten von anderen Dateien
knnen bercksichtigt werden. So kann beispielsweise dafr gesorgt
werden, dass das nicht unkritische Laden einer Datei wie
\File{french.ldf} automatisch zu einer Warnung fhrt.
Obwohl das Paket in erster Linie fr andere Paketautoren interessant
sein drfte, gibt es durchaus auch Anwendungen fr normale
\LaTeX-Benutzer. Deshalb sind in diesem Kapitel auch fr beide
Gruppen Beispiele aufgefhrt.
\end{Explain}
\section{Aktionen vor und nach dem Laden}
\label{sec:scrlfile.macros}
\begin{Declaration}
\Macro{BeforeFile}\Parameter{Datei}\Parameter{Anweisungen}\\
\Macro{AfterFile}\Parameter{Datei}\Parameter{Anweisungen}
\end{Declaration}%
\BeginIndex{Cmd}{BeforeFile}%
\BeginIndex{Cmd}{AfterFile}%
Mit Hilfe von \Macro{BeforeFile} kann dafr gesorgt werden, dass
\PName{Anweisungen} erst vor dem nchsten Laden einer bestimmten
\PName{Datei} ausgefhrt werden. Vergleichbar arbeitet
\Macro{AfterFile}. Nur werden die \PName{Anweisungen} hier erst nach
dem Laden der \PName{Datei} ausgefhrt. Wird die Datei nie geladen, so
werden die \PName{Anweisungen} auch nie ausgefhrt.
\begin{Explain}
Um die Funktionalitt bereitstellen zu knnen, bedient sich
\Package{scrlfile} der bekannten \LaTeX-Anweisung
\Macro{InputIfFileExists}. Diese wird hierzu umdefiniert. Falls die
Anweisung nicht die erwartete Definition hat, gibt
\Package{scrlfile} eine Warnung aus. Dies geschieht fr den Fall,
dass die Anweisung in spteren \LaTeX-Versionen gendert wird oder
bereits von einem anderen Paket umdefiniert wurde.
Die Anweisung \Macro{InputIfFileExists} wird von \LaTeX{} immer
verwendet, wenn eine Datei geladen werden soll. Dies geschieht
unabhngig davon, ob die Datei mit \Macro{LoadClass},
\Macro{documentclass}, \Macro{usepackage}, \Macro{RequiresPackage},
\Macro{include} oder hnlichem geladen wird. Lediglich die Anweisung
\begin{verbatim}
\input foo
\end{verbatim}
ldt die Datei \texttt{foo} ohne Verwendung von
\Macro{InputIfFileExists}. Sie sollten daher stattdessen immer
\begin{verbatim}
\input{foo}
\end{verbatim}
verwenden. Beachten Sie die Klammern um den Dateinamen!
\end{Explain}
%
\EndIndex{Cmd}{BeforeFile}%
\EndIndex{Cmd}{AfterFile}%
\begin{Declaration}
\Macro{BeforeClass}\Parameter{Klasse}\Parameter{Anweisungen}\\
\Macro{BeforePackage}\Parameter{Paket}\Parameter{Anweisungen}
\end{Declaration}%
\BeginIndex{Cmd}{BeforeClass}%
\BeginIndex{Cmd}{BeforePackage}%
Diese beiden Befehle arbeiten genau wie \Macro{BeforeFile} 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.
%
\EndIndex{Cmd}{BeforeClass}%
\EndIndex{Cmd}{BeforePackage}%
\begin{Declaration}
\Macro{AfterClass}\Parameter{Klasse}\Parameter{Anweisungen}\\
\Macro{AfterClass*}\Parameter{Klasse}\Parameter{Anweisungen}\\
\Macro{AfterPackage}\Parameter{Paket}\Parameter{Anweisungen}\\
\Macro{AfterPackage*}\Parameter{Paket}\Parameter{Anweisungen}
\end{Declaration}%
\BeginIndex{Cmd}{AfterClass}%
\BeginIndex{Cmd}{AfterClass*}%
\BeginIndex{Cmd}{AfterPackage}%
\BeginIndex{Cmd}{AfterPackage*}%
Die Anweisungen \Macro{AfterClass} und \Macro{AfterPackage} arbeiten
wie \Macro{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 den Sternvarianten gibt es
eine zustzliche Funktionalitt. Ist die entsprechende Klasse oder das
entsprechende Paket bereits geladen, so werden die \PName{Anweisungen}
nicht nach dem nchsten Laden, sondern unmittelbar ausgefhrt.
%
\EndIndex{Cmd}{AfterClass}%
\EndIndex{Cmd}{AfterClass*}%
\EndIndex{Cmd}{AfterPackage}%
\EndIndex{Cmd}{AfterPackage*}%
\begin{Example}
Als Beispiel fr Paket- oder Klassenautoren will ich zunchst
erklren, wie \KOMAScript{} selbst Gebrauch von den neuen
Anweisungen macht. Dazu findet sich in \Class{scrbook}
beispielsweise Folgendes:
\begin{small}
\begin{verbatim}
\AfterPackage{hyperref}{%
\@ifpackagelater{hyperref}{2001/02/19}{}{%
\ClassWarningNoLine{scrbook}{%
You are using an old version of hyperref package!%
\MessageBreak%
This version has a buggy hack at many drivers%
\MessageBreak%
causing \string\addchap\space to behave strange.%
\MessageBreak%
Please update hyperref to at least version
6.71b}}}
\end{verbatim}
\end{small}
Alte Versionen von \Package{hyperref} definierten ein Makro von
\Class{scrbook} in einer Weise um, so dass es mit neueren Versionen
von \KOMAScript{} nicht mehr funktioniert. Neuere Versionen von
\Package{hyperref} unterlassen dies, wenn sie eine neuere Version
von \KOMAScript{} erkennen. Fr den Fall, dass \Package{hyperref}
zu einem spteren Zeitpunkt geladen wird, sorgt also \Class{scrbook}
dafr, dass unmittelbar nach dem Laden des Paketes berprft wird, ob
es sich um eine vertrgliche Version handelt. Falls dies nicht der
Fall ist, wird eine Warnung ausgegeben.
An anderer Stelle findet sich in drei \KOMAScript-Klassen Folgendes:
\begin{small}
\begin{verbatim}
\AfterPackage{caption2}{%
\renewcommand*{\setcapindent}{%
\end{verbatim}
\end{small}
Nach dem Laden von \Package{caption2} und nur falls das Paket
geladen wird, wird hier die \KOMAScript-Anweisung
\Macro{setcapindent} umdefiniert. Der Inhalt der Umdefinierung ist
fr dieses Beispiel unerheblich. Es sei nur erwhnt, dass
\Package{caption2} die Kontrolle ber die \Macro{caption}-Anweisung
bernimmt und daher die normale Definition von \Macro{setcapindent}
keinerlei Wirkung mehr htte. Die Umdefinierung verbessert dann die
Zusammenarbeit mit \Package{caption2}.
Es gibt aber auch Beispiele fr 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 pdf\LaTeX{} erstellt werden soll. Das Dokument soll
auerdem Hyperlinks aufweisen. Im Tabellenverzeichnis haben Sie
Eintrge, die ber mehrere Zeilen gehen. Nun gibt es zwar mit
pdf\LaTeX{} bei der PDF-Ausgabe keine Probleme, da dort Links
umbrochen werden knnen. Bei Verwendung des
\Package{hyperref}-Treibers fr dvips oder
hyper\TeX{} ist dies jedoch nicht
mglich. In diesem Fall htten Sie gerne, dass bei
\Package{hyperref} die Einstellung \Option{linktocpage} verwendet
wird. Die Entscheidung, welcher Treiber geladen wird, wird bei Ihnen
automatisch von \File{hyperref.cfg} erledigt. Dazu sieht die Datei
beispielsweise wie folgt aus:
\begin{small}
\begin{verbatim}
\ProvidesFile{hyperref.cfg}
\@ifundefined{pdfoutput}{\ExecuteOptions{dvips}}
{\ExecuteOptions{pdftex}}
\endinput
\end{verbatim}
\end{small}
Alles weitere kann nun \Macro{AfterFile} berlassen werden:
\begin{small}
\begin{verbatim}
\documentclass{article}
\usepackage{scrlfile,ngerman}
\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 etwas lnglich ist und
bei der trotzdem auf die Verwendung des optionalen
Arguments verzichtet wurde}
\end{figure}
\end{document}
\end{verbatim}
\end{small}
Egal, ob nun der \Package{hyperref}-Treiber \Option{hypertex} oder
\Option{dvips} zu Anwendung kommt, wird die dann ntzliche
Einstellung \Option{linktocpage} verwendet. Wenn Sie jedoch mit
pdf\LaTeX{} eine PDF-Datei erstellen, wird darauf verzichtet.
\end{Example}
\begin{Explain}
brigens knnen Sie das Laden von \Package{scrlfile} und die
\Macro{AfterFile}-Anweisungen auch in Ihre private
\File{hyperref.cfg} einfgen. Verwenden Sie dabei jedoch zum Laden
des Paketes besser \Macro{RequiresPackage} an Stelle von
\Macro{usepackage} (siehe \cite{latex:clsguide}). Die neuen Zeilen
mssen in obigem Beispiel unmittelbar nach der
\Macro{ProvidesFile}-Zeile, also unbedingt vor der Ausfhrung der
Optionen \Option{dvips} oder \Option{pdftex}, eingefgt werden.
\end{Explain}
\EndIndex{Package}{scrlfile}
\section{Autoren}
\label{sec:scrlfile.authors}
Die folgenden Autoren waren an diesem Kapitel beteiligt oder haben die Vorlage
dafr geliefert.
% In folgender Aufzaehlung den Namen des Autors, der fuer das Kapitel
% verantwortlich ist bitte mit \textbf{} hervorheben.
\begin{itemize}
\item Markus Kohm \TextEMail{Markus.Kohm@gmx.de}
\end{itemize}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "scrguide2"
%%% End:
|