% \CheckSum{941}
% \iffalse meta-comment
% ======================================================================
% scrhack.dtx
% Copyright (c) Markus Kohm, 2008-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.
%
% To create `scrhack.sty' run `tex scrhack.dtx'.  Using LaTeX instead
% of TeX would generate the implementation documentation.
% ----------------------------------------------------------------------
% scrhack.dtx
% Copyright (c) Markus Kohm, 2008-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.
%
% `scrhack.sty' kann durch den Aufruf `tex scrhack.dtx' erzeugt 
% werden. Bei Verwendung von LaTeX statt TeX wird hingegen die
% Implementierungsdokumentation erzeugt.
% ======================================================================
% \fi
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \iffalse
%%% From File: $Id: scrhack.dtx 3063 2019-02-01 07:39:11Z kohm $
%<package&identify>%%% using: package,identify
%<package&option>%%% using: package,option
%<package&body>%%% using: package,body
%<package&identity>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
%<*dtx>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
  \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
  \filedate$Date: 2019-02-01 08:39:11 +0100 (Fri, 01 Feb 2019) $
  \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
  \filerevision$Revision: 1962 $
\endgroup
\ProvidesFile{scrhack.dtx}[\filedate\space\filerevision\space
%</dtx>
%<package&identify>\ProvidesPackage{scrhack}[%
%<hyperref&identify>\ProvidesFile{hyperref.hak}[%
%<float&identify>\ProvidesFile{float.hak}[%
%<floatrow&identify>\ProvidesFile{floatrow.hak}[%
%<listings&identify>\ProvidesFile{listings.hak}[%
%<setspace&identify>\ProvidesFile{setspace.hak}[%
%<lscape&identify>\ProvidesFile{lscape.hak}[%
%<nomencl&identify>\ProvidesFile{nomencl.hak}[%
%<*dtx|identify>
%!KOMAScriptVersion
  package
%<*dtx>
  source
%</dtx>
%<*!identify>
  (hacking other packages)%
%</!identify>
%</dtx|identify>
%<hack&identify>  (hacking package
%<hyperref&identify>    hyperref)%
%<float&identify>    float)%
%<floatrow&identify>    floatrow)%
%<listings&identify>    listings)%
%<setspace&identify>    setspace)%
%<lscape&identify>    lscape)%
%<nomencl&identify>    nomencl)%
%<*dtx|identify>
]
%</dtx|identify>
%<*dtx>
\ifx\documentclass\undefined
  \input scrdocstrip.tex
  \@@input scrkernel-version.dtx
  \@@input scrstrip.inc
  \KOMAdefVariable{COPYRIGHTFROM}{2008}
  \generate{\usepreamble\defaultpreamble
    \file{scrhack.sty}{%
      \from{scrkernel-version.dtx}{package,scrhack}%
      \from{scrhack.dtx}{package,identify}%
      \from{scrkernel-basics.dtx}{load}%
      \from{scrhack.dtx}{package,option}%
      \from{scrhack.dtx}{package,body}%
      \from{scrlogo.dtx}{logo}%
    }%
    \file{hyperref.hak}{%
      \from{scrkernel-version.dtx}{file,hyperref.hak}%
      \from{scrhack.dtx}{hack,hyperref,identify}%
      \from{scrhack.dtx}{hack,hyperref,body}%
    }%
    \file{float.hak}{%
      \from{scrkernel-version.dtx}{file,float.hak}%
      \from{scrhack.dtx}{hack,float,identify}%
      \from{scrhack.dtx}{hack,float,body}%
    }%
    \file{floatrow.hak}{%
      \from{scrkernel-version.dtx}{file,floatrow.hak}%
      \from{scrhack.dtx}{hack,floatrow,identify}%
      \from{scrhack.dtx}{hack,floatrow,body}%
    }%
    \file{listings.hak}{%
      \from{scrkernel-version.dtx}{file,listings.hak}%
      \from{scrhack.dtx}{hack,listings,identify}%
      \from{scrhack.dtx}{hack,listings,body}%
    }%
    \file{setspace.hak}{%
      \from{scrkernel-version.dtx}{file,setspace.hak}%
      \from{scrhack.dtx}{hack,setspace,identify}%
      \from{scrhack.dtx}{hack,setspace,body}%
    }%
    \file{lscape.hak}{%
      \from{scrkernel-version.dtx}{file,lscape.hak}%
      \from{scrhack.dtx}{hack,lscape,identify}%
      \from{scrhack.dtx}{hack,lscape,body}%
    }%
    \file{nomencl.hak}{%
      \from{scrkernel-version.dtx}{file,nomencl.hak}%
      \from{scrhack.dtx}{hack,nomencl,identify}%
      \from{scrhack.dtx}{hack,nomencl,body}%
    }%
  }
  \@@input scrstrop.inc
\else
  \let\endbatchfile\relax
\fi
\endbatchfile
\documentclass[parskip=half-]{scrdoc}
\usepackage[latin1]{inputenc}
\usepackage[english,ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\newcommand*{\Environment}[1]{\texttt{\mbox{#1}}}
\CodelineIndex
\RecordChanges
\begin{document}
\GetFileInfo{scrhack.dtx}
\DocInput{scrhack.dtx}
\end{document}
%</dtx>
%\fi
%
% \selectlanguage{english}
%
% \let\PName\meta
% \let\Parameter\marg
% \providecommand*{\PParameter}[1]{\texttt{\{#1\}}}
% \providecommand*{\Counter}[1]{\texttt{\mbox{#1}}}
% \providecommand*{\Option}[1]{\texttt{#1}}
% \providecommand*{\OptionValue}[2]{\texttt{\mbox{#1=}\linebreak[3]\mbox{#2}}}
% \let\PValue\texttt
%
% \title{\KOMAScript{} \partname\ \texttt{\filename}%
%   \thanks{This file is version \fileversion\ of \texttt{\filename}.}}
% \date{\filedate}
% \author{Markus Kohm\thanks{mailto:komascript(at)gmx.info}}
% \maketitle
% \begin{abstract}
%   Some packages from other authors may have problems with \KOMAScript{}.  In
%   my opinion some packages could be improved. With some packages this makes
%   only sense, if \KOMAScript{} was used. With some other packages the
%   package author has another opinion. Sometimes proposals was never
%   answered. Package \Package{scrhack} contains all those improvement
%   proposals for other packages. This means, \Package{scrhack} redefines
%   macros of packages from other authors! The redefinitions are only
%   activated, if those packages were loaded. Users may prevent
%   \Package{scrhack} from redefining macros of individual packages.
% \end{abstract}
% \tableofcontents
%
% \selectlanguage{ngerman}
% \StopEventually{\PrintIndex\PrintChanges}
% \changes{v3.03}{2009/03/12}{erste Version des Pakets}^^A
%
% \section{Implementation of \Package{scrhack}}
%
% \changes{v3.04b}{2009/08/05}{Die Reihenfolge von Anweisungen und Optionen
%   grundlegend geändert, um das Paket \textsf{scrhack} unabhängiger von der
%   Reihenfolge beim Laden von Paketen zu machen.}^^A
%
% \subsection{Optionen}
%
% \iffalse
%<*package&option>
% \fi
%
% Das Paket bedient sich \cs{KOMAoptions} etc. aus \textsf{scrkbase} (dieses
% wird übrigens direkt per \texttt{scrkbase.dtx} geladen).
%
% Per Option kann gewählt werden, welche Manipulationen geladen werden
% sollen. Alle diese Optionen können jedoch nur bis zum Laden des
% entsprechenden Pakets oder dem Laden von \textsf{scrhack} gesetzt
% werden (es zählt, was später kommt). Anschließend sind sie wirkungslos.
%
% \subsection{Verwendete Anweisungen}
%
% \iffalse
%</package&option>
%<*package&body>
% \fi
%
% \begin{macro}{\scr@ifexpected}
% Wenn die im ersten Argument angegebene Anweisung nach Ausführung der im
% zweiten Argument angegebenen Anweisungen unverändert ist, dann soll das
% dritte Argument ausgeführt werden, sonst das vierte.
%    \begin{macrocode}
\newcommand{\scr@ifexpected}[2]{%
  \begingroup
    \let\@tempa#1
    #2
    \ifx\@tempa#1
      \aftergroup\@firstoftwo
    \else
      \aftergroup\@secondoftwo
    \fi
  \endgroup
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\scr@hack@load}
% Wenn die Datei mit dem Namen des zweiten Arguments und der Endung des ersten
% Arguments so geladen wurde, dass \LaTeX{} eine Versionsinfo dazu gespeichert
% hat, dann soll zusätzlich der entsprechende Hack geladen werden.
%    \begin{macrocode}
\newcommand*{\scr@hack@load}[2]{%
  \expandafter\ifx\csname ver@#2.#1\endcsname\relax
    \expandafter\@secondoftwo
  \else
%    \end{macrocode}
% Allerdings wird jeder Hack nur genau einmal geladen:
%    \begin{macrocode}
    \expandafter\ifx\csname ver@#2.hak\endcsname\relax
      \expandafter\expandafter\expandafter\@firstoftwo
    \else
      \expandafter\expandafter\expandafter\@secondoftwo
    \fi
  \fi
  {%
    \PackageInfo{scrhack}{loading #2 hack}%
    \edef\reserved@a{%
      \noexpand\makeatletter\noexpand\input{#2.hak}%
      \noexpand\catcode`\noexpand\@\the\catcode`\@\relax
    }\reserved@a
  }{%
    \PackageInfo{scrhack}{ignorring #2 hack}%
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \iffalse
%</package&body>
% \fi
%
% \subsection{Der \textsf{hyperref}-Hack}
%
% \textsf{hyperref} setzt den Anker zu der Stern-Variante einer Überschrift
% hinter die Überschrift, während es bei der nicht Stern-Variante den Anker
% auch dann vor die Überschrift setzt, wenn die Überschrift aufgrund von
% \texttt{secnumdepth} nicht nummeriert wird. Der Hack setzt den Anker
% einheitlich vor die Überschrift.
%
% \begin{option}{hyperref}
%   \changes{v3.12}{2013/03/05}{Signalisierung mit
%     \cs{FamilyKeyStateProcessed}}^^A
%   \changes{v3.17}{2015/03/09}{Defaulteinstellung mit
%     \cs{KOMAExecuteOptions}}^^A
%    \begin{macrocode}
%<*package&option>
\KOMA@ifkey{hyperref}{@scrhack@hyperref}%
\KOMAExecuteOptions{hyperref=true}%
%</package&option>
%<*package&body>
%    \end{macrocode}
% \changes{v3.04b}{2009/11/09}{\textsf{hyperref}-Hack wird früher geladen}^^A
% \changes{v3.17}{2015/03/09}{Neuere \textsf{hyperref}-Version deaktiviert
%   ggf. Option \texttt{hyperref}}^^A
% \changes{v3.18}{2015/05/22}{Neuere \KOMAScript-Versionen deaktivieren
%   ggf. Option \texttt{hyperref}}^^A
% Hier muss ein wenig trickreicher gearbeitet werden, weil \textsf{hyperref}
% die Treiberdatei per \cs{AtEndOfPackage} lädt und der Hack erst danach
% installiert werden darf. Mit \cs{AfterPackage*} alleine, würde der Hack aber
% vor dem Laden der Treiberdatei installiert. Dafür können wir aber sicher
% sein, dass ein innerhalb von \cs{AfterPackage*} aufgerufenes
% \cs{AtEndOfPackage} garantiert nach dem Laden der Treiberdatei ausgeführt
% wird. Das funktioniert auch noch, wenn \textsf{hyperref} bereits geladen
% wurde. In dem Fall wird der Code einfach nach dem Ende von \textsf{scrhack}
% statt nach dem Ende von \textsf{hyperref} ausgeführt.
%    \begin{macrocode}
\BeforePackage{hyperref}{%
  \scr@ifundefinedorrelax{hy@insteadofrefstepcounter}{}{%
    \PackageInfo{scrhack}{hyperref hack deactivated because of\MessageBreak
      detection of KOMA-Script class, that doesn't\MessageBreak
      need that hack,}%
    \KOMAExecuteOptions[.scrhack.sty]{hyperref=false}%
  }%
}
\AfterPackage*{hyperref}{%
  \if@scrhack@hyperref
    \@ifpackagelater{hyperref}{2009/11/24}{%
      \PackageInfo{scrhack}{hyperref hack deactivated because of\MessageBreak
        detection of hyperref version, that doesn't\MessageBreak
        need that hack,}%
      \KOMAExecuteOptions[.scrhack.sty]{hyperref=false}%
    }{%
      \AtEndOfPackage{%
        \KOMA@key[.scrhack.sty]{hyperref}{%
          \PackageWarning{scrhack}{option `hyperref=#1' ignored}%
          \FamilyKeyStateProcessed
        }%
        \if@scrhack@hyperref\scr@hack@load\@pkgextension{hyperref}\fi
      }%
    }%
  \fi
}
%</package&body>
%    \end{macrocode}
% \end{option}
%
%
% \begin{macro}{\@schapter}
% \begin{macro}{\@spart}
% \begin{macro}{\@ssect}
% Eigentlich wird hier gar nicht \texttt{hyperref.sty} verändert, sondern
% diverse Treiberdateien. Sobald das Paket \textsf{hyperref} geladen ist, ist
% auch die passende Treiberdatei geladen und außerdem sind alle
% Treiberdateien, die entsprechende Definitionen vornehmen, gleichermaßen
% betroffen. Also kann der entsprechende Patch einfach erfolgen, wenn hyperref
% geladen ist (was bereits von \cs{scr@hack@load} getestet wurde). Es muss
% also nur noch sichergestellt werden, dass die umzudefinierenden Macros
% derzeit den erwarteten Inhalt haben.
%    \begin{macrocode}
%<*hyperref&body>
\scr@ifexpected\@schapter{%
  \def\@schapter#1{%
    \H@old@schapter{#1}%
    \begingroup
      \let\@mkboth\@gobbletwo
      \Hy@GlobalStepCount\Hy@linkcounter
      \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}%
      \Hy@raisedlink{%
        \hyper@anchorstart{\@currentHref}\hyper@anchorend
      }%
    \endgroup
  }%
}{%
  \PackageInfo{scrhack}{redefining \string\@schapter}%
  \def\@schapter#1{%
    \begingroup
      \let\@mkboth\@gobbletwo
      \Hy@GlobalStepCount\Hy@linkcounter
      \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}%
      \Hy@raisedlink{%
        \hyper@anchorstart{\@currentHref}\hyper@anchorend
      }%
    \endgroup
    \H@old@schapter{#1}%
  }%
}{%
  \scr@ifexpected\@schapter{%
    \def\@schapter#1{%
      \begingroup
        \let\@mkboth\@gobbletwo
        \Hy@GlobalStepCount\Hy@linkcounter
        \xdef\@currentHref{\Hy@chapapp*.\the\Hy@linkcounter}%
        \Hy@raisedlink{%
          \hyper@anchorstart{\@currentHref}\hyper@anchorend
        }%
      \endgroup
      \H@old@schapter{#1}%
    }%
  }{}{%
    \PackageWarningNoLine{scrhack}{unknown \string\@schapter\space
      definition found!\MessageBreak
      Maybe you are using a unsupported hyperref version}%
  }%
}

\scr@ifexpected\@spart{%
  \def\@spart#1{%
    \H@old@spart{#1}%
    \Hy@GlobalStepCount\Hy@linkcounter
    \xdef\@currentHref{part*.\the\Hy@linkcounter}%
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
  }%
}{%
  \PackageInfo{scrhack}{redefining \string\@spart}%
  \def\@spart#1{%
    \Hy@GlobalStepCount\Hy@linkcounter
    \xdef\@currentHref{part*.\the\Hy@linkcounter}%
    \Hy@raisedlink{%
      \hyper@anchorstart{\@currentHref}\hyper@anchorend
    }%
    \H@old@spart{#1}%
  }%
}{%
  \scr@ifexpected\@spart{%
    \def\@spart#1{%
      \Hy@GlobalStepCount\Hy@linkcounter
      \xdef\@currentHref{part*.\the\Hy@linkcounter}%
      \Hy@raisedlink{%
        \hyper@anchorstart{\@currentHref}\hyper@anchorend
      }%
      \H@old@spart{#1}%
    }%
  }{}{%
    \PackageWarningNoLine{scrhack}{unknown \string\@spart\space
      definition found!\MessageBreak
      Maybe you are using a unsupported hyperref version}%
  }%
}

\scr@ifexpected\@ssect{%
  \def\@ssect#1#2#3#4#5{%
    \H@old@ssect{#1}{#2}{#3}{#4}{#5}%
    \phantomsection
  }%
}{%
  \PackageInfo{scrhack}{redefining \string\@ssect}%
  \def\@ssect#1#2#3#4#5{%
    \H@old@ssect{#1}{#2}{#3}{#4}{\phantomsection\ignorespaces#5}%
  }%
}{%
  \scr@ifexpected\@ssect{%
    \def\@ssect#1#2#3#4#5{%
      \H@old@ssect{#1}{#2}{#3}{#4}{\phantomsection\ignorespaces#5}%
    }%
  }{}{%
    \PackageWarningNoLine{scrhack}{unknown \string\@ssect\space
      definition found!\MessageBreak
      Maybe you are using a unsupported hyperref version}%
  }%
}
%</hyperref&body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \subsection{Der \textsf{float}-Hack}
%
% Das \textsf{float}-Paket verwendet das Makro \cs{float@listhead} zum
% Setzen der Überschriften. Dies wird seit \KOMAScript~3 nicht mehr empfohlen
% und fliegt demnächst komplett aus der Unterstützung. Stattdessen wird
% empfohlen, dass Pakete \textsf{tocbasic} unterstützen. Der Aufwand dafür ist
% sehr gering und wird mit vielen neuen Möglichkeiten belohnt.
%
% Dieser Hack rüstet die \textsf{tocbasic}-Unterstützung für \textsf{float}
% nach.
%
% \begin{option}{float}
%   \changes{v3.12}{2013/03/05}{Signalisierung mit
%     \cs{FamilyKeyStateProcessed}}^^A
%   \changes{v3.17}{2015/03/09}{Defaulteinstellung mit
%     \cs{KOMAExecuteOptions}}^^A
%    \begin{macrocode}
%<*package&option>
\KOMA@ifkey{float}{@scrhack@float}%
\KOMAExecuteOptions{float=true}%
%</package&option>
%<*package&body>
\AfterPackage*{float}{%
  \KOMA@key[.scrhack.sty]{float}{%
    \PackageWarning{scrhack}{option `float' ignored}%
    \FamilyKeyStateProcessed
  }%
  \if@scrhack@float\scr@hack@load\@pkgextension{float}\fi
}
%</package&body>
%    \end{macrocode}
% \end{option}
%
%
% \begin{macro}{\newfloat}
% Über die Anweisung \cs{newfloat} wird eine neue Gleitumgebung
% definiert. Hier muss die neue Erweiterung aus dem dritten Argument
% \textsf{tocbasic} bekannt gemacht werden.
% \begin{macro}{\listof}
% Über die Anweisung \cs{listof} wird ein Verzeichnis für Gleitumgebungen
% ausgegeben. Hier muss schlicht die entsprechende Anweisung von
% \textsf{tocbasic} verwendet werden.
% \begin{macro}{\float@addtolists}
% Diese Anweisung wird nicht länger benötigt und daher auf die ursprüngliche
% Definition zurückgesetzt.
%    \begin{macrocode}
%<*float&body>
\scr@ifexpected{\newfloat}{%
  \long\def\newfloat#1#2#3{\@namedef{ext@#1}{#3}
    \let\float@do=\relax
    \xdef\@tempa{\noexpand\float@exts{\the\float@exts \float@do{#3}}}%
    \@tempa
    \floatplacement{#1}{#2}%
    \@ifundefined{fname@#1}{\floatname{#1}{#1}}{}
    \expandafter\edef\csname ftype@#1\endcsname{\value{float@type}}%
    \addtocounter{float@type}{\value{float@type}}
    \restylefloat{#1}%
    \expandafter\edef\csname fnum@#1\endcsname%
    {\expandafter\noexpand\csname fname@#1\endcsname{}
      \expandafter\noexpand\csname the#1\endcsname}
    \@ifnextchar[%]
    {\float@newx{#1}}%
    {\@ifundefined{c@#1}{\newcounter{#1}\@namedef{the#1}{\arabic{#1}}}%
      {}}}%
}{%
  \scr@ifexpected{\listof}{%
    \def\listof#1#2{%  
      \@ifundefined{ext@#1}{\float@error{#1}}{%
        \@namedef{l@#1}{\@dottedtocline{1}{1.5em}{2.3em}}%
        \float@listhead{#2}%
        \begingroup\setlength{\parskip}{\z@}%
        \@starttoc{\@nameuse{ext@#1}}%
        \endgroup}}%
  }{%
    \RequirePackage{tocbasic}%
    \PackageInfo{scrhack}{redefining \string\newfloat}%
    \renewcommand\newfloat[3]{%
      \ifattoclist{#3}{%
        \PackageError{scrhack}{extension `#3' already in use}{%
          Each extension may be used only once.\MessageBreak
          You, the class, or another package already uses extension
          `#3'.\MessageBreak
          \string\newfloat\space command will be ignored!}%
      }{%
        \addtotoclist[float]{#3}%
        \setuptoc{#3}{chapteratlist}%
        \@namedef{ext@#1}{#3}%
        \let\float@do=\relax
        \xdef\@tempa{\noexpand\float@exts{\the\float@exts \float@do{#3}}}%
        \@tempa
        \floatplacement{#1}{#2}%
        \@ifundefined{fname@#1}{\floatname{#1}{#1}}{}%
        \expandafter\edef\csname ftype@#1\endcsname{\value{float@type}}%
        \addtocounter{float@type}{\value{float@type}}
        \restylefloat{#1}%
        \expandafter\edef\csname fnum@#1\endcsname%
        {\expandafter\noexpand\csname fname@#1\endcsname{}
          \expandafter\noexpand\csname the#1\endcsname}%
        \@ifnextchar[%]
        {\float@newx{#1}}%
        {\@ifundefined{c@#1}{\newcounter{#1}\@namedef{the#1}{\arabic{#1}}}%
          {}}}%
    }%
    \PackageInfo{scrhack}{redefining \string\listof}%
    \renewcommand*\listof[2]{%
      \@ifundefined{ext@#1}{\float@error{#1}}{%
        \@ifundefined{l@#1}{\expandafter\let\csname l@#1\endcsname\l@figure
          \@ifundefined{l@#1}{%
%    \end{macrocode}
% \changes{v3.25}{2018/03/16}{Verwendung von \cs{DeclareTOCStyleEntry}}^^A
% Bis Version 3.24 wurde hier nun wie üblich |\l@#1| unter Verwendung von
% \cs{@dottedtocline} definiert:
% \begin{verbatim}
%   \@namedef{l@#1}{\@dottedtocline{1}{1.5em}{2.3em}}%
% \end{verbatim}
% Da aber \Package{tocbasic} inzwischen diese schöne Schnittstelle für die
% Verzeichniseinträge bietet, verwenden wir die hier nun auch:
%    \begin{macrocode}
            \DeclareTOCStyleEntry[level=1,numwidth=2.3em,indent=1.5em]
            {default}{#1}%
          }{}%
        }{}%
        \listoftoc[{#2}]{\csname ext@#1\endcsname}%
      }%
    }%
    \scr@ifexpected{\float@addtolists}{%
      \long\def\float@addtolists#1{%
        \def\float@do##1{\addtocontents{##1}{#1}} \the\float@exts}%
    }{%
      \PackageInfo{scrhack}{undefining \string\float@addtolists}%
      \let\float@addtolists\relax
    }{%
      \PackageWarningNoLine{scrhack}{unkown \string\float@addtolists\space
        definition found!\MessageBreak
        Maybe you are using a unsupported float version}%
    }%
  }{%
    \PackageWarningNoLine{scrhack}{unknown \string\listof\space
      definition found!\MessageBreak
      Maybe you are using a unsupported float version}%
  }%
}{%
  \PackageWarningNoLine{scrhack}{unknown \string\newfloat\space
    definition found!\MessageBreak
    Maybe you are using a unsupported float version}%
}
%</float&body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% 
%
% \subsection{Der \textsf{floatrow}-Hack}
%
% Das \textsf{floatrow}-Paket verwendet das Makro \cs{float@listhead} zum
% Setzen der Überschriften. Dies wird seit \KOMAScript~3 nicht mehr empfohlen
% und fliegt demnächst komplett aus der Unterstützung. Stattdessen wird
% empfohlen, dass Pakete \textsf{tocbasic} unterstützen. Der Aufwand dafür ist
% sehr gering und wird mit vielen neuen Möglichkeiten belohnt.
%
% Dieser Hack rüstet die \textsf{tocbasic}-Unterstützung für \textsf{floatrow}
% nach.
%
% \begin{option}{floatrow}
%   \changes{v3.12}{2013/03/05}{Signalisierung mit
%     \cs{FamilyKeyStateProcessed}}^^A
%   \changes{v3.17}{2015/03/09}{Defaulteinstellung mit
%     \cs{KOMAExecuteOptions}}^^A
%    \begin{macrocode}
%<*package&option>
\KOMA@ifkey{floatrow}{@scrhack@floatrow}
\KOMAExecuteOptions{floatrow=true}
%</package&option>
%<*package&body>
\AfterPackage*{floatrow}{%
  \KOMA@key[.scrhack.sty]{floatrow}{%
    \PackageWarning{scrhack}{option `floatrow' ignored}%
    \FamilyKeyStateProcessed
  }%
  \if@scrhack@floatrow\scr@hack@load\@pkgextension{floatrow}\fi
}
%</package&body>
%    \end{macrocode}
% \end{option}
%
%
% \begin{macro}{\DeclareNewFloatType}
% Über die Anweisung \cs{DeclareNewFloatType} wird eine neue Gleitumgebung
% definiert. Hier muss die neue Erweiterung aus dem dritten Argument
% \textsf{tocbasic} bekannt gemacht werden.
% \begin{macro}{\listof}
% Über die Anweisung \cs{listof} wird ein Verzeichnis für Gleitumgebungen
% ausgegeben. Hier muss schlicht die entsprechende Anweisung von
% \textsf{tocbasic} verwendet werden.
% \begin{macro}{\float@addtolists}
% Diese Anweisung wird nicht länger benötigt und daher auf die ursprüngliche
% Definition zurückgesetzt.
%    \begin{macrocode}
%<*floatrow&body>
\scr@ifexpected{\DeclareNewFloatType}{%
  \long\def\DeclareNewFloatType#1#2{\def\FB@captype{#1}%
    \expandafter\edef\csname ftype@#1\endcsname{\the\c@float@type}%
    \addtocounter{float@type}{\value{float@type}}%
    \@namedef{#1name}{#1}\newcounter{#1}%
    \expandafter\edef\csname fnum@#1\endcsname
    {\expandafter\noexpand\csname #1name\endcsname\nobreakspace
      \expandafter\noexpand\csname the#1\endcsname}%
    \@namedef{the#1}{\arabic{#1}}\flnew@ext{lo#1}\@namedef{fps@#1}{tbp}%
    \@namedef{l@#1}{\@dottedtocline{1}{1.5em}{2.3em}}%
    \caption@setkeys[floatrow]{newfloat}{#2}\let\FR@tmp=\relax
    \xdef\@tempa{\noexpand\flrow@types{\the\flrow@types \FR@tmp{#1}}}%
    \@tempa}%
}{%
  \scr@ifexpected{\listof}{%
    \def\listof#1#2{%  
      \@ifundefined{ext@#1}{\flrow@error{Unknown float style `#1'}}{%
        \expandafter\providecommand\csname l@#1\endcsname
        {\@dottedtocline{1}{1.5em}{2.3em}}%
        \float@listhead{#2}%
        \begingroup\setlength{\parskip}{\z@}%
        \@starttoc{\@nameuse{ext@#1}}%
        \endgroup}}%
  }{%
    \RequirePackage{tocbasic}%
    \PackageInfo{scrhack}{redefining \string\DeclareNewFloatType}%
%    \end{macrocode}
% Eigentlich wäre es besser, wie im \textsf{float}-Hack einen Test
% vorzuschalten, ob die Dateiendung bereits in Gebrauch ist. Aber das würde
% voraussetzen, dass die Reihenfolge der Anweisungen geändert wird. Dazu
% stecke ich aber im Code von \textsf{floatrow} zu wenig
% drin. (\emph{\foreignlanguage{english}{Note: It would be better to first
%     test, if the new extension is already in use like done at the
%     \textsf{float} hack. But I don't know the \textsf{floatrow} code good
%     enough to make such a change!}})
%    \begin{macrocode}
    \renewcommand\DeclareNewFloatType[2]{\def\FB@captype{#1}%
      \expandafter\edef\csname ftype@#1\endcsname{\the\c@float@type}%
      \addtocounter{float@type}{\value{float@type}}%
      \@namedef{#1name}{#1}\newcounter{#1}%
      \expandafter\edef\csname fnum@#1\endcsname
      {\expandafter\noexpand\csname #1name\endcsname\nobreakspace
        \expandafter\noexpand\csname the#1\endcsname}%
      \@namedef{the#1}{\arabic{#1}}\flnew@ext{lo#1}\@namedef{fps@#1}{tbp}%
%    \end{macrocode}
% \changes{v3.25}{2018/03/16}{Verwendung von \cs{DeclareTOCStyleEntry}}^^A
% Bis Version 3.24 wurde hier nun wie üblich |\l@#1| unter Verwendung von
% \cs{@dottedtocline} definiert:
% \begin{verbatim}
%   \@namedef{l@#1}{\@dottedtocline{1}{1.5em}{2.3em}}%
% \end{verbatim}
% Da aber \Package{tocbasic} inzwischen diese schöne Schnittstelle für die
% Verzeichniseinträge bietet, verwenden wir die hier nun auch:
%    \begin{macrocode}
      \DeclareTOCStyleEntry[level=1,numwidth=2.3em,indent=1.5em]{default}{#1}%
      \caption@setkeys[floatrow]{newfloat}{#2}\let\FR@tmp=\relax
      \xdef\@tempa{\noexpand\flrow@types{\the\flrow@types \FR@tmp{#1}}}%
      \@tempa
      \xdef\@tempa{\noexpand\addtotoclist[float]{\@nameuse{ext@\FB@captype}}%
        \noexpand\setuptoc{\@nameuse{ext@\FB@captype}}{chapteratlist}%
      }%
      \@tempa
    }%
    \PackageInfo{scrhack}{redefining \string\listof}%
    \renewcommand*\listof[2]{%
      \@ifundefined{ext@#1}{\flrow@error{Unknown float style `#1'}}{%
        \@ifundefined{l@#1}{\expandafter\let\csname l@#1\endcsname\l@figure
          \@ifundefined{l@#1}{%
%    \end{macrocode}
% Siehe die Anmerkung zur Verwendung von \cs{DeclareTOCStyleEntry} oben.
%    \begin{macrocode}
            \DeclareTOCStyleEntry[level=1,numwidth=2.3em,indent=1.5em]
            {default}{#1}%
          }{}%
        }{}%
        \listoftoc[{#2}]{\csname ext@#1\endcsname}%
      }%
    }%
    \scr@ifexpected{\float@addtolists}{%
      \long\def\float@addtolists#1{%
        \def\float@do##1{\addtocontents{##1}{#1}} \the\float@exts}%
    }{%
      \PackageInfo{scrhack}{undefining \string\float@addtolists}%
      \let\float@addtolists\relax
    }{%
      \PackageWarningNoLine{scrhack}{unkown \string\float@addtolists\space
        definition found!\MessageBreak
        Maybe you are using a unsupported floatrow version}%
    }%
  }{%
    \PackageWarningNoLine{scrhack}{unknown \string\listof\space
      definition found!\MessageBreak
      Maybe you are using a unsupported floatrow version}%
  }%
}{%
  \PackageWarningNoLine{scrhack}{unknown \string\DeclareNewFloatType\space
    definition found!\MessageBreak
    Maybe you are using a unsupported floatrow version}%
}
%</floatrow&body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% 
%
% \subsection{Der \textsf{listings}-Hack}
%
% Das \textsf{listings}-Paket verwendet das Makro \cs{float@listhead} zum
% Setzen der Überschriften. Dies wird seit \KOMAScript~3 nicht mehr empfohlen
% und fliegt demnächst komplett aus der Unterstützung. Stattdessen wird
% empfohlen, dass Pakete \textsf{tocbasic} unterstützen. Der Aufwand dafür ist
% sehr gering und wird mit vielen neuen Möglichkeiten belohnt.
%
% Dieser Hack rüstet die \textsf{tocbasic}-Unterstützung für \textsf{listings}
% nach.
%
% \begin{option}{listings}
%   \changes{v3.12}{2013/03/05}{Signalisierung mit
%     \cs{FamilyKeyStateProcessed}}^^A
%   \changes{v3.17}{2015/03/09}{Defaulteinstellung mit
%     \cs{KOMAExecuteOptions}}^^A
%    \begin{macrocode}
%<*package&option>
\KOMA@ifkey{listings}{@scrhack@listings}
\KOMAExecuteOptions{listings=true}
%</package&option>
%<*package&body>
\AfterPackage*{listings}{%
  \KOMA@key[.scrhack.sty]{listings}{%
    \PackageWarning{scrhack}{option `listings' ignored}%
    \FamilyKeyStateProcessed
  }%
  \if@scrhack@listings\scr@hack@load\@pkgextension{listings}\fi
}
%</package&body>
%    \end{macrocode}
% \end{option}
%
%
% \begin{macro}{\scr@do@hack@listings}
% \begin{macro}{\lstlistoflistings}
% Über dieses Macro wird das Verzeichnis der Listings gesetzt. Die gesamte
% Funktionalität dafür kann \Package{tocbasic} überlassen werden.
% \begin{macro}{\float@addtolists}
% Diese Anweisung wird nicht länger benötigt und daher auf die ursprüngliche
% Definition zurückgesetzt. Da \Package{listings} ihre Definition mit
% \Macro{AtBeginDocument} verzögert, muss dies hier ebenfalls geschehen.
%    \begin{macrocode}
%<*listings&body>
\newcommand*{\scr@do@hack@listings}{%
  \RequirePackage{tocbasic}%
  \addtotoclist[float]{lol}%
  \setuptoc{lol}{chapteratlist}%
  \PackageInfo{scrhack}{redefining \string\lstlistoflistings}%
  \renewcommand*{\lstlistoflistings}{\listoftoc[{\lstlistlistingname}]{lol}}%
  \AtBeginDocument{%
    \scr@ifexpected{\float@addtolists}{%
      \def\float@addtolists##1{\addtocontents{lol}{##1}}%
    }{%
      \PackageInfo{scrhack}{undefining \string\float@addtolists}%
      \let\float@addtolists\relax
    }{%
      \scr@ifexpected{\float@addtolists}{%
        \def\float@addtolists##1{\addtocontents{lol}{##1}%
          \orig@float@addtolists{##1}}%
      }{%
        \PackageInfo{scrhack}{setting \string\float@addtolists\MessageBreak
          to \string\orig@float@addtolists}%
        \let\float@addtolists\orig@float@addtolists
      }{%
        \PackageWarningNoLine{scrhack}{unkown \string\float@addtolists\space
          definition found!\MessageBreak
          Maybe you are using a unsupported listings version}%
      }%
    }%
  }%
  \let\scr@do@hack@listings\relax
}
\scr@ifexpected{\lstlistoflistings}{%
  \def\lstlistoflistings{\bgroup
    \let\contentsname\lstlistlistingname
    \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}%
    \tableofcontents \egroup}%
}{%
  \scr@do@hack@listings
}{%
  \scr@ifexpected{\lstlistoflistings}{%
    \def\lstlistoflistings{%
      \begingroup
        \@ifundefined{@restonecoltrue}{}{%
          \if@twocolumn
            \@restonecoltrue\onecolumn
          \else
            \@restonecolfalse
          \fi
        }%
        \float@listhead{\lstlistlistingname}%
        \parskip\z@\parindent\z@\parfillskip \z@ \@plus 1fil%
        \@starttoc{lol}%
        \@ifundefined{@restonecoltrue}{}{%
          \if@restonecol\twocolumn\fi
        }%
      \endgroup
    }%
  }{%
    \scr@do@hack@listings
  }{%
    \PackageWarningNoLine{scrhack}{unknown \string\lstlistoflistings\space
      definition found!\MessageBreak
      Maybe you are using a unsupported listings version}%
  }%
}
%</listings&body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{Der \textsf{nomencl}-Hack}
%
% Das \textsf{nomencl}-Paket harmoniert eigentlich nur in einer Kleinigkeit
% bezüglich des Eintrags in das Inhaltsverzeichnis nicht sehr gut mit
% \KOMAScript-Klassen bzw. Paket \textsf{tocbasic}. Allerdings kann es von den
% Vorteilen von \textsf{tocbasic} auch in weiterer Hinsicht profitieren.
%
% Dieser Hack rüstet weitgehende \textsf{tocbasic}-Unterstützung für
% \textsf{nomencl} nach. Dafür wird Paket \textsf{xpatch} verwendet.
%
% \begin{option}{nomencl}
%   \changes{v3.23}{2017/03/31}{neue Option für neuen Hack}^^A
%    \begin{macrocode}
%<*package&option>
\RequirePackage{xpatch}%
\KOMA@ifkey{nomencl}{@scrhack@nomencl}
\KOMAExecuteOptions{nomencl=true}
%</package&option>
%<*package&body>
\AfterPackage*{nomencl}{%
  \KOMA@key[.scrhack.sty]{nomencl}{%
    \PackageWarning{scrhack}{option `nomencl' ignored}%
    \FamilyKeyStateProcessed
  }%
  \if@scrhack@nomencl\scr@hack@load\@pkgextension{nomencl}\fi
}
%</package&body>
%    \end{macrocode}
% \end{option}^^A nomencl
%
% \begin{macro}{\thenomenclature}
%   \changes{v3.23}{2017/03/31}{Umgebung \texttt{thenomenclature} wird
%     gepatcht}^^A
% Statt die Fallunterscheidung aus der Originaldefinition direkt hier
% nachzubilden, patchen wir diese komplett heraus und ersetzen sie durch eine
% neue Anweisung.
%    \begin{macrocode}
%<*nomencl&body>
\RequirePackage{tocbasic}
%    \end{macrocode}
% With \Package{nomencl} > 5.0 this should be all.
%    \begin{macrocode}
\@ifpackagelater{nomencl}{2019/01/01}{%
  \PackageInfo{scrhack}{only `tocbasic' loaded for `nomencl'}%
  \expandafter\endinput
}{}
%    \end{macrocode}
% Otherwise we have to patch it.
%    \begin{macrocode}
\addtotoclist[nomencl]{nlo}
\addtotoclist[nomencl]{nls}
\xpatchcmd{\thenomenclature}{%
  \@ifundefined{chapter}%
  {
    \section*{\nomname}
    \if@intoc\addcontentsline{toc}{section}{\nomname}\fi%
  }%
  {
    \chapter*{\nomname}
    \if@intoc\addcontentsline{toc}{chapter}{\nomname}\fi%
  }%
}{%
  \scr@hack@nomencl@head
}{%
  \PackageInfo{scrhack}{\string\thenomenclature\space successfully patched}%
}{%
%    \end{macrocode}
% \changes{v3.26b}{2019/01/23}{new \textsf{nomencl} 5.0}^^A
% From \textsf{nomencl} 5.0 another code is used if the nomenclature is a
% chapter. So we need another patch:
%    \begin{macrocode}
  \xpatchcmd{\thenomenclature}{%
    \@ifundefined{chapter}%
    {
      \section*{\nomname}
      \if@intoc\addcontentsline{toc}{section}{\nomname}\fi%
    }%
    {
      \chapter*{\nomname}
      \markboth{\nomname}{\nomname}%
      \if@intoc\addcontentsline{toc}{chapter}{\nomname}\fi%
    }%
  }{%
    \scr@hack@nomencl@head
  }{%
    \PackageInfo{scrhack}{\string\thenomenclature\space successfully patched}%
  }{%
%    \end{macrocode}
% \changes{v3.26b}{2019/01/23}{prepared for hoply comming \textsf{nomencl}}^^A
% But this code is also wrong, because it breaks manual running heads, e.g.,
% of page style \texttt{myheadings}. So I hope, there will be another code,
% that needs a somehow different patch:
%    \begin{macrocode}
    \xpatchcmd{\thenomenclature}{%
      \@ifundefined{chapter}%
      {
        \section*{\nomname}
        \if@intoc\addcontentsline{toc}{section}{\nomname}\fi%
      }%
      {
        \chapter*{\nomname}
        \@mkboth{\nomname}{\nomname}%
        \if@intoc\addcontentsline{toc}{chapter}{\nomname}\fi%
      }%
    }{%
      \scr@hack@nomencl@head
    }{%
      \PackageInfo{scrhack}{\string\thenomenclature\space successfully patched}%
    }{%
%    \end{macrocode}
% \changes{v3.25}{2019/01/23}{emergency patch added}^^A
% If this also does not work, we try an emergency patch, that could break
% things.
%    \begin{macrocode}
      \xpatchcmd{\thenomenclature}{%
        \@ifundefined{chapter}%
      }{%
        \scr@hack@nomencl@head
        \@gobbletwo
      }{%
        \PackageWarning{scrhack}{%
          using emergency patch of \string\thenomenclature.\MessageBreak
          This could happen if you are using an unknown\MessageBreak
          release of package `nomencl'.\MessageBreak
          Mostly this patch does work too, but it also could\MessageBreak
          break `nomencl`. If this happens, please deactivate\MessageBreak
          the `nomencl` hack of `scrhack`
        }%
      }{%
        \PackageWarning{scrhack}{%
          cannot patch \string\thenomenclature.\MessageBreak 
          This could happen if you are using an unknown\MessageBreak
          release of package `nomencl'%
        }%
      }%
    }%
  }%
}
%</nomencl&body>
%    \end{macrocode}
% \end{macro}^^A \thenomenclature
%
% \begin{macro}{\scr@hack@nomencl@head}
%   \changes{v3.23}{2017/03/31}{Überschrift für \texttt{thenomenclature} unter
%     Verwendung von \textsf{tocbasic}}^^A
% Im Gegensatz zu Gleitumgebungen benötigen wir hier keine Gruppe, weil
% \texttt{thenomenclature} bereits die Gruppe bereitstellt.
%    \begin{macrocode}
%<*nomencl&body>
\newcommand*{\scr@hack@nomencl@head}{%
  \providecommand*{\listofnlsname}{\nomname}%
  \let\list@fname\listofnlsname
  \def\@currext{nls}%
  \tocbasic@listhead{\list@fname}%
}
%</nomencl&body>
%    \end{macrocode}
% Es ist ggf. noch zu beachten, dass von den ganzen Haken, die
% \textsf{tocbasic} bereitstellt, für dieses Verzeichnis natürlich nur die
% Überschriftenhaken zum Einsatz kommen. Verzeichnishaken können zwar
% definiert werden, kommen aber nie zur Anwendung.
% \end{macro}^^A \scr@hack@nomencl@head
%
% \begin{macro}{\if@intoc}
%   \changes{3.23}{2017/03/31}{Reaktion auf \cs{if@intoc}}
%   Natürlich muss jetzt noch auf \textsf{nomencl}'s Option \texttt{intoc}
%   reagiert werden, also entsprechend der Option das \textsf{tocbasic}
%   Feature \texttt{totoc} passend gesetzt werden. Etwaige Änderungen des
%   Features sind also erst nach dem Laden von \textsf{nomencl} und
%   \textsf{scrhack} möglich. Spätere Änderungen von \cs{if@intoc} werden
%   außerdem nicht berücksichtigt.
%    \begin{macrocode}
%<*nomencl&body>
\if@intoc
  \setuptoc{nls}{totoc}
\fi
%</nomencl&body>
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Der \textsf{setspace}-Hack}
%
% Das \textsf{setspace}-Paket verwendet \cs{@ptsize} auf ungünstige Art, indem
% es davon ausgeht, dass es immer eine ganze Zahl enthält. Das ist aber bei
% \KOMAScript{} keineswegs zwingend. Außerdem ist der Wert für \texttt{11pt}
% falsch, weil \LaTeX{} in diesem Fall tatsächlich eine 10,95\,pt-Schrift mit
% einem Zeilenabstand von 13,6\,pt einstellt. Damit wäre der korrekte Wert für
% \cs{onehalfspacing} beispielsweise:
% \[ 10{,}95\,\mathrm{pt} \dot 1{,5} / 13{,}6\,\mathrm{pt} \equiv 1{,}208 \]
% Tatsächlich stellt \textsf{setspace} aber einen Wert von 1,213 ein, was
% einer effektiven Schriftgröße von 11\,pt entsprechen würde. Ebenso stellt es
% den aktuellen Abstand bei \cs{onehalfspacing} nicht relativ zur aktuellen
% Schriftgröße ein, sondern zur Grundschriftgröße. Damit erhält man bei
% \begin{verbatim}
% \documentclass[10pt]{article}
% \usepackage{setspace}
% \begin{document}
% \large\onehalfspacing\raggedright
% Fontsize: \csname f@size\endcsname pt\\
% Normal baselineskip: \csname f@baselineskip\endcsname\\
% baselineskip: \the\baselineskip
% \end{document}
% \end{verbatim}
% einen anderen Abstand als bei
% \begin{verbatim}
% \documentclass[11pt]{article}
% \usepackage{setspace}
% \begin{document}
% \large\onehalfspacing\raggedright
% Fontsize: \csname f@size\endcsname pt\\
% Normal baselineskip: \csname f@baselineskip\endcsname\\
% baselineskip: \the\baselineskip
% \end{document}
% \end{verbatim}
% obwohl beide Male dieselbe Schriftgröße verwendet wird. Streng genommen
% müsste also bei jeder Änderung der Schriftgröße der Wert Abstand angepasst
% werden. So weit geht dieser Hack nicht. Stattdessen wird der Wert abhängig
% von der tatsächlichen Schriftgröße und dem tatsächlichen Basisabstand beim
% Aufruf der Anweisungen eingestellt. Das ergibt immerhin in den obigen
% Beispielen gleiche Ergebnisse.
%
% \begin{option}{setspace}
%   \changes{v3.17}{2015/04/16}{Neu}^^A
%    \begin{macrocode}
%<*package&option>
\KOMA@ifkey{setspace}{@scrhack@setspace}
\KOMAExecuteOptions{setspace=true}
%</package&option>
%<*package&body>
\AfterPackage*{setspace}{%
  \KOMA@key[.scrhack.sty]{setspace}{%
    \PackageWarning{scrhack}{option `setspace' ignored}%
    \FamilyKeyStateProcessed
  }%
  \if@scrhack@setspace\scr@hack@load\@pkgextension{setspace}\fi
}
%</package&body>
%    \end{macrocode}
% \end{option}
%
%
% \begin{macro}{\onehalfspacing}
%   \changes{v3.17}{2015/04/16}{Neu}^^A
% Über diese Anweisung wird der eineinhalbzeilige Satz eingestellt. Ein auf
% drei Nachkommastellen genauer Wert erscheint mir ausreichend genau.
%    \begin{macrocode}
%<*setspace&body>
\scr@ifexpected{\onehalfspacing}{%
  \long\def\onehalfspacing{%
    \setstretch{1.25}%  default
    \ifcase \@ptsize \relax % 10pt
      \setstretch {1.25}%
    \or % 11pt
      \setstretch {1.213}%
    \or % 12pt
      \setstretch {1.241}%
    \fi
  }%
}{%
  \renewcommand*{\onehalfspacing}{%
    \@tempdima=\dimexpr (\f@size pt)*1500/
                        (\dimexpr \f@baselineskip\relax)*\p@/1000\relax
    \expandafter\setstretch\expandafter{\strip@pt\@tempdima}%
  }%
}{%
  \PackageWarning{scrhack}{unknown \string\onehalfspacing\space
    definition found!\MessageBreak
    Maybe you are using a unsupported setpace version}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\doublespacing}
%   \changes{v3.17}{2015/04/16}{Neu}^^A
% Über diese Anweisung wird der zweizeilige Satz eingestellt. Ein auf
% drei Nachkommastellen genauer Wert erscheint mir ausreichend genau.
%    \begin{macrocode}
\scr@ifexpected{\doublespacing}{%
  \long\def\doublespacing{%
    \setstretch{1.667}%  default
    \ifcase \@ptsize \relax % 10pt
      \setstretch {1.667}%
    \or % 11pt
      \setstretch {1.618}%
    \or % 12pt
      \setstretch {1.655}%
    \fi
  }%
}{%
  \renewcommand*{\doublespacing}{%
    \@tempdima=\dimexpr (\f@size pt)*2000/
                        (\dimexpr \f@baselineskip\relax)*\p@/1000\relax
    \expandafter\setstretch\expandafter{\strip@pt\@tempdima}%
  }%
}{%
  \PackageWarning{scrhack}{unknown \string\doublespacing\space
    definition found!\MessageBreak
    Maybe you are using a unsupported setpace version}%
}
%</setspace&body>
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Der \textsf{lscape}-Hack}
% \changes{v3.18a}{2015/07/07}{Neuer \textsf{lscape}-Hack}^^A
%
% Das \textsf{lscape}-Paket setzt innerhalb der
% \texttt{landscape}-Umgebung die Länge \cs{textheight} auf den Wert
% von \cs{textwidth} obwohl es auf der anderen Seite \cs{textwidth}
% nicht auf den Wert von \cs{textheight} setzt. Das ist inkonsequent. Da
% David~Carlisle außerdem angibt, dass \cs{textwidth} nicht verändert wird,
% weil das zu Problemen führen konnte, ist es unverständlich, dass
% \cs{textheight} verändert wird, obwohl das ebenfalls zu Problemen führen
% kann, beispielsweise für \textsf{showframe} oder \textsf{scrpage}. Daher
% verändere ich die Definition so, dass auch \cs{textheight} unverändert
% bleibt. Dabei muss allerdings auch \textsf{pdflscape} berücksichtigt
% werden. Das ist am einfachsten mit \textsf{xpatch}.
%
% \begin{option}{lscape}
%   \changes{v3.18a}{2015/07/07}{Neue Option für neuen Hack}^^A
%   \changes{v3.20}{2016/05/07}{\textsf{xpatch} wird bereits im Optionenteil
%     geladen}^^A
%    \begin{macrocode}
%<*package&option>
\RequirePackage{xpatch}%
\KOMA@ifkey{lscape}{@scrhack@lscape}%
\KOMAExecuteOptions{lscape=true}%
%</package&option>
%<*package&body>
\AfterPackage*{lscape}{%
  \if@scrhack@lscape\scr@hack@load\@pkgextension{lscape}\else
    \KOMA@key[.scrhack.sty]{lscape}{%
      \PackageWarning{scrhack}{option `lscape' ignored}%
      \FamilyKeyStateProcessed
    }%
  \fi
}
%</package&body>
%    \end{macrocode}
% \end{option}
%
% \begin{macro}{\landscape}
%   \changes{v3.18a}{2015/07/07}{Neu}^^A
%   \changes{v3.20}{2016/05/07}{\textsf{xpatch} wird bereits im Optionenteil
%     geladen}^^A
% Über diese Anweisung wird die \texttt{landscape}-Umgebung von
% \textsf{lscape} gestartet. Genau diese muss gepatcht werden. Dafür wird das
% Paket \textsf{xpatch} benötigt. Da der Patch nur geladen wird, wenn die
% Option dafür gesetzt ist, kann die Option daher nur ein- und ausgeschaltet
% werden, wenn sie bis zum Laden des Pakets aktiviert wurde.
%    \begin{macrocode}
%<*lscape&body>
\xpatchcmd{\landscape}{\textheight=\vsize}{%
  \if@scrhack@lscape
%    \end{macrocode}
%  \changes{v3.18a}{2015/08/11}{Patchen von \cs{@outputpage}}^^A
% Es gibt allerdings in der Tat eine Stelle, an der ein verändertet Wert von
% \cs{textheight} benötigt wird. Das ist wenn innerhalb von \cs{@outputpage}
% der Wert von \cs{@colht} reinitialisiert wird. Also wird das entsprechend
% auch noch hinein gepatcht.
%    \begin{macrocode}
    \scrh@LT@textheight=\vsize
    \let\scrh@LT@outputpage\@outputpage
    \def\@outputpage{\scrh@LT@outputpage\global\@colht\scrh@LT@textheight}% 
  \else
    \textheight=\vsize
  \fi
}{%
  \PackageInfo{scrhack}{\string\landscape\space patched to make
    \string\textheight\space change optional}%
}{%
  \PackageWarning{scrhack}{Cannot patch \string\landscape!\MessageBreak
    Maybe you are using a unsupported lscape version}%
  \@scrhack@lscapefalse
}
%    \end{macrocode}
% \begin{Length}{\scrh@LT@textheight}
%    \changes{v3.18a}{2015/08/11}{neue Länge (intern)}^^A
%    \begin{macrocode}
\newlength{\scrh@LT@textheight}
%</lscape&body>
%    \end{macrocode}
% \end{Length}^^A \scrh@LT@textheight
% \end{macro}^^A \landscape
%
%
% \subsection{Optionen ausführen}
%
% Zum Schluss noch die Optionen ausführen. Im Paket wird diese Anweisung
% allerdings vor den Anweisungen der Hacks und den Anweisungen aus dem
% Abschnitt »Verwendete Anweisungen« stehen.
%    \begin{macrocode}
%<*package&option>
\KOMAProcessOptions\relax
%</package&option>
%    \end{macrocode}
%
%
% \Finale
%
\endinput
%
% end of file `scrhack.dtx'
%%% Local Variables:
%%% mode: doctex
%%% mode: flyspell
%%% coding: iso-latin-1
%%% ispell-local-dictionary: "en_GB"
%%% TeX-master: t
%%% End:

%  LocalWords:  eineinhalbzeilige
