% ======================================================================
% scrhack.tex
% Copyright (c) Markus Kohm, 2001-2019
%
% 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-2019
%
% 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: 2019-11-26 11:13:57 +0100 (Tue, 26 Nov 2019) $
                  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.

\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
