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{Paketabhängigkeiten mit \Package{scrlfile} beherrschen}
\label{cha:scrlfile}
\BeginIndex{Package}{scrlfile}
\section{Die Sache mit den Paketabhängigkeiten}
\label{sec:scrlfile.dependency}
\begin{Explain}
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.
Immer 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. In manchen Fällen 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
Tabellenüberschriften. Diese passen perfekt zu den
Tabellenüberschriften der 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.
Bisher bestand die einzige Möglichkeit, dieses Problem zu lösen
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 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 wäre 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 Abhängigkeit
von Paketen beschränkt. Auch Abhängigkeiten von anderen Dateien
können berücksichtigt werden. So kann beispielsweise dafür gesorgt
werden, dass das nicht unkritische Laden einer Datei wie
\File{french.ldf} automatisch zu einer Warnung führt.
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}
\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 dafür gesorgt werden, dass
\PName{Anweisungen} erst 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} auch nie ausgeführt.
\begin{Explain}
Um die Funktionalität bereitstellen zu können, 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 für den Fall,
dass die Anweisung in späteren \LaTeX-Versionen geändert 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
unabhängig 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}
lädt 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 zusätzliche Funktionalität. Ist die entsprechende Klasse oder das
entsprechende Paket bereits geladen, so werden die \PName{Anweisungen}
nicht nach dem nächsten Laden, sondern unmittelbar ausgeführt.
%
\EndIndex{Cmd}{AfterClass}%
\EndIndex{Cmd}{AfterClass*}%
\EndIndex{Cmd}{AfterPackage}%
\EndIndex{Cmd}{AfterPackage*}%
\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 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. 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 Paketes ü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 \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
für dieses Beispiel unerheblich. Es sei nur erwähnt, dass
\Package{caption2} die Kontrolle über die \Macro{caption}-Anweisung
übernimmt und daher die normale Definition von \Macro{setcapindent}
keinerlei Wirkung mehr hätte. Die Umdefinierung verbessert dann die
Zusammenarbeit mit \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 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
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
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 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 länglich 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 nützliche
Einstellung \Option{linktocpage} verwendet. Wenn Sie jedoch mit
pdf\LaTeX{} eine PDF-Datei erstellen, wird darauf verzichtet.
\end{Example}
\begin{Explain}
Übrigens können Sie das Laden von \Package{scrlfile} und die
\Macro{AfterFile}-Anweisungen auch in Ihre private
\File{hyperref.cfg} einfügen. Verwenden Sie dabei jedoch zum Laden
des Paketes besser \Macro{RequiresPackage} an Stelle 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.
\end{Explain}
\EndIndex{Package}{scrlfile}
\section{Autoren}
\label{sec:scrlfile.authors}
Die folgenden Autoren waren an diesem Kapitel beteiligt oder haben die Vorlage
dafür 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:
|