% \CheckSum{878} % \iffalse meta-comment % ====================================================================== % scrhack.dtx % Copyright (c) Markus Kohm, 2008-2018 % % 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-2018 % % 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 3019 2018-09-06 15:45:33Z kohm $ %%%% using: package,identify %%%% using: package,option %%%% using: package,body %\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: 2018-09-06 17:45:33 +0200 (Thu, 06 Sep 2018) $ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}} \filerevision$Revision: 1962 $ \endgroup \ProvidesFile{scrhack.dtx}[\filedate\space\filerevision\space % %\ProvidesPackage{scrhack}[% %\ProvidesFile{hyperref.hak}[% %\ProvidesFile{float.hak}[% %\ProvidesFile{floatrow.hak}[% %\ProvidesFile{listings.hak}[% %\ProvidesFile{setspace.hak}[% %\ProvidesFile{lscape.hak}[% %\ProvidesFile{nomencl.hak}[% %<*dtx|identify> %!KOMAScriptVersion package %<*dtx> source % %<*!identify> (hacking other packages)% % % % (hacking package % hyperref)% % float)% % floatrow)% % listings)% % setspace)% % lscape)% % nomencl)% %<*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} % %\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&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 % % \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&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 } % % \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}% }% } % % \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&body> \AfterPackage*{float}{% \KOMA@key[.scrhack.sty]{float}{% \PackageWarning{scrhack}{option `float' ignored}% \FamilyKeyStateProcessed }% \if@scrhack@float\scr@hack@load\@pkgextension{float}\fi } % % \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}% } % % \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&body> \AfterPackage*{floatrow}{% \KOMA@key[.scrhack.sty]{floatrow}{% \PackageWarning{scrhack}{option `floatrow' ignored}% \FamilyKeyStateProcessed }% \if@scrhack@floatrow\scr@hack@load\@pkgextension{floatrow}\fi } % % \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}% } % % \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&body> \AfterPackage*{listings}{% \KOMA@key[.scrhack.sty]{listings}{% \PackageWarning{scrhack}{option `listings' ignored}% \FamilyKeyStateProcessed }% \if@scrhack@listings\scr@hack@load\@pkgextension{listings}\fi } % % \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}% }% } % % \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&body> \AfterPackage*{nomencl}{% \KOMA@key[.scrhack.sty]{nomencl}{% \PackageWarning{scrhack}{option `nomencl' ignored}% \FamilyKeyStateProcessed }% \if@scrhack@nomencl\scr@hack@load\@pkgextension{nomencl}\fi } % % \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} \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}% }{% \PackageWarning{scrhack}{cannot patch \string\thenomenclature.\MessageBreak This could happen if you are using an unknown\MessageBreak release of package `nomencl'% }% } % % \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}% } % % \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 % % \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&body> \AfterPackage*{setspace}{% \KOMA@key[.scrhack.sty]{setspace}{% \PackageWarning{scrhack}{option `setspace' ignored}% \FamilyKeyStateProcessed }% \if@scrhack@setspace\scr@hack@load\@pkgextension{setspace}\fi } % % \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}% } % % \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&body> \AfterPackage*{lscape}{% \if@scrhack@lscape\scr@hack@load\@pkgextension{lscape}\else \KOMA@key[.scrhack.sty]{lscape}{% \PackageWarning{scrhack}{option `lscape' ignored}% \FamilyKeyStateProcessed }% \fi } % % \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} % % \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 % % \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