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
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
|
\ProvidesFile{loadfile.tex}[2004/09/13 KOMA-Script Manual english]
% ============================================================================
% loadfile.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.
% ----------------------------------------------------------------------------
% loadfile.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: scrlfile
% Authors: Markus Kohm (MJK) <markus.kohm@gmx.de>
% Contents: excecuting commands depending on one file is loaded
% Language: English
% Date of translated german file:
% 2002/08/30
% Charset of comments:
% US-ASCII
%
\chapter{Control Package Dependencies with \Package{scrlfile}}
\label{cha:scrlfile}
\BeginIndex{Package}{scrlfile}
\section{About Package Dependencies}
\label{sec:scrlfile.dependency}
\begin{Explain}
The introduction of \LaTeXe{} in 1994 brought many changes
in the handling with \LaTeX-extensions.
Today the package author has many macros in order to determine
if another package or class is employed and whether specific
options are used.
The author can load other packages or can specify options in the
the case the package is loaded later.
This has led to the expectation that the order of package-loading
will be not important.
But this hope has not been fulfilled, since often different packages
define or redefine one macro again and again.
In such a case the order of package-loading becomes very
important.
For the user this is sometimes difficult to understand the
behaviour and in some cases the user wants only react
on the loading of a package. This is also not really simple.
Assuming the simple example that loads the package \Package{longtable}
with a \KOMAScript{} document-class employed.
The \Package{longtable} package defines table captions
suitable for the standard classes, but the captions
are totally unsuitable for documents using \KOMAScript{} and thus
the provided configuration commands have no influence.
In order to solve this problem the commands which are responsible
for the table captions of the \Package{longtable} package
have to be re-defined. But at the moment when the \Package{longtable}
is loaded the \KOMAScript{} class is already processed.
The only chance for \KOMAScript{} was to delay the re-definition
until the begin of the document with help of the
macro \Macro{AtBeginDocument}.
If the user wants to change the definitions too, it is
recommended to do this in the preamble of the document.
But this is impossible since later at \Macro{begin}\PParameter{document}
\KOMAScript will again overwrite the user-definition with its own.
Therefore the user has to delay his definition with
\Macro{AtBeginDocument} as well.
However, \KOMAScript{} shouldn't delay the re-definition
until \Macro{begin}\PParameter{document}.
It would be enough to delay until the package \Package{longtable}
has been loaded. But unfortunately the basic \LaTeX{} does not
define appropriate commands. The package \Package{scrlfile}
provides redress here.
Likewise, it might be conceivable that before a package
is loaded one would like to save the definition of a macro
in a help-macro, in order to restore its meaning after
the package has been loaded. The package \Package{scrlfile}
allows this too.
The employment of \Package{scrlfile} is not limited to
package dependencies only.
Even dependencies with any other file can be attended.
For example the user can be warned if the not uncritical file
\File{french.ldf} has been loaded.
Though the package is particularly interesting for
package authors, there are of course applications for
normal \LaTeX{} users too.
Therefore this chapter gives and explains examples
for both groups of users.
\end{Explain}
\section{Actions Prior and After Loading}
\label{sec:scrlfile.macros}
\begin{Declaration}
\Macro{BeforeFile}\Parameter{file}\Parameter{instructions}\\
\Macro{AfterFile}\Parameter{file}\Parameter{instructions}
\end{Declaration}%
\BeginIndex{Cmd}{BeforeFile}%
\BeginIndex{Cmd}{AfterFile}%
The macro \Macro{BeforeFile} enables to execute \PName{instructions}
the next time the \PName{file} is loaded.
In the same way works \Macro{AfterFile}, but here the
\PName{instructions} will be executed after the \PName{file}
has been loaded.
If \PName{file} will never be loaded then the \PName{instructions}
will never be executed.
\begin{Explain}
In order to implement those features \Package{scrlfile}
re-defines the well known \LaTeX{} command
\Macro{InputIfFileExists}.
If this macro has not the expected definition \Package{scrlfile}
gives a warning.
This is for the case that in future \LaTeX{} versions
the macro can have a different definition or an other package
has already re-defined it.
The command \Macro{InputIfFileExists} is used
everytime \LaTeX{} has to load a file.
This is independent from whether the actual command was \Macro{LoadClass},
\Macro{documentclass}, \Macro{usepackage}, \Macro{RequiresPackage},
or \Macro{include}. Exclusively the command
\begin{verbatim}
\input foo
\end{verbatim}
loads the file \texttt{foo} without to utilize
\Macro{InputIfFileExists}. Therefore one should always use
\begin{verbatim}
\input{foo}
\end{verbatim}
instead. Notice the parentheses surrounding the file name!
\end{Explain}
%
\EndIndex{Cmd}{BeforeFile}%
\EndIndex{Cmd}{AfterFile}%
\begin{Declaration}
\Macro{BeforeClass}\Parameter{class}\Parameter{instructions}\\
\Macro{BeforePackage}\Parameter{package}\Parameter{instructions}
\end{Declaration}%
\BeginIndex{Cmd}{BeforeClass}%
\BeginIndex{Cmd}{BeforePackage}%
These both commands work the same way as \Macro{BeforeFile}.
The only difference is that the document class \PName{class}
and the \LaTeX{} package \PName{package} are specified
with their names and not with their file names.
That means the file extensions \File{.cls} and \File{.sty}
can be omitted.
%
\EndIndex{Cmd}{BeforeClass}%
\EndIndex{Cmd}{BeforePackage}%
\begin{Declaration}
\Macro{AfterClass}\Parameter{class}\Parameter{instructions}\\
\Macro{AfterClass*}\Parameter{class}\Parameter{instructions}\\
\Macro{AfterPackage}\Parameter{package}\Parameter{instructions}\\
\Macro{AfterPackage*}\Parameter{package}\Parameter{instructions}
\end{Declaration}%
\BeginIndex{Cmd}{AfterClass}%
\BeginIndex{Cmd}{AfterClass*}%
\BeginIndex{Cmd}{AfterPackage}%
\BeginIndex{Cmd}{AfterPackage*}%
The commands \Macro{AfterClass} und \Macro{AfterPackage}
work the same way as \Macro{AfterFile}.
The only difference is that the document class \PName{class}
and the \LaTeX{} package \PName{package} are specified
with their names and not with their file names.
That means the file extensions \File{.cls} and \File{.sty}
can be omitted.
The starred versions execute the \PName{instructions} not
only next time the class or package is loaded, but also
immediately if the class or package has been loaded already.
%
\EndIndex{Cmd}{AfterClass}%
\EndIndex{Cmd}{AfterClass*}%
\EndIndex{Cmd}{AfterPackage}%
\EndIndex{Cmd}{AfterPackage*}%
\begin{Example}
In the following an example for class and package authors
shall be given.
It shows how \KOMAScript{} itself employs the new commands.
The class \Class{scrbook} contains:
\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}
Old versions of the \Package{hyperref} package re-define
a macro of the \Class{scrbook} class in a way that does not
work with newer \KOMAScript{} versions.
New versions of \Package{hyperref} neglect these changes
if a new \KOMAScript{} version is detected.
For the case that \Package{hyperref} is loaded the code
in \Class{scrbook} verifies that a appropriate
\Package{hyperref} version is used. If not the command gives
a warning.
At other places in three \KOMAScript{} classes following can be found:
\begin{small}
\begin{verbatim}
\AfterPackage{caption2}{%
\renewcommand*{\setcapindent}{%
\end{verbatim}
\end{small}
Next the package \Package{caption2} has been loaded, and only
if the package has been loaded really, \KOMAScript{} re-defines
its own command \Macro{setcapindent}.
The exact code of the definition is not important.
It should only be noted that \Package{caption2} claims the
control over the \Macro{caption} macro.
Thus the normal definition of the \Macro{setcapindent} macro
would not work as expected.
The re-definition improves the collaboration with \Package{caption2}.
There are of course useful examples for normal \LaTeX{} user too.
Suppose a document that should be availbale as PS file, using
LaTeX{} and dvips, and as PDF file, using pdf\LaTeX.
The document should contain hyper-links.
In the List of Tables there are entries longer than one line.
This is not a problem for the pdf\LaTeX{} way, since here
hyper-links can run across multiple lines.
But if a \Package{hyperref} driver for dvips or
hyper\TeX{} is used then this is not possible.
In this case one wants that for the \Package{hyperref} setup
the \Option{linktocpage} is used.
The decision what \Package{hyperref} driver has to be used
happens automatically via \File{hyperref.cfg}.
The file has for example the content below.
\begin{small}
\begin{verbatim}
\ProvidesFile{hyperref.cfg}
\@ifundefined{pdfoutput}{\ExecuteOptions{dvips}}
{\ExecuteOptions{pdftex}}
\endinput
\end{verbatim}
\end{small}
All following is now the task of \Macro{AfterFile}.
\begin{small}
\begin{verbatim}
\documentclass{article}
\usepackage{scrlfile}
\AfterFile{hdvips.def}{\hypersetup{linktocpage}}
\AfterFile{hypertex.def}{\hypersetup{linktocpage}}
\usepackage{hyperref}
\begin{document}
\listoffigures
\clearpage
\begin{figure}
\caption{This is an example for a long figure caption,
but even though it does not employ the optional
caption argument that would allow to write
a short caption in the List of Figures.}
\end{figure}
\end{document}
\end{verbatim}
\end{small}
If now \Package{hyperref} drivers \Option{hypertex} or
\Option{dvips} are used then the useful \Package{hyperref} option
\Option{linktocpage} will be set.
In the pdf\LaTeX{} case the option will not be set, since
in that case an other \Package{hyperref} driver \File{hpdftex.def}
will be used. That means neither \File{hdvips.def} nor
\File{hypertex.def} will be loaded.
\end{Example}
\begin{Explain}
Furthermore the loading of package \Package{scrlfile}
and the \Macro{AfterFile} statement can be written
in the private \File{hyperref.cfg}.
But then instead of \Macro{usepackage} the macro
\Macro{RequiresPackage} ought be used, see \cite{latex:clsguide}.
The new lines have to be inserted directly after
\Macro{ProvidesFile} line, thus prior to the execution
of the options \Option{dvips} or \Option{pdftex}.
\end{Explain}
\section{Authors}
\label{sec:scrlfile.authors}
The authors listed below are responsible for this chapter or have
contributed to this chapter in different ways.
% Please use \textit{} for the name of the translator add all the
% names of the untranslated german file. If the translator is the
% main author, simply use \textbf.
\begin{itemize}
\item Markus Kohm \TextEMail{Markus.Kohm@gmx.de}
\item \textit{Jens-Uwe Morawski}
\end{itemize}
\EndIndex{Package}{scrlfile}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "main"
%%% End:
|