summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/koma-script/tocbasic.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/koma-script/tocbasic.dtx')
-rw-r--r--macros/latex/contrib/koma-script/tocbasic.dtx2003
1 files changed, 2003 insertions, 0 deletions
diff --git a/macros/latex/contrib/koma-script/tocbasic.dtx b/macros/latex/contrib/koma-script/tocbasic.dtx
new file mode 100644
index 0000000000..1f93df3d81
--- /dev/null
+++ b/macros/latex/contrib/koma-script/tocbasic.dtx
@@ -0,0 +1,2003 @@
+% \iffalse meta-comment
+% ======================================================================
+% tocbasic.dtx
+% Copyright (c) Markus Kohm, 2008-2022
+%
+% 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: tocbasic.dtx 3874 2022-06-05 10:38:02Z kohm $
+%<identify>%%% (run: identify)
+%<prepare>%%% (run: prepare)
+%<option>%%% (run: option)
+%<execoption>%%% (run: execoption)
+%<body>%%% (run: body)
+%<exit>%%% (run: exit)
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2022-06-05 12:38:02 +0200 (So, 05. Jun 2022) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
+ \filerevision$Revision: 3874 $
+\endgroup
+\ProvidesFile{tocbasic.dtx}[\filedate\space\filerevision\space
+%</dtx>
+%<package&identify>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+%<package&identify>\ProvidesPackage{tocbasic}[%
+%<*dtx|(package&identify)>
+%!KOMAScriptVersion
+ package
+%<*dtx>
+ source
+%</dtx>
+%</dtx|(package&identify)>
+%<package&identify> (handling toc-files)%
+%<*dtx>
+ (dtx)%
+%</dtx>
+%<*dtx|(package&identify)>
+]
+%</dtx|(package&identify)>
+%<*dtx>
+\ifx\documentclass\undefined
+ \input scrdocstrip.tex
+ \@@input scrkernel-version.dtx
+ \@@input scrstrip.inc
+ \KOMAdefVariable{COPYRIGHTFROM}{2008}
+ \generate{\usepreamble\defaultpreamble
+ \file{tocbasic.sty}{%
+ \from{tocbasic.dtx}{package,identify}%
+ \from{tocbasic.dtx}{package,prepare}%
+ \from{scrkernel-tocstyle.dtx}{package,prepare}%
+ \from{tocbasic.dtx}{package,option}%
+ \from{scrkernel-tocstyle.dtx}{package,option}%
+ \from{tocbasic.dtx}{package,body}%
+ \from{scrkernel-tocstyle.dtx}{package,body}%
+ \from{scrkernel-tocstyle.dtx}{package,style,gobble}%
+ \from{scrkernel-tocstyle.dtx}{package,style,dottedtocline}%
+ \from{scrkernel-tocstyle.dtx}{package,style,undottedtocline}%
+ \from{scrkernel-tocstyle.dtx}{package,style,largetocline}%
+ \from{scrkernel-tocstyle.dtx}{package,style,tocline}%
+ \from{scrkernel-tocstyle.dtx}{package,style,toctext}%
+ \from{scrkernel-tocstyle.dtx}{package,style,default}%
+ \from{tocbasic.dtx}{package,exit}%
+ \from{scrlogo.dtx}{logo}%
+ }%
+ }%
+ \@@input scrstrop.inc
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+\documentclass[USenglish]{koma-script-source-doc}
+\usepackage{babel}
+\setcounter{StandardModuleDepth}{2}
+\begin{document}
+\DocInput{tocbasic.dtx}
+\end{document}
+%</dtx>
+% \fi
+%
+% \changes{v3.36}{2022/02/10}{switch over from \cls*{scrdoc} to
+% \cls*{koma-script-source-doc}}
+% \changes{v3.36}{2022/02/10}{require package \pkg*{scrlogo} instead of
+% defining \cs{KOMAScript}}
+%
+% \GetFileInfo{tocbasic.dtx}
+% \title{Handling of Tables and Lists of Contents with
+% \href{https://komascript.de}{\KOMAScript} Package \pkg*{tocbasic}}
+% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}}
+% \date{Revision \fileversion{} of \filedate}
+% \maketitle
+% \begin{abstract}
+% The main purpose of package \pkg*{tocbasic} is to provide features for
+% authors of classes and packages to create own tables or lists of contents
+% like the list of figures and the list of tables and thereby allow other
+% classes or packages some types of control over these. For examples package
+% \pkg*{tocbasic} delegates language control of all these tables and lists
+% of contents to package \pkg{babel}. So automatic change of language
+% will be provided inside all these tables and lists of contents. Using
+% \pkg*{tocbasic} will exculpate authors of classes and packages from
+% implementation of such features.
+%
+% \KOMAScript{} classes use \pkg*{tocbasic} not only for the table of
+% contents but also for the already mentioned lists of figures and tables.
+% \end{abstract}
+% \tableofcontents
+%
+% \section{User Manual}
+%
+% You can find the user manuals of \pkg*{tocbasic} in the \KOMAScript{}
+% manual, either the German \file{scrguide} or the English \file{scrguien}.
+%
+% \MaybeStop{\PrintIndex}
+%
+%
+% \section{Implementation}
+% \label{sec:implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% All macros with prefix \cs{tb@} or \cs{@} are internal macros and should not
+% be used by package and class authors. Macros with prefix \cs{tocbasic@} are
+% internal macros, that may be used by class and packages authors. Macros
+% without \texttt{@} are interface commands and may be used by class and
+% package authors and users.
+%
+% Note: Parts of the implementation of package \pkg*{tocbasic} are
+% out-sourced into file \file{scrkernel-tocbasic.dtx}.
+%
+%
+% \subsection{Options}
+% \label{sec:options}
+%
+% There are no options because the package should be used by class and package
+% authors not by users. So the package will be loaded using
+% \cs{RequirePackage}. Using different options by different packages would
+% result in an option clash. Nevertheless, the not existing options are
+% processed.
+% \begin{macrocode}
+%<*option>
+\ProcessOptions\relax
+%</option>
+% \end{macrocode}
+%
+%
+% \subsection{Required packages}
+% \label{sec:packages}
+%
+% Package \pkg*{scrbase} is needed to process all macro options. As long as
+% no package options are provided, the \texttt{body}-run is early enough to
+% load it.
+% \begin{macrocode}
+%<*body>
+\RequirePackage{scrbase}
+%</body>
+% \end{macrocode}
+% We load it after processing the options, because we don't need it for
+% processing options.
+%
+%
+%
+% \subsection{Unwanted packages}
+% \label{sec:unpackages}
+%
+% There are packages, that are not recommended to be used together with
+% \pkg*{tocbasic}:
+% \begin{macrocode}
+%<*body>
+% \end{macrocode}
+% \begin{description}
+% \item[\pkg{multitoc}:] This package implements multi-column ToCs using
+% \pkg{multicol}. Unfortunately there is a bug in that package, that
+% disables all extensions but \file{toc}, \file{lof} and \file{lot} and
+% even these if the corresponding option has not been set.
+% \begin{macrocode}
+\AfterPackage*{multitoc}{%
+ \@ifpackagelater{multitoc}{2022/02/10}{}{%
+ \PackageWarningNoLine{tocbasic}{%
+ Usage of package `multitoc' is not recommended!\MessageBreak
+ Note, this package generally results in empty ToCs\MessageBreak
+ for all extension but `toc', `lof' and `lot' and\MessageBreak
+ even for these extensions if you do not use the\MessageBreak
+ corresponding multitoc options.\MessageBreak
+ It is recommended to use:\MessageBreak
+ \space\space\string\usepackage{multicol}\MessageBreak
+ \space\space\string\BeforeStartingTOC{\string\begin{multicols}{2}}%
+ \MessageBreak
+ \space\space\string\AfterStartingTOC{\string\end{multicols}}%
+ \MessageBreak
+ instead of loading package `multitoc'.\MessageBreak
+ See the KOMA-Script manual for more information\MessageBreak
+ about using \string\BeforeStartingTOC\space and
+ \string\AfterStartingTOC\MessageBreak
+ and the multicol manual for more information\MessageBreak
+ about the `multicols' environment%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{description}
+% \begin{macrocode}
+%</body>
+% \end{macrocode}
+%
+%
+% \subsection{Having a list of all toc-files}
+% \label{sec:listoftocs}
+%
+% If we have a list of all toc-files we may do commands for all
+% toc-files. Somethimes it may be usefull to known the package, that created
+% the toc-file, so this information will be stored additionally.
+%
+% \begin{macro}{\tb@listoftocs}
+% This is the list of toc-files. The list will be:
+% \begin{quote}
+% \cs{do}\marg{extension}\marg{class or
+% package}\cs{do}\marg{extension}\marg{class or package}\dots
+% \end{quote}
+% With this, adding and processing the list will be very fast but removing
+% an element will be very slow.
+%
+% The initial state of the list will be \emph{empty}.
+% \begin{macrocode}
+%<*body>
+\newcommand*{\tb@listoftocs}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{command}{\ifattoclist,\Ifattoclist}
+% \changes{v3.28}{2019/11/19}{\cs{ifattoclist} renamed to \cs{Ifattoclist}}
+% This command tests, if an extension is already at the list of toc-files. The
+% extension has to be the first argument. The second argument will be done, if
+% the extension is already at the list of toc-files. The third argument will
+% be done, if the extension is at the list of toc-files not yet.
+% \begin{macrocode}
+\providecommand*{\ifattoclist}{%
+ \PackageWarning{tocbasic}{Usage of deprecated command
+ `\string\ifattoclist'.\MessageBreak
+ The command has been renamed because of a\MessageBreak
+ recommendation of The LaTeX Project Team.\MessageBreak
+ Please replace `\string\ifattoclist' by `\string\Ifattoclist'%
+ }%
+ \Ifattoclist
+}
+\newcommand{\Ifattoclist}[1]{%
+ \begingroup
+ \def\do##1##2{%
+ \edef\reserved@a{##1}%
+ \ifx\reserved@a\reserved@b\@tempswatrue\fi
+ }%
+ \edef\reserved@b{#1}\@tempswafalse\tb@listoftocs
+ \if@tempswa\aftergroup\@firstoftwo\else\aftergroup\@secondoftwo\fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{command}^^A \ifattoclist,\Ifattoclist
+%
+% \begin{command}{\addtotoclist}
+% \changes{v3.06a}{2010/09/14}{expand the arguments while adding them to the
+% internal list}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@addtotoclist,\scr@addtotoclist}
+% \changes{v1.0a}{2008/11/11}{\cs{@addtotoclist} renamed to
+% \cs{scr@addtotoclist} because of package \pkg{flowfram}}
+% \begin{macro}{\@@addtotoclist,\scr@@addtotoclist}
+% \changes{v1.0a}{2008/11/11}{\cs{@@addtotoclist} renamed to
+% \cs{scr@@addtotoclist} because of package \pkg{flowfram}}
+% \changes{v3.28}{2019/11/19}{\cs{ifattoclist} replaced by
+% \cs{Ifattoclist}}
+% This command adds an extension to the list of toc-files. The first,
+% optional argument is the class or package name with the corresponding
+% extension of class or package files. If this argument was omitted
+% \pkg*{tocbasic} tries to get it automatically. This should be
+% successfull while loading a class or package but not while processing any
+% command of a class or package after loading the class or package. The
+% second, mandatory argument is the extension of the toc-file. NOTE: An
+% empty first argument is not the same like omitting the first argument!
+% \begin{macrocode}
+\newcommand*{\addtotoclist}{%
+ \kernel@ifnextchar [%]
+ \scr@@addtotoclist\scr@addtotoclist
+}
+\newcommand*{\scr@addtotoclist}{%
+ \ifx\@currname\@empty
+ \def\reserved@a{\scr@@addtotoclist[]}%
+ \else
+ \edef\reserved@a{\noexpand\scr@@addtotoclist[\@currname.\@currext]}%
+ \fi
+ \reserved@a
+}
+\newcommand*{\scr@@addtotoclist}[2][]{%
+ \Ifattoclist{#2}{%
+ \PackageError{tocbasic}{%
+ file extension `#2' cannot be used twice
+ }{%
+ File extension `#2' is already used by a toc-file, while
+ \ifx\relax#1\relax someone\else #2\fi\MessageBreak
+ tried to use it again for a toc-file.\MessageBreak
+ This may be either an incompatibility of packages, an error at a
+ package,\MessageBreak
+ or a mistake by the user.\MessageBreak
+ }%
+ }{%
+ \begingroup
+ \protected@edef\reserved@a{%
+ \noexpand\g@addto@macro\noexpand\tb@listoftocs{%
+ \noexpand\do{#2}{#1}}}\reserved@a
+ \endgroup
+ \ifx\relax #1\relax\else
+ \@ifundefined{tb@#1@add@hook}{}{%
+ \edef\reserved@a{%
+ \noexpand\def\noexpand\@currext{#2}%
+ \noexpand\@nameuse{tb@#1@add@hook}%
+ \noexpand\def\noexpand\@currext{\@currext}%
+ }\reserved@a
+ }%
+ \fi
+ \edef\reserved@a{%
+ \noexpand\def\noexpand\@currext{#2}%
+ \noexpand\@nameuse{tb@@add@hook}%
+ \noexpand\def\noexpand\@currext{\@currext}%
+ }\reserved@a
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{command}
+%
+% \begin{command}{\owneroftoc}
+% \changes{v3.22}{2016/08/09}{added}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% Returns the owner of a TOC or uses the owner of a TOC as argument of the
+% optional argument, if it exists.
+% \begin{macrocode}
+\newcommand*{\owneroftoc}[2][\@firstofone]{%
+ \begingroup
+ \let\reserved@a\endgroup
+ \def\do##1##2{\Ifstr{#2}{##1}{\def\reserved@a{\endgroup#1{##2}}}{}}%
+ \tb@listoftocs
+ \reserved@a
+}
+% \end{macrocode}
+% \end{command}
+% \begin{command}{\categoryoftoc}
+% \changes{v3.27}{2019/05/12}{added}
+% Synonym for \cs{owneroftoc}.
+% \begin{macrocode}
+\newcommand*{\categoryoftoc}{\owneroftoc}
+% \end{macrocode}
+% \end{command}
+%
+% \begin{command}{\AtAddToTocList}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@AtAddToTocList,\@@AtAddToTocList}
+% Action to be done, when adding a toc-file of a known owner. The first
+% optional argument is the owner. The second, mandatory argument is the
+% action. While doing the action \cs{@currext} will be the extension of the
+% added toc-file. If the first argument was omitted \pkg*{tocbasic} tries
+% to get it automatically. This should be successfull while loading a class
+% or package but not while processing any command of a class or package
+% after loading the class or package. The second, mandatory argument is the
+% extension of the toc-file. NOTE: An empty first argument is not the same
+% like omitting the first argument, but set's up the general hook. The
+% general hook will be done for every adding after the individual hook (this
+% means, you may dactivate features at the individual hook before processing
+% the general hook). But the individual hook will not be processed for
+% toc-files without any owner!
+% \begin{macrocode}
+\newcommand*{\AtAddToTocList}{%
+ \kernel@ifnextchar [%]
+ \@@AtAddToTocList\@AtAddToTocList
+}
+\newcommand*{\@AtAddToTocList}{%
+ \ifx\@currname\@empty
+ \def\reserved@a{\@@AtAddToTocList[]}%
+ \else
+ \edef\reserved@a{\noexpand\@@AtAddToTocList[\@currname.\@currext]}%
+ \fi
+ \reserved@a
+}
+\newcommand*{\@@AtAddToTocList}[1][]{%
+ \@ifundefined{tb@#1@add@hook}{\@namedef{tb@#1@add@hook}{}}{}%
+ \expandafter\g@addto@macro\csname tb@#1@add@hook\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+% \begin{macro}{\tocbasic@extend@babel}
+% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
+% \cs{Iftocfeature}}
+% NOTE: To extend the original \cs{bbl@set@language} the argument of
+% \cs{tocbasic@extend@babel} must not be a local macro (like \cs{@currext})
+% \begin{macrocode}
+\newcommand*{\tocbasic@extend@babel}[1]{%
+ \scr@ifundefinedorrelax{bbl@set@language}{%
+ \PackageInfo{tocbasic}{babel extension for `#1' omitted\MessageBreak
+ because of missing \string\bbl@set@language}%
+ }{%
+ \Iftocfeature{#1}{nobabel}{%
+ \PackageInfo{tocbasic}{omitting babel extension for `#1'\MessageBreak
+ because of feature `nobabel' available\MessageBreak
+ for `#1'}%
+ }{%
+% \end{macrocode}
+% \changes{v3.23}{2017/02/23}{using \cs{BabelContentsFiles} if available}
+% Since version 3.9a provides adding extensions to the language switch
+% preparation. So it is used if it is available.
+% \begin{macrocode}
+ \scr@ifundefinedorrelax{BabelContentsFiles}{%
+ \PackageInfo{tocbasic}{setting babel extension for `#1'}%
+ \expandafter\gdef\expandafter\bbl@set@language
+ \expandafter##\expandafter1%
+ \expandafter{%
+ \bbl@set@language{##1}%
+ \addtocontents{#1}{\xstring\select@language{\languagename}}%
+ }%
+ }{%
+ \@expandtwoargs\in@{,#1,}{,\BabelContentsFiles,}%
+ \ifin@
+ \PackageInfo{tocbasic}{omitting babel extension for
+ `#1'\MessageBreak
+ because it is already in \string\BabelContentsFiles}%
+ \else
+ \PackageInfo{tocbasic}{setting babel extension for `#1'}%
+ \xdef\BabelContentsFiles{\BabelContentsFiles,#1}%
+ \fi
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% This feature should be used for all toc-files (unless feature
+% \opt{nobabel} was set for the toc-file).
+% \begin{macrocode}
+\AtAddToTocList[]{\expandafter\tocbasic@extend@babel\expandafter{\@currext}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{command}{\removefromtoclist}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\scr@removefromtoclist,\@removefromtoclist}
+% \changes{v3.22}{2016/09/06}{missing \cs{global} added}
+% \changes{v3.28}{2019/11/22}{\cs{@removefromtoclist} renamed to
+% \cs{scr@removefromtoclist}}
+% \begin{macro}{\scr@@removefromtoclist,\@@removefromtoclist}
+% \changes{v3.22}{2016/09/06}{missing \cs{global} added}
+% \changes{v3.28}{2019/11/22}{\cs{@@removefromtoclist} renamed to
+% \cs{scr@removefromtoclist}}
+% This command will remove an extension from the list of toc-files. If the
+% first, optional argument is given, the extension will only be removed, if
+% it was added by the given owner. NOTE: An empty first argument is not the
+% same like omitting the first argument!
+% \begin{macrocode}
+\newcommand*{\removefromtoclist}{%
+ \kernel@ifnextchar [%]
+ \scr@removefromtoclist\scr@@removefromtoclist
+}
+\newcommand*{\scr@removefromtoclist}[2][]{%
+ \begingroup
+ \let\tb@oldlist\tb@listoftocs
+ \def\do##1##2{%
+ \edef\reserved@a{##1}%
+ \ifx\reserved@a\reserved@b
+ \begingroup
+ \edef\@currext{##2}%
+ \edef\reserved@b{#1}%
+ \ifx\@currext\reserved@b
+ \else
+ \g@addto@macro\tb@listoftocs{\do{##1}{##2}}%
+ \fi
+ \endgroup
+ \else
+ \g@addto@macro\tb@listoftocs{\do{##1}{##2}}%
+ \fi
+ }%
+ \edef\reserved@b{#2}\global\let\tb@listoftocs\@empty
+ \tb@oldlist
+ \endgroup
+}
+\newcommand*{\scr@@removefromtoclist}[1]{%
+ \begingroup
+ \let\tb@oldlist\tb@listoftocs
+ \def\do##1##2{%
+ \edef\reserved@a{##1}%
+ \ifx\reserved@a\reserved@b
+ \else
+ \g@addto@macro\tb@listoftocs{\do{##1}{##2}}%
+ \fi
+ }%
+ \edef\reserved@b{#1}\global\let\tb@listoftocs\@empty
+ \tb@oldlist
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{command}
+%
+% \begin{command}{\doforeachtocfile}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@doforeachtocfile,\@@doforeachtocfile}
+% \changes{v3.09}{2011/03/01}{\cs{@currext} defined using \cs{edef} instead
+% of \cs{def}}
+% This command does the second, mandatory argument for each toc-file at the
+% list of toc-files. If the first, optional argument was given this will be
+% done only for the toc-files of that owner. NOTE: An empty first argument
+% is not the same like omitting the first argument!
+%
+% While processing the second argument \cs{@currext} is the extension of
+% the toc-file. The second argument will be processed with increased group
+% level!
+%
+% See \cs{addtoeachtocfile} for an example of usage of
+% \cs{doforeachtocfile}.
+% \begin{macrocode}
+\newcommand{\doforeachtocfile}{%
+ \kernel@ifnextchar [%]
+ \@doforeachtocfile\@@doforeachtocfile
+}
+\newcommand{\@doforeachtocfile}[2][]{%
+ \def\do##1##2{%
+ \edef\reserved@a{#1}\edef\reserved@b{##2}\ifx\reserved@a\reserved@b
+ \edef\@currext{##1}#2%
+ \fi
+ }%
+ \edef\reserved@a{%
+ \noexpand\tb@listoftocs
+ \noexpand\def\noexpand\@currext{\@currext}%
+ }\reserved@a
+ \let\do\relax
+}
+\newcommand{\@@doforeachtocfile}[1]{%
+ \def\do##1##2{%
+ \edef\@currext{##1}#1%
+ }%
+ \edef\reserved@a{%
+ \noexpand\tb@listoftocs
+ \noexpand\def\noexpand\@currext{\@currext}%
+ }\reserved@a
+ \let\do\relax
+}
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+% \begin{command}{\addtoeachtocfile}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@addtoeachtocfile,\@@addtoeachtocfile}
+% \changes{v3.03b}{2009/06/08}{typo fix at usage of \cs{doforeachtocfile}}
+% This command calls \cs{addtocontents} with the section, mandatory
+% argument for each toc-file at the list of toc-files. If the first,
+% optional argument was given this will be done only for the toc-files of
+% that owner. NOTE: An empty first argument is not the same like omitting
+% the first argument! And don't forget to protect the commands, that should
+% not be expanded, at the mandatory argument.
+% \begin{macrocode}
+\newcommand{\addtoeachtocfile}{%
+ \kernel@ifnextchar [%]
+ \@addtoeachtocfile\@@addtoeachtocfile
+}
+\newcommand{\@addtoeachtocfile}[2][]{%
+ \doforeachtocfile[{#1}]{\addtocontents{\@currext}{#2}}%
+}
+\newcommand{\@@addtoeachtocfile}[1]{%
+ \doforeachtocfile{\addtocontents{\@currext}{#1}}%
+}
+%</body>
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+% \subsection{Adding entries into toc-files}
+%
+% We have a new general command to add entries to several toc-files at
+% once. And we have some special commands for the table of contents.
+%
+% \begin{command}{\addcontentslinetoeachtocfile}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@addcontentslinetoeachtocfile,\@@addcontentslinetoeachtocfile}
+% Something like a combination of \cs{addtoeachtocfile} and
+% \cs{addcontentsline}.
+% \begin{macrocode}
+%<*body>
+\newcommand{\addcontentslinetoeachtocfile}{%
+ \kernel@ifnextchar [%]
+ \@addcontentslinetoeachtocfile\@@addcontentslinetoeachtocfile
+}
+\newcommand{\@addcontentslinetoeachtocfile}[3][]{%
+ \doforeachtocfile[{#1}]{\addcontentsline{\@currext}{#2}{#3}}%
+}
+\newcommand{\@@addcontentslinetoeachtocfile}[2]{%
+ \doforeachtocfile{\addcontentsline{\@currext}{#1}{#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+% \begin{command}{\addxcontentsline}
+% \changes{v3.12}{2013/09/24}{added}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@addxcontentsline}
+% \changes{v3.12}{2013/09/24}{added}
+% This will be used instead of \cs{addcontentsline} to generate numbered or
+% not numbered entries to a toc-file. First argument is the toc-file, second
+% the entry type, e.g., |chapter|, the third is the entry number or empty and
+% the fourth and last is the entry text.
+% \begin{macrocode}
+\newcommand*{\addxcontentsline}[2]{%
+ \kernel@ifnextchar [%]
+ {\@addxcontentsline{#1}{#2}}%
+ {\@addxcontentsline{#1}{#2}[]}%
+}
+\newcommand*{\@addxcontentsline}{}
+\def\@addxcontentsline#1#2[#3]#4{%
+ \scr@ifundefinedorrelax{add#2#1entry}{%
+ \tocbasic@addxcontentsline{#1}{#2}{#3}{#4}%
+ }{%
+ \@nameuse{add#2#1entry}{#3}{#4}%
+ }%
+}
+% \end{macrocode}
+% \begin{command}{\nonumberline}
+% \changes{v3.12}{2013/09/24}{added}
+% Either \cs{relax} or \cs{numberline} depending on the feature
+% \opt{numberline}.
+% \begin{macrocode}
+\newcommand*{\nonumberline}{}%
+% \end{macrocode}
+% \end{command}
+% \begin{command}{\addxcontentsline}
+% This may be used to either use a heading type command or the general default
+% one. You are not allowed to use it in the definition of a heading type
+% command like \cs{addchaptertocentry}! You may use
+% \cs{tocbasic@addxcontentsline} at the definition of those commands.
+% \begin{macrocode}
+\newcommand*{\tocbasic@addxcontentsline}[4]{%
+ \if\relax\detokenize{#3}\relax
+ \addcontentsline{#1}{#2}{\protect\nonumberline#4}%
+ \else
+ \addcontentsline{#1}{#2}{\protect\numberline{#3}#4}%
+ \fi
+}
+% \end{macrocode}
+% \end{command}
+% \end{macro}
+% \end{command}
+%
+% \begin{command}{\addxcontentslinetoeachtocfile}
+% \changes{v3.12}{2013/09/24}{added}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@addxcontentslinetoeachtocfile,
+% \@@addxcontentslinetoeachtocfile}
+% \changes{v3.12}{2013/09/24}{added}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@@@addxcontentslinetoeachtocfile,
+% \@@@@addxcontentslinetoeachtocfile}
+% \changes{v3.12}{2013/09/24}{added}
+% Similar to \cs{addcontentslinetoeachtocfile} using
+% \cs{addxcontentsline} instead of \cs{addcontentsline}.
+% \begin{macrocode}
+\newcommand{\addxcontentslinetoeachtocfile}{%
+ \kernel@ifnextchar [%]
+ \@addxcontentslinetoeachtocfile\@@addxcontentslinetoeachtocfile
+}
+\newcommand{\@addxcontentslinetoeachtocfile}[2][]{%
+ \kernel@ifnextchar [%]
+ {\@@@addxcontentslinetoeachtocfile[{#1}]{#2}}%
+ {\@@@addxcontentslinetoeachtocfile[{#1}]{#2}[]}
+}
+\newcommand*{\@@@addxcontentslinetoeachtocfile}{}
+\def\@@@addxcontentslinetoeachtocfile[#1]#2[#3]#4{%
+ \doforeachtocfile[{#1}]{\addxcontentsline{\@currext}{#2}[#3]{#4}}%
+}
+\newcommand{\@@addxcontentslinetoeachtocfile}[1]{%
+ \kernel@ifnextchar [%]
+ {\@@@@addxcontentslinetoeachtocfile{#1}}%
+ {\@@@@addxcontentslinetoeachtocfile{#1}[]}%
+}
+\newcommand*{\@@@@addxcontentslinetoeachtocfile}{}
+\def\@@@@addxcontentslinetoeachtocfile#1[#2]#3{%
+ \doforeachtocfile{\addxcontentsline{\@currext}{#1}[{#2}]{#3}}%
+}
+%</body>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{command}
+%
+%
+% \subsection{Show list of toc-file}
+% \label{sec:showlistoftocfile}
+%
+% If you have a toc-file you want a list-of-command for this toc-file,
+% too. Here are basics and high level commands for this.
+%
+% \begin{macro}{\tocbasic@starttoc}
+% \changes{v3.17}{2015/03/23}{usage of feature \opt{noparskipfake}}
+% \changes{v3.27}{2019/07/08}{hack to add \cs{par} at end of (main) file}
+% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
+% \cs{Iftocfeature}}
+% \changes{v3.32}{2020/08/25}{replace \cs{par} hack by \cs{par} solution}
+% \changes{v3.32}{2020/08/25}{reentrant warning}
+% Some basics are done like setting up \cs{parskip}, \cs{parindent} and
+% \cs{parfillskip}, a general hook will be called, an individual hook will
+% be called, the toc will be started, an individual hook will be called, an
+% general hook wil be called, that's it.
+% \begin{macrocode}
+%<*body>
+\newcommand*{\tocbasic@starttoc}[1]{%
+ \begingroup
+ \tocbasic@reentrant@warning
+ \def\tocbasic@reentrant@warning{%
+ \PackageWarning{tocbasic}{%
+ Loading one auxiliary file inside the setup context\MessageBreak
+ of another auxiliary file is not recommended.\MessageBreak
+ In this case settings for `\@currext' could also influence\MessageBreak
+ settings of `#1' and local states of `#1' can also\MessageBreak
+ influence local states of `\@currext'%
+ }%
+ }%
+ \edef\@currext{#1}%
+ \Iftocfeature{\@currext}{noparskipfake}{}{%
+ \ifvmode
+ \@tempskipa\lastskip
+ \vskip-\lastskip
+ \addtolength{\@tempskipa}{\parskip}%
+ \vskip\@tempskipa
+ \fi
+ }%
+ \setlength{\parskip}{\z@}%
+ \setlength{\parindent}{\z@}%
+ \setlength{\parfillskip}{\z@\@plus 1fil}%
+ \csname tocbasic@@before@hook\endcsname
+ \csname tb@#1@before@hook\endcsname
+ \@starttoc{#1}%
+ \BeforeClosingMainAux{%
+ \addtocontents{#1}{%
+ \string\providecommand\string\tocbasic@end@toc@file{}%
+ \string\tocbasic@end@toc@file
+ }%
+ }%
+ \edef\@currext{#1}%
+ \csname tb@#1@after@hook\endcsname
+ \csname tocbasic@@after@hook\endcsname
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macro}{tocbasic@end@toc@file}
+% \changes{v3.32}{2020/08/25}{added}
+% \begin{macrocode}
+\newcommand*{\tocbasic@end@toc@file}{\par}
+% \end{macrocode}
+% \end{macro}^^A \tocbasic@end@toc@file
+% \begin{macro}{\tocbasic@reentrant@warning}
+% \changes{v3.32}{2020/08/25}{added}
+% \begin{macrocode}
+\newcommand*{\tocbasic@reentrant@warning}{}
+% \end{macrocode}
+% \end{macro}^^A \tocbasic@reentrant@warning
+% \begin{macro}{\tocbasic@@before@hook,\tocbasic@@after@hook}
+% These are the general hooks. They may be used by classes and packages for
+% commands, that should be used for all lists of not only the own lists of,
+% e.\,g., \KOMAScript{} may use it to handle option \opt{tocleft}.
+% \begin{macrocode}
+\newcommand*{\tocbasic@@before@hook}{}
+\newcommand*{\tocbasic@@after@hook}{}
+% \end{macrocode}
+% \end{macro}^^A \tocbasic@@before@hook,\tocbasic@@after@hook
+% \begin{command}{\BeforeStartingTOC,\AfterStartingTOC}
+% \changes{v3.04b}{2010/01/05}{fix:define the hook if not already defined}
+% \changes{v3.06}{2010/06/09}{fix: using \cs{@ifundefined} instead of
+% undefined \cs{scr@ifundefinedorrelax}}
+% \changes{v3.26}{2018/08/10}{message moved to \texttt{trace}}
+% These are the commands to add code to the general or individual hooks. If
+% the first, optional argument was given, the second, mandatory argument
+% will be added to the individual hook, otherwise the general hook will be
+% extended.
+% \begin{macrocode}
+\newcommand{\BeforeStartingTOC}[2][]{%
+ \ifx\relax#1\relax
+ \g@addto@macro\tocbasic@@before@hook{#2}%
+ \else
+ \@ifundefined{tb@#1@before@hook}{%
+%<trace> \PackageInfo{tocbasic}{defining new hook before starting `#1'}%
+ \expandafter\global\expandafter\let\csname tb@#1@before@hook\endcsname
+ \@empty
+ }{}%
+ \expandafter\g@addto@macro\csname tb@#1@before@hook\endcsname{#2}%
+ \fi
+}
+\newcommand{\AfterStartingTOC}[2][]{%
+ \ifx\relax#1\relax
+ \g@addto@macro\tocbasic@@after@hook{#2}%
+ \else
+ \@ifundefined{tb@#1@after@hook}{%
+%<trace> \PackageInfo{tocbasic}{defining new hook after starting `#1'}%
+ \expandafter\global\expandafter\let\csname tb@#1@after@hook\endcsname
+ \@empty
+ }{}%
+ \expandafter\g@addto@macro\csname tb@#1@after@hook\endcsname{#2}%
+ \fi
+}
+% \end{macrocode}
+% \end{command}^^A \BeforeStartingTOC,\AfterStartingTOC
+% \end{macro}^^A \tocbasic@starttoc
+%
+% \begin{command}{\listoftoc}
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} replaced by \cs{kernel@ifstar}}
+% \begin{macro}{\@listoftoc}
+% \changes{v1.0a}{2008/11/12}{\cs{twocolumn} fixed}
+% \changes{v1.01}{2008/11/13}{new feature \opt{onecolumn}}
+% \changes{v3.09}{2011/03/01}{\cs{@currext} defined using \cs{edef} instead
+% of \cs{def}}
+% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
+% \cs{Iftocfeature}}
+% \changes{v3.31}{2020/07/08}{use one time expansion of local
+% \cs{list@fname}}
+% Command to handle the hole list of something. There are additional hooks
+% for this. The first optional argument is the title for this list. If the
+% optional argument was omitted \cs{listof\#2name} will be used. The star
+% version does not set up a heading or switch the column number!
+% \begin{macrocode}
+\newcommand*{\listoftoc}{%
+ \kernel@ifstar \tocbasic@starttoc\@listoftoc
+}
+\newcommand*{\@listoftoc}[2][]{%
+ \begingroup
+ \def\list@fname{#1}%
+ \@ifundefined{listof#2name}{%
+ \ifx\list@fname\@empty
+ \PackageWarning{tocbasic}{%
+ You should either define \expandafter\string\csname
+ listof#2name\endcsname\MessageBreak
+ or use the optional argument of \string\listoftoc\space\MessageBreak
+ to set the term to be used for the\MessageBreak
+ heading of list of #2}%
+ \def\list@fname{\listofname~#2}%
+ \fi
+ }{%
+ \expandafter\let\expandafter\list@fname\csname listof#2name\endcsname
+ }%
+ \edef\@currext{#2}%
+ \Iftocfeature{\@currext}{onecolumn}{%
+ \Iftocfeature{\@currext}{leveldown}{}{%
+ \if@twocolumn
+ \aftergroup\twocolumn\onecolumn
+ \fi
+ }%
+ }{}%
+ \Iftocfeature{\@currext}{numberline}{\def\nonumberline{\numberline{}}}{}%
+ \expandafter\tocbasic@listhead\expandafter{\list@fname}%
+ \scr@ifundefinedorrelax{microtypesetup}{}{%
+ \Iftocfeature{\@currext}{noprotrusion}{}{%
+ \microtypesetup{protrusion=false}%
+ \PackageInfo{tocbasic}{%
+ character protrusion at \@currext\space deactivated}%
+ }%
+ }%
+ \tocbasic@starttoc{#2}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+% \changes{v3.25}{2017/11/21}{\pkg{tocbibind} warning added}
+% Using \pkg{tocbibind} and \pkg*{tocbasic} together can break features
+% either of \pkg{tocbibind} or \pkg*{tocbasic}. Here we add at least a
+% warning:
+% \begin{macrocode}
+\@ifpackageloaded{tocbibind}{}{%
+ \AtBeginDocument{%
+ \@ifpackageloaded{tocbibind}{%
+ \PackageInfo{tocbasic}{usage of `tocbibind' detected}%
+ \newcommand*{\tb@tocbibindpatch}[3]{%
+ \long\def\reserved@a{\tocfile{#2}{#1} }%
+ \ifx #3\reserved@a
+ \PackageWarningNoLine{tocbasic}{%
+ `tocbibind' redefinition of `\string#3'\MessageBreak
+ detected.\MessageBreak
+ Note: Loading `tocbibind' without option `not#1'\MessageBreak
+ can break several features of `tocbasic'%
+ \scr@ifundefinedorrelax{KOMAClassName}{%
+ .\MessageBreak
+ Loading `tocbibind' before `tocbasic' would avoid\MessageBreak
+ this warning message%
+ }{}%
+ }%
+ \fi
+ }%
+ \tb@tocbibindpatch{toc}{\contentsname}{\tableofcontents}%
+ \tb@tocbibindpatch{lof}{\listfigurename}{\listoffigures}%
+ \tb@tocbibindpatch{lot}{\listtablename}{\listoftables}%
+ }{}%
+ }%
+}
+% \end{macrocode}
+%
+% \begin{command}{\listofname}
+% While this is only an emergency command, we don't support languages.
+% \begin{macrocode}
+\newcommand*{\listofname}{List of}
+% \end{macrocode}
+% \end{command}
+%
+% \begin{command}{\listofeachtoc}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \begin{macro}{\@listofeachtoc,\@@listofeachtoc}
+% \changes{v3.03b}{2009/06/08}{typo fix at usage of \cs{doforeachtocfile}}
+% Another example of using \cs{doforeachtocfile}.
+% \begin{macrocode}
+\newcommand*{\listofeachtoc}{%
+ \kernel@ifnextchar [%]
+ \@listofeachtoc\@@listofeachtoc
+}
+\newcommand{\@listofeachtoc}[1][]{%
+ \doforeachtocfile[{#1}]{\listoftoc{\@currext}}%
+}
+\newcommand{\@@listofeachtoc}[1]{%
+ \doforeachtocfile{\listoftoc{\@currext}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+% \begin{macro}{\ext@toc}
+% \changes{v3.23}{2017/02/23}{use indirect extension for toc}
+% We do not longer hard code extension \file{toc} for the table of
+% contents. This allowes users to change it. Classes or other packages may
+% also define it. So it seems to be better to \cs{providecommand} instead of
+% \cs{newcommand} here.
+% \begin{macrocode}
+\providecommand*{\ext@toc}{toc}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tocbasic@listhead}
+% \changes{v3.02a}{2009/01/20}{no explicite marks if ``numbered''}
+% \changes{v3.09a}{2011/04/12}{again no explicite marks if ``numbered''}
+% \changes{v3.12}{2013/09/24}{usage of new \cs{tocbasic@addxcontentsline}}
+% \changes{v3.15}{2014/12/10}{moved \cs{@mkboth} inside \cs{chapter*}}
+% \changes{v3.15}{2014/12/10}{usage of \cs{addsec} if available}
+% \changes{v3.15}{2014/12/10}{usage of \cs{@mkright} if available}
+% \changes{v3.17}{2015/03/08}{moved \cs{@mkboth} outside \cs{chapter*}}
+% \changes{v3.17}{2015/03/08}{usage of \cs{@mkdouble} if available}
+% \changes{v3.17}{2015/03/25}{penalty and skip reconstruction after
+% \cs{@mkright}, \cs{@mkboth}, or \cs{@mkdouble}}
+% \changes{v3.26}{2018/06/22}{removed spurious group}
+% \changes{v3.26}{2018/09/03}{usage of \cs{addsecmark} or \cs{sectionmark}
+% instead of \cs{@mkright} or \cs{markright}}
+% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
+% \cs{Iftocfeature}}
+% Setting the headings of a list of something. The heading is the only
+% argument.
+% \begin{macrocode}
+\newcommand*{\tocbasic@listhead}[1]{%
+ \@ifundefined{tocbasic@listhead@\@currext}{%
+ \scr@ifundefinedorrelax{chapter}{%
+ \expandafter\def\csname tocbasic@listhead@\@currext\endcsname##1{%
+ \Iftocfeature{\@currext}{leveldown}{%
+ \Iftocfeature{\@currext}{numbered}{%
+ \subsection[##1]{##1}%
+ }{%
+ \subsection*{##1}%
+ \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
+ \begingroup
+ \Iftocfeature{\@currext}{totoc}{%
+ \expandafter\addxcontentsline\expandafter{\ext@toc}%
+ {subsection}{##1}%
+ }{}%
+ \c@secnumdepth=-\maxdimen
+ \subsectionmark{##1}%
+ \endgroup
+ \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
+ }%
+ }{%
+ \Iftocfeature{\@currext}{numbered}{%
+ \section[##1]{##1}%
+ }{%
+ \section*{##1}%
+ \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
+ \begingroup
+ \Iftocfeature{\@currext}{totoc}{%
+ \expandafter\addxcontentsline\expandafter{\ext@toc}%
+ {section}{##1}%
+ }{}%
+ \@ifundefined{@mkdouble}{%
+ \@mkboth{\MakeMarkcase{##1}}{\MakeMarkcase{##1}}%
+ }{%
+ \@mkdouble{\MakeMarkcase{##1}}%
+ }%
+ \endgroup
+ \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
+ }%
+ }%
+ }%
+ }{%
+ \expandafter\def\csname tocbasic@listhead@\@currext\endcsname##1{%
+ \Iftocfeature{\@currext}{leveldown}{%
+ \Iftocfeature{\@currext}{numbered}{%
+ \section{##1}%
+ }{%
+ \Iftocfeature{\@currext}{totoc}{%
+ \@ifundefined{addsec}{%
+ \section*{##1}%
+ \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
+ \begingroup
+ \@ifundefined{@mkright}{%
+ \IfActiveMkBoth{\markright{\MakeMarkcase{##1}}}{}%
+ }{%
+ \@mkright{\MakeMarkcase{##1}}%
+ }%
+ \expandafter\addxcontentsline\expandafter{\ext@toc}%
+ {section}{##1}%
+ \endgroup
+ \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
+ }{%
+ \addsec{##1}%
+ }%
+ }{%
+ \section*{##1}%
+ \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
+ \begingroup
+ \@ifundefined{addsecmark}{%
+ \c@secnumdepth=-\maxdimen
+ \sectionmark{##1}%
+ }{%
+ \addsecmark{##1}%
+ }%
+ \endgroup
+ \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
+ }%
+ }%
+ }{%
+ \Iftocfeature{\@currext}{numbered}{%
+ \chapter[##1]{##1}%
+ }{%
+ \chapter*{##1}%
+ \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
+ \begingroup
+ \@ifundefined{@mkdouble}{%
+ \@mkboth{\MakeMarkcase{##1}}{\MakeMarkcase{##1}}%
+ }{%
+ \@mkdouble{\MakeMarkcase{##1}}%
+ }%
+ \Iftocfeature{\@currext}{totoc}{%
+ \expandafter\addxcontentsline\expandafter{\ext@toc}%
+ {chapter}{##1}%
+ }{}%
+ \endgroup
+ \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
+ }%
+ }%
+ }%
+ }%
+ }{}%
+ \csname tb@@beforehead@hook\endcsname
+ \csname tb@\@currext @beforehead@hook\endcsname
+ \csname tocbasic@listhead@\@currext\endcsname{#1}%
+ \csname tb@\@currext @afterhead@hook\endcsname
+ \csname tb@@afterhead@hook\endcsname
+}
+% \end{macrocode}
+% \begin{command}{\BeforeTOCHead,\AfterTOCHead}
+% \changes{v3.04b}{2010/01/05}{fix: define the hook if not already defined}
+% \changes{v3.06}{2010/06/09}{fix: using \cs{@ifundefined} instead of
+% undefined \cs{scr@ifundefinedorrelax}}
+% \changes{v3.26}{2018/08/10}{message moved to \texttt{trace}}
+% These are the commands to add code to the general or individual hooks. If
+% the first, optional argument was given, the second, mandatory argument
+% will be added to the individual hook, otherwise the general hook will be
+% extended.
+% \begin{macrocode}
+\newcommand{\BeforeTOCHead}[2][]{%
+ \@ifundefined{tb@#1@beforehead@hook}{%
+%<trace> \PackageInfo{tocbasic}{defining new hook before heading of `#1'}%
+ \expandafter\global\expandafter\let\csname tb@#1@beforehead@hook\endcsname
+ \@empty
+ }{}%
+ \expandafter\g@addto@macro\csname tb@#1@beforehead@hook\endcsname{#2}%
+}
+\newcommand{\AfterTOCHead}[2][]{%
+ \@ifundefined{tb@#1@afterhead@hook}{%
+%<trace> \PackageInfo{tocbasic}{defining new hook after heading of `#1'}%
+ \expandafter\global\expandafter\let\csname tb@#1@afterhead@hook\endcsname
+ \@empty
+ }{}%
+ \expandafter\g@addto@macro\csname tb@#1@afterhead@hook\endcsname{#2}%
+}
+%</body>
+% \end{macrocode}
+% \end{command}
+% \end{macro}
+%
+% \begin{command}{\MakeMarkcase}
+% Use upper-case or not?
+% \begin{macrocode}
+%<*exit>
+\AtBeginDocument{%
+ \@ifundefined{MakeMarkcase}{%
+ \scr@ifundefinedorrelax{KOMAClassName}{%
+ \let\MakeMarkcase\MakeUppercase
+ }{%
+ \let\MakeMarkcase\@firstofone
+ }%
+ }{}%
+}
+%</exit>
+% \end{macrocode}
+% \end{command}
+%
+% \begin{command}{\deftocheading}
+% Define a toc headings command with one argument (the title).
+% \begin{macrocode}
+%<*body>
+\newcommand*{\deftocheading}[1]{%
+ \@namedef{tocbasic@listhead@#1}##1}
+% \end{macrocode}
+% \end{command}
+%
+% \begin{command}{\setuptoc,\unsettoc}
+% \changes{v3.26}{2018/08/29}{using \cs{scr@trim@spaces} instead of
+% \cs{tb@@sp@def}}
+% Known features are:
+% \begin{description}
+% \item[\opt{totoc}] writes the title of the list of to the table of
+% contents
+% \item[\opt{numberline}] redefines \cs{nonumberline} to use
+% \cs{numberline}
+% \item[\opt{numbered}] uses a numbered headings for the list of
+% \item[\opt{leveldown}] uses not the top level heading (e.\,g.,
+% \cs{chapter} with book) but the first sub level (e.\,g., \cs{section} with
+% book).
+% \item[\opt{nobabel}] prevents the extension to be added to the babel
+% handling of toc-files. To make this work, you have to set the feature
+% before adding the extension to the list of known extension.
+% \item[\opt{noprotrusion}] prevents disabling character protrusion at
+% the toc.
+% \end{description}
+% Other features may be package dependent. You may test the feature using:
+% \begin{quote}
+% \cs{@ifundefined}\texttt{\{tocbasic@\meta{toc}@feature@\meta{feature}\}}\\
+% \phantom{\cs{@ifundefined}}\marg{do if feature not set}\\
+% \phantom{\cs{@ifundefined}}\marg{do if feature set}
+% \end{quote}
+% See \cs{tocbasic@listhead} for an example of this.
+% \begin{macrocode}
+\newcommand*{\setuptoc}[2]{%
+ \@for\@tempa:=#2\do{%
+ \scr@trim@spaces\@tempa
+ \@namedef{tocbasic@#1@feature@\@tempa}{}%
+ }%
+}
+\newcommand*{\unsettoc}[2]{%
+ \@for\@tempa:=#2\do{%
+ \scr@trim@spaces\@tempa
+ \expandafter\let\csname tocbasic@#1@feature@\@tempa\endcsname\relax
+ }%
+}
+% \end{macrocode}
+% Do not add the files, that babel handles by default.
+% \begin{macrocode}
+\setuptoc{toc}{nobabel}
+\setuptoc{lof}{nobabel}
+\setuptoc{lot}{nobabel}
+% \end{macrocode}
+% \begin{command}{\Iftocfeature,\iftocfeature}
+% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} renamed to \cs{Iftocfeature}}
+% We need a test for the features
+% \begin{macrocode}
+\providecommand*{\iftocfeature}{%
+ \PackageWarning{tocbasic}{Usage of deprecated command
+ `\string\iftocfeature'.\MessageBreak
+ The command has been renamed because of a\MessageBreak
+ recommendation of The LaTeX Project Team.\MessageBreak
+ Please replace `\string\iftocfeature' by `\string\Iftocfeature'%
+ }%
+ \Iftocfeature
+}
+\newcommand*{\Iftocfeature}[2]{%
+ \scr@ifundefinedorrelax{tocbasic@#1@feature@#2}{%
+ \expandafter\@secondoftwo
+ }{%
+ \expandafter\@firstoftwo
+ }%
+}
+%</body>
+% \end{macrocode}
+% \end{command}
+% \end{command}
+%
+% \begin{command}{\tocbasicautomode}
+% \changes{v1.0a}{2008/11/11}{use of \cs{addtotoclist} instead of
+% internal}
+% \changes{v3.07a}{2010/11/25}{fix: added missing
+% \cs{let}\cs{@starttoc}\cs{tocbasic@starttoc}}
+% \changes{v3.28}{2019/11/19}{\cs{ifattoclist} replaced by
+% \cs{Ifattoclist}}
+% \pkg*{tocbasic} can overtake \cs{@starttoc} to automaticly add all
+% used extensions to the list of known extensions and use
+% \cs{tocbasic@starttoc} instead of \cs{@starttoc} from \LaTeX{}
+% kernel. Please note, that we don't need a fix for the unfriendly
+% redefinition of \cs{@starttoc} by \pkg{hyperref}, because hyperref
+% does it only at the first \LaTeX{} run. So this action of \pkg{hyperref}
+% may only result in the need of one more \LaTeX{} run, but not in a permanent
+% mistake.
+% \begin{macrocode}
+%<*body>
+\newcommand*{\tocbasicautomode}{%
+ \let\tb@saved@starttoc\@starttoc
+ \let\@starttoc\tocbasic@starttoc
+ \BeforeStartingTOC{%
+ \let\@starttoc\tb@saved@starttoc
+ \expandafter\Ifattoclist\expandafter{\@currext}{}{%
+ \addtotoclist[tocbasicautomode]{\@currext}%
+ }%
+ }%
+}
+%</body>
+% \end{macrocode}
+% \end{command}
+%
+%
+% \subsection{High level interface for generating new ToCs and floats}
+% \label{sec:newfloats}
+%
+% \begin{command}{\DeclareNewTOC}
+% \changes{v3.06}{2010/06/01}{added}
+% \changes{v3.18}{2015/06/20}{\cs{tb@nt@types} and \cs{tb@nt@listname} are
+% initialised \cs{relax}}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \changes{v3.26a}{2018/12/30}{fixed usage of \cs{kernel@ifnextchar}}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% This command defines only a new TOC and a new caption command for this
+% TOC. It does not define a new foat unless option float was set! It does
+% not define a new nonfloat unless option nonfloat was set! The optional
+% argument is used to set up several settings using \pkg{keyval}. The
+% mandatory argument is the shortcut. The default type is the shortcut.
+% The extension is the shortcut. The default owner is ``\texttt{float}''.
+% \begin{macrocode}
+%<*body>
+\DefineFamily{KOMAarg}
+\DefineFamilyMember[.toc]{KOMAarg}
+\newcommand*{\DeclareNewTOC}[2][]{%
+ \newif\iftb@nt@float
+ \newif\iftb@nt@nonfloat
+ \newif\iftb@nt@forcenames
+ \def\tb@nt@floattype{\tb@nt@autofloattype}%
+ \def\tb@nt@floatpos{tbp}%
+ \def\tb@nt@ext{#2}%
+ \edef\tb@nt@type{#2}%
+ \let\tb@nt@types\relax
+ \def\tb@nt@owner{float}%
+ \def\tb@nt@name{\expandafter\protect\expandafter\MakeUppercase\tb@nt@type}%
+ \let\tb@nt@listname\relax
+ \let\tb@nt@counterwithin\@empty
+ \let\tb@nt@atbegin\@empty
+ \let\tb@nt@atend\@empty
+ \def\tb@nt@tocentrystyle{default}%
+% \end{macrocode}
+% \changes{v3.20}{2016/04/29}{need more initialization for empty optional
+% argument}
+% \begin{macrocode}
+ \def\tb@nt@tocstyle@options{level=1}%
+ \IfArgIsEmpty{#1}{%
+% \end{macrocode}
+% Also need to call the style init code, to set the defaults for options
+% \opt{numwidth} and \opt{indent}.
+% \begin{macrocode}
+ \begingroup
+ \let\scr@dte@current\tb@nt@type
+ \@ExecuteTOCEntryStyleInitCode{\tb@nt@tocentrystyle}{\tb@nt@type}%
+ \def\do@endgroup{\endgroup}%
+ \def\do##1{%
+ \Ifstr{##1}{numwidth}{%
+ \l@addto@macro\do@endgroup{%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,numwidth=1.5em}%
+ }%
+ }{%
+ \Ifstr{##1}{indent}{%
+%<trace> \PackageInfo{tocbasic}{%
+%<trace> TRACE \string\DeclareNewTOC[...]{#2}:
+%<trace> set default indent 1em}%
+ \l@addto@macro\do@endgroup{%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,indent=1em}%
+ }%
+ }{}%
+ }%
+ \kernel@ifnextchar[%]
+ {\@dodefault}%
+ {}%
+ }%
+ \def\@dodefault[##1]{}%
+ \scr@dte@doopts
+ \do@endgroup
+ }{%
+ \let\tb@nt@extra@relax@opts\@empty
+% \end{macrocode}
+% After initialisation of the local values we need to know the style of the
+% toc entry, to define style dependend options.
+% \begin{macro}{\tb@nt@type}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% The type of list is used for environment and counter names and as part of
+% several internal and user macros. It is needed before defining the style
+% dependend options. So we use a first run to set it up.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{type}{%
+ \tb@ifvalueisnotempty{##1}{\edef\tb@nt@type{##1}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@tocentrystyle}
+% \changes{v3.20}{2015/12/16}{added}
+% The style of the toc entry. It is needed before defining the style
+% dependend options. So we use a first run to set it up.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{tocentrystyle}[default]{%
+ \IfArgIsEmpty{##1}{%
+ \edef\tb@nt@tocentrystyle{##1}%
+ \FamilyKeyStateProcessed
+ }{%
+ \scr@ifundefinedorrelax{scr@dte@def@l@##1}{%
+ \FamilyKeyStateUnknownValue
+ }{%
+ \edef\tb@nt@tocentrystyle{##1}%
+ \FamilyKeyStateProcessed
+ }%
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@ext}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% \changes{v3.25}{2017/11/20}{moved to pass 1}
+% Don't tell the user, that the mandatory argument of the command may be
+% overloaded by this option. This was only done to simplify the definition.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{extension}{%
+ \tb@ifvalueisnotempty{##1}{\edef\tb@nt@ext{##1}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@owner}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% \changes{v3.26}{2018/06/09}{moved to pass 1}
+% \changes{v3.27}{2019/05/12}{\opt{category} is a synonym for \opt{owner}}
+% The owner of the new list extension.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{owner}{%
+ \tb@ifvalueisnotempty{##1}{\edef\tb@nt@owner{##1}}%
+ }%
+ \DefineFamilyKey[.toc]{KOMAarg}{category}{%
+ \tb@ifvalueisnotempty{##1}{\edef\tb@nt@owner{##1}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% After this we define pseudo option \opt{@else@} to ignore all currently
+% not needed options. After this we do the first option execution run.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{@else@}{\FamilyKeyStateProcessed}%
+ \FamilyExecuteOptions[.toc]{KOMAarg}{#1}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{@else@}%
+% \end{macrocode}
+% \changes{v3.26}{2018/06/09}{add extension already after first pass}
+% First of all, every TOC needs an extension, that should be added to the
+% list of known extensions. This has to be done also, if no options has been
+% given!
+% \begin{macrocode}
+ }%
+ \expandafter\newcommand\csname ext@\tb@nt@type\endcsname{}%
+ \expandafter\let\csname ext@\tb@nt@type\endcsname\tb@nt@ext
+ \addtotoclist[\tb@nt@owner]{\csname ext@\tb@nt@type\endcsname}%
+ \IfArgIsEmpty{#1}{}{%
+% \end{macrocode}
+% For the second option pass we do not need to set up these options
+% again. So define it as no-opt.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{type}{\FamilyKeyStateProcessed}%
+ \DefineFamilyKey[.toc]{KOMAarg}{tocentrystyle}{\FamilyKeyStateProcessed}%
+ \DefineFamilyKey[.toc]{KOMAarg}{extension}{\FamilyKeyStateProcessed}%
+ \DefineFamilyKey[.toc]{KOMAarg}{category}{\FamilyKeyStateProcessed}%
+% \end{macrocode}
+% \changes{v3.20}{2015/12/16}{defining toc style depending options}
+% \changes{v3.20}{2016/06/12}{using prefix \opt{tocentry} instead of
+% \opt{toc}}
+% \changes{v3.27}{2019/10/02}{additional \opt{:}-options}
+% If the toc style is empty we won't define any \cs{l@\dots}. Otherwise we
+% need to define additional options.
+% \begin{macrocode}
+ \Ifstr{\tb@nt@tocentrystyle}{}{}{%
+ \begingroup
+ \let\scr@dte@current\tb@nt@type
+ \@ExecuteTOCEntryStyleInitCode{\tb@nt@tocentrystyle}{\tb@nt@type}%
+ \def\do@endgroup{\endgroup}%
+ \def\do##1{%
+ \l@addto@macro\do@endgroup{%
+ \l@addto@macro\tb@nt@extra@relax@opts{%
+ \RelaxFamilyKey[.toc]{KOMAarg}{toc##1}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{tocentry##1}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{tocentry##1:}%
+ }%
+ }%
+ \kernel@ifnextchar[%]
+ {\@dodefault{##1}}%
+ {\@donodefault{##1}}%
+ }%
+ \def\@donodefault##1{%
+ \l@addto@macro\do@endgroup{%
+ \DefineFamilyKey[.toc]{KOMAarg}{toc##1}{%
+ \PackageWarning{tocbasic}{you should use `tocentry##1'
+ instead\MessageBreak
+ of `toc##1'}%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
+ \FamilyKeyStateProcessed
+ }%
+ \DefineFamilyKey[.toc]{KOMAarg}{tocentry##1}{%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
+ \FamilyKeyStateProcessed
+ }%
+ \DefineFamilyKey[.toc]{KOMAarg}{tocentry##1:}{%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,##1:={####1}}%
+ }%
+ }%
+ }%
+ \def\@dodefault##1[##2]{%
+ \l@addto@macro\do@endgroup{%
+ \DefineFamilyKey[.toc]{KOMAarg}{toc##1}[##2]{%
+ \PackageWarning{tocbasic}{you should use `tocentry##1'
+ instead\MessageBreak
+ of `toc##1'}%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
+ \FamilyKeyStateProcessed
+ }%
+ \DefineFamilyKey[.toc]{KOMAarg}{tocentry##1}[##2]{%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
+ \FamilyKeyStateProcessed
+ }%
+ \DefineFamilyKey[.toc]{KOMAarg}{tocentry##1:}{%
+ \l@addto@macro{\tb@nt@tocstyle@options}{,##1:={####1}}%
+ }%
+ }%
+ }%
+ \scr@dte@doopts
+ \do@endgroup
+ }%
+% \end{macrocode}
+% After this, we need to define all the other options and do the real option
+% execution.
+% \begin{macro}{\tb@nt@atbegin}
+% \changes{v3.09}{2011/03/01}{new optional identifier \opt{atbegin}}
+% \changes{v3.11c}{2013/02/01}{\opt{atbegin} argument may be empty}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% Additional code executed at the begin of a new defined environment.
+% \begin{macrocode}
+ \FamilyStringKey[.toc]{KOMAarg}{atbegin}{\tb@nt@atbegin}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@atend}
+% \changes{v3.09}{2011/03/01}{new optional identifier \opt{atbend}}
+% \changes{v3.11c}{2013/02/01}{\opt{atend} argument may be empty}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% Additional code executed at the end of a new defined environment.
+% \begin{macrocode}
+ \FamilyStringKey[.toc]{KOMAarg}{atend}{\tb@nt@atend}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@counterwithin}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% If a counter will be defined, this counter may depend on another counter
+% (like figure counter depends on chapter counter at book classes). If the
+% value is empty, the counter does not depend on any other counter.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{counterwithin}{%
+ \edef\tb@nt@counterwithin{##1}\FamilyKeyStateProcessed
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\iftb@nt@float}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% \changes{v3.06}{2010/06/01}{added}
+% This boolean indicates, that float environments should also be defined.
+% \begin{macrocode}
+ \FamilyBoolKey[.toc]{KOMAarg}{float}{tb@nt@float}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@floatpos}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% Simply the value for the |\fps@...| macro.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{floatpos}{%
+ \tb@ifvalueisnotempty{##1}{\edef\tb@nt@floatpos{##1}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@floattype}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% Simply the value for the |\ftype@...| macro. It has to be
+% $1<=\textrm{value}<=31$.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{floattype}{%
+ \FamilySetCounterMacro{KOMAarg}{floattype}{\reserved@d}{##1}%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \ifnum 0=
+ \ifnum\reserved@d<1 0 \else\ifnum\reserved@d>31 0 \else 1 \fi\fi
+ \FamilyKeyStateUnknownValue
+ \else
+ \let\tb@nt@floattype\reserved@d
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\iftb@nt@forcenames}
+% \changes{v3.06}{2010/06/01}{added}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% The |\...name| commands will only be defined, if they are not already
+% defined. But some users may want to define their own names even if there
+% are already definitions. So this boolean option may switch to force the
+% definition.
+% \begin{macrocode}
+ \FamilyBoolKey[.toc]{KOMAarg}{forcenames}{tb@nt@forcenames}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[noprint]{\tb@nt@hang}
+% \changes{v3.20}{2015/12/16}{removed}
+% \end{macro}
+% Earch entry of a TOC/list of is idented on the left side. This is the
+% amount of the indention of the text of the entry.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{hang}{%
+ \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocnumwidth}{%
+ \PackageWarning{tocbasic}{%
+ deprecated option `hang'.\MessageBreak
+ Option will be ignored, because toc entry style\MessageBreak
+ `\tb@nt@tocentrystyle' does not provide option `numwidth'%
+ }%
+ }{%
+ \PackageWarning{tocbasic}{%
+ deprecated option `hang'.\MessageBreak
+ You should replace option `hang' by option\MessageBreak
+ `tocentrynumwidth'%
+ }%
+ \l@addto@macro\tb@nt@tocstyle@options{,numwidth={##1}}%
+ }%
+ \FamilyKeyStateProcessed
+ }%
+ \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocnumwidth}{}{%
+ \l@addto@macro\tb@nt@tocstyle@options{,numwidth=1.5em}%
+ }%
+% \end{macrocode}
+% \begin{macro}[noprint]{\tb@nt@indent}
+% \changes{v3.20}{2015/12/16}{removed}
+% \end{macro}
+% Earch entry of a TOC/list of is idented on the left side. This is the
+% amount of the indention of the number part.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{indent}{%
+ \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocindent}{%
+ \PackageWarning{tocbasic}{%
+ deprecated option `indent'.\MessageBreak
+ Option will be ignored, because toc entry style\MessageBreak
+ `\tb@nt@tocentrystyle' does not provide option `indent'%
+ }%
+ }{%
+ \PackageWarning{tocbasic}{%
+ deprecated option `indent'.\MessageBreak
+ You should replace option `indent' by option\MessageBreak
+ `tocentryindent'%
+ }%
+ \l@addto@macro\tb@nt@tocstyle@options{,indent={##1}}%
+ }%
+ \FamilyKeyStateProcessed
+ }%
+ \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocindent}{}{%
+%<trace> \PackageInfo{tocbasic}{%
+%<trace> TRACE \string\DeclareNewTOC[...]{#2}: set default indent 1em}%
+ \l@addto@macro\tb@nt@tocstyle@options{,indent=1em}%
+ }%
+% \end{macrocode}
+% \begin{macro}[noprint]{\tb@nt@level}
+% \changes{v3.20}{2015/12/16}{removed}
+% \end{macro}
+% \changes{v3.30}{2020/02/25}{spurious space in warning message removed}
+% Each entry to a TOC/list of has a numeric level. You may set up your own
+% level.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{level}{%
+ \PackageWarning{tocbasic}{%
+ deprecated option `level'.\MessageBreak
+ You should replace option `level' by option\MessageBreak
+ `tocentrylevel'%
+ }%
+ \l@addto@macro\tb@nt@tocstyle@options{,level={##1}}%
+ \FamilyKeyStateProcessed
+ }%
+% \end{macrocode}
+% \begin{macro}{\tb@nt@listname}
+% \changes{v3.18}{2015/06/20}{using \cs{def} instead of \cs{edef}}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% The list itself has a heading. A |\list<type>name| will also be defined.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{listname}{%
+ \tb@ifvalueisnotempty{##1}{\def\tb@nt@listname{##1}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@name}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% We need a name/term for the entries of the new list. This may e.\,g. be used
+% for |caption| output. A |\<type>name| will also be defined.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{name}{%
+ \tb@ifvalueisnotempty{##1}{\edef\tb@nt@name{##1}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\iftb@nt@nonfloat}
+% \changes{v3.06}{2010/06/01}{added}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% This boolean indicates, that non-float environment should also be
+% defined. The environment has the postfix ``-''.
+% \begin{macrocode}
+ \FamilyBoolKey[.toc]{KOMAarg}{nonfloat}{tb@nt@nonfloat}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@nt@types}
+% \changes{v3.20}{2015/12/16}{locally valid only}
+% Sometimes the plural of the type is needed and may be defined by a
+% seperate option.
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{types}{%
+ \tb@ifvalueisnotempty{##1}{\edef\tb@nt@types{##1}}%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \changes{v3.25}{2017/11/20}{option \opt{setup} added}
+% The new option \opt{setup} allowes to setup ToC features provided by
+% \cs{setuptoc}. Note, currently there is no test whether or not a feature
+% does exist!
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{setup}{%
+ \setuptoc\tb@nt@ext{##1}%
+ }%
+% \end{macrocode}
+% \changes{v3.25}{2017/11/20}{option \opt{unset} added}
+% The new option \opt{unset} allowes to unset ToC features provided
+% by \cs{unsettoc}. Note, currently there is no test whether or not a
+% feature does exist!
+% \begin{macrocode}
+ \DefineFamilyKey[.toc]{KOMAarg}{unset}{%
+ \unsettoc\tb@nt@ext{##1}%
+ }%
+% \end{macrocode}
+% Last but not least we have to execute the options and reset the option
+% definitions.
+% \changes{v3.25}{2017/09/27}{\opt{nonfloat} fixed}
+% \changes{v3.26}{2018/06/09}{added missing reset of \opt{unset} and
+% \opt{setup}}
+% \begin{macrocode}
+ \FamilyExecuteOptions[.toc]{KOMAarg}{#1}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{unset}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{setup}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{types}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{nonfloat}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{name}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{listname}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{level}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{indent}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{hang}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{forcenames}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{floatpos}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{float}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{counterwithin}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{atend}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{atbegin}%
+ \tb@nt@extra@relax@opts
+ \RelaxFamilyKey[.toc]{KOMAarg}{category}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{owner}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{extension}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{tocentrystyle}%
+ \RelaxFamilyKey[.toc]{KOMAarg}{type}%
+ }%
+% \end{macrocode}
+% We save the type of the extension at \cs{tb@nt@type@\meta{extension}}
+% for later usage.
+% \begin{macrocode}
+ \expandafter\let\csname tb@nt@type@\tb@nt@ext\endcsname\tb@nt@type
+% \end{macrocode}
+% Then we need the TOC itself with a name:
+% \changes{v3.25}{2017/10/10}{use \cs{ext@\dots} instead of the extension
+% itself in definition of \cs{listof\dots}}
+% \begin{macrocode}
+ \scr@ifundefinedorrelax{tb@nt@types}{%
+ \edef\tb@nt@types{\tb@nt@type s}%
+ }{}%
+ \scr@ifundefinedorrelax{tb@nt@listname}{%
+ \protected@edef\tb@nt@listname{List of \protect\MakeUppercase\tb@nt@types}%
+ }{}%
+ \@ifundefined{\tb@nt@type name}{%
+ \expandafter\protected@edef\csname \tb@nt@type name\endcsname{\tb@nt@name}%
+ }{%
+ \iftb@nt@forcenames
+ \expandafter\protected@edef\csname \tb@nt@type name\endcsname
+ {\tb@nt@name}%
+ \fi
+ }%
+ \@ifundefined{list\tb@nt@type name}{%
+ \expandafter\let\csname list\tb@nt@type name\endcsname\tb@nt@listname
+ }{%
+ \iftb@nt@forcenames
+ \expandafter\let\csname list\tb@nt@type name\endcsname\tb@nt@listname
+ \fi
+ }%
+ \expandafter\newcommand\csname listof\tb@nt@ext name\expandafter\endcsname
+ \expandafter{\csname list\tb@nt@type name\endcsname}%
+ \begingroup\edef\@tempa{\endgroup
+ \noexpand\newcommand*\csname listof\tb@nt@types\endcsname{%
+ \noexpand\listoftoc{%
+ \expandafter\noexpand\csname ext@\tb@nt@type\endcsname}%
+ }%
+ }\@tempa
+% \end{macrocode}
+% The list entry:
+% \changes{v3.20}{2016/04/05}{warning if \cs{l@\dots} is undefined}
+% \begin{macrocode}
+ \Ifstr{\tb@nt@tocentrystyle}{}{%
+ \@ifundefined{l@\tb@nt@type}{%
+ \PackageWarning{tocbasic}{%
+ \expandafter\string\csname l@\tb@nt@type\endcsname\space
+ undefined!\MessageBreak
+ I hope you know, what you are doing, but\MessageBreak
+ maybe it would be better to use proper\MessageBreak
+ `tocentrystyle' settings%
+ }%
+ }{}%
+ }{%
+ \edef\reserved@a{%
+ \noexpand\DeclareTOCStyleEntry[%
+ {\unexpanded\expandafter{\tb@nt@tocstyle@options}}%
+ ]{\tb@nt@tocentrystyle}{\tb@nt@type}%
+ }%
+ \reserved@a
+ }%
+% \end{macrocode}
+% \changes{v3.12}{2013/05/03}{fixed: definition of
+% \cs{listof\meta{type}entryname} added as explained in the manual}
+% \begin{macrocode}
+ \@ifundefined{listof\tb@nt@ext entryname}{%
+ \expandafter\let\csname listof\tb@nt@ext entryname\endcsname\tb@nt@name
+ }{}%
+% \end{macrocode}
+% The setup command:
+% \begin{macrocode}
+ \begingroup\edef\@tempa{\endgroup
+ \noexpand\newcommand*\csname setup\tb@nt@types\endcsname{%
+ \noexpand\setuptoc{\tb@nt@ext}%
+ }%
+ }\@tempa
+ \@tempswafalse
+% \end{macrocode}
+% The float environments:
+% \changes{v3.09a}{2011/05/30}{fixed: floats may have an optional argument}
+% \changes{v3.12}{2013/12/10}{fixed: usage of default placement}
+% \begin{macrocode}
+ \iftb@nt@float
+ \expandafter\newcommand\expandafter*\csname fps@\tb@nt@type\expandafter
+ \endcsname\expandafter{\tb@nt@floatpos}%
+ \expandafter\newcommand\expandafter*\csname ftype@\tb@nt@type\expandafter
+ \endcsname\expandafter{\tb@nt@floattype}%
+ \begingroup
+ \edef\@tempa{%
+ \noexpand\endgroup
+ \noexpand\newenvironment{\tb@nt@type}{%
+ \noexpand\kernel@ifnextchar[%]
+ {\noexpand\tb@atbegin@after\noexpand\@float{\tb@nt@type}}%
+ {\noexpand\edef\noexpand\reserved@a{%
+ \noexpand\noexpand\noexpand\tb@atbegin@after
+ \noexpand\noexpand\noexpand\@float{\tb@nt@type}%
+ [\noexpand\csname fps@\tb@nt@type\noexpand\endcsname]}%
+ \noexpand\reserved@a}%
+ }{%
+ \noexpand\csname \tb@nt@type @atend\noexpand\endcsname
+ \noexpand\end@float
+ }%
+ \noexpand\newenvironment{\tb@nt@type*}{%
+ \noexpand\kernel@ifnextchar[%]
+ {\noexpand\tb@atbegin@after\noexpand\@dblfloat{\tb@nt@type}}%
+ {\noexpand\edef\noexpand\reserved@a{%
+ \noexpand\noexpand\noexpand\tb@atbegin@after
+ \noexpand\noexpand\noexpand\@dblfloat{\tb@nt@type}%
+ [\noexpand\csname fps@\tb@nt@type\noexpand\endcsname]}%
+ \noexpand\reserved@a}%
+ }{%
+ \noexpand\csname \tb@nt@type @atend\noexpand\endcsname
+ \noexpand\end@dblfloat
+ }%
+ }%
+ \@tempa
+ \@tempswatrue
+ \fi
+% \end{macrocode}
+% The nonfloat environment:
+% \begin{macrocode}
+ \iftb@nt@nonfloat
+ \begingroup
+ \edef\@tempa{%
+ \noexpand\endgroup
+ \noexpand\newenvironment{\tb@nt@type-}{%
+ \noexpand\trivlist\noexpand\item\noexpand\relax
+ \noexpand\minipage{\noexpand\linewidth}%
+ \noexpand\def\noexpand\@captype{\tb@nt@type}%
+ \noexpand\csname \tb@nt@type @atbegin\noexpand\endcsname
+ }{%
+ \noexpand\csname \tb@nt@type @atend\noexpand\endcsname
+ \noexpand\endminipage\noexpand\endtrivlist
+ }%
+ }%
+ \@tempa
+ \@tempswatrue
+ \fi
+% \end{macrocode}
+% The counter and hooks of float and nonfloat environments:
+% \changes{v3.10b}{2012/04/04}{\cs{noexpand} added to fix problems using
+% \cs{autodot}}
+% \changes{v3.13}{2014/07/31}{add \cs{autodot} only to hierachical
+% counters}
+% \changes{v3.35}{2021/10/12}{ignore \opt{counterwithin} if it is
+% ``\texttt{chapter}'' resp. ``\texttt{section}'' and \cs{if@mainmatter} is
+% not \cs{iffalse} and the counterwithin counter is < 1}
+% \changes{v3.37}{2022/05/24}{mainmatter test fixed}
+% \begin{macrocode}
+ \if@tempswa
+ \@ifundefined{c@\tb@nt@type}{%
+ \newcounter{\tb@nt@type}%
+ }{%
+ \PackageWarning{tocbasic}{using already defined counter `\tb@nt@type'}%
+ }%
+ \ifx\tb@nt@counterwithin\@empty\else
+ \@addtoreset{\tb@nt@type}{\tb@nt@counterwithin}%
+ \begingroup
+ \def\reserved@c{section}%
+ \@ifundefined{chapter}{}{%
+ \@ifundefined{c@chapter}{}{%
+ \@ifundefined{l@chapter}{}{%
+ \def\reserved@c{chapter}}}}%
+ \expandafter\Ifstr\expandafter{\reserved@c}{\tb@nt@counterwithin}{%
+ \edef\@tempa{%
+ \noexpand\endgroup
+ \noexpand\renewcommand*\expandafter\noexpand
+ \csname the\tb@nt@type\endcsname{%
+ \unexpanded{%
+ \expandafter\ifx\csname if@mainmatter\expandafter\endcsname
+ \csname iffalse\endcsname\else
+ }%
+ \noexpand\ifnum
+ \expandafter\noexpand\csname c@\tb@nt@counterwithin\endcsname
+ >\noexpand\z@
+ \expandafter\noexpand\csname the\tb@nt@counterwithin\endcsname
+ .%
+ \noexpand\fi
+ \noexpand\fi
+ \noexpand\arabic{\tb@nt@type}%
+ }%
+ }%
+ }{%
+ \edef\@tempa{%
+ \noexpand\endgroup
+ \noexpand\renewcommand*\expandafter\noexpand
+ \csname the\tb@nt@type\endcsname{%
+ \expandafter\noexpand\csname the\tb@nt@counterwithin\endcsname
+ .%
+ \noexpand\arabic{\tb@nt@type}%
+ }%
+ }%
+ }%
+ \@tempa
+ \fi
+ \begingroup
+ \edef\@tempa{%
+ \noexpand\endgroup
+ \noexpand\newcommand*\expandafter\noexpand
+ \csname \tb@nt@type format\endcsname{%
+ \expandafter\noexpand\csname \tb@nt@type name\endcsname
+ \noexpand\nobreakspace
+ \expandafter\noexpand\csname the\tb@nt@type\endcsname
+ \ifx\tb@nt@counterwithin\@empty\else
+ \noexpand\csname autodot\endcsname
+ \fi
+ }%
+ \noexpand\newcommand*\expandafter\noexpand
+ \csname fnum@\tb@nt@type\endcsname{%
+ \expandafter\noexpand\csname \tb@nt@type format\endcsname
+ }%
+ }%
+ \@tempa
+ \expandafter\newcommand\expandafter*\csname \tb@nt@type @atbegin\expandafter
+ \endcsname\expandafter{\tb@nt@atbegin}%
+ \expandafter\newcommand\expandafter*\csname \tb@nt@type @atend\expandafter
+ \endcsname\expandafter{\tb@nt@atend}%
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\tb@atbegin@after}
+% \changes{v3.09a}{2011/05/30}{added}
+% Processes command \#1 with argument \#2 and optional argument \#3 and than
+% \verb|\csname #2@atbegin\endcsname|. This is used to add
+% \verb|csname #2@atbegin\endcsname| at begin part of a float (but after
+% optional argument of the float).
+% \begin{macrocode}
+\newcommand*{\tb@atbegin@after}[3]{}
+\def\tb@atbegin@after#1#2[#3]{%
+ #1{#2}[#3]%
+ \csname #2@atbegin\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\tb@ifvalueisnotempty}
+% \changes{v3.06}{2010/05/21}{added}
+% \changes{v3.20}{2015/12/16}{simpler definition}
+% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
+% This is only a helper for defining some of the keys.
+% \begin{macrocode}
+\newcommand*{\tb@ifvalueisnotempty}[1]{%
+ \Ifstr{#1}{}{%
+ \FamilyKeyStateUnknownValue
+ \expandafter\@gobble
+ }{%
+ \FamilyKeyStateProcessed
+ \expandafter\@firstofone
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[noprint]{\tb@boolkey,\tb@dimkey,\tb@numkey}
+% \changes{v3.06}{2010/05/21}{added}
+% \changes{v3.20}{2015/12/16}{removed}
+% \end{macro}
+% \begin{macro}{\tb@nt@autofloattype}
+% \changes{v3.06}{2010/06/01}{added}
+% This macro saves the float type for auto generated float types.
+% \begin{macrocode}
+\newcommand*{\tb@nt@autofloattype}{16}
+%</body>
+% \end{macrocode}
+% \end{macro}
+% \end{command}
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \subsection{Loading the package}
+% Used at \KOMAScript{} packages and classes to load the package.
+% \begin{macrocode}
+%<*load>
+\RequirePackage{tocbasic}[%
+%!KOMAScriptVersion
+]
+%</load>
+% \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: