diff options
Diffstat (limited to 'macros/latex/contrib/koma-script/tocbasic.dtx')
-rw-r--r-- | macros/latex/contrib/koma-script/tocbasic.dtx | 2003 |
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: |