% \iffalse meta-comment % ====================================================================== % tocbasic.dtx % Copyright (c) Markus Kohm, 2008-2023 % % This file is part of the LaTeX2e KOMA-Script bundle. % % This work may be distributed and/or modified under the conditions of % the LaTeX Project Public License, version 1.3c of the license. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2005/12/01 or later and of this work. % % This work has the LPPL maintenance status "author-maintained". % % The Current Maintainer and author of this work is Markus Kohm. % % This work consists of all files listed in MANIFEST.md. % ====================================================================== %%% From File: $Id: tocbasic.dtx 4067 2023-06-28 14:37:03Z kohm $ %%%% (run: identify) %%%% (run: prepare) % % \end{macrocode} % % Now we can load \pkg{xparse} if needed, which also would load \pkg{expl3}: % \begin{macrocode} %<*prepare> \scr@ifundefinedorrelax{NewDocumentCommand}{% \RequirePackage{xparse}[2018-04-12]% }{} % % \end{macrocode} % % % \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} %<*execoption> \ProcessOptions\relax % % \end{macrocode} % % % \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} % % \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{macro}{\tb@optowner} % \changes{v3.41}{2023/06/28}{new} % Several of the following commands use an optional argument for the % owner. Almost always if the argument is not given but \cs{@currname} is not % empty \texttt{\cs{@currname}.\cs{@currext}} should be used. If the argument % is not given but \cs{@currname} is empty, an empty value should be used. And % if the optional argument is given, it should be used unchanged. So here is a % helper macro for exactly this logic. Note, that argument here is not % optional but mandatory and should be an optional argument of % \cs{NewDocumentCommand}. % \begin{macrocode} \newcommand*{\tb@optowner}[1]{% \IfValueTF{#1}{% #1% }{% \ifx\@currname\@empty\else \@currname.\@currext% \fi }% } % \end{macrocode} % \end{macro} % \begin{command}{\addtotoclist} % \changes{v3.06a}{2010/09/14}{expand the arguments while adding them to the % internal list} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % 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} \NewDocumentCommand\addtotoclist{om}{% \edef\reserved@b{\tb@optowner{#1}}% \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 \edef\reserved@a{% \noexpand\g@addto@macro\noexpand\tb@listoftocs{% \noexpand\do{#2}{\reserved@b}}}\reserved@a \endgroup \ifx\reserved@b\@empty\else \@ifundefined{tb@\reserved@b @add@hook}{}{% \edef\reserved@a{% \noexpand\def\noexpand\@currext{#2}% \noexpand\@nameuse{tb@\reserved@b @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} % \begin{macro}[noprint]{\@addtotoclist,\scr@addtotoclist, % \@@addtotoclist,\scr@@addtotoclist} % \changes{v1.0a}{2008/11/11}{\cs{@addtotoclist} renamed to % \cs{scr@addtotoclist} because of package \pkg{flowfram}} % \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}} % \changes{v3.41}{2023/06/28}{removed} % \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}} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % 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} \NewDocumentCommand\AtAddToTocList{o}{% \edef\reserved@a{\tb@optowner{#1}}% \@ifundefined{tb@\reserved@a @add@hook}% {\@namedef{tb@\reserved@a @add@hook}{}}% {}% \expandafter\g@addto@macro\csname tb@\reserved@a @add@hook\endcsname } % \end{macrocode} % \begin{macro}[noprint]{\@AtAddToTocList,\@@AtAddToTocList} % \changes{v3.41}{2023/06/28}{removed} % \end{macro} % \end{command} % % \begin{macro}{\tocbasic@extend@babel} % \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by % \cs{Iftocfeature}} % \changes{v3.38}{2022/07/22}{first test feature than availability} % 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]{% \Iftocfeature{#1}{nobabel}{% \PackageInfo{tocbasic}{omitting babel extension for `#1'\MessageBreak because of feature `nobabel' available\MessageBreak for `#1'}% }{% \scr@ifundefinedorrelax{bbl@set@language}{% \PackageInfo{tocbasic}{omitting babel extension for `#1'\MessageBreak because of missing \string\bbl@set@language}% }{% % \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}} % \changes{v3.22}{2016/09/06}{missing \cs{global} added} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % 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} \NewDocumentCommand\removefromtoclist{om}{% \begingroup \let\tb@oldlist\tb@listoftocs \edef\reserved@b{#2}% \global\let\tb@listoftocs\empty \def\do##1##2{% \edef\reserved@a{##1}% \ifx\reserved@a\reserved@b \IfValueT{#1}{% \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 }% \tb@oldlist \endgroup } % \end{macrocode} % \begin{macro}[noprint]{\scr@removefromtoclist,\@removefromtoclist, % \scr@@removefromtoclist,\@@removefromtoclist} % \changes{v3.28}{2019/11/22}{\cs{@removefromtoclist} renamed to % \cs{scr@removefromtoclist}} % \changes{v3.28}{2019/11/22}{\cs{@@removefromtoclist} renamed to % \cs{scr@removefromtoclist}} % \changes{v3.41}{2023/06/28}{removed} % \end{macro} % \end{command} % % \begin{command}{\doforeachtocfile} % \changes{v3.09}{2011/03/01}{\cs{@currext} defined using \cs{edef} instead % of \cs{def}} % \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by % \cs{kernel@ifnextchar}} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % 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} \NewDocumentCommand\doforeachtocfile{o+m}{% \IfValueTF{#1}{% \def\do##1##2{% \edef\reserved@a{#1}\edef\reserved@b{##2}% \ifx\reserved@a\reserved@b \edef\@currext{##1}#2\fi }% }{% \def\do##1##2{\edef\@currext{##1}#2}% }% \edef\reserved@a{% \noexpand\tb@listoftocs \noexpand\def\noexpand\@currext{\@currext}% }\reserved@a % \end{macrocode} % \changes{v3.41}{2023/05/16}{don't \cs{let}\cs{do}\cs{relax}} % Former versions of \KOMAScript{} have used |\let\do\relax| to undefined % \cs{do} after the walk-through. But some packages like \pkg{dynkin-diagrams} % have had problems using \cs{renewcommand} instead of \cs{def} or \cs{let} to % change \cs{do}. So from version 3.41 \KOMAScript{} has changed this to % |\let\do\noexpand|, because this is the default of \LaTeX{} after % |\begin{document}|. However, this is only a workaround for a % workaround. Best would be to remove the final change of \cs{do}. But this % could also break packages. % \begin{macrocode} \let\do\noexpand } % \end{macrocode} % \begin{macro}[noprint]{\@doforeachtocfile,\@@doforeachtocfile} % \changes{v3.41}{2023/06/28}{removed} % \end{macro} % \end{command} % % \begin{command}{\addtoeachtocfile} % \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by % \cs{kernel@ifnextchar}} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % 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} \NewDocumentCommand\addtoeachtocfile{o+m}{% \doforeachtocfile[{#1}]{\addtocontents{\@currext}{#2}}% } % % \end{macrocode} % \begin{macro}[noprint]{\@addtoeachtocfile,\@@addtoeachtocfile} % \changes{v3.03b}{2009/06/08}{typo fix at usage of \cs{doforeachtocfile}} % \changes{v3.41}{2023/06/28}{removed} % \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}} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % Something like a combination of \cs{addtoeachtocfile} and % \cs{addcontentsline}. % \begin{macrocode} %<*body> \NewDocumentCommand\addcontentslinetoeachtocfile{omm}{% \doforeachtocfile[{#1}]{\addcontentsline{\@currext}{#2}{#3}}% } % \end{macrocode} % \begin{macro}[noprint]{\@addcontentslinetoeachtocfile, % \@@addcontentslinetoeachtocfile} % \changes{v3.41}{2023/06/28}{removed} % \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}} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % 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} \NewDocumentCommand\addxcontentsline{mmO{}m}{% \scr@ifundefinedorrelax{add#2#1entry}{% \tocbasic@addxcontentsline{#1}{#2}{#3}{#4}% }{% \@nameuse{add#2#1entry}{#3}{#4}% }% } % \end{macrocode} % \begin{macro}[noprint]{\@addxcontentsline} % \changes{v3.12}{2013/09/24}{added} % \changes{v3.41}{2023/06/28}{removed} % \end{macro} % \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{macro}{\tocbasic@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]{% \IfArgIsEmpty{#3}{% \addcontentsline{#1}{#2}{\protect\nonumberline#4}% }{% \addcontentsline{#1}{#2}{\protect\numberline{#3}#4}% }% } % \end{macrocode} % \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}} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % Similar to \cs{addcontentslinetoeachtocfile} using % \cs{addxcontentsline} instead of \cs{addcontentsline}. % \begin{macrocode} \NewDocumentCommand\addxcontentslinetoeachtocfile{omom}{% \doforeachtocfile[{#1}]{\addxcontentsline{\@currext}{#2}[{#3}]{#4}} } % % \end{macrocode} % \begin{macro}[noprint]{\@addxcontentslinetoeachtocfile, % \@@addxcontentslinetoeachtocfile, % \@@@addxcontentslinetoeachtocfile, % \@@@@addxcontentslinetoeachtocfile} % \changes{v3.12}{2013/09/24}{added} % \changes{v3.41}{2023/06/28}{removed} % \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 \IfArgIsEmpty{#1}{any toc}{`#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 \IfArgIsEmpty{#1}{any toc}{`#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.03b}{2009/06/08}{typo fix at usage of \cs{doforeachtocfile}} % \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by % \cs{kernel@ifnextchar}} % \changes{v3.41}{2023/06/28}{using \cs{NewDocumentCommand} to not need all % the helpers} % Another example of using \cs{doforeachtocfile}. % \begin{macrocode} \NewDocumentCommand\listofeachtoc{o}{% \doforeachtocfile[{#1}]{\listoftoc{\@currext}}% } % \end{macrocode} % \begin{macro}[noprint]{\@listofeachtoc,\@@listofeachtoc} % \changes{v3.41}{2023/06/28}{removed} % \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 \IfArgIsEmpty{#1}{each toc}{`#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 \IfArgIsEmpty{#1}{each toc}{`#1'}}% % \expandafter\global\expandafter\let\csname tb@#1@afterhead@hook\endcsname \@empty }{}% \expandafter\g@addto@macro\csname tb@#1@afterhead@hook\endcsname{#2}% } % % \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 }% }{}% } % % \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} %<*deprecated> \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 }% } % % \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}% }% }% } % % \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}% % \end{macrocode} % \begin{description} % \item[ToDo:] We still do not use \cs{MakeTitlecase} of \LaTeX{} from % 2022/06/01~PL\,5 here (and later), because \pkg{hyperref} 2022-06-20 % v7.00s is still not able to process it. So we would get a warning message % instead of switching to uppercase. But maybe in some future, this could be % changed. % \end{description} % \begin{macrocode} \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}{% % \PackageInfo{tocbasic}{% % TRACE \string\DeclareNewTOC[...]{#2}: % 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}{}{% % \PackageInfo{tocbasic}{% % 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 |\listname| 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 |\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} % % \end{macrocode} % \end{macro} % \end{command} % % % \begin{macrocode} % % \end{macrocode} % % \subsection{Loading the package} % Used at \KOMAScript{} packages and classes to load the package. % \begin{macrocode} %<*load> \RequirePackage{tocbasic}[% %!KOMAScriptVersion ] % % \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: