% \iffalse meta-comment % ====================================================================== % scrkernel-miscellaneous.dtx % Copyright (c) Markus Kohm, 2002-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. % ====================================================================== %%% From File: $Id: scrkernel-miscellaneous.dtx 4094 2023-12-05 16:17:40Z kohm $ %<init>%%% (run: init) %<option>%%% (run: option) %<execoption>%%% (run: execoption) %<body>%%% (run: body) %<*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-12-05 17:17:40 +0100 (Di, 05 Dez 2023) $ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}} \filerevision$Revision: 4094 $ \edef\reserved@a{% \noexpand\endgroup \noexpand\ProvidesFile{scrkernel-miscellaneous.dtx}% [\filedate\space\filerevision\space KOMA-Script source (miscellaneous, maybe everything or nothing)] }% \reserved@a \documentclass[USenglish]{koma-script-source-doc} \usepackage{babel} \setcounter{StandardModuleDepth}{2} \begin{document} \DocInput{scrkernel-miscellaneous.dtx} \end{document} %</dtx> % \fi % % \changes{v2.95}{2002/07/01}{first version after splitting \file{scrclass.dtx}} % \changes{v3.36}{2022/03/01}{switch over from \cls*{scrdoc} to % \cls*{koma-script-source-doc}} % \changes{v3.36}{2022/03/01}{whole implementation documentation in English} % \changes{v3.40}{2023/04/17}{guide names changed} % % \GetFileInfo{scrkernel-miscellaneous.dtx} % \title{All the Code of % \href{https://komascript.de}{\KOMAScript} not Fitting into another File} % \author{\href{mailto:komascript@gmx.info}{Markus Kohm}} % \date{Revision \fileversion{} of \filedate} % \maketitle % \begin{abstract} % Currently \file{scrkernel-miscellaneous.dtx} is a mess of miscellaneous % code. There is a big, fat \textbf{ToDo} to change this! % \end{abstract} % \tableofcontents % % \section{User Manual} % % You can find the user documentation the commands implemented here in the % \KOMAScript{} manual, either the German \file{scrguide-de.pdf} or the % English \file{scrguide-en.pdf}. % % \MaybeStop{\PrintIndex} % % % \section{Implementation of Special Requirements of Package \pkg*{scrletter}} % % The \pkg*{scrletter} depends on some features of the \KOMAScript{} % classes. However, a special user request was to make it work with the % standard classes too. So we need additional code to detect not using a % \KOMAScript{} class and to make this work. % \begin{description} % \item[ToDo:] Can we move this code into a letter file or use a new file only % used for package \pkg*{scrletter}? % \end{description} % \begin{macrocode} %<*package&letter&init> \scr@ifundefinedorrelax{KOMAClassName}{% \PackageWarningNoLine{scrletter}{% Cannot detect any KOMA-Script class.\MessageBreak Package `scrletter' is an extension to\MessageBreak KOMA-Script classes.\MessageBreak Usage with another class is not recommended% \@ifclassloaded{article}{}{% \@ifclassloaded{report}{}{% \@ifclassloaded{book}{}{% \MessageBreak and can result in several errors% }% }% }% }% \RequirePackage{scrextend}% % \end{macrocode} % % \begin{command}{\setparsizes} % \changes{v3.23}{2017/02/22}{simple fallback definition} % \begin{macro}{\par@updaterelative} % \changes{v3.23}{2017/02/22}{empty fallback definition} % If \pkg*{scrletter} is not used with a \KOMAScript{} class \cs{setparsizes} % would not be available. But it is used in \cs{vb@t@z}, \cs{@addrfield}, % \cs{@datefield}, \cs{@makelettertitle}, \cs{@subjfield}, \cs{opening}, % \cs{closing}. Instead of changing the implementation of all these commands % and macros, we define a very simple version of \cs{setparsizes}. And in case % of using this simple version \cs{par@updaterelative} would become a % do-nothing macro. This does work in case of the commands and macros listed % above. But maybe it does not work in other cases. % \begin{description} % \item[ToDo:] Can we move this code into \file{scrkernel-paragraphs.dtx} or % use a new file only for package \pkg*{scrletter}? % \end{description} % \begin{macrocode} \providecommand*{\setparsizes}[3]{% \setlength{\parindent}{#1}% \setlength{\parskip}{#2}% \setlength{\parfillskip}{#3}% } \providecommand*{\par@updaterelative}{} % \end{macrocode} % \end{macro}^^A \par@updaterelative % \end{command}^^A \setparsizes % \begin{macrocode} }{} %</package&letter&init> % \end{macrocode} % % \begin{macro}{\scr@renewforletter,\@renewforletter,\do@renewforletter@list, % \do@renewforletter} % \changes{v3.20}{2014/04/10}{added} % \changes{v3.25}{2017/11/15}{removed} % \end{macro} % % % \section{Implementation of the Draft Mode} % % The \KOMAScript{} classes provide two draft options, the general one and a % more specific. % \begin{description} % \item[ToDo:] Should we move this to \file{scrkernel-paragraphs.dtx}? % \end{description} % % \begin{option}{draft} % \changes{v2.95}{2002/12/05}{re-implemented using \pkg{keyval}} % \changes{v3.17}{2015/03/12}{using internal value storage} % \changes{v3.25}{2017/11/21}{respect option \opt{overfullrule}} % \changes{v3.12}{2013/03/05}{using \cs{FamilyKeyState}} % \changes{v3.39}{2022/11/11}{initial dot removed from member argument of % option storage commands} % \begin{option}{final} % \changes{v2.95}{2002/12/05}{obsolete} % \changes{v2.97d}{2007/10/03}{\cs{PackageInfo} replaced by % \cs{PackageInfoNoLine}} % \changes{v3.01a}{2008/11/21}{standard instead of obsolete} % \changes{v3.02c}{2008/02/17}{explicit optional argument for \pkg*{scrextend}} % In draft mode classes usually show a rule for overfull boxes. Despite this % is usually already handled by the class, package \pkg*{scrextend} also % provides the option, because of correct setting of the internal value % storage also of option \opt{overfullrule}. % \begin{macrocode} %<*(class|extend)&option> \KOMA@key{draft}[true]{% \KOMA@set@ifkey{draft}{@tempswa}{#1}% \ifx\FamilyKeyState\FamilyKeyStateProcessed \if@tempswa \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{draft}{@tempswa}% \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{overfullrule}{@tempswa}% \setlength{\overfullrule}{5pt}% \else \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{draft}{@tempswa}% \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{overfullrule}{@tempswa}% \setlength{\overfullrule}{\z@}% \fi \fi } %<class>\KOMA@kav@add{\KOMAClassFileName}{draft}{false} %<*package&extend> \KOMA@kav@xadd{scrextend.\scr@pkgextension}{draft}{% \ifdim\overfullrule>\z@ true\else false\fi } %</package&extend> \KOMA@DeclareStandardOption %<package&extend>[scrextend] {final}{draft=false} % \end{macrocode} % \begin{option}{overfullrule} % \changes{v3.25}{2017/11/21}{added} % \changes{v3.39}{2022/11/11}{initial dot removed from member argument of % option storage commands} % Because option \opt{draft} can result in unwanted effects I've added a % new option to explicite only change the overfull rule setting. However for % \textsf{scrextend} and the \KOMAScript{} classes the result is the same. % \begin{macrocode} \KOMA@key{overfullrule}[true]{% \KOMA@set@ifkey{overfullrule}{@tempswa}{#1}% \ifx\FamilyKeyState\FamilyKeyStateProcessed \if@tempswa \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{draft}{@tempswa}% \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{overfullrule}{@tempswa}% \setlength{\overfullrule}{5pt}% \else \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{draft}{@tempswa}% \KOMA@kav@replacebool{% %<class> \KOMAClassFileName %<package&extend> scrextend.\scr@pkgextension }{overfullrule}{@tempswa}% \setlength{\overfullrule}{\z@}% \fi \fi } %<class>\KOMA@kav@add{\KOMAClassFileName}{overfullrule}{false} %<*package&extend> \KOMA@kav@xadd{scrextend.\scr@pkgextension}{overfullrule}{% \ifdim\overfullrule>\z@ true\else false\fi } %</package&extend> %</(class|extend)&option> % \end{macrocode} % \end{option}^^A overfullrule % \end{option}^^A final % \end{option}^^A draft % % % \section{Implementations for the Math Mode} % % \KOMAScript{} does not make something special for the math mode. % \begin{description} % \item[ToDo:] Should we move this to the special treatment of \pkg{amsmath} % in \file{scrkernel-basics.dtx} or move it with the special treatment of % \pkg{amsmath} in \file{scrkernel-basics.dtx} to a new file % \file{scrkernel-math.dtx}? % \end{description} % % \begin{option}{leqno,fleqno} % The \KOMAScript{} classes but \cls*{scrlttr2} do support the standard % class options \opt{leqno} and \opt{fleqn}. % \begin{macrocode} %<*class&!letter&option> \DeclareOption{leqno}{\input{leqno.clo}} \DeclareOption{fleqn}{\input{fleqn.clo}} %</class&!letter&option> % \end{macrocode} % \end{option} % % \begin{counter}{equation} % \changes{v3.37}{2022/08/24}{accidentally removed \cs{@addtoreset} added % again} % \begin{command}{\theequation} % \changes{v2.97e}{2007/11/23}{chapter numbers only in main matter} % \changes{v3.27}{2022/03/01}{\cs{relax} replaced by percent because of % \pkg*{hyperref}} % The \KOMAScript{} classes \cls*{scrbook} and \cls*{scrreprt} have a special % treatment for equation numbers. For \cls*{scrreprt} the number just depends % on the chapter number. But for \cls*{scrbook} it also depends on the active % matter. % \begin{description} % \item[ToDo:] With \cs{counterwidth} instead of \cs{@addtoreset} the % \cls*{scrreprt} code could be very simple. But currently we still support % old \LaTeX{} kernels without \cs{counterwithin}. % \item[ToDo:] Should we also add a definition for \cls*{scrartcl} as done for % \cls*{article}, though the same definition is already the default of the % \LaTeX{} kernel? % \end{description} % \begin{macrocode} %<*(book|report)&body> \@addtoreset{equation}{chapter} \renewcommand*{\theequation}{% %<*book> %<!v4> \expandafter\ifnum\scr@v@is@gt{2.97d}% \if@mainmatter\thechapter.\fi %<!v4> \else %</book> %<!v4> \thechapter.% %<book&!v4> \fi \@arabic\c@equation } %</(book|report)&body> % \end{macrocode} % \end{command}^^A \theequation % \end{counter}^^A equation % % % \section{Implementation of the Execution and Processing of Options} % % After the definition of all options, some defaults have to be executed and % all options have to be processed. % \begin{description} % \item[ToDo:] Can we move the execution of default to the files, where the % corresponding options are defined? % \item[ToDo:] Can we move the processing of options to % \file{scrkernel-basics.dtx} where the command itself is defined? % \end{description} % % \changes{v2.97c}{2007/04/19}{using \cs{KOMAExecuteOptions} instead of % \cs{KOMAoptions} and \cs{KOMAProcessOptions} instead of % \cs{ProcessOptions}} % \changes{v2.97c}{2007/04/19}{options that are implicit defaults are not set % explicitly} % \changes{v2.97c}{2007/07/18}{removed \opt{twoside} from the default} % \changes{v2.98c}{2008/03/10}{\opt{headings\quotechar=big} added to the % default} % \changes{v3.11c}{2013/03/04}{\opt{headings\quotechar=big} not with % \cls*{scrlttr2}} % \begin{macrocode} %<*execoption> %<*class> \KOMAExecuteOptions{% parskip=false,% %<!letter> headings=big% } %</class> \KOMAProcessOptions\relax %</execoption> % \end{macrocode} % % % \section{Implementation of Temporary Switch to Single Column Mode} % % Sometimes we need to temporary switch to single column mode, e.g., to print % a table of contents or similar. This is not needed for \cls*{scrlttr2} or % \pkg*{scrletter}. % \begin{description} % \item[ToDo:] Should we move this to \file{scrkernel-paragraphs.dtx} or % another file? Currently it is used in \file{scrkernel-index.dtx}, % \file{scrkernel-notepaper.dtx}, and \file{scrkernel-title.dtx} (and also % in \file{scrhack.dtx}, which also defines it of needed). % \end{description} % % \begin{macro}{\@restonecolfalse,\@restonecoltrue,\if@restonecol} % We need a local switch to be able to restore two column mode after locally % switching to one column mode (or visa versa). For \pkg*{scrextend} this is a % little bit complicated, because the switch could already exist in the used % class. % \begin{macrocode} %<*!letter&body> %<*!extend> \newif\if@restonecol %</!extend> %<*extend> \scr@ifundefinedorrelax{if@restonecol}{% \expandafter\newif\csname if@restonecol\endcsname \@restonecolfalse }{} %</extend> %</!letter&body> % \end{macrocode} % \end{macro} % % \section{Implementation of the Dictum} % % Printing a \emph{dictum} is also not supported by letters. % \begin{description} % \item[ToDo:] Should we move this to \file{scrkernel-sections.dtx} or to a % new file? % \end{description} % % \begin{command}{\dictum} % \changes{v2.8q}{2001/20/04}{added} % \changes{v2.9l}{2003/01/28}{\cs{edef} replaced by \cs{def} ersetzt} % \changes{v2.9q}{2004/04/19}{group added} % \begin{command}{\dictumwidth, % \raggeddictum,\raggeddictumtext,\raggeddictumauthor} % \changes{v2.8q}{2001/20/04}{added} % \begin{fontelement}{dictum} % \changes{v2.8q}{2001/20/04}{added} % \changes{v3.20}{2016/01/29}{\cs{sffamily} replaced by \cs{@gr@gsffamily}} % \changes{v3.39}{2023/04/04}{\cs{@gr@gsfamily} replaced by \cs{maybesffamily}} % \begin{fontelement}{dictumtext,dictumauthor} % \changes{v2.8q}{2001/20/04}{added} % \begin{command}{\dictumauthorformat} % \changes{v2.8q}{2001/20/04}{added} % \begin{command}{\dictumrule} % \changes{v3.10}{2011/09/02}{added} % The \emph{dictum} consist of a text, the dictum, and an optional % author. Text and author are separated by a horizontal rule. % \begin{macrocode} %<*!letter&body> \newcommand{\dictum}[2][]{\par% \begingroup \raggeddictum\parbox{\dictumwidth}{% {\@dictumfont{\raggeddictumtext #2\strut\par}% \def\@tempa{#1}\ifx\@tempa\@empty\else% {\raggeddictumtext\dictumrule}% \raggeddictumauthor\@dictumauthorfont\dictumauthorformat{#1}% \strut\par% \fi% }% }\par% \endgroup } \newcommand*{\dictumrule}{\vskip-1ex\hrulefill\par}% \newcommand*{\dictumwidth}{.3333\textwidth} \newcommand*{\raggeddictum}{\raggedleft} \newcommand*{\dictumauthorformat}[1]{(#1)} \newcommand*{\raggeddictumtext}{\raggedright} \newcommand*{\raggeddictumauthor}{\raggedleft} \newkomafont{dictum}{\normalfont\normalcolor\maybesffamily\small} \newkomafont{dictumauthor}{\itshape} \aliaskomafont{dictumtext}{dictum} %</!letter&body> % \end{macrocode} % \end{command}^^A \dictumrule % \end{command}^^A \dictumauthorformat % \end{fontelement}^^A dictumtext,dictumauthor % \end{fontelement}^^A dictum % \end{command}^^A \dictumwidth,\raggeddictum…\raggeddictumauthor % \end{command}^^A \dictum % % % \section{Setting Default Lengths of \env{minipage} and Frames} % % \begin{description} % \item[ToDo:] Should we move the default for \len{@mpfootins} to % \file{scrkernel-footnotes.dtx}? % \item[ToDo:] Do we really need to set initial values to \len{fboxsep} and % \len{fboxrule}? The same defaults using |pt| instead of \cs{p@} are already % used in the \LaTeX{} kernel. Wouldn't that be enough? % \end{description} % % \begin{length}{@mpfootins} % \begin{length}{fboxsep,fboxrule} % We are using the same settings like the standard classes. % \begin{macrocode} %<*class&body> \setlength{\skip\@mpfootins}{\skip\footins} \setlength\fboxsep{3\p@} \setlength\fboxrule{.4\p@} %</class&body> % \end{macrocode} % \end{length} % \end{length} % % % \section{Implementation of Detection of Odd and Even Pages} % % \begin{description} % \item[ToDo:] Should this code moved to \file{scrkernel-basics.dtx} or to a % new one? % \end{description} % % \begin{command}{\ifthispageodd,\Ifthispageodd} % \changes{v2.8q}{2001/11/22}{added} % \changes{v3.28}{2019/11/19}{\cs{ifthispageodd} renamed to \cs{Ifthispageodd}} % Users often use |\ifodd\value{page}| to test, whether the current page is % odd or even. But this is dramatically wrong, because of the asynchronous % output of \TeX. So here we define a command % \begin{quote} % \Ifthispageodd\marg{then code}\marg{else code} % \end{quote} % that internally uses a label-like mechanism to do the decision. We do not % really use \cs{label} and \cs{pageref}, because this would not work with % Roman or alphabetic page numbers. So we use a direct write to the \file{aux} % file instead. % % \begin{macro}{\new@tpo@label} % \changes{v2.8q}{2001/11/22}{added} % \changes{v2.95b}{2006/07/28}{using \cs{@newl@bel}} % \changes{v3.20}{2016/03/25}{use after definition in the \file{aux}-file} % Definition of a new \textbf{t}rue-\textbf{p}age-\textbf{o}dd label. To be % used in the \file{aux} file. A fallback definition is also added to the % \file{aux} file, so there wouldn't be an error, e.g., after removing package % \pkg*{scrextend} from a document. % \begin{macrocode} %<*(class|extend)&body> \newcommand*{\new@tpo@label}{\@newl@bel{tpo}} \AtBeginDocument{% \if@filesw \immediate\write\@auxout{% \string\providecommand*\string\new@tpo@label[2]{}% }% \fi } % \end{macrocode} % \end{macro}^^A \new@tpo@label % % \begin{macro}{\scr@tpo} % \changes{v2.8q}{2001/11/22}{added} % We need a kind of counter with the actual usage number of % \cs{Ifthispageodd}. % \begin{macrocode} \newcommand*{\scr@tpo}{0} % \end{macrocode} % \end{macro}^^A \scr@tpo % % \begin{macro}{\is@thispageodd} % \changes{v2.8q}{2001/11/22}{added} % \changes{v2.9l}{2003/01/28}{renamed \cs{if@thispageodd}} % \changes{v2.95b}{2006/07/28}{using \cs{@newl@bel}} % \changes{v3.17}{2015/03/23}{split into two macros} % \begin{macro}{\is@thispageodd@setlabel} % \changes{v3.17}{2015/03/23}{added} % \changes{v3.20}{2016/03/25}{write to \file{aux} file only \cs{if@filesw}} % \changes{v3.23}{2017/02/23}{empty macro after usage} % \changes{v3.42}{2023/12/05}{using \cs{number} instead of \cs{arabic} to fix % \href{https://sourceforge.net/p/koma-script/tickets/58/}{issue 58}} % The main workers of \cs{Ifthispageodd}. It is used to set % \cs{ifthispagewasodd} depending on the information it adds to the \file{aux} % file. % \begin{description} % \item[ToDo:] Why do we use an optional argument here? Are there any % circumstances, when the optional argument is not the default % \cs{is@thispageodd@setlabel}? % \item[ToDo:] From \LaTeX~2023-11-01 use the page property instead of % \cs{new@tpo@label}. % \end{description} % \begin{macrocode} \newcommand*{\is@thispageodd}[1][\is@thispageodd@setlabel]{% \@bsphack \begingroup \@tempcnta=\scr@tpo \advance\@tempcnta by\@ne \xdef\scr@tpo{\the\@tempcnta}% \expandafter\ifx\csname tpo@\scr@tpo\endcsname\relax \protect\G@refundefinedtrue %<!extend> \ClassWarning{\KOMAClassName}{% %<extend> \PackageWarning{scrextend}{% odd/even page label number \scr@tpo\space undefined}% \edef\@tempa{\the\value{page}}% \else \edef\@tempa{\csname tpo@\scr@tpo\endcsname}% \fi \ifodd\number\@tempa \aftergroup\thispagewasoddtrue \else \aftergroup\thispagewasoddfalse \fi \endgroup \edef\is@thispageodd@setlabel{% \if@filesw \unexpanded{\protected@write\@auxout{\let\number\relax}}{% \noexpand\string \noexpand\new@tpo@label{\scr@tpo}{\noexpand\number\c@page}}% \fi \noexpand\def\noexpand\is@thispageodd@setlabel {\unexpanded\expandafter{\is@thispageodd@setlabel}}% }% #1% \@esphack } \newcommand*{\is@thispageodd@setlabel}{} % \end{macrocode} % \end{macro}^^A \is@thispageodd@setlabel % \end{macro}^^A \is@thispageodd % % \begin{command}{\thispagewasoddfalse,\thispagewasoddtrue,\ifthispagewasodd} % \changes{v2.9l}{2003/01/20}{added} % Rolf Niepraschks asked for the possibility to check for the last decision, % e.g., inside the \meta{then code} or \meta{else code}. So the definition of % \cs{Ifthispageodd} has been changed not only to set such a switch, but also % use it. % \begin{macrocode} \newif\ifthispagewasodd % \end{macrocode} % \end{command} % % With all these macros the user command is very easy. % \changes{v3.31}{2020/04/27}{fixed class and package name in the warning} % \changes{v3.32}{2020/08/06}{\cs{KOMAClassName} fixed} % \begin{macrocode} \providecommand*{\ifthispageodd}{% %<class> \ClassWarning{\KOMAClassName}{% %<extend> \PackageWarning{scrextend}{% Usage of deprecated command `\string\ifthispageodd'.\MessageBreak The command has been renamed because of a\MessageBreak recommendation of The LaTeX Project Team.\MessageBreak Please replace `\string\ifthispageodd' by `\string\Ifthispageodd'% }% \Ifthispageodd } \newcommand{\Ifthispageodd}{% \is@thispageodd \ifthispagewasodd \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } %</(class|extend)&body> % \end{macrocode} % \end{command}^^A \ifthispageodd,\Ifthispageodd % % % \section{Implementation of Notes to the Margin} % % \begin{description} % \item[ToDo:] This has been moved newly to % \file{scrkernel-miscellaneous.dtx}, but maybe we can find another suitable % file? % \end{description} % % \begin{command}{\marginline} % \changes{v2.4l}{1997/02/06}{using the optional argument of \cs{marginpar}} % \changes{v2.8q}{2001/11/27}{missing brace added} % \changes{v3.36}{2022/02/22}{moved from \file{scrkernel-floats.dtx} to % \file{scrkernel-miscellaneaous.dtx}} % \changes{v3.39}{2022/12/21}{braces fixed} % A very often wanted margin note feature is, to print all such notes in the % left margin ragged-left and all such notes in the right margin % ragged-right. So this is a simple shortcut for \cs{marginpar} with using % almost the same argument twice. % \begin{macrocode} %<*(class|extend)&body> \newcommand\marginline[1]{% \marginpar[{\raggedleft #1}]{\raggedright #1}% } %</(class|extend)&body> % \end{macrocode} % \end{command} % % % \section{Implementation of Subscripts} % % \begin{command}{\textsubscript} % \changes{v2.8h}{2001/07/19}{added} % \changes{v3.25}{2017/11/15}{define only if un-defined because of \LaTeX{} % kernel change} % \begin{macro}{\@textsubscript} % \changes{v2.8h}{2001/07/19}{added} % \changes{v3.10}{2011/09/05}{\cs{providecommand} instead of \cs{newcommand} % because of \pkg{fixltx2e}} % The \LaTeX{} kernel has \cs{textsuperscript}. But for several years % \cs{textsubscript} was missing. For such old \LaTeX{} kernels, we define it % similar to \cs{textsuperscript}. % \begin{macrocode} %<*(class|extend)&body> \scr@ifundefinedorrelax{textsubscript}{% \DeclareRobustCommand*\textsubscript[1]{% \@textsubscript{\selectfont#1}% }% }{% \scr@ifundefinedorrelax{textsubscript }{% \DeclareRobustCommand*\textsubscript[1]{% \@textsubscript{\selectfont#1}% }% }{}% } \providecommand*{\@textsubscript}[1]{% {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}% } %</(class|extend)&body> % \end{macrocode} % \end{macro} % \end{command}^^A \textsubscript % % % \section{Implementation of an Invisible Strut} % \label{sec:strut} % % \begin{description} % \item[ToDo:] Maybe \file{scrkernel-basics.dtx} would be a good place for % this and maybe is should become a user command and be used at several % places, currently \cs{strut} is used. % \end{description} % % \begin{macro}{\scr@endstrut} % \changes{v3.25}{2017/11/15}{added} % If we simply add \cs{strut} to the end of material which is assumed to be % horizontal, white spaces at the end of such material could become relevant, % even if the would not without the \cs{strut}. We can avoid this by adding % \cs{unskip} before the \cs{strut}. But in this case, the last work before % the \cs{strut} will not be hyphenated any more. If we are really in % horizontal mode, we can use \cs{nobreak} before the \cs{strut} you once % again allow hyphenation. % \begin{description} % \item[ToDo:] Should the \cs{unskip} also be moved behind \cs{ifhmode}? % \end{description} % \begin{macrocode} %<*(class|letter|extend)&body> \providecommand*{\scr@endstrut}{\unskip\ifhmode\nobreak\strut\fi} %</(class|letter|extend)&body> % \end{macrocode} % \end{macro} % % % \section{Warnings for Using Incompatible Packages} % \label{sec:packagewarning} % % \begin{description} % \item[ToDo:] This should be moved to a new file. % \end{description} % % \changes{v3.12}{2013/07/08}{warnings about several incompatible packages % added} % % \begin{macro}{\scr@package@not@recommended} % \changes{v3.12}{2013/07/08}{added} % \begin{macro}{\class@shoulddisablepackagewarning@list} % \changes{v3.24}{2017/06/25}{added} % \changes{v3.42}{2023/07/26}{indirect warnings can be redefined after loading % the class} % Loading of several incompatible packages should result in warnings using: % \begin{quote} % \cs{scr@package@not@recommended}\marg{package}\marg{alternatives} % \end{quote} % Usually the warning contains information about \meta{alternatives}, but this % argument can also be empty. Authors of classes can deactivate the warning, % by adding a \meta{package} to the comma separated list % \cs{class@shoulddisablepackagewarning@list}. This has to be done, before % loading the \KOMAScript{} class. However doing so is not recommended and the % class author is responsible for the drawbacks. Similar the indirect warning % messages \cs{scr@class@\meta{package}@warning} could be redefined after % loading the class, but this is also not recommended. % \begin{macrocode} %<*class&body> \newcommand*{\scr@package@not@recommended}[2]{% \scr@ifundefinedorrelax{class@shoulddisablepackagewarning@list}{% \@firstofone }{% \edef\reserved@a{% \noexpand\in@{#1}{\class@shoulddisablepackagewarning@list}}% \reserved@a \ifin@\expandafter\@gobble\else\expandafter\@firstofone\fi }{% \expandafter\providecommand\csname scr@class@#1@warning\endcsname{% \ClassWarning{\KOMAClassName}{% Usage of package `#1' together\MessageBreak with a KOMA-Script class is not recommended.\MessageBreak \if\relax\detokenize{#2}\relax\else I'd suggest to use #2.\MessageBreak \fi Nevertheless, using requested\MessageBreak package `#1'% }% }% \BeforePackage{#1}{% \csname scr@class@#1@warning\endcsname }% }% }% % \end{macrocode} % \end{macro}^^A \class@shoulddisablepackagewarning@list % Here are the not recommended packages and the alternatives: % \begin{description} % \item[\pkg{emptypage}:] is not needed, because there are corresponding % options and features in \KOMAScript. % \begin{macrocode} \scr@package@not@recommended{emptypage}{% option\MessageBreak `cleardoublepage' with one of it's\MessageBreak several values} % \end{macrocode} % \item[\pkg{fancyhdr}:] does not respect font settings of \KOMAScript{} and % also breaks some other features. % \changes{v3.24}{2017/06/25}{improved \pkg{fancyhdr} warning} % \begin{macrocode} \scr@package@not@recommended{fancyhdr}{% \MessageBreak package `scrlayer' or `scrlayer-scrpage', because\MessageBreak they support KOMA-Script classes.\MessageBreak With `fancyhdr' several features of class `\KOMAClassName'\MessageBreak like options `headsepline', `footsepline' or command\MessageBreak `\string\MakeMarkcase' and the commands `\string\setkomafont' and\MessageBreak `\string\addtokomafont' for the page style elements need\MessageBreak explicite user intervention to work} % \end{macrocode} % \item[\pkg{minitoc}:] % \changes{v3.23}{2017/02/04}{\pkg{minitoc} is not recommended} % re-defines, e.g., \cs{@sect} and therefore breaks all the extensions of % \KOMAScript{} to this command. Currently not all impacts of the package has % been explored. Currently there is only a workaround for the \cs{@sect} % issue. See \autoref{sec:packageworkarounds} for more information. % \begin{macrocode} %<*!letter> \scr@package@not@recommended{minitoc}{} %</!letter> % \end{macrocode} % \item[\pkg{multitoc}:] % \changes{v3.26}{2018/07/18}{\pkg{multitoc} not recommended} % At least up to version 2.01 this breaks all additional lists/tables of % contents, because the \cs{@starttoc} redefinition does not allow to use % another extension but \file{toc}, \file{lof}, or \file{lot}. The package is % also not needed, because the \env{multicols} environment can simply be added % using \cs{BeforeStartingTOC} and \cs{AfterStartingTOC}. % \begin{macrocode} %<*!letter> \scr@package@not@recommended{multitoc}{% package `multicol' and, e.g.:\MessageBreak \space\space \string\BeforeStartingTOC{\string\begin{multicols}{2}}\MessageBreak \space\space \string\AfterStartingTOC{\string\end{multicols}}\MessageBreak to make all ToCs two-columned.\MessageBreak \@ifpackagelater{2018/07/18}{}{% Note, package `multitoc' breaks additional\MessageBreak ToCs generated by `\string\DeclareNewTOC' or\MessageBreak packages like `listings' or `newcaption' and\MessageBreak even the standard table of contents,\MessageBreak list of figures or list of tables,\MessageBreak if you omit the corresponding options `toc',\MessageBreak `lof' or `lot'.% }% } %</!letter> % \end{macrocode} % \item[\pkg{parskip}:] is an emergency fallback package for classes, that % do not support paragraph skips themselves. % \begin{macrocode} \scr@package@not@recommended{parskip}{% option\MessageBreak `parskip' with one of it's several values} % \end{macrocode} % \item[\pkg{titleps}:] % \changes{v3.16}{2015/01/21}{\pkg{titleps} not recommended} % does not respect several font settings and other features of the % \KOMAScript{} classes. % \begin{macrocode} \scr@package@not@recommended{titleps}{% package `scrlayer-scrpage'} % \end{macrocode} % \item[\pkg{titlesec}:] % \changes{v3.36}{2022/03/01}{bring back \pkg{titlesec} warning} % breaks several \KOMAScript{} features and needs a lot % of workarounds to not result in errors. Note, these workarounds have been % removed from \KOMAScript{}, because they are very fragile and use internal % macros of \pkg{titlesec}. % \begin{macrocode} %<*!letter> \scr@package@not@recommended{titlesec}{% KOMA-Script features\MessageBreak like \string\setkomafont, \string\RedeclareSectionCommand, \string\sectionlinesformat\MessageBreak and several others to re-configure section\MessageBreak headings} %</!letter> % \end{macrocode} % \item[\pkg{sectsty}:] % \changes{v3.27}{2019/07/24}{\pkg{sectsty} up to v2.0.2 is incompatible} % uses up to version 2.0.2 internal commands of % \KOMAScript{}, that has been removed already 2001 in \KOMAScript{} 2.8e. So % it was never compatible with \KOMAScript~3. % \begin{macrocode} %<*!letter> \AfterPackage*{sectsty}{% \@ifpackagelater{sectsty}{2002/02/26}{% \ClassInfo{\KOMAClassName}{Unknown `sectsty' release.\MessageBreak Cross your fingers, that is compatible% }% }{% \ClassWarning{\KOMAClassName}{% Incompatible package `sectsty' loaded!\MessageBreak Package `sectsty' up to version 2.0.2 is incompatible\MessageBreak with KOMA-Script from version 2.8e released in 2001.\MessageBreak You should avoid that package and configure the\MessageBreak section titles of your document using the KOMA-Script\MessageBreak user interface, e.g., \string\chapterlinesformat,\MessageBreak \string\RedeclareSectionCommand\space etc. or you should ask\MessageBreak the `sectsty' maintainer for a more compatible release.\MessageBreak Ignoring this warning could result in several error\MessageBreak messages and formatting issues after loading package\MessageBreak `sectsty'% }% }% } %</!letter> % \end{macrocode} % \item[\pkg{tocbibind}:] % \changes{v3.25}{2017/11/21}{Usage of \pkg{tocbibind} not recommended} % \pkg{tocbibind} does several things, that break \KOMAScript, i.e.: % \begin{itemize} % \item usage of \cs{MakeUppercase} within running heads, % \item usage of hard codes \texttt{toc} for the ToC entries, % \item hard redefinition of \env{thebibliography}, % \item hard redefinition of \env{theindex}, % \item hard redefinition of \cs{tableofcontents}, % \item hard redefinition of \cs{listoftables}, % \item hard redefinition of \cs{listoffigures}, % \item hard redefinition of \cs{@makechapterhead} % \end{itemize} % \begin{macrocode} %<*!letter> \scr@package@not@recommended{tocbibind}{% options like `listof=totoc'\MessageBreak or `bibliography=totoc', or commands like\MessageBreak `\string\setuptoc{toc}{totoc}' instead of this package,\MessageBreak because it breaks several KOMA-Script features of\MessageBreak the list of figures, list of tables, bibliography,\MessageBreak index and the running head% } %</!letter> % \end{macrocode} % \item[\pkg{tocloft}:] % \changes{v3.26}{2018/07/18}{Usage of \textsf{tocloft} not recommended} % redefines \cs{tableofcontents}, \cs{listoffigures}, % \cs{listoftables}, \cs{l@part} \dots{} \cs{l@subparagraph} and breaks % \KOMAScript, i.e.: % \begin{itemize} % \item commands \cs{BeforeTOCHead}, \cs{AfterTOCHead}, % \cs{BeforeStartingTOC}, \cs{AfterStartingTOC}, % \item almost all TOC features, % \item options \opt{listof=totoc}, \opt{listof=numbered}, % \item option \opt{listof=flat}, % \item option \opt{listof=entryprefix}, % \item all options of \cs{DeclareTOCEntryStyle}, % \end{itemize} % \begin{macrocode} %<*!letter> \scr@package@not@recommended{tocloft}{% options like `listof=entryprefix',\MessageBreak commands like `\string\listoflofentryname' or\MessageBreak `\string\listoflotentryname', and `\string\DeclareTOCStyleEntry' or\MessageBreak `\string\RedeclareSectionCommand' instead of this package,\MessageBreak because it breaks several KOMA-Script features of\MessageBreak the list of figures, list of tables and table of\MessageBreak contents, i.e., options like `listof=numbered',\MessageBreak `listof=flat or `toc=flat', commands like\MessageBreak `\string\BeforeTOCHead{...}' and `\string\AfterTOCHead{...}',\MessageBreak `\string\BeforeStartingTOC{...}' and \string\AfterStartingTOC{...}',\MessageBreak all features of `\string\DeclareTOCStyleEntry',\MessageBreak and the ToC entry features of `\string\DeclareSecionCommand'\MessageBreak and `\string\RedeclareSectionCommand' of levels\MessageBreak `part', %<article> `chapter', `section', `subsection',\MessageBreak `subsubsection', `paragraph' and `subparagraph'% } %</!letter> %</class&body> % \end{macrocode} % \end{description} % \end{macro}^^A \scr@package@not@recommended % % \section{Workarounds for Incompatible Packages} % \label{sec:packageworkarounds} % % \begin{description} % \item[ToDo:] The code should be moved to the same file as the code of % \autoref{sec:packagewarning} or maybe even to \pkg{scrhack}. % \end{description} % % For some packages can be made compatible, patching some internal macros of % these packages: % \begin{description} % \item[\pkg{minitoc}:] % \changes{v3.23}{2017/02/04}{\pkg{minitoc} is incompatible} % has some serious issues. The first issue is the hard re-definition of % \cs{@sect} without respecting the changes the \KOMAScript{} classes % already made. Here I'll try a ugly workaround for this, but is can % break. So not using the package with a \KOMAScript{} class would be the % better choice. % \begin{macrocode} %<*class&body> %<*!letter> \BeforePackage{minitoc}{% \let\scr@mt@saved@sect\@sect } \AfterPackage{minitoc}{% \def\@tempa#1#2#3#4#5#6[#7]#8{% \ifnum #2<1 \relax \addtocontents{toc}{\protect\sectbegin} \fi \stc@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}% }% \ifx\@sect\@tempa % \end{macrocode} % Note: There are several bugs in this definition (e.g. missing % \cs{expandafter} and spurious spaced). Nevertheless its the original one % from \pkg{minitoc} 61 and 62 and so I have to use it. % \begin{macrocode} \def\@tempa#1#2#3#4#5#6[#7]#8{ \expandafter \ifx\csname #1\endcsname\section\relax \addcontentsline{lof}{xsect}{#7}% \addcontentsline{lot}{xsect}{#7}% \fi \ifx\csname #1\endcsname\starsection\relax \addcontentsline{lof}{xsect}{#7}% \addcontentsline{lot}{xsect}{#7}% \fi \ifnum #2>\c@secnumdepth\relax \let\@svsec\@empty \else \refstepcounter{#1}% \edef\@svsec{\csname the#1\endcsname\hskip 1em}% \fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}% {\interlinepenalty \@M #8\par}% \endgroup \csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth\relax \else \protect\numberline{\csname the#1\endcsname}% \fi #7% }% \else \def\@svsechd{#6\hskip #3\relax \@svsec #8\csname #1mark\endcsname{#7}% \addcontentsline{toc}{#1}{% \ifnum #2>\c@secnumdepth\relax \else \protect\numberline{\csname the#1\endcsname} \fi #7}% }% \fi \@xsect{#5}% }% \ifx\stc@sect\@tempa \ClassWarning{\KOMAClassName}{% Redefining minitoc's internal command `\string\stc@sect'\MessageBreak to prevent minitoc to destroy several features\MessageBreak of KOMA-Script% }% \let\stc@sect\scr@mt@saved@sect \else \ClassInfo{\KOMAClassName}{% Deactivating the `minitoc' workaround,\MessageBreak because of unexpected definition of\MessageBreak `\string\stc@sect'% }% \let\scr@mt@saved@sect\relax \fi \else \ifx\@sect\scr@mt@saved@sect \ClassInfo{\KOMAClassName}{% Deactivating the `minitoc' workaround for `\string\@sect',\MessageBreak because it is not needed% }% \else \ClassInfo{\KOMAClassName}{% Deactivating the `minitoc' workaround,\MessageBreak because of unexpected definition of\MessageBreak `\string\@sect'% }% \fi \let\scr@mt@saved@sect\relax \fi } %</!letter> %</class&body> % \end{macrocode} % \item[\pkg{titlesec}:] % \changes{v3.13a}{2014/10/09}{\pkg{titlesec} is hardly incompatible} % \changes{v3.27}{2019/07/23}{\pkg{titlesec} does not support % KOMA-Script classes}% % After several years \textsf{titlesec} still does not really support % \KOMAScript{} classes and \KOMAScript{} would still need an ugly hack % using internal \texttt{titlesec} macros and deactivating several features % of \KOMAScript{} to make the package work. So IMO the better solution is % to remove such hacks from the \KOMAScript{} classes. Maybe the % \pkg{titlesec} author will support the \KOMAScript{} classes in some % future, maybe not. If you really need to \pkg{titlesec} with a % \KOMAScript{} class, see the ugly \texttt{standardsection} hack in % \pkg*{scrhack}. % \end{description} % % % \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: