% \iffalse meta-comment % ====================================================================== % scrhack.dtx % Copyright (c) Markus Kohm, 2008-2023 % % 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.md. % % To create `scrhack.sty' run `tex scrhack.dtx'. Using LaTeX instead % of TeX would generate the implementation documentation. % ====================================================================== %%% From File: $Id: scrhack.dtx 4063 2023-06-28 08:28:26Z 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: 2023-06-28 10:28:26 +0200 (Mi, 28. Jun 2023) $ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}} \filerevision$Revision: 4063 $ \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}[% %\ProvidesFile{standardsections.hak}[% %<*dtx|identify> %!KOMAScriptVersion %<*dtx> source of % %<*dtx|package> package (hacking other packages)% % %<*hack> % scrhack part % (hacking package % hyperref)% % float)% % floatrow)% % listings)% % setspace)% % lscape)% % nomencl)% % (defining standard LaTeX class section headings)% % ] % %<*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}% }% \file{standardsections.hak}{% \from{scrkernel-version.dtx}{file,standardsections.hak}% \from{scrhack.dtx}{hack,standardsections,identify}% \from{scrhack.dtx}{hack,standardsections,body}% }% } \@@input scrstrop.inc \else \let\endbatchfile\relax \fi \endbatchfile \documentclass[USenglish]{koma-script-source-doc} \usepackage{babel} \setcounter{StandardModuleDepth}{2} \begin{document} \DocInput{scrhack.dtx} \end{document} % %\fi % % \changes{v3.03}{2009/03/12}{first version ever} % \changes{v3.36}{2022/02/08}{switch over from \cls*{scrdoc} to % \cls*{koma-script-source-doc}} % \changes{v3.36}{2022/02/08}{require package \pkg*{scrlogo} instead of % defining \cs{KOMAScript}} % \changes{v3.36}{2022/02/08}{whole implementation documentation in English} % \changes{v3.40}{2023/04/17}{guide names changed} % % \GetFileInfo{scrhack.dtx} % \title{Patching Third-Party Packages using % \href{https://komascript.de}{\KOMAScript} Package \pkg*{scrhack}} % \author{\href{mailto:komascript@gmx.info}{Markus Kohm}} % \date{Revision \fileversion{} of \filedate} % \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 \pkg*{scrhack} contains all those improvement proposals % for other packages. This means, \pkg*{scrhack} redefines macros of packages % from other authors! The redefinitions are only activated, if those % packages were loaded. Users may prevent \pkg*{scrhack} from redefining % macros of individual packages. % \end{abstract} % \tableofcontents % % \section{User Manual} % % You can find the user manuals of \pkg*{scrhack} in the \KOMAScript{} manual, % either the German \file{scrguide-de.pdf} or the English % \file{scrguide-en.pdf}. % % \MaybeStop{\PrintIndex} % % \section{Implementation of \pkg*{scrhack}} % % \changes{v3.04b}{2009/08/05}{order of commands/macros and options changed} % % \subsection{Optionen} % % The package uses \cs{KOMAoptions} of \pkg*{scrkbase}, which is loaded by % (virtual) \file{scrkbase.ins}. % % The options allow the selection of the used manipulations of other % packages. But all these options are valid only until both \pkg*{scrhack} and % the other package has been loaded. Later settings are invalid. % % % \subsection{Used Macros and Commands} % \label{sec:macros} % \begin{macrocode} %<*package&body> % \end{macrocode} % % \begin{macro}{\scr@ifexpected} % Mentioned to do (re)definitions only, if local execution of code does not % change a command. Concrete, if (local) execution of \marg{test code} of % \begin{quote} % \cs{scr@ifexpected}\marg{command}\marg{test code}\marg{then % code}\marg{else code} % \end{quote} % would not result in a change of \cs{\meta{command}}, the \marg{then code} % will be executed, otherwise the \marg{else code}. % \begin{description}\item[Note:] \meta{test code} must not have any global % side effect!\end{description} % \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} % Conditionally loading of a hack file. % \begin{quote} % \cs{scr@hack@load}\marg{extension}\marg{basename}\marg{hack}% % \marg{true code}\marg{false code} % \end{quote} % The first two arguments \marg{} and \marg{extension} and \marg{basename} are % same to the internal\LaTeX{} kernel command \cs{@ifl@aded}. With \LaTeX{} % from 2021/11/15 we even could use \cs{@ifl@aded} for the test, because it is % not restricted to the preamble any more. But because it is restricted with % older \LaTeX{} kernels, we test the definition of % \cs{ver@}\meta{basename}\texttt{.}\meta{extension}. If it is defined, we % also test the definition of \cs{ver@}\meta{basename}\texttt{.hak}. If this % is not defined, \file{\meta{hack}.hak} is loaded and \meta{true code} is % executed. Otherwise \meta{false code} is executed. This means: A hack file % is only loaded, if a class or package (or other file with version) has % already been loaded, but the hack file has not already been loaded. % \begin{macrocode} \newcommand*{\scr@hack@load}[2]{% \expandafter\ifx\csname ver@#2.#1\endcsname\relax \expandafter\@secondoftwo \else % \end{macrocode} % Load a hack only once. % \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} % % \begin{macrocode} % % \end{macrocode} % % \subsection{The \pkg*{hyperref} hack} % % Package \pkg{hyperref} places the anchor of the star variant of a heading % after the heading, but the anchor of the normal variant before the heading % even if the heading is not numbered because of the value of % \cnt{secnumdepth}. The hack changes this to more consistent placing always % before the heading. % % \begin{option}{hyperref} % \changes{v3.12}{2013/03/05}{using \cs{FamilyKeyStateProcessed}} % \changes{v3.17}{2015/03/09}{defaults by \cs{KOMAExecuteOptions}} % \begin{macrocode} %<*package&option> \KOMA@ifkey{hyperref}{@scrhack@hyperref}% \KOMAExecuteOptions{hyperref=true}% % % \end{macrocode} % \changes{v3.04b}{2009/11/09}{loading \pkg{hyperref} hack earlier} % \changes{v3.17}{2015/03/09}{auto deactivation for newer versions of % \pkg{hyperref}} % \changes{v3.18}{2015/05/22}{newer versions of \KOMAScript{} classes also % deactivate the the hack} % \changes{v3.39}{2022/11/11}{initial dot in member argument of \cs{KOMA@key} % and \cs{KOMAExecuteOptions} removed} % This is a little bit tricky, because \pkg{hyperref} loads the driver file % via \cs{AtEndOfPackage} and the hack cannot be loaded before loading the % driver file. Using \cs{AfterPackage*} would not be good enough therefore, % because it would load the hack before the driver file. But using % \cs{AtEndOfPackage} inside \cs{AfterPackage*} should delay the loading % enough. This also works, if \pkg{hyperref} has already been loaded. In this % case the code will be executed at the end of \pkg*{scrhack} instead of % \pkg{hyperref}. This is no problem. % \begin{macrocode} %<*package&body> \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,\@spart,\@ssect} % We do not hack \pkg{hyperref} itself, but the driver files. After loading % \pkg{hyperref} the driver file is also loaded. Moreover, all driver files % that re-define these commands have to be patched also. So the patch is % related to the loading of \pkg{hyperref} instead of every single driver % file. This have already been tested by \cs{scr@hack@load}. So we just have % to test, whether the definition of these commands are the expected one. % 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} % % % \subsection{The \pkg*{floatrow} hack} % % Package \pkg{floatrow} insists in using \cs{float@listhead} for the setting % of the headings. This is not recommended any longer since \KOMAScript~2.95 % from July 2006! The \KOMAScript{} classes will remove the support for % this very limited approach. Recommended is the usage of \pkg*{tocbasic}. The % effort to do so, it very small and I do not understand, why package authors % are not willing to use it. Because the benefit would be a lot. % % This hack adds \pkg*{tocbasic} usage to \pkg{floatrow}. Nevertheless it is % more complicated than adding \pkg*{tocbasic} support into \pkg{floatrow}. % % \begin{option}{floatrow} % \changes{v3.12}{2013/03/05}{using \cs{FamilyKeyStateProcessed}} % \changes{v3.17}{2015/03/09}{using \cs{KOMAExecuteOptions}} % \changes{v3.34}{2021/06/03}{deactivation of the \pkg{float} hack} % \changes{v3.39}{2022/11/11}{initial dot in member argument of \cs{KOMA@key} % removed} % \begin{macrocode} %<*package&option> \KOMA@ifkey{floatrow}{@scrhack@floatrow} \KOMAExecuteOptions{floatrow=true} % %<*package&body> \AfterPackage*{floatrow}{% \KOMAoptions{float=false}% \PackageInfo{scrhack}{option `float' deactivated}% \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{command}{\DeclareNewFloatType,\listof} % \changes{v3.25}{2018/03/16}{using \cs{DeclareTOCStyleEntry}} % Command \cs{DeclareNewFloatType} is used to define a new float % environment. We have to add registration of the file extension (third % argument) with \pkg*{tocbasic}. % Command \cs{listof} outputs the list of the float environments. Here we % just use the corresponding macro of \pkg*{tocbasic}. % \begin{macro}{\float@addtolists} % The deprecated macro \cs{float@addtolists} is not needed any longer an will % be reset to the original definition. % \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} % \begin{description} % \item[Note:] It would be better to first test, if the new extension is % already in use like done at the \pkg{float} hack. But I don't know the % \pkg{floatrow} code good enough to make such a change! % \end{description} % \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}% \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}{% \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{command} % % % \subsection{The \pkg*{float} hack} % % Package \pkg{float} insists in using \cs{float@listhead} for the setting % of the headings. This is not recommended any longer since \KOMAScript~2.95 % from July 2006! The \KOMAScript{} classes will remove the support for % this very limited approach. Recommended is the usage of \pkg*{tocbasic}. The % effort to do so, it very small and I do not understand, why package authors % are not willing to use it. Because the benefit would be a lot. % % This hack adds \pkg*{tocbasic} usage to \pkg{float}. Nevertheless it is % more complicated than adding \pkg*{tocbasic} support into \pkg{float}. % % \begin{option}{float} % \changes{v3.12}{2013/03/05}{using \cs{FamilyKeyStateProcessed}} % \changes{v3.17}{2015/03/09}{using \cs{KOMAExecuteOptions}} % \changes{v3.39}{2022/11/11}{initial dot in member argument of \cs{KOMA@key} % removed} % \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{command}{\newfloat} % \changes{v3.28}{2019/11/19}{\cs{ifattoclist} replaced by % \cs{Ifattoclist}} % \changes{v3.25}{2018/03/16}{using \cs{DeclareTOCStyleEntry}} % We have to add registration of the file extension (third argument of % \cs{newfloat}) with \pkg*{tocbasic}. % \begin{command}{\listof} % Command \cs{listof} outputs the list of the float environments. Here we % just use the corresponding macro of \pkg*{tocbasic}. % \begin{macro}{\float@addtolists} % The deprecated macro \cs{float@addtolists} is not needed any longer an will % be reset to the original definition. % \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}{% \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{command} % \end{command} % % % \subsection{The \pkg*{listings} hack} % % Package \pkg{listing} insists in using \cs{float@listhead} for the setting % of the headings. This is not recommended any longer since \KOMAScript~2.95 % from July 2006! The \KOMAScript{} classes will remove the support for % this very limited approach. Recommended is the usage of \pkg*{tocbasic}. The % effort to do so, it very small and I do not understand, why package authors % are not willing to use it. Because the benefit would be a lot. % % This hack adds \pkg*{tocbasic} usage to \pkg{listings}. Nevertheless it is % more complicated than adding \pkg*{tocbasic} support into \pkg{listings}. % % \begin{option}{listings} % \changes{v3.12}{2013/03/05}{using \cs{FamilyKeyStateProcessed}} % \changes{v3.17}{2015/03/09}{using \cs{KOMAExecuteOptions}} % \changes{v3.39}{2022/11/11}{initial dot in member argument of \cs{KOMA@key} % removed} % \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} % \changes{v3.41}{2023/06/28}{patching \cs{lst@MakeCaption} to use % \cs{ext@lstlisting}} % \begin{command}{\lstlistoflistings} % \cs{scr@do@hack@listings} patches \pkg{listings} to use \pkg*{tocbasic} for % the whole output of the list of listings. This adds several new features to % \pkg{listings}. % \begin{macro}{\ext@lstlisting,\lst@MakeCaption,\float@addtolists} % Macro \cs{ext@lstlisting} is defined, to make \cs{captionof} work with % argument \texttt{lstlisting}. Additionally \cs{lst@MakeCaption} is patched % to use the new macro. The deprecated macro \cs{float@addtolists} is not % needed any longer an will be reset to the original definition. But, because % \pkg{listings} delays the redefinition with \cs{AtBeginDocument} we have to % do the same here. % \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}}% \providecommand*{\ext@lstlisting}{lol}% \@tempswafalse \xpatchcmd\lst@MakeCaption {\addcontentsline{lol}}% {\addcontentsline{\ext@lstlisting}}% {\PackageInfo{scrhack}{patching \string\lst@MakeCaption}\@tempswatrue}% {\PackageWarning{scrhack}{cannot patch \string\lst@MakeCaption}}% \@whilesw\if@tempswa\fi{% \xpatchcmd\lst@MakeCaption {\addcontentsline{lol}}% {\addcontentsline{\ext@lstlisting}}% {}% {\@tempswafalse}% }% \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}% }% }% }% % \end{macrocode} % \begin{macro}{\lst@makecaption} % \changes{v3.30}{2020/04/01}{setting of \cs{@captype} added} % From version~3.30 setting of \cs{@captype} to \texttt{lstlisting} is added % to \cs{lst@makecaption}. This adds support for usage of % \cs{raggedlstlistingcaption} (if the user or a package author defines % it). The change is a little bit dangerous, because it will break, if % \pkg{listings} would add an argument to \cs{lst@makecaption}. % \begin{macrocode} \expandafter\def\expandafter\lst@makecaption\expandafter{% \expandafter\def\expandafter\@captype\expandafter{% \expandafter l\expandafter s\expandafter t\expandafter l% \expandafter i\expandafter s\expandafter t\expandafter i% \expandafter n\expandafter g\expandafter}\lst@makecaption }% \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{command} % \end{macro} % % % % \subsection{The \pkg*{nomencl} hack} % % With package \pkg{nomencl} and the \KOMAScript{} classes there is only a % small disharmony between relating the ToC entry. Nevertheless the package % can benefit from using \pkg*{tocbasic}. % % This hack adds \pkg*{tocbasic} usage to \pkg{nomencl}. This is done using % \pkg{xpatch} Nevertheless it is much more complicated than adding real % \pkg*{tocbasic} support into \pkg{nomencl}. The mess is, that every new % release of \pkg{nomencl} changes the kind of ``support'' of % \pkg*{tocbasic}. For some versions there isn't any such support. Other % versions use \pkg*{tocbasic} if it has been loaded. Other versions need an % option to activate usage of \pkg*{tocbasic}. So don't expect that the % following hack does the correct thing for every version of \pkg{nomencl}! % % \begin{option}{nomencl} % \changes{v3.23}{2017/03/31}{added} % \changes{v3.39}{2022/11/11}{initial dot in member argument of \cs{KOMA@key} % removed} % \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{command}{\thenomenclature} % \changes{v3.23}{2017/03/31}{added} % Instead of using the several definitions by cases of the several versions of % \pkg{nomencl} we use a patch, that should remove all such cases and use % \pkg*{tocbasic} always. % \begin{macrocode} %<*nomencl&body> \RequirePackage{tocbasic} % \end{macrocode} % With \pkg{nomencl} > 5.0 this should be all. % Unfortunately is isn't, because newer versions of \pkg{nomencl} need option % \opt{tocbasic} to be set. Good luck: It is the default. So the chances % are good, that with new versions of \pkg{nomencl} usage of \pkg*{tocbasic} is % the default. % \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 \pkg{nomencl} 5.0} % From \pkg{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 \pkg{nomencl}} % 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} % \changes{v3.30}{2020/02/25}{spurious space in warning message removed} % 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'% }% }% }% }% } % % \end{macrocode} % \end{command}^^A \thenomenclature % % \begin{macro}{\scr@hack@nomencl@head} % \changes{v3.23}{2017/03/31}{heading of \env{thenomenclature} by % \pkg*{tocbasic}} % \changes{v3.31}{2020/07/08}{internal \cs{list@fname} eliminated} % We don't need an extra group, because \env{thenomenclature} already adds the % group. % \begin{macrocode} %<*nomencl&body> \newcommand*{\scr@hack@nomencl@head}{% \providecommand*{\listofnlsname}{\nomname}% \def\@currext{nls}% \tocbasic@listhead{\nomname}% } % % \end{macrocode} % \begin{description} % \item[Note:] Only the heading hooks of \pkg*{tocbasic} are used. The other % hooks can be set, but would never be used! % \end{description} % \end{macro}^^A \scr@hack@nomencl@head % % \begin{macro}{\if@intoc} % \changes{3.23}{2017/03/31}{support of \cs{if@intoc}} % Generally we have to support \pkg{nomencl}'s option \opt{intoc} and the % switch \cs{if@intoc}. This is done by (un-)setting \pkg*{tocbasic} feature % \texttt{totoc}. So additional changes of the feature can be done at first % after loading both, \pkg{nomencl} and \pkg*{scrhack}. Moreover, later changes % of \cs{if@intoc} are not recognized. % \begin{macrocode} %<*nomencl&body> \if@intoc \setuptoc{nls}{totoc} \fi % % \end{macrocode} % \end{macro} % % % \subsection{The \pkg*{setspace} hack} % % Package \pkg{setspace} internally uses \cs{@ptsize} in a way, that only % works as long as \cs{@ptsize} is an integer. But because \KOMAScript{} % supports non integer font sizes, \cs{@ptsize} can also contain non-integer % values. Moreover for \opt{11pt}, \LaTeX{} does not use a 11\,pt font but % a 10.95\,pt font with a \len{baselineskip} of 13.6\,pt, the correct factor % for, e.g., \cs{onehalfspacing} would be: % \[ 10{,}95\,\mathrm{pt} \dot 1{,5} / 13{,}6\,\mathrm{pt} \equiv 1{,}208 \] % But \pkg{setspace} uses 1.213, which would be correct for 11\,pt. Moreover % the factor is always relative to the base font size and not the current font % size. Because of this % \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} % results in another \len{baselineskip} than: % \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} % despite both examples use the same font size. So, to make it absolutely % correct, the factor would have to change with every change of the font % size. But the hack also does not do so. It just calculates the factor % depending on the base font size an the current font size. This is enough to % have the same \len{baselineskip} with both of the examples above. % % \begin{option}{setspace} % \changes{v3.17}{2015/04/16}{added} % \changes{v3.39}{2022/11/11}{initial dot in member argument of \cs{KOMA@key} % removed} % \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{command}{\onehalfspacing} % \changes{v3.17}{2015/04/16}{added} % This selects the one half line spacing. I think, a factor with three digits % for the decimals should be enough. % \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}% }% }{% % \end{macrocode} % \changes{v3.39}{2023/03/15}{support for \pkg{setspace} 6.7b added} % \begin{macrocode} \scr@ifexpected{\onehalfspacing}{% \long\def\onehalfspacing{% \setstretch{1.25}% default % DPC 6.7b guard \@ptsize \ifx\@ptsize\@undefined\else \ifcase \@ptsize \relax % 10pt \setstretch {1.25}% \or % 11pt \setstretch {1.213}% \or % 12pt \setstretch {1.241}% \fi \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{command} % \begin{command}{\doublespacing} % \changes{v3.17}{2015/04/16}{new} % This selects the double line spacing. I think, a factor with three digits % for the decimals should be enough. % \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}% }% }{% % \end{macrocode} % \changes{v3.39}{2023/03/15}{support for \pkg{setspace} 6.7b added} % \begin{macrocode} \scr@ifexpected{\doublespacing}{% \long\def\doublespacing{% \setstretch {1.667}% default % DPC 6.7b guard \@ptsize \ifx\@ptsize\@undefined\else \ifcase \@ptsize \relax % 10pt \setstretch {1.667}% \or % 11pt \setstretch {1.618}% \or % 12pt \setstretch {1.655}% \fi \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{command} % % % \subsection{The \pkg*{lscape} hack} % \changes{v3.18a}{2015/07/07}{\pkg{lscape} hack added} % % The package does change \len{textheight} inside \env{landscape} to the prior % value of \len{textwidth}, nevertheless is does not change \len{textwidth} to % the prior value of \len{textheight}. This is at least inconsistent. After % asking him, David~Carlisle answered, that he does not change % \len{textwidth}, because this could result in problems. Therefore it is very % strange, that he does change \cs{textheight}, despite this also to problems, % e.g., with packages \pkg{showframe} or \pkg*{scrlayer}. So the patch here % also keeps \len{textheight} unchanged. This also has to take care for % \pkg{pdflscape}. The patches are done using \pkg{xpatch}. % % % \begin{option}{lscape} % \changes{v3.18a}{2015/07/07}{added} % \changes{v3.20}{2016/05/07}{loading \pkg{xpatch} in option part already} % \changes{v3.39}{2022/11/11}{initial dot in member argument of \cs{KOMA@key} % removed} % \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{command}{\landscape} % \changes{v3.18a}{2015/07/07}{added} % \changes{v3.20}{2016/05/07}{loading \pkg{xpatch} in option part already} % This command is the beginning of environment \env{landscape}. This has to be % patched using \pkg{xpatch}. % \begin{description} % \item[Note:] This is a load time option and cannot be changed after loading % the package! % \end{description} % \begin{macrocode} %<*lscape&body> \xpatchcmd{\landscape}{\textheight=\vsize}{% \if@scrhack@lscape % \end{macrocode} % \begin{macro}{\@outputpage} % \changes{v3.18a}{2015/08/11}{added} % Here the changed value of \len{textheight} is needed for initialization of % \cs{@colht}. So we patch it to use the new internal \len{scr@LT@textheight} % instead of \len{textheight}. % \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{ilength}{\scrh@LT@textheight} % \changes{v3.18a}{2015/08/11}{new} % \begin{macrocode} \newlength{\scrh@LT@textheight} % % \end{macrocode} % \end{ilength}^^A \scrh@LT@textheight % \end{macro}^^A \@outputpage % \end{command}^^A \landscape % % % \subsection{The standard classes sections hack} % \label{sec:standardsections} % The \emph{standard classes sections hack} differs from each other % hack. First of all it does not patch a specific package but the class % definitions of section commands from \cs{part} till % \cs{subparagraph}. Additionally it resets several internal \LaTeX{} macros % which are changed by \KOMAScript{} classes to their original % definition. Last but not least it is not activated by default, but the user % has to activate it, if he needs it. The hack has more potential to break % things than to make things better. Because of this, there is not any support % for using this hack and the hack shows several warning messages. % % \begin{option}{standardsections} % \begin{macrocode} %<*package&option> \KOMA@ifkey{standardsections}{@scrhack@standardsections} \KOMAExecuteOptions{standardsections=false} % %<*package&body> \AtEndOfPackage{% \if@scrhack@standardsections \PackageInfo{scrhack}{loading standard classes sections hack}% \input{standardsections.hak}% \fi } % % \end{macrocode} % \end{option}^^A standardsections % % \begin{command}{\part,\chapter, % \section,\subsection,\subsubsection, % \paragraph,\subparagraph} % The hack redefines all these commands to a definition copied from the % standard \LaTeX{} classes version v1.4i. Copyright of this code is by the % \LaTeX3{} Project. The complete, unmodified code can be found on % \url{https://ctan.org/tex-archive/macros/latex/base/classes.dtx}. % \begin{macrocode} %<*standardsections&body> \PackageWarningNoLine{scrhack}{% You are loosing every kind of support because of\MessageBreak using the dangerous standard classes sections hack!\MessageBreak This hack can break several classes and packages.\MessageBreak However, sometimes it is needed to make a\MessageBreak package work% }% \PackageInfo{scrhack}{% Using code from the standard LaTeX classes.\MessageBreak For more information about this code and the\MessageBreak license of this code, please see:\MessageBreak https://ctan.org/tex-archive/macros/latex/base/classes.dtx }% \@ifpackageloaded{hyperref}{% \PackageWarning{scrhack}{this hack should not be loaded after `hyperref'}% }{} \@ifpackageloaded{titlesec}{% \PackageWarning{scrhack}{this hack should not be loaded after `titlesec'}% }{} \@ifpackageloaded{sectsty}{% \PackageWarning{scrhack}{this hack should not be loaded after `sectsty'}% }{} \@ifpackageloaded{sectsty}{% \PackageWarning{scrhack}{this hack should not be loaded after `sectsty'}% }{} \scr@ifundefinedorrelax{chapter}{% % \end{macrocode} % It seems to be an article class, so we use the code from % \href{http://mirrors.ctan.org/macros/latex/base/classes.dtx}{\cls*{article}}. % \begin{macrocode} \scr@ifundefinedorrelax{c@part}{\newcounter{part}}{}% \scr@ifundefinedorrelax{c@section}{\newcounter{section}}{}% \scr@ifundefinedorrelax{c@subsection}{\newcounter{subsection}[section]}{}% \scr@ifundefinedorrelax{c@subsubsection}{% \newcounter{subsubsection}[subsection]}{}% \scr@ifundefinedorrelax{c@paragraph}{% \newcounter{paragraph}[subsubsection]}{}% \scr@ifundefinedorrelax{c@subparagraph}{% \newcounter{subparagraph}[paragraph]}{}% \renewcommand\thepart {\@Roman\c@part}% \renewcommand\thesection {\@arabic\c@section}% \renewcommand\thesubsection {\thesection.\@arabic\c@subsection}% \renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection}% \renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph}% \renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph}% \def\part{% \if@noskipsec \leavevmode \fi \par \addvspace{4ex}% \@afterindentfalse \secdef\@part\@spart}% \def\@part[#1]#2{% \ifnum \c@secnumdepth >\m@ne \refstepcounter{part}% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% \else \addcontentsline{toc}{part}{#1}% \fi {\parindent \z@ \raggedright \interlinepenalty \@M \normalfont \ifnum \c@secnumdepth >\m@ne \Large\bfseries \partname\nobreakspace\thepart \par\nobreak \fi \huge \bfseries #2% \markboth{}{}\par}% \nobreak \vskip 3ex \@afterheading}% \def\@spart#1{% {\parindent \z@ \raggedright \interlinepenalty \@M \normalfont \huge \bfseries #1\par}% \nobreak \vskip 3ex \@afterheading}% \def\section{\@startsection {section}{1}{\z@}% {-3.5ex \@plus -1ex \@minus -.2ex}% {2.3ex \@plus.2ex}% {\normalfont\Large\bfseries}}% \def\subsection{\@startsection{subsection}{2}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\large\bfseries}}% \def\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\normalsize\bfseries}}% \def\paragraph{\@startsection{paragraph}{4}{\z@}% {3.25ex \@plus1ex \@minus.2ex}% {-1em}% {\normalfont\normalsize\bfseries}}% \def\subparagraph{\@startsection{subparagraph}{5}{\parindent}% {3.25ex \@plus1ex \@minus .2ex}% {-1em}% {\normalfont\normalsize\bfseries}}% }{% % \end{macrocode} % It seems to be either a book or report class. % \begin{macrocode} \scr@ifundefinedorrelax{c@part}{\newcounter{part}}{}% \scr@ifundefinedorrelax{c@chapter}{\newcounter{chapter}}{}% \scr@ifundefinedorrelax{c@section}{\newcounter{section}[chapter]}{}% \scr@ifundefinedorrelax{c@subsection}{\newcounter{subsection}[section]}{}% \scr@ifundefinedorrelax{c@subsubsection}{% \newcounter{subsubsection}[subsection]}{}% \scr@ifundefinedorrelax{c@paragraph}{% \newcounter{paragraph}[subsubsection]}{}% \scr@ifundefinedorrelax{c@subparagraph}{% \newcounter{subparagraph}[paragraph]}{}% \def\@chapapp{\chaptername}% \scr@ifundefinedorrelax{frontmatter}{% % \end{macrocode} % It seems not to be a book class. % \begin{macrocode} \def\part{% \if@openright \cleardoublepage \else \clearpage \fi \thispagestyle{plain}% \if@twocolumn \onecolumn \@tempswatrue \else \@tempswafalse \fi \null\vfil \secdef\@part\@spart} \def\@part[#1]#2{% \ifnum \c@secnumdepth >-2\relax \refstepcounter{part}% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% \else \addcontentsline{toc}{part}{#1}% \fi \markboth{}{}% {\centering \interlinepenalty \@M \normalfont \ifnum \c@secnumdepth >-2\relax \huge\bfseries \partname\nobreakspace\thepart \par \vskip 20\p@ \fi \Huge \bfseries #2\par}% \@endpart} \def\@spart#1{% {\centering \interlinepenalty \@M \normalfont \Huge \bfseries #1\par}% \@endpart} \def\@endpart{\vfil\newpage \if@twoside \if@openright \null \thispagestyle{empty}% \newpage \fi \fi \if@tempswa \twocolumn \fi} \def\chapter{\if@openright\cleardoublepage\else\clearpage\fi \thispagestyle{plain}% \global\@topnum\z@ \@afterindentfalse \secdef\@chapter\@schapter} \def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne \refstepcounter{chapter}% \typeout{\@chapapp\space\thechapter.}% \addcontentsline{toc}{chapter}% {\protect\numberline{\thechapter}#1}% \else \addcontentsline{toc}{chapter}{#1}% \fi \chaptermark{#1}% \addtocontents{lof}{\protect\addvspace{10\p@}}% \addtocontents{lot}{\protect\addvspace{10\p@}}% \if@twocolumn \@topnewpage[\@makechapterhead{#2}]% \else \@makechapterhead{#2}% \@afterheading \fi} \def\@makechapterhead#1{% \vspace*{50\p@}% {\parindent \z@ \raggedright \normalfont \ifnum \c@secnumdepth >\m@ne \huge\bfseries \@chapapp\space \thechapter \par\nobreak \vskip 20\p@ \fi \interlinepenalty\@M \Huge \bfseries #1\par\nobreak \vskip 40\p@ }} \def\@schapter#1{\if@twocolumn \@topnewpage[\@makeschapterhead{#1}]% \else \@makeschapterhead{#1}% \@afterheading \fi} \def\@makeschapterhead#1{% \vspace*{50\p@}% {\parindent \z@ \raggedright \normalfont \interlinepenalty\@M \Huge \bfseries #1\par\nobreak \vskip 40\p@ }} \def\section{\@startsection {section}{1}{\z@}% {-3.5ex \@plus -1ex \@minus -.2ex}% {2.3ex \@plus.2ex}% {\normalfont\Large\bfseries}}% \def\subsection{\@startsection{subsection}{2}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\large\bfseries}}% \def\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\normalsize\bfseries}}% \def\paragraph{\@startsection{paragraph}{4}{\z@}% {3.25ex \@plus1ex \@minus.2ex}% {-1em}% {\normalfont\normalsize\bfseries}}% \def\subparagraph{\@startsection{subparagraph}{5}{\parindent}% {3.25ex \@plus1ex \@minus .2ex}% {-1em}% {\normalfont\normalsize\bfseries}}% }{% % \end{macrocode} % It seems to be a book class. % \begin{macrocode} \scr@ifundefinedorrelax{if@mainmatter}{% \expandafter\newif\csname if@mainmatter\endcsname }{}% \def\frontmatter{% \cleardoublepage \@mainmatterfalse \pagenumbering{roman}}% \def\mainmatter{% \cleardoublepage \@mainmattertrue \pagenumbering{arabic}}% \def\backmatter{% \if@openright \cleardoublepage \else \clearpage \fi \@mainmatterfalse}% \def\part{% \if@openright \cleardoublepage \else \clearpage \fi \thispagestyle{plain}% \if@twocolumn \onecolumn \@tempswatrue \else \@tempswafalse \fi \null\vfil \secdef\@part\@spart}% \def\@part[#1]#2{% \ifnum \c@secnumdepth >-2\relax \refstepcounter{part}% \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% \else \addcontentsline{toc}{part}{#1}% \fi \markboth{}{}% {\centering \interlinepenalty \@M \normalfont \ifnum \c@secnumdepth >-2\relax \huge\bfseries \partname\nobreakspace\thepart \par \vskip 20\p@ \fi \Huge \bfseries #2\par}% \@endpart}% \def\@spart#1{% {\centering \interlinepenalty \@M \normalfont \Huge \bfseries #1\par}% \@endpart}% \def\@endpart{\vfil\newpage \if@twoside \if@openright \null \thispagestyle{empty}% \newpage \fi \fi \if@tempswa \twocolumn \fi}% \def\chapter{\if@openright\cleardoublepage\else\clearpage\fi \thispagestyle{plain}% \global\@topnum\z@ \@afterindentfalse \secdef\@chapter\@schapter}% \def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne \if@mainmatter \refstepcounter{chapter}% \typeout{\@chapapp\space\thechapter.}% \addcontentsline{toc}{chapter}% {\protect\numberline{\thechapter}#1}% \else \addcontentsline{toc}{chapter}{#1}% \fi \else \addcontentsline{toc}{chapter}{#1}% \fi \chaptermark{#1}% \addtocontents{lof}{\protect\addvspace{10\p@}}% \addtocontents{lot}{\protect\addvspace{10\p@}}% \if@twocolumn \@topnewpage[\@makechapterhead{#2}]% \else \@makechapterhead{#2}% \@afterheading \fi}% \def\@makechapterhead#1{% \vspace*{50\p@}% {\parindent \z@ \raggedright \normalfont \ifnum \c@secnumdepth >\m@ne \if@mainmatter \huge\bfseries \@chapapp\space \thechapter \par\nobreak \vskip 20\p@ \fi \fi \interlinepenalty\@M \Huge \bfseries #1\par\nobreak \vskip 40\p@ }}% \def\@schapter#1{\if@twocolumn \@topnewpage[\@makeschapterhead{#1}]% \else \@makeschapterhead{#1}% \@afterheading \fi}% \def\@makeschapterhead#1{% \vspace*{50\p@}% {\parindent \z@ \raggedright \normalfont \interlinepenalty\@M \Huge \bfseries #1\par\nobreak \vskip 40\p@ }}% \def\section{\@startsection {section}{1}{\z@}% {-3.5ex \@plus -1ex \@minus -.2ex}% {2.3ex \@plus.2ex}% {\normalfont\Large\bfseries}}% \def\subsection{\@startsection{subsection}{2}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\large\bfseries}}% \def\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-3.25ex\@plus -1ex \@minus -.2ex}% {1.5ex \@plus .2ex}% {\normalfont\normalsize\bfseries}}% \def\paragraph{\@startsection{paragraph}{4}{\z@}% {3.25ex \@plus1ex \@minus.2ex}% {-1em}% {\normalfont\normalsize\bfseries}}% \def\subparagraph{\@startsection{subparagraph}{5}{\parindent}% {3.25ex \@plus1ex \@minus .2ex}% {-1em}% {\normalfont\normalsize\bfseries}}% }% }% End of the derived code. % \end{macrocode} % \end{command} % % \begin{macro}{\@startsection} % \KOMAScript{} classes redefine this internal \LaTeX{} kernel macro. In this % case \cs{scr@saved@startsection} is defined, differs from % \cs{@startsection} and has the definition found before redefining the % original macro. We do nothing else but resetting \cs{@startsection} to this % saved definition. % \begin{macrocode} \scr@ifundefinedorrelax{scr@saved@startsection}{}{% \ifx\@startsection\scr@saved@startsection\else \PackageWarningNoLine{scrhack}{% Resetting \string\@startsection,\MessageBreak because of loading standard classes sections hack% }% \let\@startsection\scr@saved@startsection \fi } % \end{macrocode} % \end{macro}^^A \@startsection % % \begin{macro}{\@sect,\@ssect,\@xsect} % All these should be resetted to their original definitions stored in % \cs{scr@latex@\dots}. % \begin{macrocode} \scr@ifundefinedorrelax{scr@latex@sect}{}{% \ifx\@sect\scr@latex@sect\else \PackageWarningNoLine{scrhack}{% Resetting \string\@sect,\MessageBreak because of loading standard classes sections hack% }% \let\@sect\scr@latex@sect \fi } \scr@ifundefinedorrelax{scr@latex@ssect}{}{% \ifx\@ssect\scr@latex@ssect\else \PackageWarningNoLine{scrhack}{% Resetting \string\@ssect,\MessageBreak because of loading standard classes sections hack% }% \let\@sect\scr@latex@ssect \fi } \scr@ifundefinedorrelax{scr@latex@xsect}{}{% \ifx\@xsect\scr@latex@xsect\else \PackageWarningNoLine{scrhack}{% Resetting \string\@xsect,\MessageBreak because of loading standard classes sections hack% }% \let\@sect\scr@latex@sect \fi } % \end{macrocode} % \end{macro}^^A \@xsect,\@ssect,\@sect % % \begin{command}{\DeclareSectionCommand,\RedeclareSectionCommand, % \DeclareNewSectionCommand,\ProvideSectionCommand, % \DeclareSectionCommands,\RedeclareSectionCommands, % \DeclareNewSectionCommands,\ProvideSectionCommands} % These \KOMAScript{} commands do not make sense any longer after forced % redefinition of \cs{part} \dots{} \cs{subparagraph}. They even would not % work correctly after resetting, e.g., \cs{@startsection}. So best reaction % is to \emph{undefine} them. % \begin{macrocode} \scr@ifundefinedorrelax{DeclareSectionCommand}{}{% \PackageWarningNoLine{scrhack}{% \string\DeclareSectionCommand\space and all derivates deactivated,\MessageBreak because of loading standard classes sections hack% }% \let\DeclareSectionCommand\undefined \let\DeclareSectionCommands\undefined \let\RedeclareSectionCommand\undefined \let\RedeclareSectionCommands\undefined \let\DeclareNewSectionCommand\undefined \let\DeclareNewSectionCommands\undefined \let\ProvideSectionCommand\undefined \let\ProvideSectionCommands\undefined } % \end{macrocode} % \begin{macro}{\scr@chapter@before@hyperref@patch, % \scr@chapter@after@hyperref@patch} % Now, definitions without respecting \pkg{hyperref} are used, so % \pkg{hyperref} should again be able to patch them. So the hack should % deactivate the patch deactivation of the \KOMAScript{} classes. % \begin{macrocode} \let\scr@chapter@before@hyperref@patch\relax \let\scr@chapter@after@hyperref@patch\relax % \end{macrocode} % \end{macro} % \end{command} % % \begin{macro}{\scr@osectarg} % The \KOMAScript{} classes use this macro to store how to use the optional % argument of section commands. But with the standard class definition the % only possibility is to use it as running head and write it into the table of % contents without any extended handling. So the only value, that makes sense % is 0. % \begin{macrocode} \scr@ifundefinedorrelax{scr@osectarg}{}{% \def\reserved@a{0}% \ifx\scr@osectarg\reserved@a\else \let\scr@osectarg\reserved@a \PackageWarningNoLine{scrhack}{% Extended option handling for section commands deactivated,\MessageBreak because of loading standard classes sections hack% }% \fi }% % \end{macrocode} % \begin{macro}{\scr@activate@xsection} % Further changing of the value has to be deactivated. % \begin{macrocode} \scr@ifundefinedorrelax{scr@activate@xsection}{}{% \renewcommand*{\scr@activate@xsection}[1]{% \edef\scr@osectarg{#1}\def\reserved@a{0}% \ifx\scr@osectarg\reserved@a \else \let\scr@osectarg\reserved@a \PackageWarning{scrhack}{% Because of loading the standard classes\MessageBreak sections hack, the extended option handling\MessageBreak of section commands failed% }% \fi }% } % \end{macrocode} % \end{macro}^^A \scr@activate@xsection % \end{macro}^^A \scr@osectarg % % \begin{command}{\partformat,\chapterformat} % Most \cs{\dots format} macros of \KOMAScript{} are still used, because of % the redefinition of \cs{@seccntformat}. But \cs{part} and \cs{chapter} are % defined without using them. % \begin{macrocode} \scr@ifundefinedorrelax{partformat}{}{% \PackageWarningNoLine{scrhack}{% Usage of \string\partformat\space deactivated,\MessageBreak because of loading the standard classes sections hack% }% } \scr@ifundefinedorrelax{chapterformat}{}{% \PackageWarningNoLine{scrhack}{% Usage of \string\chapterformat\space deactivated,\MessageBreak because of loading the standard classes sections hack% }% } % \end{macrocode} % \end{command}^^A \chapterformat,\partformat % % \begin{command}{\sectionformat,\subsectionformat,\subsubsectionformat, % \paragraphformat,\subparagraphformat} % All these commands have to be resetted to not use the automatic dot and to % add a \cs{quad} instead of an \cs{enskip}. % \begin{macrocode} \scr@ifundefinedorrelax{sectionformat}{}{% \PackageWarningNoLine{scrhack}{% \string\sectionformat\space set to `\string\thesection\string\quad',\MessageBreak because of loading the standard classes sections hack% }% \renewcommand*{\sectionformat}{\thesection\quad}% } \scr@ifundefinedorrelax{subsectionformat}{}{% \PackageWarningNoLine{scrhack}{% \string\subsectionformat\space set to `\string\thesubsection\string\quad'\MessageBreak because of loading the standard classes sections hack% }% \renewcommand*{\subsectionformat}{\thesubsection\quad}% } \scr@ifundefinedorrelax{subsubsectionformat}{}{% \PackageWarningNoLine{scrhack}{% \string\subsubsectionformat\space set to `\string\thesubsubsection\string\quad'\MessageBreak because of loading the standard classes sections hack% }% \renewcommand*{\subsubsectionformat}{\thesubsubsection\quad}% } \scr@ifundefinedorrelax{paragraphformat}{}{% \PackageWarningNoLine{scrhack}{% \string\paragraphformat\space set to `\string\theparagraph\string\quad'\MessageBreak because of loading the standard classes sections hack% }% \renewcommand*{\paragraphformat}{\theparagraph\quad}% } \scr@ifundefinedorrelax{subparagraphformat}{}{% \PackageWarningNoLine{scrhack}{% \string\subparagraphformat\space set to `\string\thesubparagraph\string\quad'\MessageBreak because of loading the standard classes sections hack% }% \renewcommand*{\subparagraphformat}{\thesubparagraph\quad}% } % \end{macrocode} % \end{command} % % \begin{command}{\partlineswithprefixformat, % \chapterlineswithprefixformat,\chapterlinesformat, % \sectionlinesformat,\sectioncatchphraseformat} % These \KOMAScript{} commands are not used any longer. % \begin{macrocode} \scr@ifundefinedorrelax{partlineswithprefixformat}{}{% \PackageWarningNoLine{scrhack}{% Usage of \string\partlineswithprefixformat\space deactivated,\MessageBreak because of loading the standard classes sections hack% }% } \scr@ifundefinedorrelax{chapterlineswithprefixformat}{}{% \PackageWarningNoLine{scrhack}{% Usage of \string\chapterlineswithprefixformat\space and\MessageBreak \string\chapterlinesformat\space deactivated,\MessageBreak because of using standard classes sections hack% }% } \scr@ifundefinedorrelax{sectionlinesformat}{}{% \PackageWarningNoLine{scrhack}{% Usage of \string\sectionlinesformat\space and\MessageBreak \string\sectioncatchphraseformat\space deactivated,\MessageBreak because of using standard classes sections hack% }% } % \end{macrocode} % \end{command}^^A \partlineswithprefixformat … % % \begin{option}{headings} % \changes{v3.39}{2022/11/11}{initial dot in member argument of option storage % commands removed} % The \KOMAScript{} option does not make sense any longer. So it is % deactivated and usage will throw an error. % \begin{macrocode} \scr@ifundefinedorrelax{KOMAClassName}{}{% \PackageWarningNoLine{scrhack}{% KOMA-Script option `headings' removed,\MessageBreak because of loading standard classes sections hack% }% \RelaxFamilyKey[.\KOMAClassFileName]{KOMA}{headings}% \KOMA@kav@removekey{\KOMAClassFileName}{headings}% } % \end{macrocode} % \end{option}^^A headings % % \begin{macro}{\scr@class@titlesec@warning} % The warning about loading \pkg{titlesec} has to be changes, because we do % not expect errors any longer. % \begin{macrocode} \def\scr@class@titlesec@warning{% \PackageWarning{scrhack}{% Usage of `titlesec' should work, because of\MessageBreak loading the standard classes sections hack.\MessageBreak However, you should know, there is not any\MessageBreak support for this combination by the\MessageBreak KOMA-Script author% }% } % % \end{macrocode} % \end{macro}^^A \scr@class@titlesec@warning % % \subsection{Executing options} % % Last but not least the options have to be processed. In the generated % package this will be done before the commands of \autoref{sec:macros}. % \begin{macrocode} %<*package&option> \KOMAProcessOptions\relax % % \end{macrocode} % % \Finale % \PrintChanges % \endinput % Local Variables: % mode: doctex % ispell-local-dictionary: "en_US" % eval: (flyspell-mode 1) % TeX-master: t % TeX-engine: luatex-dev % eval: (setcar (or (cl-member "Index" (setq-local TeX-command-list (copy-alist TeX-command-list)) :key #'car :test #'string-equal) (setq-local TeX-command-list (cons nil TeX-command-list))) '("Index" "mkindex %s" TeX-run-index nil t :help "makeindex for dtx")) % End: