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
|
% ======================================================================
% scrhack.tex
% Copyright (c) Markus Kohm, 2001-2021
%
% 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.txt.
% ----------------------------------------------------------------------
% scrhack.tex
% Copyright (c) Markus Kohm, 2001-2021
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
% Die neuste Version dieser Lizenz ist
% http://www.latex-project.org/lppl.txt
% und Version 1.3c ist Teil aller Verteilungen von LaTeX
% Version 2005/12/01 oder spaeter und dieses Werks.
%
% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
% (allein durch den Autor verwaltet).
%
% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
%
% Chapter about scrhack of the KOMA-Script guide
% Maintained by Markus Kohm
%
% ----------------------------------------------------------------------------
%
% Kapitel über scrhack in der KOMA-Script-Anleitung
% Verwaltet von Markus Kohm
%
% ============================================================================
\KOMAProvidesFile{scrhack.tex}
[$Date: 2021-06-03 19:56:49 +0200 (Do, 03. Jun 2021) $
KOMA-Script guide (chapter: scrhack)]
\chapter{Fremdpakete verbessern mit \Package{scrhack}}
\labelbase{scrhack}
\BeginIndexGroup
\BeginIndex{Package}{scrhack}
Einige Pakete außerhalb von \KOMAScript{} arbeiten nicht sehr gut mit
\KOMAScript{} zusammen. Für den \KOMAScript-Autor ist es dabei oftmals sehr
mühsam, die Autoren der jeweiligen Pakete von einer Verbesserung zu
überzeugen. Das betrifft auch Pakete, deren Entwicklung eingestellt
wurde. Deshalb wurde das Paket \Package{scrhack} begonnen. Dieses Paket ändert
Anweisungen und Definitionen anderer Pakete, damit sie besser mit
\KOMAScript{} zusammenarbeiten. Einige Änderungen sind auch bei
Verwendung anderer Klassen nützlich.
Es wird empfohlen, das Paket \Package{scrhack} so früh wie möglich zu
laden. Insbesondere sollte das Laden vor den betroffenen Paketen erfolgen.
\section{Entwicklungsstand}
\seclabel{draft}
Obwohl das Paket bereits seit längerer Zeit Teil von \KOMAScript{} ist und
von vielen Anwendern genutzt wird, hat es auch ein Problem: Bei
der Umdefinierung von Makros fremder Pakete ist es von der genauen Definition
und Verwendung dieser Makros abhängig. Damit ist es gleichzeitig auch von
bestimmten Versionen dieser Pakete abhängig. Wird eine unbekannte Version
eines der entsprechenden Pakete verwendet, kann \Package{scrhack} den
notwendigen Patch eventuell nicht ausführen. Im Extremfall kann aber umgekehrt
der Patch einer unbekannten Version auch zu einem Fehler führen.
Da also \Package{scrhack} immer wieder an neue Versionen fremder Pakete
angepasst werden muss, kann es niemals als fertig angesehen werden. Daher
existiert von \Package{scrhack} dauerhaft nur eine Beta-Version. Obwohl die
Benutzung in der Regel einige Vorteile mit sich bringt, kann die Funktion
nicht dauerhaft garantiert werden.
\LoadCommonFile{options}
\section{Verwendung von \Package{tocbasic}}
\seclabel{improvement}
In den Anfängen von \KOMAScript{} gab es von Anwenderseite den Wunsch, dass
Verzeichnisse von Gleitumgebungen, die mit dem Paket
\Package{float}\IndexPackage{float}\important{\Package{float}} erzeugt werden,
genauso behandelt werden wie das Abbildungsverzeichnis oder das
Tabellenverzeichnis, das von den \KOMAScript-Klassen selbst angelegt
wird. Damals setzte sich der \KOMAScript-Autor mit dem Autor von
\Package{float} in Verbindung, um diesem eine Schnittstelle für entsprechende
Erweiterungen zu unterbreiten. In etwas abgewandelter Form wurde diese in
Gestalt der beiden Anweisungen
\Macro{float@listhead}\IndexCmd[indexmain]{float@listhead} und
\Macro{float@addtolists}\IndexCmd[indexmain]{float@addtolists} realisiert.
Später zeigte sich, dass diese beiden Anweisungen nicht genug Flexibilität für
eine umfangreiche Unterstützung aller \KOMAScript-Möglichkeiten boten. Leider
hatte der Autor von \Package{float} die Entwicklung aber bereits eingestellt,
so dass hier keine Änderungen mehr zu erwarten sind.
Andere Paketautoren haben die beiden Anweisungen ebenfalls übernommen. Dabei
zeigte sich, dass die Implementierung in einigen Paketen, darunter auch
\Package{float}, dazu führt, dass all diese Pakete nur in einer bestimmten
Reihenfolge geladen werden können, obwohl sie ansonsten in keinerlei Beziehung
zueinander stehen.
Um all diese Nachteile und Probleme zu beseitigen, unterstützt \KOMAScript{}
diese alte Schnittstelle offiziell nicht mehr. Stattdessen wird bei Verwendung
dieser Schnittstelle von \KOMAScript{} gewarnt. Gleichzeitig wurde in
\KOMAScript{} das Paket
\Package{tocbasic}\IndexPackage{tocbasic}\important{\Package{tocbasic}} (siehe
\autoref{cha:tocbasic}) als zentrale Schnittstelle für die Verwaltung von
Verzeichnissen entworfen und realisiert. Die Verwendung dieses Pakets bietet
\iffalse weit \fi % Umbruchkorrektur
mehr Vorteile und Möglichkeiten als die
\iffalse beiden \fi % Umbruchkorrektur
alten Anweisungen.
Obwohl der Aufwand zur Verwendung dieses Pakets gering ist, haben bisher
die Autoren der Pakete, die auf die veralteten Anweisungen gesetzt haben,
keine Anpassung vorgenommen. Daher bietet \Package{scrhack}
entsprechende Anpassungen für die Pakete
\Package{float}\IndexPackage{float}\important{\Package{float},
\Package{floatrow}, \Package{listings}},
\Package{floatrow}\IndexPackage{floatrow} und
\Package{listings}\IndexPackage{listings}. Allein durch das Laden von
\Package{scrhack} reagieren diese Pakete dann nicht nur auf die Einstellungen
von Option
\DescRef{maincls.option.listof}\IndexOption{listof~=\PName{Einstellung}},
sondern beachten auch Sprachumschaltungen durch
\Package{babel}\IndexPackage{babel}. Näheres zu den Möglichkeiten, die
durch die Umstellung der Pakete auf \Package{tocbasic} zur Verfügung
stehen, ist \autoref{sec:tocbasic.toc} zu entnehmen.
Sollte diese Änderung für eines der Pakete nicht erwünscht sein oder zu
Problemen führen, so kann sie selektiv mit den Einstellungen
\OptionValue{float}{false}\IndexOption[indexmain]{float~=\textKValue{false}},
\OptionValue{floatrow}{false}%
\IndexOption[indexmain]{floatrow~=\textKValue{false}} und
\OptionValue{listings}{false}%
\IndexOption[indexmain]{listings~=\textKValue{false}} abgeschaltet
werden. Wichtig\textnote{Achtung!} dabei ist, dass eine Änderung der Optionen
nach dem Laden des zugehörigen Pakets keinen Einfluss mehr hat!
\section{Falsche Erwartungen an \Macro{@ptsize}}
\seclabel{ptsize}
Einige Pakete gehen \iffalse grundsätzlich \fi % Umbruchkorrektur
davon aus, dass das klasseninterne Makro \Macro{@ptsize}\IndexCmd{@ptsize}
sowohl definiert ist als auch zu einer ganzen Zahl expandiert. Aus
Kompatibilitätsgründen definiert \KOMAScript{} \Macro{@ptsize} auch bei
anderen Grundschriftgrößen als 10\Unit{pt}, 11\Unit{pt} oder 12\Unit{pt}. Da
\KOMAScript{} außerdem auch gebrochene Schriftgrößen erlaubt, kann
\iffalse dabei \fi % Umbruchkorrektur
\Macro{@ptsize} natürlich auch zu einem Dezimalbruch expandieren.
Eines\ChangedAt{v3.17}{\Package{scrhack}} der Pakete, die damit nicht zurecht
kommen, ist das Paket \Package{setspace}\IndexPackage[indexmain]{setspace}%
\important{\Package{setspace}}. Darüber hinaus sind die von diesem Paket
eingestellten Werte immer von der Grundschriftgröße abhängig, auch wenn die
Einstellung im Kontext einer anderen Schriftgröße erfolgt. Paket
\Package{scrhack} löst beide Probleme, indem es die Einstellungen von
\Macro{onehalfspacing} und \Macro{doublespacing} immer relativ zur aktuellen,
tatsächlichen Schriftgröße vornimmt.
Sollte diese Änderung nicht erwünscht sein oder zu Problemen führen, so kann
sie selektiv mit der Einstellung
\OptionValue{setspace}{false}\IndexOption[indexmain]{setspace~=\textKValue{false}}
abgeschaltet werden. Wichtig\textnote{Achtung!} dabei ist, dass eine Änderung
der Option nach dem Laden von \Package{setspace} keinen Einfluss mehr hat!
Ebenso muss \Package{scrhack} vor \Package{setspace} geladen werden, falls
\Package{setspace} mit einer der Optionen \Option{onehalfspacing} oder
\Option{doublespacing} geladen wird und dieser Hack sich bereits darauf
auswirken soll.
\section{Sonderfall \Package{hyperref}}
\seclabel{hyperref}
Ältere Versionen von
\Package{hyperref}\IndexPackage{hyperref}\important{\Package{hyperref}} vor
6.79h haben bei den Sternformen der Gliederungsbefehle hinter statt vor oder
auf die Gliederungsüberschriften verlinkt. Inzwischen ist dieses Problem auf
Vorschlag des \KOMAScript-Autors beseitigt. Da die entsprechende Änderung aber
über ein Jahr auf sich warten ließ, wurde in \Package{scrhack} ein
entsprechender Patch aufgenommen. Zwar kann dieser ebenfalls durch
\OptionValue{hyperref}{false} deaktiviert werden, empfohlen wird jedoch
stattdessen die aktuelle Version von \Package{hyperref} zu verwenden. In
diesem Fall wird die Änderung durch \Package{scrhack} automatisch verhindert.
\section{Inkonsistente Behandlung von \Length{textwidth} und \Length{textheight}}
\seclabel{lscape}
Das\ChangedAt{v3.18}{\Package{scrhack}} Paket
\Package{lscape}\IndexPackage[indexmain]{lscape}%
\important{\Package{lscape}} definiert eine Umgebung
\Environment{landscape}\IndexEnv{landscape}, um den Inhalt einer Seite aber
nicht deren Kopf und Fuß quer zu setzen. Innerhalb dieser Umgebung wird
\Length{textheight}\IndexLength{textheight} auf den Wert von
\Length{textwidth} gesetzt. Umgekehrt wird jedoch \Length{textwidth} nicht auf
den vorherigen Wert von \Length{textheight} gesetzt. Das ist
inkonsistent. Meines Wissens wird \Length{textwidth} nicht entsprechend
geändert, weil andere Pakete oder Anwenderanweisungen gestört werden
könnten. Jedoch hat auch die Änderung von \Length{textheight} dieses Potential
und in der Tat beschädigt sie die Funktion beispielsweise der Pakete
\Package{showframe}\IndexPackage{showframe} und
\Package{scrlayer}\IndexPackage{scrlayer}. Daher wäre es am besten, wenn
\Length{textheight} ebenfalls unverändert bliebe. \Package{scrhack} verwendet
Paket \Package{xpatch} (siehe \cite{package:xpatch}), um die Startanweisung
\Macro{landscape} der gleichnamigen Umgebung entsprechend zu ändern.
Falls diese Änderung nicht gewünscht wird oder Probleme verursacht, kann sie
mit Option
\OptionValue{lscape}{false}\IndexOption[indexmain]{lscape~=\textKValue{false}}
deaktiviert werden. Es ist zu beachten\textnote{Achtung!}, dass eine
nachträgliche Zuweisung an Option \Option{lscape} mit
\DescRef{\LabelBase.cmd.KOMAoption}\IndexCmd{KOMAoption} oder
\DescRef{\LabelBase.cmd.KOMAoptions}\IndexCmd{KOMAoptions} nur eine Wirkung
hat, wenn sie während des Ladens von \Package{lscape} nicht \PValue{false}
war.
Im übrigens wird \Package{lscape} auch von dem Paket
\Package{pdflscape}\IndexPackage[indexmain]{pdflscape}%
\important{\Package{pdflscape}} verwendet, so dass \Package{scrhack} sich auch
auf die Funktion dieses Pakets auswirkt.%
\section{Sonderfall \Package{nomencl}}
\seclabel{nomencl}
Eine\ChangedAt{v3.23}{\Package{scrhack}} Besonderheit stellt der Hack für das
Paket
\Package{nomencl}\IndexPackage[indexmain]{nomencl}\important{\Package{nomencl}}
dar. Dieser rüstet einerseits nach, dass der optionale
Inhaltsverzeichniseintrag für die Nomenklatur Option
\OptionValueRef{maincls}{toc}{indentunnumbered} beachtet. Quasi nebenbei
werden über das Paket \Package{tocbasic} auch gleich die Endungen \File{nlo}
und \File{nls} für den Besitzer \PValue{nomencl} reserviert (siehe
\DescRef{tocbasic.cmd.addtotoclist}, \autoref{sec:tocbasic.basics},
\DescPageRef{tocbasic.cmd.addtotoclist}).
Außerdem wird die Umgebung
\Environment{thenomenclature}\IndexEnv{thenomenclature} so geändert,
dass \DescRef{tocbasic.cmd.tocbasic@listhead}\IndexCmd{tocbasic@listhead} für
die Überschrift verwendet wird (siehe \autoref{sec:tocbasic.internals},
\DescPageRef{tocbasic.cmd.tocbasic@listhead}). Dadurch können mit dem Hack
diverse Attribute für die Endung \File{nls} über
\DescRef{tocbasic.cmd.setuptoc}\IndexCmd{setuptoc}%
\important{\DescRef{tocbasic.cmd.setuptoc}} gesetzt werden. So ist es
beispielsweise möglich, mit
\DescRef{tocbasic.cmd.setuptoc}\PParameter{nls}\PParameter{numbered} die
Nomenklatur nicht nur ins Inhaltsverzeichnis einzutragen, sondern auch gleich
zu nummerieren. Näheres zu \DescRef{tocbasic.cmd.setuptoc} und den damit
möglichen Einstellungen ist in \autoref{sec:tocbasic.toc}, ab
\DescPageRef{tocbasic.cmd.setuptoc} zu finden. Als kleiner aber wichtiger
Nebeneffekt erhält die Nomenklatur mit diesem Patch außerdem einen passenden
Kolumnentitel, falls lebende Kolumnentitel beispielsweise durch Verwendung von
Seitenstil \DescRef{maincls.pagestyle.headings} aktiviert wurden.
Dieser eher simple Patch ist damit ein Beispiel dafür, wie auch Pakete, die
keine Gleitumgebungen definieren, Nutzen aus der Verwendung von
\Package{tocbasic} ziehen könnten. Falls diese Änderung jedoch nicht
gewünscht wird oder Probleme verursacht, kann sie mit Option
\OptionValue{nomencl}{false}\IndexOption[indexmain]{nomencl~=\textKValue{false}}
deaktiviert werden. Entscheidend\textnote{Achtung!} ist dabei die Einstellung
der Option zum Zeitpunkt, zu dem \Package{nomencl} geladen wird! Spätere
Änderungen der Option mit \DescRef{\LabelBase.cmd.KOMAoption} oder
\DescRef{\LabelBase.cmd.KOMAoptions} haben also keinen Einfluss und führen zu
einer entsprechenden Warnung.%
\section{Sonderfall Überschriften}
\seclabel{sections}
Diverse\ChangedAt{v3.27}{\Package{scrhack}} Pakete gehen davon aus, dass
Überschriften auf eine ganz bestimmte Weise definiert sind, die weitgehend den
Definitionen der Standardklassen entsprechen. Dies ist jedoch nicht bei allen
Klassen der Fall. Beispielsweise sind bei den \KOMAScript-Klassen die
Überschriften komplett anders definiert, um viele zusätzliche Möglichkeiten zu
bieten. Das kann einige wenige Pakete aus dem Tritt bringen. Ab Version~3.27
bietet \Package{scrhack} daher die Möglichkeit, zwangsweise die
Überschriftenbefehle \DescRef{maincls.cmd.part}\IndexCmd{part},
\DescRef{maincls.cmd.chapter}\IndexCmd{chapter},
\DescRef{maincls.cmd.section}\IndexCmd{section},
\DescRef{maincls.cmd.subsection}\IndexCmd{subsection},
\DescRef{maincls.cmd.subsubsection}\IndexCmd{subsubsection},
\DescRef{maincls.cmd.paragraph}\IndexCmd{paragraph} und
\DescRef{maincls.cmd.subparagraph}\IndexCmd{subparagraph} kompatibel zu den
Standardklassen zu definieren. Dabei werden im Fall, dass
\DescRef{maincls.cmd.chapter} definiert ist, die Definitionen von \Class{book}
zugrunde gelegt. Ist \DescRef{maincls.cmd.chapter} nicht definiert, so werden
die Definitionen von \Class{article} herangezogen.
Bei Verwendung einer \KOMAScript-Klasse werden als Seiteneffekt zusätzlich
diverse Möglichkeiten dieser Klassen deaktviert. Beispielsweise stehen dann
die Befehle zur Neudefinition oder Änderung der Gliederungsbefehle aus
\autoref{sec:maincls-experts.sections} oder Option
\DescRef{maincls.option.headings} nicht mehr zur Verfügung und Befehle wie
\DescRef{maincls.cmd.partformat} erhalten eine neue Voreinstellung.
Da dieser Hack häufig mehr Schaden als Nutzen bringt, erzeugt er eine größere
Anzahl an Warnungen. Außerdem ist er nicht bereits durch das Laden von Paket
\Package{scrhack} aktiv, sondern muss beim Laden des Pakets mit Option
\Option{standardsections}\IndexOption[indexmain]{standardsections} explizit
aktiviert werden. Eine nachträgliche Aktivierung oder Deaktivierung ist nicht
möglich.
Da es für die eingangs erwähnten Probleme oft weniger invasive Lösungen gibt,
wird die Verwendung des Hacks ausdrücklich nicht empfohlen, sondern lediglich
als letzte Rettungschance für Notfälle angeboten.%
\EndIndexGroup
%%% Local Variables:
%%% mode: latex
%%% coding: utf-8
%%% TeX-master: "../guide"
%%% End:
% LocalWords: Eindateiensystem Schreibdatei Zieldatei Zielendung Quellendung
% LocalWords: Verzeichnisüberschrift Dateiendung Zielendungen Verzeichnisdatei
% LocalWords: Benutzeranweisungen Dokumentpräambel Kapitelebene Sternformen
% LocalWords: Sprachumschaltungen Gliederungsüberschriften Gliederungsbefehle
% LocalWords: Paketautoren
|