% \iffalse meta-comment % ====================================================================== % scrhack.dtx % Copyright © 2008–2024 Markus Kohm % % This work is a KOMA-Script spin-off. For the original sources of % KOMA-Script's `scrhack.sty' see file `scrhack.dtx' in the KOMA-Script % sources at . % % Development is taking place as part of `scrhack' at % . New issues % should be reported there as well as known issues can be found. % % 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 the file `scrhack.dtx', % `scrhack-2023-07-07,dtx', and `README.md'. % % The recommended way to install `scrhack' is to use % the package manager of your TeX distribution. % ====================================================================== % %<*dtx> \ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi \ProvidesFile{scrhack.dtx} % %\providecommand\DeclareRelease[3]{} %\providecommand\DeclareCurrentRelease[2]{} %\DeclareRelease{v3.41}{2023-07-07}{scrhack-2023-07-07.sty} %\DeclareCurrentRelease{}{2023-07-15} %<*dtx|package> %\ProvidesPackage{scrhack} [2024-09-04 v3.42 % sources and unpack driver of scrhack emulation package] % %<*dtx> \ifx\documentclass\undefined \input docstrip.tex \generate{% \file{scrhack.sty}{% \from{scrhack.dtx}{package}% }% }% \else \let\endbatchfile\relax \fi \endbatchfile \documentclass[ngerman,USenglish]{koma-script-source-doc} \usepackage{babel} \usepackage{csquotes} \usepackage[style=alphabetic]{biblatex} \begin{filecontents}[force]{\jobname.bib} @online{pkg:koma-script, author={Markus Kohm}, version={3.41}, date={2023-07-07}, title={{\KOMAScript} --- A bundle of versatile classes and packages}, url={https://ctan.org/pkg/koma-script}, urldate={2023-07-14}, note={The \KOMAScript{} bundle provides replacements for the \pkg*{article}, \pkg*{report}, and \pkg*{book} classes with emphasis on typography and versatility. There is also a letter class.}, } @manual{pkg:koma-script:manual:de, author={Markus Kohm}, date={2023-06-16}, title={{\KOMAScript}}, subtitle={Die Anleitung}, url={http://mirrors.ctan.org/macros/latex/contrib/koma-script/scrguide-de.pdf}, urldate={2023-07-04}, } @manual{pkg:koma-script:manual:en, author={Markus Kohm}, date={2023-06-16}, title={{\KOMAScript}}, subtitle={The Guide}, url={http://mirrors.ctan.org/macros/latex/contrib/koma-script/scrguide-en.pdf}, urldate={2023-07-14}, } @article{latexnews35, author={{The {\LaTeX} Project Team}}, shortauthor={TLT}, year={2022}, month={6}, title={Issue 35}, journal={{\LaTeX} News}, url={http://mirrors.ctan.org/macros/latex/base/ltnews35.pdf}, urldate={2023-07-14}, } \end{filecontents} \addbibresource{\jobname.bib} \setcounter{StandardModuleDepth}{2} \providecommand*{\seclabel}[1]{\label{sec:#1}} \begin{document} \nocite{pkg:koma-script} \DocInput{scrhack.dtx} \end{document} % %\fi % % \changes{v0.1}{2023/07/14}{start of \KOMAScript{} spin-off} % % \GetFileInfo{scrhack.dtx} % \title{Emulating Former \href{https://komascript.de/}{\KOMAScript} Package % \pkg*{scrhack}} % \author{\href{mailto:komascript@gmx.info}{Markus Kohm}} % \date{Version \filedate{} \fileversion} % \maketitle % \begin{abstract} % For several years \href{https://komascript.de/}{\KOMAScript} provided a % package \pkg*{scrhack}, that has been made not only to improve the % compatibility of third-party packages with % \href{https://komascript.de/}{\KOMAScript} classes, but also to generally % improve third-party packages. The package consisted not only in the % package file \file{scrhack.sty} but also in several so called \emph{hacks} % as separate files with extension \file{.hak}. In the course of splitting % off former \href{https://komascript.de/}{\KOMAScript} packages from the % \href{https://komascript.de/}{\KOMAScript} collection, it was decided to % create independent packages from the individual hacks. These new % independent packages then serve as replacements for the original packages % they were intended to improve. In addition, to preserve the functionality % of loading the enhancements only when the corresponding original package % is loaded, a new \pkg*{scrhack} was created to do just that. % \end{abstract} % % \tableofcontents % %\iffalse %<*doc> %\fi % \section{History} % \label{sec:history} Some packages from other authors do not work well with \href{https://komascript.de/}{\KOMAScript}. It is often very tedious for the author of \href{https://komascript.de/}{\KOMAScript} to convince the authors of these packages to make specific improvements. This also applies to packages whose development has been discontinued. That's why the \pkg*{scrhack} was created. This package alters the commands and definitions of other to work better with \href{https://komascript.de/}{\KOMAScript}. Some changes are also useful when using other classes. In the early days of \href{https://komascript.de/}{\KOMAScript}, users wanted to handle lists of floating environments created with the \pkg{float} package in the same way as the list of figures and list of tables created by \href{https://komascript.de/}{\KOMAScript} itself. At that time the author of \href{https://komascript.de/}{\KOMAScript} contacted the author of \pkg{float} to propose an interface to support such an enhancement. A somewhat modified form of that interface was implemented with the \cs{float@listhead} and \cs{float@addtolists} commands. Later it became apparent that these two commands were not flexible enough to fully support all of \href{https://komascript.de/}{\KOMAScript}'s capabilities. Unfortunately, the author of \pkg{float} had already ceased development by that point, so further changes to this package cannot be expected. Other package authors have also adopted these two commands, and it became apparent that the implementation in some packages, including \pkg{float}, means that all these packages can only be loaded in a specific order, even though they are otherwise unrelated to each other. To overcome all these disadvantages and problems, \href{https://komascript.de/}{\KOMAScript} no longer officially supports this old interface. Instead, \href{https://komascript.de/}{\KOMAScript} warns if the old interface is used. At the same time, the \pkg{tocbasic} package has been designed and implemented as a central interface for managing of table of contents and similar content lists. This package provides many more advantages and features than the two old commands. Although the effort to use this package is very small, so far the authors of most of the packages that use the old interface have not made any adjustments. Therefore the \KOMAScript author designed a new package \pkg*{scrhack} as part of \href{https://komascript.de/}{\KOMAScript}. That package contained appropriate modifications of the packages \pkg{float}, \pkg{floatrow}, \pkg{listings}, and later on also for \pkg{nomencl} and some others not related to that interface. Merely loading \pkg*{scrhack} was sufficient to make these packages recognize not only the setting of the \href{https://komascript.de/}{\KOMAScript} option \opt{listof}, but, e.g., also to react to the language switching features of the \pkg{babel} package. You can find more information about the features available by switching packages to \pkg{tocbasic} in \autocite{pkg:koma-script:manual:en} or \autocite{pkg:koma-script:manual:de}. With release of version 3.42 package \pkg*{scrhack} has been removed from \href{https://komascript.de/}{\KOMAScript}. The code of the former package has been split into several standalone packages, that can be loaded individually if needed. However, for compatibility and maybe for convenience there is also a new standalone package \pkg*{scrhack} almost compatible with the old one. \section{Using \texorpdfstring{\pkg*{scrhack}}{scrhack}} \seclabel{usage} It is recommended to load the \pkg*{scrhack} package using: \begin{verbatim} \usepackage{scrhack} \end{verbatim} as early as possible. In particular, loading should be done before the affected packages. The package also provides several options, one for each hack. Usually the options are named identically to the package, that is patched by the hack. All these options are boolean options. You can switch such an option on assigning value \optvalue{true} or using it without value. You can switch off such an option assigning value \optvalue{false}. Switching off an option means to not automatically load the corresponding enhancement package after the package, that has to be patched. Therefore switching off an option results in not patching the corresponding package. \paragraph{Notes:} \begin{itemize} \item From version 3.42, you cannot use \cs{KOMAoptions} or \cs{KOMAoption} any longer to change the options. Instead loading \pkg*{scrhack} again with other options does not result in an option clash, but in a change of the option settings. \item Switching off an option of an already loaded enhancement package is ignored (with warning). It does not unload the enhancement package or switch back to a not patched functionality. \item Switching on an option of a not yet loaded enhancement package would result in loading the enhancement package. \item From version 3.42, you should no longer load package \pkg*{scrhack}. Instead you can and should simply load the individual enhancement package when you need it. \item If you need the old legacy version of \pkg*{scrhack} from \href{https://komascript.de/}{\KOMAScript} 3.41 you can use: \begin{verbatim} \usepackage{scrhack}[=2023-07-07] \end{verbatim} or \begin{verbatim} \usepackage{scrhack}[=v3.41] \end{verbatim} However, this depends on internal packages of \href{https://komascript.de/}{\KOMAScript}. \item The hacks of the legacy version have been frozen. So the hacks may break with packages or \LaTeX{} versions released after 2023-07-07. There is no support for such combinations! \item Loading the legacy version more than once with different option setting still results in option clash errors. \end{itemize} \paragraph{Available options with \pkg*{scrhack}:} \begin{description} \item[\opt{float=\meta{boolean}}:] \DescribeOption[noprint]{float=\meta{boolean}}% \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{float} is loaded, load also package \pkg{floatbytocbasic} to fix the issue explained in \autoref{sec:history}. This also provides the full functionality of \pkg{tocbasic} to \pkg{float}. \item[\opt{floatrow=\meta{boolean}}:] \DescribeOption[noprint]{floatrow=\meta{boolean}}% \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{floatrow} is loaded, load also package \pkg{floatbytocbasic} to fix the issue explained in \autoref{sec:history}. This also provides the full functionality of \pkg{tocbasic} to \pkg{floatrow}. \item[\opt{hyperref=\meta{boolean}}:] \DescribeOption[noprint]{hyperref=\meta{boolean}}% \hfill \marginline{\raisebox{\dimexpr\ht\strutbox-\height\relax}{\Huge\textcolor{red}{!}}}% initial: \optvalue{false}, default: \optvalue{true}\\ Option \opt{hyperref} is deprecated. It is implemented for compatibility reasons only. Using \opt{hyperref} without value or \opt{hyperref=true} results in a warning. Using \opt{hyperref=false} results in an info only. \item[\opt{listings=\meta{boolean}}:] \DescribeOption[noprint]{listings=\meta{boolean}}% \hfill \marginline{\raisebox{\dimexpr\ht\strutbox-\height\relax}{\Huge\textcolor{red}{!}}}% initial: \optvalue{false}, default: \optvalue{true}\\ Option \opt{listings} is deprecated. It is implemented for compatibility reasons only. Using \opt{listings} without value or \opt{listings=true} results in a warning. Using \opt{listings=false} results in an info only. \item[\opt{lscape=\meta{boolean}}:] \DescribeOption[noprint]{lscape=\meta{boolean}}% \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{lscape} is loaded, load also package \pkg{lscapeenhanced} to fix an issue with detection of text height for some packages like \pkg{scrlayer} and \pkg{showframe}. \item[\opt{nomencl=\meta{boolean}}:] \DescribeOption[noprint]{nomencl=\meta{boolean}}% \hfill \marginline{\raisebox{\dimexpr\ht\strutbox-\height\relax}{\Huge\textcolor{red}{!}}}% initial: \optvalue{false}, default: \optvalue{true}\\ Option \opt{nomencl} is deprecated. It is implemented for compatibility reasons only. Using \opt{nomencl} without value or \opt{nomencl=true} results in a warning. Using \opt{nomencl=false} results in an info only. \item[\opt{setspace=\meta{boolean}}:] \DescribeOption[noprint]{setspace=\meta{boolean}}% \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{setspace} is loaded, load also package \pkg{setspaceenhanced} with the same options plus options \opt{byselectfont} and \opt{keepfontsize}. \item[\opt{standardsectioning=\meta{boolean}}:] \DescribeOption[noprint]{standardsectioning=\meta{boolean}}% \hfill initial: \optvalue{false}, default: \optvalue{true}\\ Load package \pkg{standardsectioning} to (re-)define the sectioning commands using the code from the standard classes. If \pkg*{scrhack} is loaded \emph{before} any class\footnote{This is detected heuristic by definition of \cs{normalsize}. If \cs{normalsize} contains \cs{@latex@error} no class has been loaded.} the definition is delayed until a class has been loaded. \end{description} \paragraph{Available options with the legacy version:} \begin{description} \item[\opt{float=\meta{boolean}}:] \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{float} is loaded, load \file{float.hak} to fix the issue explained in \autoref{sec:history}. This also provides the full functionality of \pkg{tocbasic} to \pkg{float}. \item[\opt{floatrow=\meta{boolean}}:] \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{floatrow} is loaded, load \file{floatrow.hak} to fix the issue explained in \autoref{sec:history}. This also provides the full functionality of \pkg{tocbasic} to \pkg{floatrow}. \item[\opt{hyperref=\meta{boolean}}:] \hfill initial: \optvalue{true}, default: \optvalue{true}\\ Versions of \pkg{hyperref} before 6.79h set the link anchors after the heading of the starred versions of commands like \cs{part*}, \cs{chapter*}, etc. instead of before them. Since then, this problem has been resolved at the suggestion of \KOMAScript's author. But because the change took more than a year, a patch was added to \pkg*{scrhack}. Although this can also be deactivated with \opt{hyperref=false}, you should instead use an up-to-date \pkg{hyperref} release. In this case the legacy version of \pkg*{scrhack} automatically deactivates this unnecessary patch. \item[\opt{listings=\meta{boolean}}:] \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{listings} is loaded, load \file{listings.hak} to fix the issue explained in \autoref{sec:history}. This also provides the full functionality of \pkg{tocbasic} to old versions of \pkg{listings}. With newer versions, also the legacy version of \pkg*{scrhack} automatically deactivates this unnecessary patch. \item[\opt{lscape=\meta{boolean}}:] \hfill initial: \optvalue{true}, default: \optvalue{true}\\ The \pkg{lscape} package defines a \env{landscape} environment to set the page contents, but not the header or footer in landscape mode. Inside this environment, \len{textheight}is set to the value of \len{textwidth}, but \len{textwidth} is not set to the former value of \len{textheight}. This is inconsistent. As far as I know, \len{textwidth} is left unchanged because setting it to \len{textheight} could interfere with other packages or user commands. But changing \len{textheight} also has this potential, and indeed it breaks, for example, \pkg{showframe} and \pkg{scrlayer}. Thus it would be best if \len{textheight} too remained unchanged. After package \pkg{lscape} is loaded, the legacy version of \pkg*{scrhack} loads \file{lscape.hak}, that uses the \pkg{xpatch} package to modify the \env{landscape} environment's start macro \cs{landscape} appropriately. Incidentally, the \pkg{pdflscape} package also uses \pkg{lscape}, so this option affects the functioning of this package too. \item[\opt{nomencl=\meta{boolean}}:] \hfill initial: \optvalue{true}, default: \optvalue{true}\\ After package \pkg{nomencl} is loaded, load \file{nomencl.hak} to fix the issue explained in \autoref{sec:history}. This is a little bit more complicated, because the \pkg*{nomencl} author has also adapted his package to support \pkg{tocbasic}. So additional versions checks are done. \item[\opt{setspace=\meta{boolean}}:] \hfill initial: \optvalue{true}, default: \optvalue{true}\\ Some packages assume that the class-internal macro \cs{@ptsize} both is defined and expands to an integer. For compatibility, \href{https://komascript.de/}{\KOMAScript} defines \cs{@ptsize} even if the basic font size is something other than 10\,pt, 11\,pt, or 12\,pt. \href{https://komascript.de/}{\KOMAScript} also allows non-integer font sizes. So \cs{@ptsize} can, of course, also expand to a non-integer number. One of the packages that cannot cope with a non-integer \cs{@ptsize} is \pkg{setspace}. Additionally, the values set by this package are always dependent on the basic font size, even if the setting is made in the context of another font size. The legacy version of \pkg{scrhack} loads the hack \file{setspace.hak} after package \pkg{setspace} to solves both problems by redefining \cs{onehalfspacing} and \cs{doublespacing} to set the spacing relative to the actual font size. \textbf{Note:} if you use \pkg{setspace} with either the \opt{onehalfspacing} or \opt{doublespacing} option, you must load \pkg*{scrhack} first. \item[\opt{standardsections=\meta{boolean}}] \hfill initial: \optvalue{false}, default: \optvalue{true}\\ Various packages assume that the sectioning commands are defined in a specific way, corresponding to the definitions in the standard classes. But for some classes this is not the case. For example, the \href{https://komascript.de/}{\KOMAScript} classes use a completely different implementation to provide many additional features. But this can cause problems for packages that depend on the definition of the standard classes. The legacy version of \pkg*{scrhack} offers the option to force the sectioning commands \cs{part}, \cs{chapter}, \cs{section}, \cs{subsection}, \cs{subsubsection}, \cs{paragraph}, and \cs{subparagraph} to be compatible with those in the standard classes. When \cs{chapter} is defined, the definitions are based on those in \cls{book}. When \cs{chapter} is undefined, the definitions of \cls{article} are used. If you are using a \href{https://komascript.de/}{\KOMAScript} class, several features of these classes are also deactivated as side effect. For example, the commands to define or modify sectioning commands or option \opt{headings} are no longer available, and commands like \cs{partformat} have different defaults. Because this hack has the potential to do more harm than good, it issues several warnings. Also it is not activated simply by loading the legacy version of \pkg*{scrhack} package. If you want to use it, you must explicitly activate this option when you load the package. Late activation or deactivation is not supported. Since there are often less invasive solutions to fix the problem of package incompatibilities, using this hack is not recommended. It is provided only as a last resort for emergencies. \end{description} % % \iffalse % % \fi % % \MaybeStop{\printbibliography[heading=bibintoc]\PrintIndex} % % \iffalse %<*package> %<@@=scrhack> % \fi % \section{Implementation} % % Because \pkg*{scrhack} is not longer a % \href{https://komascript.de/}{\KOMAScript} package, it does not use the % \texttt{KOMA} family for options any longer. Instead it uses the new % \LaTeX{} kernel feature of key-value-options introduced in % \autocite{latexnews35}. So we need at least \LaTeX{} 2022-06-01: % \begin{macrocode} \ifnum 0=\ifcsname IfFormatAtLeastTF\endcsname \IfFormatAtLeastTF{2022-06-01}{1}{0}% \else 0% \fi\relax \PackageError{scrhack}{LaTeX kernel too old}{% The package needs at least LaTeX 2022-06-01.\MessageBreak This error is fatal. Loading will be aborted.% }% \endinput \fi \ExplSyntaxOn % \end{macrocode} % % \subsection{Messages} % % We need some messages, that are not specific for only one use-case. % \begin{itemize} % \item If an option is ignored, because it cannot be handled after already % loading the enhancement package. \#1 is the name option, \#2 is the % enhancement package. % \end{itemize} % \begin{macrocode} \msg_new:nnn { scrhack } { option-too-late } { option~`#1'~after~loading~package~`#2'~ignored. } % \end{macrocode} % \begin{itemize} % \item If an option is ignored, because it is deprecated. % \end{itemize} % \begin{macrocode} \msg_new:nnn { scrhack } { deprecated-option } { deprecated~option~`#1'~ignored. } % \end{macrocode} % % \subsection{Emulating \file{float.hak}} % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% float .code = \@@_switch_float:n { #1 }, float .default:n = true, float .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_float:n} % \ExplSyntaxOff % This is used to switch the state and add or remove the hook if needed. A new % boolean is used to know, whether the hook has been put. Using % \opt{float=true}, if package \pkg{floatbytocbasic} already has been loaded % isn't a foul. So we just write an information to the \file{log}. But using % \opt{float=false}, if package \pkg{floatbytocbasic} already has been loaded % may be wrong. So we use a warning message. We also warn if a not allowed % value is used. % \begin{macrocode} \bool_new:N \@@_float_bool \cs_new:Nn \@@_switch_float:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \@ifpackageloaded { floatbytocbasic } { \msg_info:nnnn { scrhack } { option-too-late } { float = true } { floatbytocbasic } } { \bool_if:NF \@@_float_bool { \hook_gput_code:nnn { package/float/after } { scrhack } { \RequirePackage { floatbytocbasic } } \bool_gset_true:N \@@_float_bool } } } {false} { \@ifpackageloaded { floatbytocbasic } { \msg_warning:nnnn { scrhack } { option-too-late } { float=false } { floatbytocbasic } } { \bool_if:NT \@@_float_bool { \hook_gremove_code:nn { package/float/after } { scrhack } } \bool_gset_false:N \@s@_float_bool } } } { \msg_warning:nnn { keys } { boolean-values-only } { float } } } \SetKeys{float=true} % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % \subsection{Emulating \file{floatrow.hak}} % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% floatrow .code = \@@_switch_floatrow:n { #1 }, floatrow .default:n = true, floatrow .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_floatrow:n} % \ExplSyntaxOff % This is used to switch the state and add or remove the hook if needed. A new % boolean is used to know, whether the hook has been put. Using % \opt{floatrow=true}, if package \pkg{floatrowbytocbasic} already has been % loaded isn't a foul. So we just write an information to the \file{log}. But % using \opt{floatrow=false}, if package \pkg{floatrowbytocbasic} already has % been loaded may be wrong. So we use a warning message. We also warn if a not % allowed value is used. % \begin{macrocode} \bool_new:N \@@_floatrow_bool \cs_new:Nn \@@_switch_floatrow:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \@ifpackageloaded { floatrowbytocbasic } { \msg_info:nnnn { scrhack } { option-too-late } { floatrow = true } { floatrowbytocbasic } } { \bool_if:NF \@@_floatrow_bool { \hook_gput_code:nnn { package/floatrow/after } { scrhack } { \RequirePackage { floatrowbytocbasic } } \bool_gset_true:N \@@_floatrow_bool } } } {false} { \@ifpackageloaded { floatrowbytocbasic } { \msg_warning:nnnn { scrhack } { option-too-late } { floatrow=false } { floatrowbytocbasic } } { \bool_if:NT \@@_floatrow_bool { \hook_gremove_code:nn { package/floatrow/after } { scrhack } } \bool_gset_false:N \@s@_floatrow_bool } } } { \msg_warning:nnn { keys } { boolean-values-only } { floatrow } } } \SetKeys{floatrow=true} % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % \subsection{Emulating \file{hyperref.hak}} % % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% hyperref .code = \@@_switch_hyperref:n { #1 }, hyperref .default:n = true, hyperref .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_hyperref:n} % \ExplSyntaxOff % This is somehow special, because the hack is deprecated. It only has been % needed for \pkg{hyperref} versions released before 2009-11-24, which would % not work with the \LaTeX{} kernel version needed by this version of % \pkg*{scrhack}. So emulating the hack does not make sense. Instead the % initial value of the option is changed to implicit \optvalue{false} and % switching it on explicitly does result in a warning. % \begin{macrocode} \cs_new:Nn \@@_switch_hyperref:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \msg_warning:nnn { scrhack } { deprecated-option } { hyperref=#1 } } {false} { \msg_info:nnn { scrhack } { deprecated-option } { hyperref=#1 } } } { \msg_warning:nnn { keys } { boolean-values-only } { hyperref } } } % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % \subsection{Emulating \file{listings.hak}} % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% listings .code = \@@_switch_listings:n { #1 }, listings .default:n = true, listings .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_listings:n} % \ExplSyntaxOff % This is somehow special, because the hack is deprecated. It only has % been needed for \pkg{listings} version released before 2024-02-15. So % instead of using any patch hacks, users should update \pkg{listings}. So % emulating the hack does not make sense. Instead the initial value of the % option is changed to implicit \optvalue{false} and switching it on % explicitly does result in a warning. % \begin{macrocode} \cs_new:Nn \@@_switch_listings:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \msg_warning:nnn { scrhack } { deprecated-option } { listings=#1 } } {false} { \msg_info:nnn { scrhack } { deprecated-option } { listings=#1 } } } { \msg_warning:nnn { keys } { boolean-values-only } { listings } } } % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % \subsection{Emulating \file{lscape.hak}} % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% lscape .code = \@@_switch_lscape:n { #1 }, lscape .default:n = true, lscape .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_lscape:n} % \ExplSyntaxOff % This is used to switch the state and add or remove the hook if needed. A new % boolean is used to know, whether the hook has been put. Using % \opt{lscape=true}, if package \pkg{lscapeenhanced} already has been % loaded isn't a foul. So we just write an information to the \file{log}. But % using \opt{lscape=false}, if package \pkg{lscapeenhanced} already has % been loaded may be wrong. So we use a warning message. We also warn if a not % allowed value is used. % \begin{macrocode} \bool_new:N \@@_lscape_bool \cs_new:Nn \@@_switch_lscape:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \@ifpackageloaded { lscapeenhanced } { \msg_info:nnnn { scrhack } { option-too-late } { lscape = true } { lscapeenhanced } } { \bool_if:NF \@@_lscape_bool { \hook_gput_code:nnn { package/lscape/after } { scrhack } { \RequirePackage { lscapeenhanced } } \bool_gset_true:N \@@_lscape_bool } } } {false} { \@ifpackageloaded { lscapeenhanced } { \msg_warning:nnnn { scrhack } { option-too-late } { lscape=false } { lscapeenhanced } } { \bool_if:NT \@@_lscape_bool { \hook_gremove_code:nn { package/lscape/after } { scrhack } } \bool_gset_false:N \@s@_lscape_bool } } } { \msg_warning:nnn { keys } { boolean-values-only } { lscape } } } \SetKeys{lscape=true} % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % \subsection{Emulating \file{nomencl.hak}} % % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% nomencl .code = \@@_switch_nomencl:n { #1 }, nomencl .default:n = true, nomencl .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_nomencl:n} % \ExplSyntaxOff % This is somehow special, because the hack is deprecated. It only has been % needed for \pkg{nomencl} versions released before 2019-01-23. So updating % the package would be the better \emph{hack}. So emulating the hack does not % make sense. Instead the initial value of the option is changed to implicit % \optvalue{false} and switching it on explicitly does result in a warning. % \begin{macrocode} \cs_new:Nn \@@_switch_nomencl:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \msg_warning:nnn { scrhack } { deprecated-option } { nomencl=#1 } } {false} { \msg_info:nnn { scrhack } { deprecated-option } { nomencl=#1 } } } { \msg_warning:nnn { keys } { boolean-values-only } { nomencl } } } % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % % \subsection{Emulating \file{setspace.hak}} % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% setspace .code = \@@_switch_setspace:n { #1 }, setspace .default:n = true, setspace .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_setspace:n} % \ExplSyntaxOff % This is used to switch the state and add or remove the hook if needed. A new % boolean is used to know, whether the hook has been put. Using % \opt{setspace=true}, if package \pkg{setspaceenhanced} already has been loaded % isn't a foul. So we just write an information to the \file{log}. But using % \opt{setspace=false}, if package \pkg{setspaceenhanced} already has been loaded % may be wrong. So we use a warning message. We also warn if a not allowed % value is used. % \begin{macrocode} \bool_new:N \@@_setspace_bool \cs_new:Nn \@@_switch_setspace:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \@ifpackageloaded { setspaceenhanced } { \msg_info:nnnn { scrhack } { option-too-late } { setspace = true } { setspaceenhanced } } { \bool_if:NF \@@_setspace_bool { \hook_gput_code:nnn { package/setspace/after } { scrhack } { \exp_last_unbraced:Ne \RequirePackage { [ \use:c { @raw@opt@setspace.sty }, byselectfont, keepfontsize ] } { setspaceenhanced } } \bool_gset_true:N \@@_setspace_bool } } } {false} { \@ifpackageloaded { setspaceenhanced } { \msg_warning:nnnn { scrhack } { option-too-late } { setspace=false } { setspaceenhanced } } { \bool_if:NT \@@_setspace_bool { \hook_gremove_code:nn { package/setspace/after } { scrhack } } \bool_gset_false:N \@s@_setspace_bool } } } { \msg_warning:nnn { keys } { boolean-values-only } { setspace } } } \SetKeys{setspace=true} % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % \subsection{Emulating \file{standardsectioning.hak}} % First we declare the options using the new key-value interface: % \begin{macrocode} \DeclareKeys{% standardsections .code = \@@_switch_standardsectioning:n { #1 }, standardsections .default:n = true, standardsections .usage = preamble, } % \end{macrocode} % % \ExplSyntaxOn % \begin{macro}{\__scrhack_switch_standardsectioning:n} % \ExplSyntaxOff % This is used to switch the state and add or remove the hook if needed. A new % boolean is used to know, whether the hook has been put. Using % \opt{standardsectioning=true}, if package \pkg{standardsectioning} % already has been loaded isn't a foul. So we just write an information to the % \file{log}. But using \opt{standardsectioning=false}, if package % \pkg{standardsectioning} already has been loaded may be wrong. So % we use a warning message. We also warn if a not allowed value is used. % \begin{macrocode} \bool_new:N \@@_standardsectioning_bool \cs_new:Nn \@@_switch_standardsectioning:n { \str_case_e:nnF { \str_foldcase:n { #1 } } { {true} { \@ifpackageloaded { standardsectioning } { \msg_info:nnnn { scrhack } { option-too-late } { standardsectioning = true } { standardsectioning } } { \bool_if:NF \@@_standardsectioning_bool { \str_set:Nx \l_tmpa_str { \cs_meaning:N \normalsize } \str_if_in:NnTF \l_tmpa_str { \@latex@error } { \hook_gput_code:nnn { class/after } { scrhack } { \RequirePackage { standardsectioning } \exp_args:Nnnx \hook_gput_code:nnn { begindocument/before } { scrhack } { \exp_not:N \cs_gset:Npn \exp_after:wN \exp_not:N \cs:w ver@standardsectioning.sty \cs_end: { \cs:w ver@standardsectioning.sty \cs_end: } } \cs_undefine:c { var@standardsectioning.sty } } \bool_gset_true:N \@@_standardsectioning_bool } { \RequirePackage{ standardsectioning } \bool_gset_false:N \@@_standardsectioning_bool } } } } {false} { \@ifpackageloaded { standardsectioning } { \msg_warning:nnnn { scrhack } { option-too-late } { standardsectioning=false } { standardsectioning } } { \bool_if:NT \@@_standardsectioning_bool { \hook_gremove_code:nn { class/after } { scrhack } } \bool_gset_false:N \@s@_standardsectioning_bool } } } { \msg_warning:nnn { keys } { boolean-values-only } { standardsectioning } } } % \end{macrocode} % \end{macro} % \ExplSyntaxOff % % % % \subsection{Processing the options} % Last but not least, we set the defaults and process the options. % \begin{macrocode} \ExplSyntaxOff \ProcessKeyOptions\relax % \end{macrocode} % % \iffalse % % \fi % % \Finale % \PrintChanges % % \endinput % Local Variables: % mode: doctex % ispell-local-dictionary: "en_US" % eval: (flyspell-mode 1) % TeX-master: t % 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: