% \iffalse meta-comment
% ======================================================================
% scrkernel-tocstyle.dtx
% Copyright (c) Markus Kohm, 2015-2025
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c of the license.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX 
% version 2005/12/01 or later and of this work.
%
% This work has the LPPL maintenance status "author-maintained".
%
% The Current Maintainer and author of this work is Markus Kohm.
%
% This work consists of all files listed in MANIFEST.md.
% ======================================================================
%%% From File: $Id: scrkernel-tocstyle.dtx 4196 2025-08-15 09:12:57Z kohm $
% The runs of run-time file generation:
%<preidentify>%%%            (run: preidentify)
% - everything that is needed before selfidentification of resulting files
%   (unused)
%<identify>%%%            (run: identify)
% - everything that is needed for selfidentification of resulting files
%   (unused)
%<prepare>%%%            (run: prepare)
% - everything that is needed to define options
%<option>%%%            (run: option)
% - definition of options (unused)
%<execoption>%%%            (run: execoption)
% - initial option executions up to \KOMAProcessOptions 
%   (unused)
%<body>%%%            (run: body)
% - everything, that should be done after \KOMAProcessOptions
%<exit>%%%            (run: exit)
% - everything, that should be done immediately before leaving the file
%   (unused) 
%<*dtx>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
  \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
  \filedate$Date: 2025-08-15 11:12:57 +0200 (Fr, 15. Aug 2025) $
  \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
  \filerevision$Revision: 4196 $
  \edef\reserved@a{%
    \noexpand\endgroup
    \noexpand\ProvidesFile{scrkernel-tocstyle.dtx}%
                          [\filedate\space\filerevision\space
                           KOMA-Script source (TOC styles)]
  }%
\reserved@a
\documentclass[USenglish]{koma-script-source-doc}
\usepackage{babel}
\setcounter{StandardModuleDepth}{3}
\begin{document}
\DocInput{scrkernel-tocstyle.dtx}
\end{document}
%</dtx>
% \fi
%
% \changes{v3.20}{2015/11/13}{added}
% \changes{v3.36}{2022/02/14}{switch over from \cls*{scrdoc} to
%   \cls*{koma-script-source-doc}}
% \changes{v3.36}{2022/02/14}{whole implementation documentation in English}
% \changes{v3.40}{2023/04/17}{guide names changed}
%
% \GetFileInfo{scrkernel-tocstyle.dtx}
% \title{The Predifined Directory Styles of
%   \href{https://komascript.de}{\KOMAScript} Package \pkg*{tocbasic} and the
%   \href{https://komascript.de}{\KOMAScript} Classes}
% \author{\href{mailto:komascript@gmx.info}{Markus Kohm}}
% \date{Revision \fileversion{} of \filedate}
% \maketitle
% \begin{abstract}
%   \file{scrkernel-tocstyle.dtx} provides the predefined directory (or ToC)
%   styles. The basic styles of \pkg*{tocbasic} are defined independent from
%   the \KOMAScript{} classes. However, the \KOMAScript{} classes define their
%   own styles depending on the styles of \pkg*{tocbasic}.
% \end{abstract}
% \tableofcontents
%
% \section{User Manual}
%
% You can find the user documentation the commands implemented here in the
% \KOMAScript{} manual, either the German \file{scrguide-de.pdf} or the
% English \file{scrguide-en.pdf}.
% 
% \MaybeStop{\PrintIndex}
%
% \section{Implementation of the Basic ToC Styles of Package
%  \pkg*{tocbasic} and the Specific ToC Styles of the \KOMAScript{} classes}
%
% \subsection{Settings independent from directories but nevertheless basis for
% them}
%
% Before \KOMAScript~3.20 the commands here were part of the \KOMAScript{}
% classes. But now they are part of package \pkg*{tocbasic}, because they
% are more basic than only to be used by the \KOMAScript{} classes.
%
%
% \begin{command}{\numberline}
% \changes{v3.20}{2016/03/10}{\cs{numberline} defined indirectly by
%   \cs{scr@numberline}}
% \begin{macro}{\scr@numberline}
% \changes{v2.3c}{1995/08/06}{\cs{numberline} redefined}
% \changes{v3.06}{2010/05/18}{Usage of\cs{numberline@prefix} and
%   \cs{numberline@postfix}}
% \changes{v3.12}{2013/11/22}{use \cs{numberline@numberformat} only, if the
%   argument expands to a non-empty string}
% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed into \cs{Ifstr}}
% This macro is used indirectly in the ToC and has to be redefined to fulfil
% rules~5 and 6 of DUDDEN, 20th edition.
%    \begin{macrocode}
%<*package&body>
\newcommand*{\scr@numberline}[1]{%
  \numberline@box{%
    \numberline@prefix
    \Ifstr{#1}{}{#1}{%
      \numberline@numberformat{#1}%
    }%
    \numberline@postfix
  }%
}
%    \end{macrocode}
% \begin{command}{\usetocbasicnumberline}
% \changes{v3.20}{2016/03/15}{added}
% The macro tests, whether \cs{numberline} used \cs{scr@numberline}. If not,
% the optional argument is executed and a afterwards \cs{numberline} is
% redefined.
%    \begin{macrocode}
\newcommand*{\usetocbasicnumberline}[1][%
  \PackageInfo{tocbasic}{Using my definition of `\string\numberline'}%
]{%
  \@tempswatrue
  \begingroup
    \def\scr@numberline##1{\global\@tempswafalse}%
%    \end{macrocode}
% For \cs{numberline} \cs{@tempdima} usually is the width reserved for the
% number. To avoid problems with to low values, we use the maximum value for
% the test.
%    \begin{macrocode}
    \@tempdima\maxdimen
    \sbox\@tempboxa{\numberline{0}}%
  \endgroup
  \if@tempswa #1\renewcommand*{\numberline}[1]{\scr@numberline{##1}}\fi
}
%    \end{macrocode}
% \end{command}^^A \usetocbasicnumberline
% \begin{macro}{\numberline@prefix}
% \changes{v3.06}{2010/05/18}{added}
% The default is just empty. It can be used, e.g., to print something before
% the number or to make the number right aligned.
%    \begin{macrocode}
\newcommand*{\numberline@prefix}{}
%    \end{macrocode}
% \end{macro}^^A \numberline@prefix
% \begin{macro}{\numberline@postfix}
% \changes{v3.06}{2010/05/18}{added} 
% The default is \cs{hfil} to make the number left aligned.
%    \begin{macrocode}
\newcommand*{\numberline@postfix}{\hfil}
%    \end{macrocode}
% \end{macro}^^A \numberline@postfix
% \begin{macro}{\numberline@numberformat}
% \changes{v3.06}{2010/05/18}{added}
% \changes{v3.12}{2013/11/22}{don't output anything, if argument expands to
%   an empty string}
% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed into \cs{Ifstr}}
% Used to fulfil rules~5 and 6 of DUDEN, 20th edition.
%    \begin{macrocode}
\newcommand*{\numberline@numberformat}[1]{%
  \Ifstr{#1}{}{}{\numberline@numberprefix#1\numberline@numberpostfix}%
}
%    \end{macrocode}
% \begin{macro}{\numberline@numberprefix}
% \changes{v3.20}{2016/03/15}{added}
% Used to prefix the number inside \cs{numberline@numberformat}. In opposite
% to \cs{numberline@prefix} it is only used, if the argument of
% \cs{numberline@numberformat} and therefore the argument of \cs{numberline}
% is not empty.
%    \begin{macrocode}
\newcommand*{\numberline@numberprefix}{}
%    \end{macrocode}
% \end{macro}^^A \numberline@numberprefix
% \begin{macro}{\numberline@numberpostfix}
% \changes{v3.20}{2016/03/15}{added}
% Used to postfix the number inside \cs{numberline@numberformat}. In opposite
% to \cs{numberline@prefix} it is only used, if the argument of
% \cs{numberline@numberformat} and therefore the argument of \cs{numberline}
% is not empty.
%    \begin{macrocode}
\newcommand*{\numberline@numberpostfix}{}
%    \end{macrocode}
% \end{macro}^^A \numberline@numberpostfix
% \end{macro}^^A \numberline@numberformat
% \begin{macro}{\numberline@box}
% \changes{v3.06}{2010/05/18}{added}
% Is used to put the sectioning number into a box.
%    \begin{macrocode}
\newcommand*{\numberline@box}[1]{\hb@xt@\@tempdima{#1}}
%</package&body>
%    \end{macrocode}
% \end{macro}^^A \numberline@box
% \end{macro}^^A \scr@numberline
%
%    \begin{macrocode}
%<*class&body>
\let\numberline\scr@numberline
%</class&body>
%    \end{macrocode}
% \end{command}^^A \numberline
%
%
% \subsection{The basics of the styles}
%
% From \KOMAScript~3.20 styles are a new basic feature for the entries into
% the table of contents and other directories. Each style consists of a
% command that defines the entry command and the corresponding options. The
% options are used to provide configuration features.
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% \changes{v3.20}{2015/11/17}{ToC styles have the \texttt{KOMAarg} member
%   \texttt{.dte}}
%    \begin{macrocode}
%<*body>
\DefineFamily{KOMAarg}
\DefineFamilyMember[.dte]{KOMAarg}
%</body>
%    \end{macrocode}
%
% \begin{macro}{\@DefineTOCEntryOption}
% \changes{v3.20}{2015/04/10}{added}
% The definition of the options is done by a general interface. Important is,
% that the definition of the option is done indirectly, which means: Here we
% define a command, that defines the options when needed. Note, not only the
% entry command interface itself but also the sectioning command interface may
% and should be able to setup options of the entry commands.
% The parameters:
% \begin{description}
% \item[\marg{style}: \meta{string},] name of the entry style
% \item[\marg{option}: \meta{string},] name of the option
% \item[\oarg{value}:] default value of the option depending on the
%   \meta{definition}
% \item[\marg{definition}: \meta{code},] definition of the option
% \end{description}
% \begin{macro}{\@DefineTOCEntryOptionWithoutDefault,\@DefineTOCEntryOptionWithDefault}
% \changes{v3.20}{2015/11/10}{added}
% Because of the options argument at position 3 (and because we've made this
% before \pkg{xparse} became part of the \LaTeX{} kernel), we need two
% auxiliary macros.
%    \begin{macrocode}
%<*body>
\newcommand*{\@DefineTOCEntryOption}[2]{%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2}%
  }%
  \kernel@ifnextchar [%]
    {\@DefineTOCEntryOptionWithDefault{#1}{#2}}%
    {\@DefineTOCEntryOptionWithoutDefault{#1}{#2}}%
}
\newcommand*{\@DefineTOCEntryOptionWithoutDefault}[3]{%
  \DefineFamilyKey[.dte]{KOMAarg}{#2}{#3}%
}
\newcommand*{\@DefineTOCEntryOptionWithDefault}{}
\def\@DefineTOCEntryOptionWithDefault#1#2[#3]#4{%
  \l@addto@macro\scr@dte@doopts{[{#3}]}%
  \DefineFamilyKey[.dte]{KOMAarg}{#2}[{#3}]{#4}%
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@DefineTOCEntryOptionWithoutDefault,\@DefineTOCEntryOptionWithDefault
% \end{macro}^^A \@DefineTOCEntryOption
%
% \begin{macro}{\@RelaxTOCEntryOptions}
% \changes{v3.20}{2015/04/10}{added}
% Reset all options of the current do-list back to \cs{relax}.
%    \begin{macrocode}
%<*body>
\newcommand*{\@RelaxTOCEntryOptions}{%
  \begingroup
    \def\do@endgroup{\endgroup}%
    \def\do##1{%
      \l@addto@macro\do@endgroup{%
        \RelaxFamilyKey[.dte]{KOMAarg}{##1}%
      }%
      \scr@dte@gobbleopt
    }%
    \scr@dte@doopts
  \do@endgroup
}
\newcommand{\scr@dte@gobbleopt}[1][]{}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@RelaxTOCEntryOptions
%
% \begin{macro}{\@DefineTOCEntryListOption}
% \changes{v3.31}{2020/06/11}{added}
% Use \cs{DefineTOCEntryOption} to define an option that represents a list.
% It has following parameters:
% \begin{description}
% \item[\marg{style}: \meta{string},] name of the entry style
% \item[\marg{option}: \meta{string},] name of the option
% \item[\oarg{default}: \meta{string},] default value of the option
% \item[\marg{prefix}: \meta{string},] prefix of the macro to be defined
% \item[\marg{postfix}: \meta{string},] postfix of the macro to be defined
% \item[\marg{description}: \meta{String},] short description of the option
% \item[\oarg{init}: \meta{code},] initialization of the option
% \end{description}
% Between the \meta{prefix} and \meta{postfix} automatically
% \cs{scr@dte@current} will be added. A copy option using ``\opt{:=}''
% instead of ``\opt{=}'' and an add (append) option using ``\opt{+=}''
% instead of ``\opt{=}'' is also defined.
%    \begin{macrocode}
%<*body>
\newcommand*{\@DefineTOCEntryListOption}[2]{%
  \kernel@ifnextchar [%]
    {\@DefineTOCEntryListOptionWithDefault{#1}{#2}}
    {\@DefineTOCEntryListOptionWithoutDefault{#1}{#2}}%
}
%    \end{macrocode}
% \begin{macro}{\@DefineTOCEntryListOptionWithoutDefault}
% \changes{v3.31}{2020/06/11}{added}
% This is the case without default value. So we only have to define
% the three internal options, that manipulate a macro.
% \begin{macrocode}
\newcommand*{\@DefineTOCEntryListOptionWithoutDefault}[5]{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#3}{#4}{#2}{#5}%
  \@DefineTOCEntryOption{#1}{#2}{%
    \expandafter\protected@edef\csname #3\scr@dte@current#4\endcsname{##1}%
    \FamilyKeyStateProcessed
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{#3##1#4}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname #3\scr@dte@current#4\expandafter\endcsname
      \csname #3##1#4\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
    \expandafter\protected@edef\csname #2\scr@dte@current#4\endcsname{%
      \csname #2\scr@dte@current#4\endcsname,##1}%
    \FamilyKeyStateProcessed
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}\noexpand\do{#2+}%
  }%
}
%    \end{macrocode}
% \end{macro}^^A \@DefineTOCEntryListOptionWithoutDefault
% \begin{macro}{\@DefineTOCEntryListOptionWithDefault}
% \changes{v3.31}{2020/06/11}{added}
% This is the case with a default value. It's almost the same, but the
% argument numbers and using \cs{DefineFamilyKey} with optional argument.
%    \begin{macrocode}
\newcommand*{\@DefineTOCEntryListOptionWithDefault}{}
\def\@DefineTOCEntryListOptionWithDefault#1#2[#3]#4#5#6{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#4}{#5}{#2}{#6}%
  \@DefineTOCEntryOption{#1}{#2}[{#3]}{%
    \expandafter\protected@edef\csname #4\scr@dte@current#5\endcsname{##1}%
    \FamilyKeyStateProcessed
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{#4##1#5}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname #4\scr@dte@current#5\expandafter\endcsname
      \csname #4##1#5\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
    \expandafter\protected@edef\csname #4\scr@dte@current#5\endcsname{%
      \csname #4\scr@dte@current#5\endcsname,##1}%
    \FamilyKeyStateProcessed
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}\noexpand\do{#2+}%
  }%  
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@DefineTOCEntryListOptionWithDefault
% \end{macro}^^A \@DefineTOCEntryListOption
%
% \begin{macro}{\@DefineTOCEntryLengthOption}
% \changes{v3.20}{2015/12/04}{added}
% Use \cs{DefineTOCEntryOption} to define an option that represents a length
% macro. The parameters are:
% \begin{description}
% \item[\marg{style}: \meta{string},] name of the entry style
% \item[\marg{option}: \meta{string},] name of the option
% \item[\oarg{value}: \meta{length},] default value of the option
% \item[\marg{prefix}: \meta{string},] prefix of the name of the macro
% \item[\marg{postfix}: \meta{string},] postfix of the name of the macro
% \item[\marg{explanation}: \meta{string},] short description of the option
% \item[\oarg{init}: \meta{code},] initialisation code for the option
% \end{description}
% Later, when the option is defines, between \meta{prefix} and \meta{postfix}
% will be added \cs{scr@dte@current} automatically. This is the name of the
% entry level, e.g., |subsection| or |figure|. Additionally to
% the option \marg{option} itself a copy option \marg{option}\opt{:} will
% be defined. So it seems, that for the copy option a colon is before the
% equal sign. The value of the copy option has to be the name of another entry
% level and it copies the value of the same option of that entry
% level. Additionally an additive option with appended plus sign is
% defined. It adds the new value to the existing one.
% \begin{macro}{\@DefineTOCEntryLengthOptionWithoutDefault,
%               \@DefineTOCEntryLengthOptionWithDefault}
% \changes{v3.20}{2015/11/10}{added}
% \changes{v3.27}{2019/10/02}{automatic definition of copy option}
% \changes{v3.27}{2019/10/03}{automatic definition of add option}
% \begin{macro}{\@DefineTOCEntryLengthOptionMacro,\@DefineTOCEntryAddLengthOptionMacro}
% \changes{v3.27}{2019/10/03}{added}
% Because of the options argument at position 3 (and because we've made this
% before \pkg{xparse} became part of the \LaTeX{} kernel), we need three
% auxiliary macros.
%    \begin{macrocode}
%<*body>
\newcommand*{\@DefineTOCEntryLengthOption}[2]{%
  \kernel@ifnextchar [%]
    {\@DefineTOCEntryLengthOptionWithDefault{#1}{#2}}
    {\@DefineTOCEntryLengthOptionWithoutDefault{#1}{#2}}%
}
\newcommand*{\@DefineTOCEntryLengthOptionWithoutDefault}[5]{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#3}{#4}{#2}{#5}%
  \@DefineTOCEntryOption{#1}{#2}{%
    \@DefineTOCEntryLengthOptionMacro{#2}{#3}{#4}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{#3##1#4}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname #3\scr@dte@current#4\expandafter\endcsname
      \csname #3##1#4\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
    \@DefineTOCEntryAddLengthOptionMacro{#2+}{#3}{#4}{##1}%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}%
    \noexpand\do{#2:}\noexpand\do{#2+}%
  }%
}
\newcommand*{\@DefineTOCEntryLengthOptionWithDefault}{}
\def\@DefineTOCEntryLengthOptionWithDefault#1#2[#3]#4#5#6{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#4}{#5}{#2}{#6}%
  \@DefineTOCEntryOption{#1}{#2}[{#3}]{%
    \@DefineTOCEntryLengthOptionMacro{#2}{#4}{#5}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{#4##1#5}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname #4\scr@dte@current#5\expandafter\endcsname
      \csname #4##1#5\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
    \@DefineTOCEntryAddLengthOptionMacro{#2+}{#4}{#5}{##1}%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}%
    \noexpand\do{#2:}\noexpand\do{#2+}%
  }%
}
\newcommand*{\@DefineTOCEntryLengthOptionMacro}[4]{%
  \protected@edef\reserved@a{%
    \noexpand\FamilySetLength{KOMAarg}{#1}{\noexpand\@tempskipa}{#4}%
  }\reserved@a
  \ifx\FamilyKeyState\FamilyKeyStateProcessed
    \ifscr@dte@expandtopt
      \expandafter\edef\csname #2\scr@dte@current#3\endcsname{%
        \the\@tempskipa}%
    \else
      \expandafter\protected@edef\csname #2\scr@dte@current#3\endcsname{#4}%
    \fi
  \fi
}
\newcommand*{\@DefineTOCEntryAddLengthOptionMacro}[4]{%
  \@ifundefined{#2\scr@dte@current#3}{%
    \FamilyKeyStateUnknownValue
  }{%
    \protected@edef\reserved@a{%
      \noexpand\FamilySetLength{KOMAarg}{#1}{\noexpand\@tempskipa}{#4}%
    }\reserved@a
    \ifx\FamilyKeyState\FamilyKeyStateProcessed
      \ifscr@dte@expandtopt
        \expandafter\edef\csname #2\scr@dte@current#3\endcsname{%
          \the\glueexpr\@tempskipa
          +\csname #2\scr@dte@current#3\endcsname\relax}%
      \else
        \expandafter\protected@edef\csname #2\scr@dte@current#3\endcsname{%
          \the\glueexpr #4%
            +\csname #2\scr@dte@current#3\endcsname\relax}%
      \fi
    \fi
  }%
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@DefineTOCEntryAddLengthOptionMacro,\@DefineTOCEntryLengthOptionMacro
% \end{macro}^^A \@DefineTOCEntryLengthOptionWithDefault,\@DefineTOCEntryLengthOptionWithoutDefault
% \end{macro}^^A \@DefineTOCEntryLengthOption
%
% \begin{macro}{\@DefineTOCEntryNumberOption}
% \changes{v3.20}{2015/12/04}{added}
% Use \cs{DefineTOCEntryOption} to define an option that represents a number
% macro. The parameters are:
% \begin{description}
% \item[\marg{style}: \meta{string},] name of the entry style
% \item[\marg{option}: \meta{string},] name of the option
% \item[\oarg{value}: \meta{length},] default value of the option
% \item[\marg{prefix}: \meta{string},] prefix of the name of the macro
% \item[\marg{postfix}: \meta{string},] postfix of the name of the macro
% \item[\marg{explanation}: \meta{string},] short description of the option
% \item[\oarg{init}: \meta{code},] initialisation code for the option
% \end{description}
% Later, when the option is defines, between \meta{prefix} and \meta{postfix}
% will be added \cs{scr@dte@current} automatically. This is the name of the
% entry level, e.g., |subsection| or |figure|. Additionally to
% the option \marg{option} itself a copy option \marg{option}\opt{:} will
% be defined. So it seems, that for the copy option a colon is before the
% equal sign. The value of the copy option has to be the name of another entry
% level and it copies the value of the same option of that entry
% level. Additionally an additive option with appended plus sign is
% defined. It adds the new value to the existing one.
% \begin{macro}{\@DefineTOCEntryNumberOptionWithoutDefault,
%               \@DefineTOCEntryNumberOptionWithDefault}
% \changes{v3.20}{2015/11/12}{added}
% \changes{v3.27}{2019/10/02}{automatic definition of copy option}
% \changes{v3.27}{2019/10/03}{automatic definition of add option}
% \begin{macro}{\@DefineTOCEntryNumberOptionMacro,\@DefineTOCEntryAddNumberOptionMacro}
% \changes{v3.27}{2019/10/03}{added}
% Because of the options argument at position 3 (and because we've made this
% before \pkg{xparse} became part of the \LaTeX{} kernel), we need three
% auxiliary macros.
%    \begin{macrocode}
%<*body>
\newcommand*{\@DefineTOCEntryNumberOption}[2]{%
  \kernel@ifnextchar [%]
    {\@DefineTOCEntryNumberOptionWithDefault{#1}{#2}}
    {\@DefineTOCEntryNumberOptionWithoutDefault{#1}{#2}}%
}
\newcommand*{\@DefineTOCEntryNumberOptionWithoutDefault}[5]{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#3}{#4}{#2}{#5}%
  \@DefineTOCEntryOption{#1}{#2}{%
    \@DefineTOCEntryNumberOptionMacro{#2}{#3}{#4}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{#3##1#4}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname #3\scr@dte@current#4\expandafter\endcsname
      \csname #3##1#4\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
    \@DefineTOCEntryAddNumberOptionMacro{#2+}{#3}{#4}{##1}%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}%
    \noexpand\do{#2:}\noexpand\do{#2+}%
  }%
}
\newcommand*{\@DefineTOCEntryNumberOptionWithDefault}{}
\def\@DefineTOCEntryNumberOptionWithDefault#1#2[#3]#4#5#6{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#4}{#5}{#2}{#6}%
  \@DefineTOCEntryOption{#1}{#2}[{#3}]{%
    \@DefineTOCEntryNumberOptionMacro{#2}{#4}{#5}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{#4##1#5}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname #4\scr@dte@current#5\expandafter\endcsname
      \csname #4##1#5\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
    \@DefineTOCEntryAddNumberOptionMacro{#2+}{#4}{#5}{##1}%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}%
    \noexpand\do{#2:}\noexpand\do{#2+}%
  }%
}
\newcommand*{\@DefineTOCEntryNumberOptionMacro}[4]{%
  \protected@edef\reserved@a{%
    \noexpand\FamilySetCounterMacro{KOMAarg}{#1}{%
      \expandafter\noexpand\csname #2\scr@dte@current#3\endcsname
    }{#4}%
  }\reserved@a
}
\newcommand*{\@DefineTOCEntryAddNumberOptionMacro}[4]{%
  \@ifundefined{#2\scr@dte@current#3}{%
    \FamilyKeyStateUnknownValue
  }{%
    \FamilySetCounterMacro{KOMAarg}{#1}{%
      \reserved@a
    }{#4}%
    \ifx\FamilyKeyState\FamilyKeyStateProcessed
      \expandafter\edef\csname #2\scr@dte@current#3\endcsname{%
        \the\numexpr \reserved@a+\csname #2\scr@dte@current#3\endcsname\relax
      }%
    \fi
  }%
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@DefineTOCEntryAddNumberOptionMacro,\@DefineTOCEntryNumberOptionMacro
% \end{macro}^^A \@DefineTOCEntryNumberOptionWithDefault,\@DefineTOCEntryNumberOptionWithoutDefault
% \end{macro}^^A \@DefineTOCEntryNumberOption
%
% \begin{macro}{\@DefineTOCEntryBooleanOption}
% \changes{v3.20}{2015/12/04}{added}
% Use \cs{DefineTOCEntryOption} to define an option that represents a boolean
% switch. The parameters are:
% \begin{description}
% \item[\marg{style}: \meta{string},] name of the entry style
% \item[\marg{option}: \meta{string},] name of the option
% \item[\oarg{value}: \meta{length},] default value of the option
% \item[\marg{prefix}: \meta{string},] prefix of the name of the macro
% \item[\marg{postfix}: \meta{string},] postfix of the name of the macro
% \item[\marg{explanation}: \meta{string},] short description of the option
% \item[\oarg{init}: \meta{code},] initialisation code for the option
% \end{description}
% Later, when the option is defines, between \meta{prefix} and \meta{postfix}
% will be added \cs{scr@dte@current} automatically. This is the name of the
% entry level, e.g., |subsection| or |figure|. Additionally to
% the option \marg{option} itself a copy option \marg{option}\opt{:} will
% be defined. So it seems, that for the copy option a colon is before the
% equal sign. The value of the copy option has to be the name of another entry
% level and it copies the value of the same option of that entry
% level.
% \begin{macro}{\@DefineTOCEntryBoolOptionWithoutDefault,
%               \@DefineTOCEntryBoolOptionWithDefault}
% \changes{v3.20}{2015/11/12}{added}
% \changes{v3.27}{2019/10/02}{automatic definition of copy option}
% \begin{macro}{\@DefineTOCEntryBoolOptionMacro}
% \changes{v3.20}{2015/11/12}{added}
% Because of the options argument at position 3 (and because we've made this
% before \pkg{xparse} became part of the \LaTeX{} kernel), we need three
% auxiliary macros.
%    \begin{macrocode}
%<*body>
\newcommand*{\@DefineTOCEntryBooleanOption}[2]{%
  \kernel@ifnextchar [%]
    {\@DefineTOCEntryBoolOptionWithDefault{#1}{#2}}
    {\@DefineTOCEntryBoolOptionWithoutDefault{#1}{#2}}%
}
\newcommand*{\@DefineTOCEntryBoolOptionWithoutDefault}[5]{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{if#3}{#4}{#2}{#5}%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#3}{#4false}{#2}{#5}%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#3}{#4false}{#2}{#5}%
  \@DefineTOCEntryOption{#1}{#2}[true]{%
    \@DefineTOCEntryBoolOptionMacro{#2}{#3}{#4}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{if#3##1#4}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname if#3\scr@dte@current#4\expandafter\endcsname
      \csname if#3##1#4\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
  }%
}
\newcommand*{\@DefineTOCEntryBoolOptionWithDefault}{}
\def\@DefineTOCEntryBoolOptionWithDefault#1#2[#3]#4#5#6{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{if#4}{#5}{#2}{#6}%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#4}{#5true}{#2}{#6}%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#4}{#5false}{#2}{#6}%
  \@DefineTOCEntryOption{#1}{#2}[{#3}]{%
    \@DefineTOCEntryBoolOptionMacro{#2}{#4}{#5}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{if#4##1#5}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname if#4\scr@dte@current#5\expandafter\endcsname
      \csname if#4##1#5\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
  }%
}
\newcommand*{\@DefineTOCEntryBoolOptionMacro}[4]{%
  \@ifundefined{if#2\scr@dte@current#3}{%
    \expandafter\newif\csname if#2\scr@dte@current#3\endcsname
  }{}%
  \FamilySetBool{KOMAarg}{#1}{#2\scr@dte@current#3}{#4}%
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@DefineTOCEntryBoolOptionMacro
% \end{macro}^^A \@DefineTOCEntryBoolOptionWithDefault,\@DefineTOCEntryBoolOptionWithoutDefault
% \end{macro}^^A \@DefineTOCEntryBooleanOption
%
% \begin{macro}{\@DefineTOCEntryIfOption}
% \changes{v3.20}{2015/12/06}{added}
% Use \cs{DefineTOCEntryOption} to define an option that represents an if
% command. The option itself is a boolean option. The parameters are:
% \begin{description}
% \item[\marg{style}: \meta{string},] name of the entry style
% \item[\marg{option}: \meta{string},] name of the option
% \item[\oarg{value}: \meta{length},] default value of the option
% \item[\marg{prefix}: \meta{string},] prefix of the name of the macro
% \item[\marg{postfix}: \meta{string},] postfix of the name of the macro
% \item[\marg{explanation}: \meta{string},] short description of the option
% \end{description}
% Later, when the option is defines, between \meta{prefix} and \meta{postfix}
% will be added \cs{scr@dte@current} automatically. This is the name of the
% entry level, e.g., |subsection| or |figure|. Additionally to
% the option \marg{option} itself a copy option \marg{option}\opt{:} will
% be defined. So it seems, that for the copy option a colon is before the
% equal sign. The value of the copy option has to be the name of another entry
% level and it copies the value of the same option of that entry
% level.
% \begin{macro}{\@DefineTOCEntryIfOptionWithoutDefault,
%               \@DefineTOCEntryIfOptionWithDefault}
% \changes{v3.20}{2015/11/12}{added}
% \changes{v3.27}{2019/10/02}{automatic definition of copy option}
% \begin{macro}{\@DefineTOCEntryIfOptionMacro}
% \changes{v3.20}{2015/11/12}{added}
% Because of the options argument at position 3 (and because we've made this
% before \pkg{xparse} became part of the \LaTeX{} kernel), we need three
% auxiliary macros.
%    \begin{macrocode}
%<*body>
\newcommand*{\@DefineTOCEntryIfOption}[2]{%
  \kernel@ifnextchar [%]
    {\@DefineTOCEntryIfOptionWithDefault{#1}{#2}}
    {\@DefineTOCEntryIfOptionWithoutDefault{#1}{#2}}%
}
\newcommand*{\@DefineTOCEntryIfOptionWithoutDefault}[5]{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{If#3}{#4}{#2}{#5}%
  \@DefineTOCEntryOption{#1}{#2}[true]{%
    \@DefineTOCEntryIfOptionMacro{#2}{#3}{#4}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{If#3##1#4}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname If#3\scr@dte@current#4\expandafter\endcsname
      \csname If#3##1#4\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
  }%
}
\newcommand*{\@DefineTOCEntryIfOptionWithDefault}{}
\def\@DefineTOCEntryIfOptionWithDefault#1#2[#3]#4#5#6{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{If#4}{#5}{#2}{#6}%
  \@DefineTOCEntryOption{#1}{#2}[{#3}]{%
    \@DefineTOCEntryIfOptionMacro{#2}{#4}{#5}{##1}%
  }%
  \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
    \scr@ifundefinedorrelax{If#4##1#5}{\FamilyKeyStateUnknownValue}{%
      \expandafter\let
      \csname If#4\scr@dte@current#5\expandafter\endcsname
      \csname If#4##1#5\endcsname
      \FamilyKeyStateProcessed
    }%
  }%
  \edef\scr@dte@doopts{%
    \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
  }%
}
\newcommand*{\@DefineTOCEntryIfOptionMacro}[4]{%
  \FamilySetBool{KOMAarg}{#1}{@tempswa}{#4}%
  \ifx\FamilyKeyState\FamilyKeyStateProcessed
    \if@tempswa
      \expandafter\let\csname If#2\scr@dte@current#3\endcsname\@firstoftwo
    \else
      \expandafter\let\csname If#2\scr@dte@current#3\endcsname\@secondoftwo
    \fi
  \fi
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@DefineTOCEntryIfOptionMacro
% \end{macro}^^A \@DefineTOCEntryIfOptionWithDefault,\@DefineTOCEntryIfOptionWithoutDefault
% \end{macro}^^A \@DefineTOCEntryIfOption
%
%<@@=>
% \begin{macro}{\@DefineTOCEntryCommandOption}
% \changes{v3.20}{2015/11/17}{added}
% Use \cs{DefineTOCEntryOption} to define an option that represents a
% macro. The parameters are:
% \begin{description}
% \item[\marg{style}: \meta{string},] name of the entry style
% \item[\marg{option}: \meta{string},] name of the option
% \item[\oarg{value}: \meta{length},] default value of the option
% \item[\marg{prefix}: \meta{string},] prefix of the name of the macro
% \item[\marg{postfix}: \meta{string},] postfix of the name of the macro
% \item[\marg{explanation}: \meta{string},] short description of the option
% \item[\oarg{init}: \meta{code},] initialisation code for the option
% \end{description}
% Later, when the option is defines, between \meta{prefix} and \meta{postfix}
% will be added \cs{scr@dte@current} automatically. This is the name of the
% entry level, e.g., |subsection| or |figure|. Additionally to
% the option \marg{option} itself a copy option \marg{option}\opt{:} will
% be defined. So it seems, that for the copy option a colon is before the
% equal sign. The value of the copy option has to be the name of another entry
% level and it copies the value of the same option of that entry
% level. Additionally an appending option with appended plus sign is
% defined. It appends the new code to the existing one.
% \begin{macro}{\@DefineTOCEntryCommandOptionWithoutDefault}
% \changes{v3.20}{2015/11/12}{added}
% \begin{macro}{\@@DefineTOCEntryCommandOptionWithoutDefault}
% \changes{v3.20}{2015/11/12}{added}
% \changes{v3.27}{2019/10/02}{automatic definition of copy option}
% \changes{v3.27}{2019/10/03}{automatic definition of add option}
% \begin{macro}{\@DefineTOCEntryCommandOptionWithDefault}
% \changes{v3.20}{2015/11/12}{added}
% \begin{macro}{\@@DefineTOCEntryCommandOptionWithDefault}
% \changes{v3.20}{2015/11/12}{added}
% \changes{v3.27}{2019/10/02}{automatic definition of copy option}
% \changes{v3.27}{2019/10/03}{automatic definition of add option}
% \begin{macro}{\@DefineTOCEntryCommandOptionMacro,\@@DefineTOCEntryCommandOptionMacro}
% \changes{v3.20}{2015/11/26}{added}
% Because of the options argument at position 3 (and because we've made this
% before \pkg{xparse} became part of the \LaTeX{} kernel), we need three
% auxiliary macros.
%    \begin{macrocode}
%<*body>
\newcommand*{\@DefineTOCEntryCommandOption}[2]{%
  \kernel@ifnextchar [%]
    {\@DefineTOCEntryCommandOptionWithDefault{#1}{#2}}
    {\@DefineTOCEntryCommandOptionWithoutDefault{#1}{#2}}%
}
\newcommand*{\@DefineTOCEntryCommandOptionWithoutDefault}[4]{%
  \@testopt{\@@DefineTOCEntryCommandOptionWithoutDefault{#1}{#2}{#3}{#4}}0%
}
\newcommand*{\@@DefineTOCEntryCommandOptionWithoutDefault}{}%
\def\@@DefineTOCEntryCommandOptionWithoutDefault#1#2#3#4[#5]#6{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#3}{#4}{#2}{#6}%
  \ifcase #5
    \@DefineTOCEntryOption{#1}{#2}{%
      \@DefineTOCEntryCommandOptionMacro{#2}{#3}{#4}[#5]{##1}%
    }%
    \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
      \scr@ifundefinedorrelax{#3##1#4}{\FamilyKeyStateUnknownValue}{%
        \expandafter\let
        \csname #3\scr@dte@current#4\expandafter\endcsname
        \csname #3##1#4\endcsname
        \FamilyKeyStateProcessed
      }%
    }%
    \edef\scr@dte@doopts{%
      \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
    }%
  \or
    \@DefineTOCEntryOption{#1}{#2}{%
      \@DefineTOCEntryCommandOptionMacro{#2}{#3}{#4}[#5]{##1{####1}}%
    }%
    \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
      \scr@ifundefinedorrelax{#3##1#4}{\FamilyKeyStateUnknownValue}{%
        \expandafter\let
        \csname #3\scr@dte@current#4\expandafter\endcsname
        \csname #3##1#4\endcsname
        \FamilyKeyStateProcessed
      }%
    }%
    \edef\scr@dte@doopts{%
      \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
    }%
  \else
    \PackageError{tocbasic}{only one argument supported}{%
      \string\DefineTOCEntryCommandOption\space currently supports only
      commands with\MessageBreak
      at most one argument not #5}%
  \fi
}
\newcommand*{\@DefineTOCEntryCommandOptionWithDefault}{}
\def\@DefineTOCEntryCommandOptionWithDefault#1#2[#3]#4#5{%
  \@testopt{\@@DefineTOCEntryCommandOptionWithDefault{#1}{#2}{#3}{#4}{#5}}0%
}
\def\@@DefineTOCEntryCommandOptionWithDefault#1#2#3#4#5[#6]#7{%
  \@TOCEntryStyleNeedsCommandByOption{#1}{#4}{#5}{#2}{#7}%
  \ifcase #6
    \@DefineTOCEntryOption{#1}{#2}[{#3}]{%
      \@DefineTOCEntryCommandOptionMacro{#2}{#4}{#5}[#6]{##1}%
    }%
    \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
      \scr@ifundefinedorrelax{#4##1#5}{\FamilyKeyStateUnknownValue}{%
        \expandafter\let
        \csname #4\scr@dte@current#5\expandafter\endcsname
        \csname #4##1#5\endcsname
        \FamilyKeyStateProcessed
      }%
    }%
    \edef\scr@dte@doopts{%
      \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
    }%
  \or
    \@DefineTOCEntryOption{#1}{#2}[{#3}]{%
      \@DefineTOCEntryCommandOptionMacro{#2}{#4}{#5}[#6]{##1{####1}}%
    }%
    \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
      \scr@ifundefinedorrelax{#4##1#5}{\FamilyKeyStateUnknownValue}{%
        \expandafter\let
        \csname #4\scr@dte@current#5\expandafter\endcsname
        \csname #4##1#5\endcsname
        \FamilyKeyStateProcessed
      }%
    }%
    \edef\scr@dte@doopts{%
      \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
    }%
  \or
    \@DefineTOCEntryOption{#1}{#2}[{#3}]{%
      \@DefineTOCEntryCommandOptionMacro{#2}{#4}{#5}[#6]{##1{####1}{####2}}%
    }%
    \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
      \scr@ifundefinedorrelax{#4##1#5}{\FamilyKeyStateUnknownValue}{%
        \expandafter\let
        \csname #4\scr@dte@current#5\expandafter\endcsname
        \csname #4##1#5\endcsname
        \FamilyKeyStateProcessed
      }%
    }%
    \edef\scr@dte@doopts{%
      \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}%
    }%
  \else
    \PackageError{tocbasic}{only one argument supported}{%
      \string\DefineTOCEntryCommandOption\space currently supports only
      commands with\MessageBreak
      at most two argument not #6}%
  \fi
}
\newcommand*{\@DefineTOCEntryCommandOptionMacro}[3]{%
  \@testopt{\@@DefineTOCEntryCommandOptionMacro{#1}{#2}{#3}}0%
}
\newcommand*{\@@DefineTOCEntryCommandOptionMacro}{}
\long\def\@@DefineTOCEntryCommandOptionMacro#1#2#3[#4]#5{%
  \let\l@ngrel@x\long
  \expandafter\@yargdef\csname #2\scr@dte@current#3\endcsname\@ne{#4}{#5}%
  \FamilyKeyStateProcessed
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@@DefineTOCEntryCommandOptionMacro,\@DefineTOCEntryCommandOptionMacro
% \end{macro}^^A \@@DefineTOCEntryCommandOptionWithDefault
% \end{macro}^^A \@DefineTOCEntryCommandOptionWithDefault
% \end{macro}^^A \@@DefineTOCEntryCommandOptionWithoutDefault
% \end{macro}^^A \@DefineTOCEntryCommandOptionWithoutDefault
% \end{macro}^^A \@DefineTOCEntryCommandOption
%
% \begin{macro}{\@AddToDeclareTOCStyleEntryPreCheckNeeds,
%               \@PreToDeclareTOCStyleEntryPreCheckNeeds}
% \changes{v3.20}{2015/12/06}{added}
% Before the existence of the mandatory commands can be tested in
% \cs{DeclareTOCStyleEntry}, a hook will be executed. To add code to this hook
% we have this command with the following parameter:
% \begin{description}
% \item[\marg{code}: \meta{code},] code to be executed.
% \end{description}
% Please note, this command is used inside the init code of styles, which
% means inside \cs{DeclareTOCEntryStyle}, but the hook is inside
% \cs{DeclareTOCStyleEntry}. The code of the hook has exactly one argument,
% the name of the ToC entry level.
%    \begin{macrocode}
%<*body>
\newcommand{\@AddToDeclareTOCEntryStylePreCheckNeeds}[1]{%
  \expandafter\providecommand\csname scr@dte@precheck\endcsname[1]{}%
  \expandafter\l@addto@macro@a\csname scr@dte@precheck\endcsname
}
\newcommand{\@PreToDeclareTOCEntryStylePreCheckNeeds}[1]{%
  \expandafter\providecommand\csname scr@dte@precheck\endcsname[1]{}%
  \expandafter\l@preto@macro@a\csname scr@dte@precheck\endcsname
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@AddToDeclareTOCStyleEntryPreCheckNeeds,\@PreToDeclareTOCStyleEntryPreCheckNeeds
%
% \begin{macro}{\@TOCEntryStyleNeedsCommandByOption}
% \changes{v3.20}{2015/12/04}{added}
% Adds one or more commands to the list of mandatory commands. The parameters
% are:
% \begin{description}
% \item[\marg{style}:] The style \meta{string}, that needs the command(s).
% \item[\marg{prefix}:] Prefix \meta{string} of the mandatory command(s).
% \item[\marg{postfix}:] Postfix \meta{string} of the mandatory command(s).
% \item[\marg{Option}:] Option \meta{string}, that defines the command(s).
% \item[\marg{explanation}:] Short description.
% \end{description}
% Between \meta{prefix} and \meta{postfix} will be added the name of the entry
% level automatically.
%    \begin{macrocode}
%<*body>
\newcommand*{\@TOCEntryStyleNeedsCommandByOption}[5]{%
  \expandafter\providecommand\expandafter*\csname scr@dte@#1@needs\endcsname{}%
  \expandafter\l@addto@macro\csname scr@dte@#1@needs\endcsname{%
    \do{#2}{#3}{#4}{#5}%
  }%
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@TOCEntryStyleNeedsCommandByOption
%
% \begin{command}{\TOCEntryStyleInitCode,\TOCEntryStyleInitCode*,
%                 \TOCEntryStyleStartInitCode}
% \changes{v3.20}{2015/11/25}{added}
% \changes{v3.41}{2023/06/20}{star variant \cs{TOCEntryStyleInitCode*} added}
% Executes commands before a ToC entry level command of this style is defined
% and before the \emph{needs} list will be executed. The parameters are:
% \begin{description}
% \item[\marg{style}:] The style \meta{string} that should be initialised.
% \item[\marg{code}:] The code that should be executed to initialise the
% style. The code has one argument \texttt{\#1} which is the name of the ToC
% entry level.
% \end{description}
%    \begin{macrocode}
%<*body>
\NewDocumentCommand\TOCEntryStyleInitCode{sm}{%
  \IfBooleanT{#1}{\expandafter\let\csname scr@dte@#2@init\endcsname\relax}%
  \scr@ifundefinedorrelax{scr@dte@#2@init}{%
    \expandafter\newcommand\expandafter*%
    \csname scr@dte@#2@init\endcsname[1]%
  }{%
    \expandafter\l@addto@macro@a\csname scr@dte@#2@init\endcsname
  }%
}
\newcommand{\TOCEntryStyleStartInitCode}[1]{%
  \scr@ifundefinedorrelax{scr@dte@#1@init}{%
    \expandafter\providecommand\expandafter*%
    \csname scr@dte@#1@init\endcsname[1]%
  }{%
    \expandafter\l@preto@macro@a\csname scr@dte@#1@init\endcsname
  }%
}
%    \end{macrocode}
% \end{command}^^A \TOCEntryStyleInitCode … \TOCEntryStyleStartInitCode
% \begin{macro}{\@ExecuteTOCEntryStyleInitCode}
% \changes{v3.20}{2015/12/04}{added}
% Executes the init code of one style. The first argument is the name of the
% style, the second the name of the ToC entry level, which will be used as
% argument of the init code (see above).
%    \begin{macrocode}
\newcommand*{\@ExecuteTOCEntryStyleInitCode}[2]{%
  \let\scr@dte@doopts\@empty
%    \end{macrocode}
% \changes{v3.27}{2019/10/02}{init \cs{scr@dte@\meta{Stil}@init}}
% Because the definition which options or which macros are needed for a style
% takes place via the declaration of the options and this declaration does not
% take place with the definition of the style but with the assignment of the
% style to an entry, the do list of this information must also be deleted
% here. Otherwise it would constantly grow over all entries of the same style
% and thus contain various entries several times. Probably it would be better
% to actually create a list per entry here instead of one per style, but
% that's just not how it is. So the same list is always rebuilt here and must
% therefore be reset at the beginning.
%    \begin{macrocode}
  \expandafter\let\csname scr@dte@#1@needs\endcsname\relax
  \scr@ifundefinedorrelax{scr@dte@#1@init}{}{%
    \def\DefineTOCEntryBooleanOption{\@DefineTOCEntryBooleanOption{#1}}%
    \def\DefineTOCEntryCommandOption{\@DefineTOCEntryCommandOption{#1}}%
    \def\DefineTOCEntryIfOption{\@DefineTOCEntryIfOption{#1}}%
    \def\DefineTOCEntryLengthOption{\@DefineTOCEntryLengthOption{#1}}%
    \def\DefineTOCEntryListOption{\@DefineTOCEntryListOption{#1}}%
    \def\DefineTOCEntryNumberOption{\@DefineTOCEntryNumberOption{#1}}%
    \def\DefineTOCEntryOption{\@DefineTOCEntryOption{#1}}%
    \def\AddToDeclareTOCEntryStylePreCheckNeeds{%
      \@AddToDeclareTOCEntryStylePreCheckNeeds{#1}}%
    \def\PreToDeclareTOCEntryStylePreCheckNeeds{%
      \@PreToDeclareTOCEntryStylePreCheckNeeds{#1}}%
    \def\TOCEntryStyleNeedsCommandByOption{%
      \@TOCEntryStyleNeedsCommandByOption{#1}}%
    \@nameuse{scr@dte@#1@init}{#2}%
    \let\TOCEntryStyleNeedsCommandByOption\relax
    \let\PreToDeclareTOCEntryStylePreCheckNeeds\relax
    \let\AddToDeclareTOCEntryStylePreCheckNeeds\relax
    \let\DefineTOCEntryOption\relax
    \let\DefineTOCEntryNumberOption\relax
    \let\DefineTOCEntryListOption\relax
    \let\DefineTOCEntryLengthOption\relax
    \let\DefineTOCEntryIfOption\relax
    \let\DefineTOCEntryCommandOption\relax
    \let\DefineTOCEntryBooleanOption\relax
  }%
}
%</body>
%    \end{macrocode}
% \end{macro}^^A \@ExecuteTOCEntryStyleInitCode
%
%
% \begin{command}{\DeclareTOCStyleEntry}
%   \changes{v3.20}{2015/11/13}{added}
%   \changes{v3.39}{2022/10/24}{error message about missing options improved}
%   \changes{v3.41}{2023/06/20}{usage of style definition files supported}
%   \changes{v3.46}{2025/07/17}{using \cs{NewDocumentCommand} for better
%     handling of optional argument}
%   This user command defines a new ToC entry command. It tests, if all needed
%   style macros are already defined. Otherwise an error will be shown and the
%   ToC entry command will not be defined. The arguments are:
%   \begin{description}
%   \item[\oarg{options}:] comma-separated list of options to specify the
%     entry;
%   \item[\marg{style}:] a string, that specifies the style of the ToC entry;
%   \item[\marg{level name}:] a string, that specifies the name of the
%     sectioning level (or float environment), related to the ToC entry;
%   \end{description}
%   The real macro to define a ToC entry command is
%   \cs{scr@dte@def@l@\meta{style}}. That needs exactly one argument, the
%   \meta{level name}.
%    \begin{macrocode}
%<*body>
\NewDocumentCommand{\DeclareTOCStyleEntry}{+omm}{%
  \scr@ifundefinedorrelax{scr@dte@def@l@#2}{%
    \IfFileExists{tocbasic-tocstyle-#2.def}{%
      \edef\reserved@a{%
        \unexpanded{%
          \makeatletter
          \input{tocbasic-tocstyle-#2.def}%
          \catcode`\@=}\the\catcode`\@\relax
      }\reserved@a
    }{}%
  }{}%
  \scr@ifundefinedorrelax{scr@dte@def@l@#2}{%
    \PackageError{tocbasic}{toc entry style `#2' undefined}{%
      Somebody told me to define toc entry `#3' with style `#2',\MessageBreak
      but I do not know style `#2'.\MessageBreak
      You should first define the style then define the entry.\MessageBreak
      If you'll continue, I'll ignore the command. This could result
      in\MessageBreak
      further error messages.%
    }%
  }{%
    \let\scr@dte@precheck\@gobble
    \def\scr@dte@current{#3}%
    \@ExecuteTOCEntryStyleInitCode{#2}{#3}%
    \IfValueT{#1}{%
      \FamilyBoolKey[.dte]{KOMAarg}{expandtopt}{scr@dte@expandtopt}%
      \scr@dte@expandtoptfalse
      \FamilyExecuteOptions[.dte]{KOMAarg}{#1}%
      \RelaxFamilyKey[.dte]{KOMAarg}{expandtopt}%
    }%
    \@RelaxTOCEntryOptions
    \let\scr@dte@doopts\relax
    \let\scr@dte@current\relax
    \scr@ifundefinedorrelax{#3tocdepth}{%
      \expandafter\let\csname #3tocdepth\expandafter\endcsname
      \csname #3numdepth\endcsname
    }{}%
    \scr@dte@precheck{#3}%
    \let\scr@dte@precheck\relax
    \begingroup
      \aftergroup\@tempswatrue
      \def\do##1##2##3##4{%
        \scr@ifundefinedorrelax{##1#3##2}{%
          \PackageError{tocbasic}{toc style `#2' needs ##4\MessageBreak
            of `#3'}{%
            Usually the ##4 is defined using option `##3'.\MessageBreak
            In some cases it may be set defining command
            `\expandafter\string\csname ##1#3##2\endcsname'.\MessageBreak
            If you'll continue, I'll ignore the command. This could result
            in\MessageBreak
            further error messages.%
          }%
          \aftergroup\@tempswafalse
        }{}%
      }%
      \do{}{tocdepth}{level}{toc style level}%
      \@nameuse{scr@dte@#2@needs}%
    \endgroup
    \if@tempswa
      \@nameuse{scr@dte@def@l@#2}{#3}%
%    \end{macrocode}
% \changes{v3.27}{2019/10/02}{macro name prefix for style information changed}
% Note: Before \KOMAScript~3.27 the style name of an entry was stored in
% \cs{scr@dte@\meta{level name}@style}. But this war wrong, because the prefix
% |scr@dte| is used for attributes of the style (while declaring an
% entry), but the style is an attribute of the entry. So usage of the prefix
% |scr@tso| would be much better. This means usage of
% \cs{scr@dte@\meta{level name}@style} is deprecated and should be replaced by
% \cs{scr@tso@\meta{level name}@style}.
%    \begin{macrocode}
      \expandafter\edef\csname scr@dte@#3@style\endcsname{#2}%
      \expandafter\edef\csname scr@tso@#3@style\endcsname{#2}%
%    \end{macrocode}
% \changes{v3.21}{2016/06/09}{\cs{toclevel@\emph{level}} added for \pkg{hyperref}}
% At least \pkg{hyperref}, but several other packages too, depend on a
% \pkg{hyperref} compatible storage of the level number. So we define it here
% additionally. Unfortunately \pkg{hyperref} overwrites this definition, so we
% do so after loading the package and sometimes also at |\begin{document}|.
%    \begin{macrocode}
      \expandafter\let\csname toclevel@#3\expandafter\endcsname
      \csname #3tocdepth\endcsname
      \if@atdocument\else
        \scr@ifundefinedorrelax{AfterPackage}{%
          \AtBeginDocument
        }{%
          \AfterPackage*{hyperref}%
        }%
        {%
          \expandafter\let\csname toclevel@#3\expandafter\endcsname
          \csname #3tocdepth\endcsname
        }%
      \fi
    \fi
  }%
}
%</body>
%    \end{macrocode}
% \end{command}^^A \DeclareTOCStyleEntry
%
% \begin{command}{\DeclareTOCStyleEntries}
%   \changes{v3.26}{2018/08/27}{added}
%   \changes{v3.46}{2025/07/17}{using \cs{NewDocumentCommand} for better
%     handling of optional argument}
%   Use \cs{DeclareTOCStyleEntry} to define a list of entries, all with the
%   same options and style.
%    \begin{macrocode}
%<*body>
\NewDocumentCommand{\DeclareTOCStyleEntries}{+omm}{%
  \edef\reserved@a{#3}%
  \@for \reserved@a:=\reserved@a \do {%
    \scr@trim@spaces\reserved@a
    \ifx\reserved@a\@empty\else
      \IfValueTF{#1}{%
        \edef\reserved@a{%
          \unexpanded{\DeclareTOCStyleEntry[{#1}]{#2}}{\reserved@a}}%
      }{%
        \edef\reserved@a{%
          \unexpanded{\DeclareTOCStyleEntry{#2}}{\reserved@a}}%
      }%
      \reserved@a
    \fi
  }%
}
%</body>
%    \end{macrocode}
% \end{command}^^A \DeclareTOCStyleEntries
%
% \begin{command}{\DeclareTOCEntryStyle}
%   \changes{v3.20}{2015/11/17}{added}
% \begin{macro}{\@DeclareTOCEntryStyle}
%   \changes{v3.46}{2025/07/17}{removed}
% \end{macro}
%   \changes{v3.20}{2015/11/17}{added}
%   \changes{v3.41}{2023/06/20}{using \cs{TOCEntryStyleInitCode*} instead of
%     \cs{TOCEntryStyleInitCode}}
%  \changes{v3.46}{2025/07/17}{using \cs{NewDocumentCommand} to avoid
%    auxiliary command}
%   The user command is used to define a new style for ToC entries. The
%   arguments are:
%   \begin{description}
%   \item[\marg{style}:] a string, that represents the name of the style;
%   \item[\oarg{initialization code}:] code, e.g., to initialize the options,
%     that will be used to define the ToC entry command (note: this code can be
%     executed more than once);
%   \item[\marg{code}:] code, that will be used to generate a ToC entry while
%     loading the auxiliary file of the ToC;
%   \end{description}
%   Independent from the \meta{initialization code}, \opt{level} is always
%   defined, because a numerical ToC level is always needed.
%    \begin{macrocode}
%<*body>
\NewDocumentCommand{\DeclareTOCEntryStyle}{m+O{}+m}{%
  \@namedef{scr@dte@def@l@#1}##1{%
    \@namedef{l@##1}####1####2{%
      \TOC@EntryStartHook{##1}%
      #3%
      \TOC@EntryEndHook{##1}%
    }%
  }%
  \TOCEntryStyleInitCode*{#1}{%
    \DefineTOCEntryNumberOption{level}{}{tocdepth}{toc entry level}%
    #2%
  }%
}
%</body>
%    \end{macrocode}
% \end{command}^^A \DeclareTOCEntryStyle
%
%
% \begin{macro}{\TOC@EntryStartHook,\TOC@EntryEndHook}
% \changes{v3.20}{2016/01/12}{added}
% For every ToC entry, that has been defined by \KOMAScript{}, there is one
% \emph{hook}, that will be executed before the corresponding ToC entry, and
% another \emph{hook}, that will executed after the corresponding ToC entry. Inside
% the \emph{hook} commands \texttt{\#1} is the name of the ToC level. Generally
% the \emph{hook} commands should not do any output and should neither change
% \cs{lastpenalty} nor \len{lastskip}. The user is responsible for this!
% However, because this \emph{hook} is very dangerous, we only have two
% internal macros for it but no user command to add new commands to the
% hook. So it is a kind of last chance mechanism.
%    \begin{macrocode}
%<*body>
\newcommand*{\TOC@EntryStartHook}[1]{}
\newcommand*{\TOC@EntryEndHook}[1]{}
%</body>
%    \end{macrocode}
% \end{macro}^^A \TOC@EntryStartHook,\TOC@EntryEndHook
%
%
% \begin{command}{\CloneTOCEntryStyle}
% \changes{v3.20}{2015/11/25}{added}
% The user command clones the style from \texttt{\#1} to style
% \texttt{\#2}. After cloning you can change the new style.
%    \begin{macrocode}
%<*body>
\newcommand*{\CloneTOCEntryStyle}[2]{%
%    \end{macrocode}
% First of all copy the ToC entry command.
%    \begin{macrocode}
  \expandafter\let\csname scr@dte@def@l@#2\expandafter\endcsname
  \csname scr@dte@def@l@#1\endcsname
%    \end{macrocode}
% Then copy the \meta{initialization code}.
%    \begin{macrocode}
  \expandafter\let\csname scr@dte@#2@init\expandafter\endcsname
  \csname scr@dte@#1@init\endcsname
}
%</body>
%    \end{macrocode}
% \end{command}
%
%
% \begin{macro}{\@pnumwidth,\@tocrmarg,\@dotsep}
% \changes{v3.27}{2019/05/11}{moved from the classes to the package}
% \begin{description}
% \item[\cs{@pnumwidth}] is the space of the page number.
% \item[\cs{@tocrmarg}] is the right margin of entries with more than one
%   line. Usually this should be larger than \cs{@pnumwidth}.
% \item[\cs{\@dotsep}] is the space between the dots of a dotted connecting line.
% \end{description}
%    \begin{macrocode}
%<*body>
\providecommand*\@pnumwidth{1.55em}
\providecommand*\@tocrmarg {2.55em}
\providecommand*\@dotsep   {4.5}
%</body>
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Predefined ToC entry styles}
%
% You can read this code as examples for defining ToC entry styles using the
% commands from the previous sections. Some of them are very basic. Others are
% extensions of the basic styles. \file{scrdocstrip.tex} has to process this
% code several times to generate all the styles.
%
%    \begin{macrocode}
%<*style>
%    \end{macrocode}
% 
% \begin{macro}{\scr@dte@def@l@gobble}
%   \changes{v3.20}{2015/11/20}{ToC style \texttt{gobble} added}
%   The simplest directory entry style is |gobble|. It takes the two arguments
%   for the directory entry and the page number and simply ignores them,
%   regardless of the entry level. Therefore, this style does not require any
%   options or initialization.
%    \begin{macrocode}
%<*gobble>
%%%            (run: style,gobble)
\DeclareTOCEntryStyle{gobble}{}%
%</gobble>
%    \end{macrocode}
% \end{macro}^^A \scr@dte@def@l@gobble
%
% \begin{macro}{\scr@dte@def@l@dottedtocline}
% \changes{v3.20}{2015/11/20}{ToC style \texttt{dottedtocline} added}
% The most simple real ToC entry style is |dottedtocline|. It used the
% \LaTeX{} kernel macro \cs{@dottedtocline}. You should not use this style for
% \KOMAScript. But it may be useful to be used with the standard
% classes. However, in my opinion style |tocline| would always be the better one.
% \begin{macro}{\scr@dte@def@l@undottedtocline}
% \changes{v3.20}{2015/11/20}{ToC style \texttt{undottedtocline} added}
% Style |undottedtocline| corresponds to the style, that is used for chapter
% entries of the standard class \cls*{book} or \cls*{report}. In opposite to
% that, it also supports an horizontal indent. So you can alternatively
% interpret it as a variant of |dottedtocline| without dots.
% \begin{macro}{\scr@dte@def@l@largetocline}
% \changes{v3.20}{2015/11/20}{ToC style \texttt{largetocline} added}
% Style |largetocline| corresponds to the style, that is used for part entries
% of the standard classes. Once again and in opposite to the original code of
% the standard classes, this style supports an entry indent. But an additional
% number width is not supported. Instead the entries will be printed hanging.
% \begin{macro}{\scr@dte@def@l@tocline}
% \changes{v3.20}{2015/11/22}{ToC style \texttt{tocline} added}
% |tocline| is a very flexible style. It is intended to be used for entries with
% one or more line. It is used for all the ToC entries of the \KOMAScript{}
% classes. The classes also clone this style several times.
% \begin{macro}{\scr@dte@def@l@toctext}
% \changes{3.27}{2019/07/08}{ToC style \texttt{toctext} added}
% So far all mentioned styles are intended to generate one paragraph per
% entry. Style |toctext| generated only one paragraph for all consecutive
% entries. So it prints \emph{text inside} a paragraph.
%    \begin{macrocode}
%<*dottedtocline|undottedtocline|largetocline|tocline|toctext>
%<*dottedtocline>
%%%            (run: style,dottedtocline)
\DeclareTOCEntryStyle{dottedtocline}[{%
%</dottedtocline>
%<*undottedtocline>
%%%            (run: style,undottedtocline)
\DeclareTOCEntryStyle{undottedtocline}[{%
%</undottedtocline>
%<*largetocline>
%%%            (run: style, largetocline)
\DeclareTOCEntryStyle{largetocline}[{%
%</largetocline>
%<*toctext>
%%%            (run: style,toctext)
\DeclareTOCEntryStyle{toctext}[{%
%</toctext>
%<*tocline>
%%%            (run: style,tocline)
\DeclareTOCEntryStyle{tocline}[{%
%</tocline>
%    \end{macrocode}
%   \changes{v3.46}{2025/08/13}{new option \opt{numberprefix}}
%   \changes{v3.46}{2025/08/13}{new option \opt{numberpostfix}}
%    \begin{macrocode}
%<*tocline>
  \DefineTOCEntryCommandOption{numberprefix}%
    {scr@tso@}{@numberprefix}{number prefix definition}%
  \DefineTOCEntryCommandOption{numberpostfix}%
    {scr@tso@}{@numberpostfix}{number postfix definition}%
%</tocline>
%    \end{macrocode}
% \changes{v3.31}{2020/06/09}{style \texttt{toctext} also provides option
%   \opt{beforeskip}}
%    \begin{macrocode}
%<*tocline|toctext>
  \DefineTOCEntryLengthOption{beforeskip}%
    {scr@tso@}{@beforeskip}{vertical skip before the entry}%
%</tocline|toctext>
%<*tocline>
  \DefineTOCEntryIfOption{breakafternumber}%
    {scr@tso@}{@breakafternumber}{line break after number flag}%
  \DefineTOCEntryIfOption{dynnumwidth}%
    {scr@tso@}{@dynnumwidth}{dynamic number width flag}%
%    \end{macrocode}
% \changes{v3.31}{2020/06/08}{option for indent follows list}
%    \begin{macrocode}
  \DefineTOCEntryListOption{indentfollows}%
    {scr@tso@}{@indentfollows}{list of levels that define the indent}%
  \DefineTOCEntryIfOption{dynindent}%
    {scr@tso@}{@dynindent}{dynamic indent width flag}%
%</tocline>
%<*tocline|toctext>
  \DefineTOCEntryCommandOption{entryformat}%
    {scr@tso@}{@entryformat}[1]{entry format}%
  \DefineTOCEntryCommandOption{entrynumberformat}%
    {scr@tso@}{@numberformat}[1]{entry number format}%
%</tocline|toctext>
%<*tocline>
  \DefineTOCEntryCommandOption{linefill}[\TOCLineLeaderFill]%
    {scr@tso@}{@linefill}{filling between text and page number}%
%</tocline>
%<*toctext>
  \DefineTOCEntryCommandOption{prepagenumber}%
    {scr@tso@}{@prepagenumber}{separator between text and page number}%
%</toctext>
%<*tocline|toctext>
  \DefineTOCEntryLengthOption{numsep}%
    {scr@tso@}{@numsep}{entry number separation}%
%</tocline|toctext>
%<*tocline>
  \DefineTOCEntryCommandOption{onstarthigherlevel}%
    {scr@tso@}{@LastTOCLevelWasLower}{start higher level entry hook}%
  \DefineTOCEntryCommandOption{onstartlowerlevel}%
    {scr@tso@}{@LastTOCLevelWasHigher}{start lower level entry hook}%
  \DefineTOCEntryCommandOption{onstartsamelevel}%
    {scr@tso@}{@LastTOCLevelWasSame}{start same level entry hook}%
%</tocline>
%<*toctext>
  \DefineTOCEntryCommandOption{onstartfirstentry}%
    {scr@tso@}{@onstartfirstentry}{output at start of paragraph}%
  \DefineTOCEntryCommandOption{onstartentry}%
    {scr@tso@}{@onstartentry}{output at start of all entries but the first}%
  \DefineTOCEntryCommandOption{onendlastentry}%
    {scr@tso@}{@onendlastentry}{output at end of paragraph}%
  \DefineTOCEntryCommandOption{afterpar}%
    {scr@tso@}{@afterpar}{settings after end of paragraph}%
  \DefineTOCEntryCommandOption{onendentry}%
    {scr@tso@}{@onendentry}{output at end of all entries but the last}%
%</toctext>
%<*tocline>
  \DefineTOCEntryCommandOption{pagenumberbox}%
    {scr@tso@}{@pagenumberbox}[1]{page number box}%
%</tocline>
%<*tocline|toctext> 
  \DefineTOCEntryCommandOption{pagenumberformat}%
    {scr@tso@}{@pagenumberformat}[1]{page number format}%
%</tocline|toctext>  
%    \end{macrocode}
% \changes{v3.27}{2019/05/24}{new option \opt{pagenumberwidth}}
% \changes{v3.27}{2019/05/24}{new option \opt{rightindent}}
% Die Optionen \opt{pagenumberwidth} und \opt{rightindent} ersetzen
% innerhalb des Stils |tocline| die Makros \cs{@pnumwidth} und
% \cs{@tocrmarg}.
%    \begin{macrocode}
%<*tocline>
  \DefineTOCEntryLengthOption{pagenumberwidth}%
    {scr@tso@}{@pagenumberwidth}{width of page number box}%
%</tocline>
%<*tocline|toctext>
  \DefineTOCEntryLengthOption{rightindent}%
    {scr@tso@}{@rightindent}{entry's text right indent}%
%</tocline|toctext>  
%    \end{macrocode}
% \changes{v3.21}{2016/06/06}{new option \opt{raggedentrytext}}
% Unfortunately definition of option \opt{raggedentrytext} is somehow
% cumbersome, to be more or less compatible with former definition of
% \cs{raggedchapterentry}.
%    \begin{macrocode}
%<*tocline>
  \DefineTOCEntryOption{raggedentrytext}[true]{%
    \FamilySetBool{KOMAarg}{raggedentrytext}{@tempswa}{##1}%
    \ifx\FamilyKeyState\FamilyKeyStateProcessed
      \if@tempswa
        \expandafter\let\csname ragged\scr@dte@current entry\endcsname
        \raggedright
      \else
        \expandafter\let\csname ragged\scr@dte@current entry\endcsname
        \relax
      \fi
    \fi
  }%
  \DefineTOCEntryIfOption{raggedpagenumber}%
    {scr@tso@}{@raggedpage}{page number ragged flag}%
%</tocline>
%<*toctext>
  \DefineTOCEntryIfOption{raggedright}%
    {scr@tso@}{@raggedright}{use raggedright for the whole paragraph}%
%</toctext>
  \DefineTOCEntryLengthOption{indent}%
    {scr@tso@}{@indent}{entry indent}%
%<*dottedtocline|undottedtocline|tocline>
  \DefineTOCEntryLengthOption{numwidth}%
    {scr@tso@}{@numwidth}{entry number width}%
%</dottedtocline|undottedtocline|tocline>
%    \end{macrocode}
%   \changes{v3.46}{2025/08/13}{new default for option \opt{numberprefix}}
%   \changes{v3.46}{2025/08/13}{new default for option \opt{numberpostfix}}
%    \begin{macrocode}
%<*tocline>
  \ExpandArgs{c}\providecommand{scr@tso@#1@numberprefix}{}%
  \ExpandArgs{c}\providecommand{scr@tso@#1@numberpostfix}{}%
%</tocline>
%    \end{macrocode}
% Automatic setting of the numerical level of option \opt{level} resp. command
% \cs{\meta{entry name}tocdepth} can be done either by increasing the parent
% level number of a sub level, if the parent level has already be defined:
% \changes{v3.21}{2016/06/09}{\cs{the} inserted}
% \changes{v3.28}{2019/11/18}{\cs{ifstr} renamed to \cs{Ifstr}}
%    \begin{macrocode}
%<*tocline|toctext>
  \scr@ifundefinedorrelax{#1tocdepth}{%
    \Ifstrstart{#1}{sub}{%
      \scr@ifundefinedorrelax{\scr@dte@nosub{#1}tocdepth}{}{%
        \expandafter\edef\csname #1tocdepth\endcsname{%
          \the\numexpr \noexpand\@nameuse{\scr@dte@nosub{#1}tocdepth}+\@ne\relax
        }%
      }%
    }{}%
  }{}%
%</tocline|toctext>
%    \end{macrocode}
% or, if this cannot be used, by using a standard value analogues to the
% values of the standard classes and the \KOMAScript{} classes.
% \changes{v3.39}{2022/10/24}{default level for \texttt{lstlisting} added}
%    \begin{macrocode}
  \@ifundefined{#1tocdepth}{%
    \Ifstr{#1}{part}{\@namedef{#1tocdepth}{-1}}{%
      \Ifstr{#1}{chapter}{\@namedef{#1tocdepth}{0}}{%
        \Ifstr{#1}{section}{\@namedef{#1tocdepth}{1}}{%
          \Ifstr{#1}{subsection}{\@namedef{#1tocdepth}{2}}{%
            \Ifstr{#1}{subsubsection}{\@namedef{#1tocdepth}{3}}{%
              \Ifstr{#1}{paragraph}{\@namedef{#1tocdepth}{4}}{%
                \Ifstr{#1}{subparagraph}{\@namedef{#1tocdepth}{5}}{%
                  \Ifstr{#1}{figure}{\@namedef{#1tocdepth}{1}}{%
                    \Ifstr{#1}{table}{\@namedef{#1tocdepth}{1}}{%
                      \Ifstr{#1}{lstlisting}{\@namedef{#1tocdepth}{1}}{%
%    \end{macrocode}
% As last chance, we can use the same number already used for a headings level
% with the same name.
%    \begin{macrocode}
                        \expandafter\let\csname #1tocdepth\expandafter\endcsname
                        \csname #1numdepth\endcsname
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }{}%
%    \end{macrocode}
% \changes{v3.39}{2022/10/24}{try also using \cs{toclevel@\meta{level name}} as
%   default level}
% Last but not least, if \cs{tocdepth@\meta{level name}} has been defined, we
% can use this one.
%    \begin{macrocode}
  \@ifundefined{#1tocdepth}{%
    \expandafter\let\csname #1tocdepth\expandafter\endcsname
    \csname toclevel@#1\endcsname
  }{}%
%    \end{macrocode}
% The indent can also be defined automatically by a parent level.
%    \begin{macrocode}
%<*tocline|toctext>
  \scr@ifundefinedorrelax{scr@tso@#1@indent}{%
    \@ifundefined{scr@#1@tocindent}{%
      \Ifstrstart{#1}{sub}{%
        \scr@ifundefinedorrelax{scr@tso@\scr@dte@nosub{#1}@indent}{%
          \scr@ifundefinedorrelax{scr@tso@\scr@dte@nosub{#1}@numwidth}{}{%
            \expandafter\edef\csname scr@tso@#1@indent\endcsname{%
              \glueexpr \noexpand\@nameuse{scr@tso@\scr@dte@nosub{#1}@numwidth}%
              \relax
            }%
          }%
        }{%
          \scr@ifundefinedorrelax{scr@tso@\scr@dte@nosub{#1}@numwidth}{%
            \expandafter\edef\csname scr@tso@#1@indent\endcsname{%
              \glueexpr \noexpand\@nameuse{scr@tso@\scr@dte@nosub{#1}@indent}%
              \relax
            }%
          }{%
            \expandafter\edef\csname scr@tso@#1@indent\endcsname{%
              \glueexpr \noexpand\@nameuse{scr@tso@\scr@dte@nosub{#1}@indent}%
                       +\noexpand\@nameuse{scr@tso@\scr@dte@nosub{#1}@numwidth}%
              \relax
            }%
          }%
        }%
      }{}%
    }{%
%    \end{macrocode}
% Former \KOMAScript{} versions use another macro name, that is also defined
% for compatibility.
%    \begin{macrocode}
      \@namedef{scr@tso@#1@indent}{\@nameuse{scr@#1@tocindent}}%
    }%
  }{}%
%</tocline|toctext>
%    \end{macrocode}
% The width of the page number box and the right margin can simply be copied
% from a parent level.
%    \begin{macrocode}
%<*tocline>
  \scr@ifundefinedorrelax{scr@tso@#1@pagenumberwidth}{%
    \Ifstrstart{#1}{sub}{%
      \scr@ifundefinedorrelax{scr@tso@\scr@dte@nosub{#1}@pagenumberwidth}{%
        \@namedef{scr@tso@#1@pagenumberwidth}{\@pnumwidth}%
      }{%
        \expandafter\let
        \csname scr@tso@#1@pagenumberwidth\expandafter\endcsname
        \csname scr@tso@\scr@dte@nosub{#1}@pagenumberwidth\endcsname
      }%
    }{%
      \@namedef{scr@tso@#1@pagenumberwidth}{\@pnumwidth}%
    }%
  }{}%
%</tocline>
%<*tocline|toctext>
  \scr@ifundefinedorrelax{scr@tso@#1@rightindent}{%
    \Ifstrstart{#1}{sub}{%
      \scr@ifundefinedorrelax{scr@tso@\scr@dte@nosub{#1}@rightindent}{%
        \@namedef{scr@tso@#1@rightindent}{\@tocrmarg}%
      }{%
        \expandafter\let
        \csname scr@tso@#1@rightindent\expandafter\endcsname
        \csname scr@tso@\scr@dte@nosub{#1}@rightindent\endcsname
      }%
    }{%
      \@namedef{scr@tso@#1@rightindent}{\@tocrmarg}%
    }%
  }{}%
%</tocline|toctext>
%    \end{macrocode}
% If all the automatic setting methods were not successful, we try standard
% values used from the standard classes or older versions of the \KOMAScript{}
% classes.
% \changes{v3.39}{2022/10/24}{default indent for \texttt{lstlisting} added}
%    \begin{macrocode}
  \@ifundefined{scr@tso@#1@indent}{%
%<*dottedtocline|undottedtocline|largetocline>
    \@ifundefined{scr@#1@tocindent}{%
%</dottedtocline|undottedtocline|largetocline>
      \Ifstr{#1}{figure}{\@namedef{scr@tso@#1@indent}{1.5em}}{%
        \Ifstr{#1}{table}{\@namedef{scr@tso@#1@indent}{1.5em}}{%
          \Ifstr{#1}{lstlisting}{\@namedef{scr@tso@#1@indent}{1.5em}}{%
            \Ifstr{#1}{part}{\@namedef{scr@tso@#1@indent}{0em}}{%
              \Ifstr{#1}{chapter}{\@namedef{scr@tso@#1@indent}{0em}}{%
%    \end{macrocode}
% The follow code needs information about the existence of the chapter
% level. So the chapter level should already be defined, before the first
% usage!
%    \begin{macrocode}
                \scr@ifundefinedorrelax{l@chapter}{%
                  \Ifstr{#1}{section}{\@namedef{scr@tso@#1@indent}{0pt}}{%
                    \Ifstr{#1}{subsection}{\@namedef{scr@tso@#1@indent}{1.5em}}{%
                      \Ifstr{#1}{subsubsection}{%
                        \@namedef{scr@tso@#1@indent}{3.8em}%
                      }{%
                        \Ifstr{#1}{paragraph}{%
                          \@namedef{scr@tso@#1@indent}{7em}%
                        }{%
                          \Ifstr{#1}{subparagraph}{%
                            \@namedef{scr@tso@#1@indent}{10em}%
                          }{%
%    \end{macrocode}
% If nothing helps, the user has to define the values.
%    \begin{macrocode}
                          }%
                        }%
                      }%
                    }%
                  }%
                }{%
                  \Ifstr{#1}{section}{\@namedef{scr@tso@#1@indent}{1.5em}}{%
                    \Ifstr{#1}{subsection}{\@namedef{scr@tso@#1@indent}{3.8em}}{%
                      \Ifstr{#1}{subsubsection}{%
                        \@namedef{scr@tso@#1@indent}{7.0em}%
                      }{%
                        \Ifstr{#1}{paragraph}{%
                          \@namedef{scr@tso@#1@indent}{10em}%
                        }{%
                          \Ifstr{#1}{subparagraph}{%
                            \@namedef{scr@tso@#1@indent}{12em}%
                          }{%
%    \end{macrocode}
% Once more: if nothing helps, the user has to define the values.
%    \begin{macrocode}
                          }%
                        }%
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
%<*dottedtocline|undottedtocline|largetocline>
    }{%
%    \end{macrocode}
% Once again, for compatibility with former versions of \KOMAScript:
%    \begin{macrocode}
      \@namedef{scr@tso@#1@indent}{\@nameuse{scr@#1@tocindent}}%
    }%
%</dottedtocline|undottedtocline|largetocline>
  }{}%
%    \end{macrocode}
% Almost the same for the number width:
% \changes{v3.39}{2022/10/24}{default number width for \texttt{lstlisting} added}
%    \begin{macrocode}
%<*dottedtocline|undottedtocline|tocline>
%<*tocline>
  \scr@ifundefinedorrelax{scr@tso@#1@numwidth}{%
    \scr@ifundefinedorrelax{scr@#1@tocnumwidth}{%
      \Ifstrstart{#1}{sub}{%
        \scr@ifundefinedorrelax{scr@tso@\scr@dte@nosub{#1}@numwidth}{}{%
          \expandafter\edef\csname scr@tso@#1@numwidth\endcsname{%
            \glueexpr \noexpand\@nameuse{scr@tso@\scr@dte@nosub{#1}@numwidth}%
                     +.9em%
            \relax
          }%
        }%
      }{}%
    }{%
      \@namedef{scr@tso@#1@numwidth}{\@nameuse{scr@#1@tocnumwidth}}%
    }%
  }{}%
%</tocline>
  \@ifundefined{scr@tso@#1@numwidth}{%
%<*dottedtocline|undottedtocline>
    \@ifundefined{scr@#1@tocnumwidth}{%
%</dottedtocline|undottedtocline>
      \Ifstr{#1}{figure}{\@namedef{scr@tso@#1@numwidth}{2.3em}}{%
        \Ifstr{#1}{table}{\@namedef{scr@tso@#1@numwidth}{2.3em}}{%
          \Ifstr{#1}{lstlisting}{\@namedef{scr@tso@#1@numwidth}{2.3em}}{%
            \Ifstr{#1}{chapter}{\@namedef{scr@tso@#1@numwidth}{1.5em}}{%
%    \end{macrocode}
% Depending on existence of the chapter level:
%    \begin{macrocode}
              \scr@ifundefinedorrelax{chapter}{%
                \Ifstr{#1}{section}{\@namedef{scr@tso@#1@numwidth}{1.5em}}{%
                  \Ifstr{#1}{subsection}{\@namedef{scr@tso@#1@numwidth}{2.3em}}{%
                    \Ifstr{#1}{subsubsection}{%
                      \@namedef{scr@tso@#1@numwidth}{3.2em}%
                    }{%
                      \Ifstr{#1}{paragraph}{%
                        \@namedef{scr@tso@#1@numwidth}{4.1em}%
                      }{%
                        \Ifstr{#1}{subparagraph}{%
                          \@namedef{scr@tso@#1@numwidth}{5m}%
                        }{%
%    \end{macrocode}
% Need option to be set.
%    \begin{macrocode}
                        }%
                      }%
                    }%
                  }%
                }%
              }{%
                \Ifstr{#1}{section}{\@namedef{scr@tso@#1@numwidth}{2.3em}}{%
                  \Ifstr{#1}{subsection}{\@namedef{scr@tso@#1@numwidth}{3.2em}}{%
                    \Ifstr{#1}{subsubsection}{%
                      \@namedef{scr@tso@#1@numwidth}{3.1em}%
                    }{%
                      \Ifstr{#1}{paragraph}{%
                        \@namedef{scr@tso@#1@numwidth}{5em}%
                      }{%
                        \Ifstr{#1}{subparagraph}{%
                          \@namedef{scr@tso@#1@numwidth}{6em}%
                        }{%
%    \end{macrocode}
% Need option to be set.
%    \begin{macrocode}
                        }%
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
%<*dottedtocline|undottedtocline>
    }{%
%    \end{macrocode}
% Compatibility with old \KOMAScript{} versions.
%    \begin{macrocode}
      \@namedef{scr@tso@#1@numwidth}{\@nameuse{scr@#1@tocnumwidth}}%
    }%
%</dottedtocline|undottedtocline>
  }{}%
%</dottedtocline|undottedtocline|tocline>
%<*tocline>
%    \end{macrocode}
% The three penalty hooks. Here simply the default commands are used by
% default.
%    \begin{macrocode}
  \expandafter\providecommand%
  \csname scr@tso@#1@LastTOCLevelWasLower\endcsname{\LastTOCLevelWasLower}%
  \expandafter\providecommand%
  \csname scr@tso@#1@LastTOCLevelWasSame\endcsname{\LastTOCLevelWasSame}%
  \expandafter\providecommand%
  \csname scr@tso@#1@LastTOCLevelWasHigher\endcsname{\LastTOCLevelWasHigher}%
%    \end{macrocode}
% The default of the vertical distance of entries is 0 plus some glue. But
% this is enough only for at least one line, if needed for vertical
% justification. For the higher levels (part and chapter resp. section) the
% defaults of the standard classes are used. These have some more glue.
%    \begin{macrocode}
  \@ifundefined{scr@tso@#1@beforeskip}{%
    \Ifstr{#1}{part}{%
      \@namedef{scr@tso@#1@beforeskip}{\glueexpr 2.25em \@plus\p@\relax}%
    }{%
      \Ifstr{#1}{chapter}{%
        \@namedef{scr@tso@#1@beforeskip}{\glueexpr 1.0em \@plus\p@\relax}%
      }{%
        \Ifstr{#1}{section}{%
          \scr@ifundefinedorrelax{l@chapter}{%
            \@namedef{scr@tso@#1@beforeskip}{\glueexpr 1.0em \@plus\p@\relax}%
          }{}%
        }{}%
      }%
    }%
    \expandafter\providecommand\expandafter*%
    \csname scr@tso@#1@beforeskip\endcsname{\glueexpr \z@ plus .2\p@\relax}%
  }{}%
%</tocline>
%    \end{macrocode}
% \changes{v3.31}{2020/06/09}{\opt{beforeskip} default also for style \texttt{toctext}}
% For style |toctext| a default without glue is used to stay compatible.
%    \begin{macrocode}
%<*toctext>
  \expandafter\providecommand\expandafter*%
  \csname scr@tso@#1@beforeskip\endcsname{\z@}%
%</toctext>
%<*tocline>
%    \end{macrocode}
% It would be good to know the width of the widest number. We will use this to
% test several conditions.
%    \begin{macrocode}
  \@ifundefined{scr@dte@#1@maxnumwidth}{%
    \expandafter\newlength\csname scr@dte@#1@maxnumwidth\endcsname
    \setlength{\@nameuse{scr@dte@#1@maxnumwidth}}{\z@}%
  }{}%
  \providecommand*{\scr@dte@donumwidth}{}%
  \g@addto@macro{\scr@dte@donumwidth}{\do{#1}}%
%</tocline>
%    \end{macrocode}
% One condition is a minimum distance between number and text.
%    \begin{macrocode}
%<*tocline|toctext>
  \expandafter\providecommand\expandafter*%
  \csname scr@tso@#1@numsep\endcsname{.4em}%
%</tocline|toctext>
%    \end{macrocode}
% The |toctext| style support the output of some text before the first entry
% of a paragraph, between the entries and after the last entry of a paragraph.
%    \begin{macrocode}
%<*toctext>
  \expandafter\providecommand%
  \csname scr@tso@#1@onstartfirstentry\endcsname{}%
  \expandafter\providecommand%
  \csname scr@tso@#1@onstartentry\endcsname{}%
  \expandafter\providecommand%
  \csname scr@tso@#1@onendlastentry\endcsname{}%
  \expandafter\providecommand%
  \csname scr@tso@#1@onendentry\endcsname{\quad}%
  \expandafter\providecommand%
  \csname scr@tso@#1@afterpar\endcsname{}%
%</toctext>
%    \end{macrocode}
% Formatting for only the number and formatting for number and text are
% provided. For part we use the formatting of the standard classes as default.
%    \begin{macrocode}
%<*tocline|toctext>
  \expandafter\providecommand%
  \csname scr@tso@#1@numberformat\endcsname[1]{##1}%
%<*tocline>
  \Ifstr{#1}{part}{%
    \expandafter\providecommand%
    \csname scr@tso@#1@entryformat\endcsname[1]{\large\bfseries ##1}%
  }{%
    \Ifstr{#1}{chapter}{%
      \expandafter\providecommand%
      \csname scr@tso@#1@entryformat\endcsname[1]{\bfseries ##1}%
    }{%
      \scr@ifundefinedorrelax{l@chapter}{%
        \Ifstr{#1}{section}{%
          \expandafter\providecommand%
          \csname scr@tso@#1@entryformat\endcsname[1]{\bfseries ##1}%
        }{}%
      }{}%
%</tocline>
      \expandafter\providecommand%
      \csname scr@tso@#1@entryformat\endcsname[1]{##1}%
%<*tocline>      
    }%
  }%
%</tocline>
%</tocline|toctext>
%    \end{macrocode}
% After the number a line break is optional. In this case the text starts
% again at the horizontal position of the number and not behind it. The
% default is, not to break after the number.
%    \begin{macrocode}
%<*tocline>
  \expandafter\providecommand
  \csname Ifscr@tso@#1@breakafternumber\endcsname[2]{##2}%
%    \end{macrocode}
% The default of the connection between the end of the text and the page
% number column is a simple \cs{hfill}. Here you can optionally use dots as usual.
%    \begin{macrocode}
  \@ifundefined{scr@tso@#1@linefill}{%
    \Ifstr{#1}{part}{%
      \@namedef{scr@tso@#1@linefill}{\hfill}%
    }{%
      \Ifstr{#1}{chapter}{%
        \@namedef{scr@tso@#1@linefill}{\hfill}%
      }{%
        \scr@ifundefinedorrelax{l@chapter}{%
          \Ifstr{#1}{section}{%
            \@namedef{scr@tso@#1@linefill}{\hfill}%
          }{}%
        }{}%
        \expandafter\providecommand%
        \csname scr@tso@#1@linefill\endcsname{\TOCLineLeaderFill\relax}%
      }%
    }%
  }{}%
%    \end{macrocode}
% If you don't want a connection, this does not automatically mean, that the
% page number moves forwards to the end of the text. This only happens, if the
% entry is set ragged.
%    \begin{macrocode}
  \expandafter\providecommand\csname Ifscr@tso@#1@raggedpage\endcsname[2]{##2}%
%    \end{macrocode}
% Optionally you can use a formatting for the page number.
%    \begin{macrocode}
  \Ifstr{#1}{part}{%
%    \end{macrocode}
% With parts this is usually large and bold.
%    \begin{macrocode}
    \expandafter\providecommand%
    \csname scr@tso@#1@pagenumberformat\endcsname[1]{\large\bfseries ##1}%
  }{%
%    \end{macrocode}
% \changes{v3.25}{2017/11/23}{default of page numbers of chapter entries is bold}
% With chapters it is bold.
%    \begin{macrocode}
    \Ifstr{#1}{chapter}{%
      \expandafter\providecommand%
      \csname scr@tso@#1@pagenumberformat\endcsname[1]{\bfseries ##1}%
    }{%
      \scr@ifundefinedorrelax{l@chapter}{%
        \Ifstr{#1}{section}{%
%    \end{macrocode}
% \changes{v3.25}{2017/11/23}{default of page numbers of section entries maybe
%   bold}
% With sections sometimes bold.
%    \begin{macrocode}
          \expandafter\providecommand%
          \csname scr@tso@#1@pagenumberformat\endcsname[1]{\bfseries ##1}%
        }{}%
      }{}%
%    \end{macrocode}
% All others in normal font and normal color.
%    \begin{macrocode}
      \expandafter\providecommand%
      \csname scr@tso@#1@pagenumberformat\endcsname[1]{%
        \normalfont\normalcolor ##1}%
    }%
  }%
%    \end{macrocode}
% Sometimes the page number has a box with defined width.
% \changes{v3.27}{2019/10/02}{consequent use of width of page number box}
%    \begin{macrocode}
  \expandafter\providecommand%
  \csname scr@tso@#1@pagenumberbox\endcsname[1]{%
    \hb@xt@\@nameuse{scr@dte@pagenumberwidth}{\hfil ##1}}%
  \expandafter\providecommand\csname Ifscr@tso@#1@dynnumwidth\endcsname[2]{##2}%
%    \end{macrocode}
% \changes{v3.31}{2020/06/08}{init indent follows list}
% This command defines a list of levels that specify the indent (if not empty).
%    \begin{macrocode}
  \expandafter\providecommand\csname Ifscr@tso@#1@dynindent\endcsname[2]{##2}%
  \scr@ifundefinedorrelax{scr@tso@#1@indentfollows}{%
    \Ifstrstart{#1}{sub}{%
      \expandafter\edef\csname scr@tso@#1@indentfollows\endcsname{%
        \scr@dte@nosub{#1}%
      }%
    }{%
      \expandafter\let\csname scr@tso@#1@indentfollows\endcsname\@empty
    }%
  }{}%
%</tocline>
%    \end{macrocode}
% \changes{v3.27}{2019/07/08}{initialization of \opt{raggedentry}}
% \changes{v3.27}{2019/07/08}{initialization of \opt{prepagenumber}}
% \changes{v3.46}{2025/06/26}{initialization of \opt{pagenumberformat}}
% With style |toctext| we have to initialize ragged or justified text and what
% to print immediately before the page number (\opt{linefill} wouldn't have
% been a suitable term).
%    \begin{macrocode}
%<*toctext>
  \expandafter\providecommand%
  \csname Ifscr@tso@#1@raggedright\endcsname[2]{##2}%
  \expandafter\providecommand%
  \csname scr@tso@#1@prepagenumber\endcsname{\nobreakspace}%
  \expandafter\providecommand%
  \csname scr@tso@#1@pagenumberformat\endcsname[1]{##1}%
%</toctext>
}]{%
%    \end{macrocode}
% \changes{v3.27}{2019/05/12}{support for \opt{noindent}}
% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
%   \cs{Iftocfeature}}
% Initialization complete. Next we have the output code or macro.
%    \begin{macrocode}
%<*dottedtocline>
  \Iftocfeature{\@currext}{noindent}{%
    \@dottedtocline{\@nameuse{#1tocdepth}}{\z@}%
                   {\@nameuse{scr@tso@#1@numwidth}}{##1}{##2}%
  }{%
    \@dottedtocline{\@nameuse{#1tocdepth}}{\@nameuse{scr@tso@#1@indent}}%
                   {\@nameuse{scr@tso@#1@numwidth}}{##1}{##2}%
  }%
%</dottedtocline> 
%<*undottedtocline|largetocline>
  \ifnum \c@tocdepth >\numexpr \@nameuse{#1tocdepth}-\@ne\relax
%    \end{macrocode}
% Here we have a little difference between chapters and the sections of
% \cls*{article}. We do this by the level. So if you change the levels, the
% result would change too.
%    \begin{macrocode}
    \ifnum \@nameuse{#1tocdepth}<\@ne
      \scr@ifundefinedorrelax{chapter}{%
        \addpenalty\@secpenalty
%<undottedtocline>        \addvspace{1.0em \@plus\p@}%
%<largetocline>        \addvspace{2.25em \@plus\p@}%
      }{%
        \addpenalty{-\@highpenalty}%
%<undottedtocline>        \vskip 1.0em \@plus\p@
%<largetocline>        \addvspace{2.25em \@plus\p@}%
      }%
    \else
      \addpenalty\@secpenalty
%<undottedtocline>      \addvspace{1.0em \@plus\p@}%
%<largetocline>      \addvspace{2.25em \@plus\p@}%
    \fi
%<undottedtocline>    \setlength\@tempdima{\@nameuse{scr@tso@#1@numwidth}}%
%<largetocline>    \setlength\@tempdima{3em}%
    \begingroup
%    \end{macrocode}
% Note: Here we should use two \cs{@tocrmarg} correctly. I've reported this
% bug in the standard classes years ago without any change. So for
% compatibility I've decided to accept it as feature and two times
% \cs{@pnumwith} like the standard classes.
%    \begin{macrocode}
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
%    \end{macrocode}
% The standard classes use a group at this point. This group ends before the
% final \cs{par}. This can result in wrong baseline skip for multi line
% entries. It was a hard decision, but I've decided to avoid this bug, because
% it was much too strange. Moreover, with the bug, the setting of
% \len{leftskip} would have to be changed, because here also the value at the
% end of the paragraph is used.
%    \begin{macrocode}
      \leavevmode
%<largetocline>      \large
      \bfseries
%    \end{macrocode}
% Note, here we also should use \cs{@tempdima} with style |largetocline|. But
% we cannot do so, only because the standard classes do not use
% \cs{numberline} for parts. Because of this, multi line entries are not
% correctly indented. To do this same is also because of compatibility.
% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by \cs{Iftocfeature}}
%    \begin{macrocode}
%<undottedtocline>      \advance\leftskip\@tempdima
      \Iftocfeature{\@currext}{noindent}{%
%<undottedtocline>        \hskip -\leftskip
      }{%
        \advance\leftskip\@nameuse{scr@tso@#1@indent}%
%<*undottedtocline>
        \hskip -\dimexpr \leftskip-\@nameuse{scr@tso@#1@indent}\relax
%</undottedtocline>
      }%
      ##1%
%<undottedtocline>      \nobreak
%    \end{macrocode}
% Here \cs{@pnumwidth} is not the same absolute value for entries with
% \cs{large} as for entries without \cs{large}. So correctly, e.g., the value
% should be transferred via \len{@temdimb}. But because of compatibility this
% bug hat also been interpreted as feature.
%    \begin{macrocode}
      \hfil \nobreak\hb@xt@\@pnumwidth{\hss ##2}%
      \par
%<undottedtocline>      \penalty\@highpenalty
%<*largetocline>
      \nobreak
      \ifnum 0=
        \scr@ifundefinedorrelax{chapter}{\if@compatibility 1\else 0\fi}{1}\relax
        \global\@nobreaktrue
        \everypar{\global\@nobreakfalse\everypar{}}%
      \fi
%</largetocline>
    \endgroup
  \fi
%</undottedtocline|largetocline>
%<*tocline>
  \scr@dte@tocline{#1}{##1}{##2}%
%</tocline>
%<*toctext>
  \scr@dte@toctext{#1}{##1}{##2}%
%</toctext>
}
%</dottedtocline|undottedtocline|largetocline|tocline|toctext>
%    \end{macrocode}
% \end{macro}^^A \scr@dte@def@l@toctext
% \end{macro}^^A \scr@dte@def@l@tocline
% \end{macro}^^A \scr@dte@def@l@largetocline
% \end{macro}^^A \scr@dte@def@l@undottedtocline
% \end{macro}^^A \scr@dte@def@l@dottedtocline
%
% Style |tocline| needs several additional settings and macros:
%    \begin{macrocode}
%<*tocline>
\AtBeginDocument{%
  \BeforeClosingMainAux{%
    \begingroup
      \def\do#1{%
        \relax
        \scr@ifundefinedorrelax{scr@dte@#1@maxnumwidth}{}{%
          \ifdim \@nameuse{scr@dte@#1@maxnumwidth}>\z@
            \if@filesw
              \protected@write\@mainaux{}{%
                \string\global\string\@namedef{scr@dte@#1@lastmaxnumwidth}%
                {\the\@nameuse{scr@dte@#1@maxnumwidth}}%
              }%
            \fi
            \@nameuse{scr@dte@#1@maxnumwidth}\z@
          \fi
        }%
      }%
      \@nameuse{scr@dte@donumwidth}%
    \endgroup
  }%
}
%    \end{macrocode}
% \begin{macro}{\scr@dte@nosub,\@scr@dte@nosub}
% \changes{v3.20}{2015/11/23}{added}
% These helper macros are used to recognize the |sub| prefix at the start of
% an argument and remove it. If there isn't a |sub| at the very beginning, we
% report an error, because of wrong usage of \cs{@scr@de@nusub}.
%    \begin{macrocode}
\newcommand*{\scr@dte@nosub}[1]{\@scr@dte@nosub #1\relax}
\newcommand*{\@scr@dte@nosub}{}
\def\@scr@dte@nosub sub#1\relax{#1}
%    \end{macrocode}
% \end{macro}^^A \scr@dte@nosub,\@scr@dte@nosub
% \begin{macro}{\scr@dte@tocline}
% \changes{v3.20}{2015/11/22}{added}
% \changes{v3.27}{2019/05/12}{support for \opt{noindent}}
% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by \cs{Iftocfeature}}
% This is somehow like the \LaTeX{} kernel macro \cs{@dottedtocline}. But it
% supports a lot of more attributes, not only the level, the numberwidth, the
% indent and the text. The attributes are handled by options. So we need only
% three arguments:
% \begin{description}
% \item[\marg{level name}:] the name of the ToC entry level;
% \item[\marg{entry}:] the ToC entry;
% \item[\marg{page number}:] the page number of the ToC entry.
% \end{description}
% \begin{length}{\scr@dte@tocline@numberwidth}
% \changes{v3.20}{2016/01/15}{added}
% Sometimes the real width of a formatted number is of interest. So we store
% it in \len{scr@dte@tocline@numberwidth}.
%    \begin{macrocode}
\newlength\scr@dte@tocline@numberwidth
\newcommand*{\scr@dte@tocline}[3]{%
  \ifnum \@nameuse{#1tocdepth}>\c@tocdepth
  \else
    \tocbasic@DependOnPenaltyAndTOCLevel{#1}%
    \addvspace{\@nameuse{scr@tso@#1@beforeskip}}\relax
%    \end{macrocode}
% \changes{v3.31}{2020/06/08}{code for indent following list processing}
% If a indent following list exists and the depth of an entry is lower than
% the depth of the current entry, use the maximum of the ident + number width
% for the indent of this entry.
%    \begin{macrocode}
    \@nameuse{Ifscr@tso@#1@dynindent}{%
      \expandafter\ifx\csname scr@tso@#1@indentfollows\endcsname\@empty
        \PackageWarning{tocbasic}{`dynindent' for `#1' not available}%
      \else
        \edef\reserved@a{\@nameuse{scr@tso@#1@indentfollows}}%    
        \@for \reserved@a:=\reserved@a\do {%
          \scr@trim@spaces\reserved@a
          \ifx\reserved@a\@empty\else
            \scr@ifundefinedorrelax{\reserved@a tocdepth}{%
            }{%
              \ifnum \@nameuse{\reserved@a tocdepth}<\@nameuse{#1tocdepth}%
                \@tempdima\@nameuse{scr@tso@\reserved@a @indent}\relax
                \@nameuse{Ifscr@tso@\reserved@a @dynnumwidth}{%
                  \scr@ifundefinedorrelax
                  {scr@dte@\reserved@a @lastmaxnumwidth}{%
                    \advance\@tempdima
                    \@nameuse{scr@tso@\reserved@a @numwidth}\relax
                  }{%
                    \advance\@tempdima
                    \@nameuse{scr@dte@\reserved@a @lastmaxnumwidth}\relax
                  }%
                }{%
                  \advance\@tempdima
                  \@nameuse{scr@tso@\reserved@a @numwidth}\relax
                }%
                \ifdim \@tempdima>\@nameuse{scr@tso@#1@indent}\relax
                  \expandafter\edef\csname scr@tso@#1@indent\endcsname
                  {\the\@tempdima}%
                \fi
              \fi
            }%
          \fi
        }%
      \fi
    }{}%  
    {%
      \Iftocfeature{\@currext}{noindent}{%
        \leftskip \z@
      }{%
        \leftskip \@nameuse{scr@tso@#1@indent}\relax
      }%
      \rightskip \@nameuse{scr@tso@#1@rightindent}\relax
      \parfillskip -\rightskip
      \@nameuse{Ifscr@tso@#1@raggedpage}{%
        \addtolength{\parfillskip}{\z@ \@plus 1fil}%
      }{}%
      \Iftocfeature{\@currext}{noindent}{%
        \parindent \z@
      }{%
        \parindent \@nameuse{scr@tso@#1@indent}\relax
      }%
      \@afterindenttrue
      \interlinepenalty\@M
%    \end{macrocode}
% \changes{v3.21}{2016/06/06}{\cs{ragged\dots entry} is supported (again)}
%    \begin{macrocode}
      \expandafter\ifx\csname ragged#1entry\endcsname\raggedright
        \addtolength\rightskip\@flushglue
      \else
        \def\reserved@a{\raggedright}%
        \expandafter\ifx\csname ragged#1entry\endcsname\reserved@a
          \addtolength\rightskip\@flushglue
        \else
          \renewcommand\reserved@a{\raggedright}%
          \expandafter\ifx\csname ragged#1entry\endcsname\reserved@a
            \addtolength\rightskip\@flushglue
          \fi
        \fi
      \fi
      \leavevmode
      \@tempdima \@nameuse{scr@tso@#1@numwidth}\relax
      \@nameuse{Ifscr@tso@#1@dynnumwidth}{%
        \scr@ifundefinedorrelax{scr@dte@#1@lastmaxnumwidth}{}{%
          \ifdim \@nameuse{scr@dte@#1@lastmaxnumwidth}>\@tempdima
            \@tempdima\@nameuse{scr@dte@#1@lastmaxnumwidth}\relax
          \fi
        }%
      }{}%
      \advance\leftskip \@tempdima 
      \null\nobreak\hskip -\leftskip
      {%
%    \end{macrocode}
% \changes{v3.46}{2025/08/13}{extending \cs{numberline@numberprefix}}
% \changes{v3.46}{2025/08/13}{extending \cs{numberline@numberpostfix}}
% Here we extend \cs{numberline@numberprefix} and
% \cs{numberline@numberpostfix} to handle options \opt{numberprefix} and
% \opt{numberpostfix}.
%    \begin{macrocode}
        \l@preto@macro\numberline@numberprefix
          {\@nameuse{scr@tso@#1@numberprefix}}%
        \l@addto@macro\numberline@numberpostfix
          {\@nameuse{scr@tso@#1@numberpostfix}}%
%    \end{macrocode}
% Here we use a trick to detect the width of an eventually existing number
% while printing it. For this it is a must to use the internal definition of
% \cs{numberline}.
%    \begin{macrocode}
        \usetocbasicnumberline
        \let\scr@dte@numberline@box\numberline@box
        \def\numberline@box##1{%
          \sbox\scr@dte@tocline@numbox{\@nameuse{scr@tso@#1@numberformat}{##1}}%
%    \end{macrocode}
% We are inside a group, so we have to set the length globally.
%    \begin{macrocode}
          \global\scr@dte@tocline@numberwidth
          \dimexpr\wd\scr@dte@tocline@numbox+\@nameuse{scr@tso@#1@numsep}\relax
%    \end{macrocode}
% \changes{v3.22}{2016/12/02}{missing second \cs{relax} added}
% Attention: We need two \cs{relax}, because the first one is eaten by
% \cs{dimexpr}.
%    \begin{macrocode}
          \relax
          \ifdim \scr@dte@tocline@numberwidth
                >\@nameuse{scr@dte@#1@maxnumwidth}\relax
            \global\@nameuse{scr@dte@#1@maxnumwidth}\scr@dte@tocline@numberwidth
          \fi
          \@nameuse{Ifscr@tso@#1@dynnumwidth}{}{%
            \ifdim \scr@dte@tocline@numberwidth
                  >\dimexpr \@nameuse{scr@tso@#1@numwidth}%
                           +\@nameuse{scr@tso@#1@numsep}\relax\relax
              \PackageWarning{tocbasic}{%
                number width of #1 toc entries should be
                increased!\MessageBreak
                Currently used number width =
                \the\wd\scr@dte@tocline@numbox,\MessageBreak
                Wanted number separation
                \space\space\space =
                \the\dimexpr\@nameuse{scr@tso@#1@numsep}\relax,\MessageBreak
                Reserved number width \space\space\space\space\space\space =
                \the\dimexpr\@nameuse{scr@tso@#1@numwidth}\relax%
              }%
            \fi
          }%
          \scr@dte@numberline@box{\@nameuse{scr@tso@#1@numberformat}{##1}}%
          \@nameuse{Ifscr@tso@#1@breakafternumber}{%
            {\parfillskip\@flushglue\par}\nobreak\hskip-\leftskip
          }{}%
        }%
        \@nameuse{scr@tso@#1@entryformat}{%
          #2%
          \nobreak
          {%
            \normalfont\normalsize\@nameuse{scr@tso@#1@linefill}%
            \nobreak
%    \end{macrocode}
% \changes{v3.27}{2019/10/02}{\cs{scr@dte@pagenumberwidth} is defined}
% We don't want a dependency of entry variable from entry variables. So
% locally \cs{scr@dte@pagenumberwidth} will become
% \cs{scr@tso@\meta{Eintragsname}@pagenumberwidth} and in the definition of
% \cs{scr@tso@\meta{Eintragsname}@pagenumberbox} we use this local macro.
%    \begin{macrocode}
            \expandafter\let\expandafter\scr@dte@pagenumberwidth
            \csname scr@tso@#1@pagenumberwidth\endcsname
            \@nameuse{scr@tso@#1@pagenumberbox}{%
              \@nameuse{scr@tso@#1@pagenumberformat}{#3}%
            }%
          }%
          \@par
        }%
      }%
    }%
    \tocbasic@SetPenaltyByTOCLevel{#1}%
  \fi
}
%    \end{macrocode}
% \end{length}^^A \scr@dte@tocline@numberwidth
% \begin{macro}{\scr@dte@tocline@numbox}
% \changes{v3.20}{2015/11/25}{new (\emph{box})}
% Needed to measure the width of the number and use the number later.
%    \begin{macrocode}
\newsavebox\scr@dte@tocline@numbox
%    \end{macrocode}
% \end{macro}^^A \scr@dte@tocline@numbox
% \begin{macro}{\tocbasic@DependOnPenaltyAndTOCLevel,
%               \tocbasic@SetPenaltyByTOCLevel}
% \changes{v3.20}{2015/11/23}{added}
% \changes{v3.20}{2016/03/12}{changed for \pkg*{tocbasic} syntax of package
%   author macros}
% \cs{tocbasic@DepenedOnPenaltyAndTOCLevel} executes a saved action depending
% on whether the current penalty value stands for an entry with higher, same,
% or lower entry level.
% \cs{tocbasic@SetPenaltyByTOCLevel} sets the penalty for the page break
% depending on the current entry level.
% \begin{command}{\LastTOCLevelWasHigher,\LastTOCLevelWasSame,
%                 \LastTOCLevelWasLower}
% \changes{v3.20}{2015/11/23}{added}
% Standard action, if the previous entry level was higher (allow page break),
% same (allow page break), or lower (keep penalty and therefore prevent page
% break).
%    \begin{macrocode}
\newcommand*{\tocbasic@DependOnPenaltyAndTOCLevel}[1]{%
  \ifnum \lastpenalty<\numexpr 20009-\@nameuse{#1tocdepth}\relax
    \@nameuse{scr@tso@#1@LastTOCLevelWasHigher}%
  \else\ifnum \lastpenalty=\numexpr 20009-\@nameuse{#1tocdepth}\relax
      \@nameuse{scr@tso@#1@LastTOCLevelWasSame}%
    \else
      \@nameuse{scr@tso@#1@LastTOCLevelWasLower}%
    \fi
  \fi
}
\newcommand*{\tocbasic@SetPenaltyByTOCLevel}[1]{%
  \penalty \numexpr 20009-\@nameuse{#1tocdepth}\relax
}
\newcommand*{\LastTOCLevelWasHigher}{\ifvmode\addpenalty{\@lowpenalty}\fi}
\newcommand*{\LastTOCLevelWasSame}{\ifvmode\addpenalty{\@lowpenalty}\fi}
\newcommand*{\LastTOCLevelWasLower}{}
%    \end{macrocode}
% \end{command}^^A \LastTOCLevelWasHigher … \LastTOCLevelWasLower
% \end{macro}^^A \tocbasic@SetPenaltyByTOCLevel,\tocbasic@DependOnPenaltyAndTOCLevel
% \begin{command}{\TOCLineLeaderFill}
% \changes{v3.20}{2015/11/14}{added}
% Filler between the last text line and the page number. The optional argument
% \texttt{\#1} is the character used for filling.
%    \begin{macrocode}
\newcommand*{\TOCLineLeaderFill}[1][.]{%
  \leaders\hbox{$\m@th
    \mkern \@dotsep mu\hbox{#1}\mkern \@dotsep
    mu$}\hfill
}
%</tocline>
%    \end{macrocode}
% \end{command}^^A \TOCLineLeaderFill
% \end{macro}^^A \scr@dte@tocline
%
% \begin{macro}{\scr@dte@toctext}
% \changes{v3.27}{2019/07/08}{added}
% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
%   \cs{Iftocfeature}}
% This is the command to format entries that will be accumalted into a single
% paragraph. This is somehow special, because the settings of one entrie can
% influence another one. The three arguments are:
% \begin{description}
% \item[\marg{level}:] The name \meta{string} of the entry level.
% \item[\marg{entry}:] The ToC entry \meta{string}.
% \item[\marg{pagenumber}:] The page number \meta{string} of the ToC entry.
% \end{description}
%    \begin{macrocode}
%<*toctext>
\newcommand*{\scr@dte@toctext}[3]{%
  \ifnum \@nameuse{#1tocdepth}>\c@tocdepth
  \else
    \ifhmode
%    \end{macrocode}
% In h-mode their is already output of a previous text entry. So the end code
% of that previous text entry has to be output before the initial output of
% the new text entry has to be done.
%    \begin{macrocode}
      \scr@dte@toctext@lastend
      \@nameuse{scr@tso@#1@onstartentry}%
    \else
%    \end{macrocode}
% \changes{v3.31}{2020/06/09}{use of option \opt{beforeskip}}
% In v-mode it is a new text entry. Before leaving v-mode the vertical space
% is added.
%    \begin{macrocode}
      \addvspace{\@nameuse{scr@tso@#1@beforeskip}}%
      \leavevmode
%    \end{macrocode}
% The paragraph end has to be prepared to eventually change the right
% skip, to do the final output, and after all destroy these commands.
%    \begin{macrocode}
      \def\par{%
        \scr@dte@toctext@raggedright
        \scr@dte@toctext@parend
        \@par
        \scr@dte@toctext@afterpar
        \global\let\scr@dte@toctext@afterpar\relax
        \global\let\scr@dte@toctext@parend\relax
        \global\let\scr@dte@toctext@raggedright\relax
      }%
      \global\let\scr@dte@toctext@afterpar\@empty
%    \end{macrocode}
% Also the left skip and the right skip has to be setup (these are the
% margins) and if any of the text entries has to be printed ragged right, all
% of them should be ragged right.
%    \begin{macrocode}
      \Iftocfeature{\@currext}{noindent}{%
        \leftskip \z@
      }{%
        \leftskip \@nameuse{scr@tso@#1@indent}\relax
      }%
      \rightskip \@nameuse{scr@tso@#1@rightindent}\relax
      \parfillskip \z@ \@plus 1fill\relax
%    \end{macrocode}
% \changes{v3.31}{2020/06/09}{redefinition of \cs{addvspace}}
% \changes{v3.31}{2020/06/09}{redefinition of \cs{addpenalty}}
% Now, make sure, that the first non-|toctext| entry does do a \cs{par}
% before it uses \cs{addpenalty} or \cs{addvspace}. Before version~3.31 this
% has been done by redefining \cs{@noitemerr} but this does not work, because
% it ignores the argument of \cs{addpenalty} or \cs{addvspace}. So, this more
% dangerous solution has been made, that redefines \cs{addvspace} and
% \cs{addpenalty} locally.
%    \begin{macrocode}
      \ifx\addvspace\scr@dte@xaddvspace\else
        \let\scr@dte@saddvspace\addvspace
        \def\scr@dte@xaddvspace{%
          \let\addvspace\scr@dte@saddvspace\par\addvspace}%
        \let\addvspace\scr@dte@xaddvspace
      \fi
      \ifx\addpenalty\scr@dte@xaddpenalty\else
        \let\scr@dte@saddpenalty\addpenalty
        \def\scr@dte@xaddpenalty{%
          \let\addpenalty\scr@dte@saddpenalty\par\addpenalty}%
      \fi
%    \end{macrocode}
% Finally the init code of the first entry has to be used.
%    \begin{macrocode}
      \@nameuse{scr@tso@#1@onstartfirstentry}%
    \fi
%    \end{macrocode}
% Also some settings are independend from beeing the first entry in the
% paragraph or not.
%    \begin{macrocode}
    \@nameuse{Ifscr@tso@#1@raggedright}{%
      \let\\\@centercr
      \gdef\scr@dte@toctext@raggedright{%
        \@rightskip\@flushglue
        \addtolength\rightskip\@rightskip
      }%
    }{}%
    \l@addto@macro\scr@dte@toctext@afterpar{\@nameuse{scr@tso@#1@afterpar}}%
%    \end{macrocode}
% The end codes have to be changed. These are used either at the start of the
% next entry with this style or at the end of the paragraph.
%    \begin{macrocode}
    \expandafter\global\expandafter\let\expandafter\scr@dte@toctext@lastend
    \csname scr@tso@#1@onendentry\endcsname
    \expandafter\global\expandafter\let\expandafter\scr@dte@toctext@parend
    \csname scr@tso@#1@onendlastentry\endcsname
%    \end{macrocode}
% Last but not least, the output has to be done.
%    \begin{macrocode}
    {%
      \usetocbasicnumberline
      \def\numberline@box##1{%
        \mbox{%
          \@nameuse{scr@tso@#1@numberformat}{\ignorespaces ##1\unskip}%
          \hskip\@nameuse{scr@tso@#1@numsep}\relax
        }%
      }%
      \@nameuse{scr@tso@#1@entryformat}{%
        \ignorespaces#2\unskip
        \@nameuse{scr@tso@#1@prepagenumber}%
        \@nameuse{scr@tso@#1@pagenumberformat}{\ignorespaces #3\unskip}%
      }%
    }%
  \fi
}
%    \end{macrocode}
% \begin{macro}{\scr@dte@toctext@raggedright,\scr@dte@toctext@parend,
%               \scr@dte@toctext@lastend}
% Helper macros to store some information for later usage.
%    \begin{macrocode}
\newcommand*{\scr@dte@toctext@raggedright}{}
\newcommand*{\scr@dte@toctext@parend}{}
\newcommand*{\scr@dte@toctext@lastend}{}
%</toctext>
%    \end{macrocode}
% \end{macro}^^A \scr@dte@toctext@raggedright … \scr@dte@toctext@lastend
% \end{macro}^^A \scr@dte@toctext
%
%
% \begin{macro}{\scr@dte@def@l@default}
% \changes{v3.20}{2015/12/16}{new for the package}
% The package \pkg*{tocbasic} already has a standard style. Other packages
% should not change the standard style. But classes are allowed to clone (or
% define) another standard style for documents made with that class.
%    \begin{macrocode}
%<*default>
%%%            (run: style,dottedtocline)
\CloneTOCEntryStyle{dottedtocline}{default}
%</default>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</style>
%</package>
%    \end{macrocode}
%
%
% \subsubsection{The styles used by the \KOMAScript{} classes}
%
%    \begin{macrocode}
%<*class>
%<*style>
%    \end{macrocode}
%
% Some styles are defined by the classes only. They are only defined for the
% classes, that use them. So not all styles are available by all classes and
% even not all styles are the same with every class.
%
% \begin{macro}{\scr@dte@def@l@part}
% \changes{v3.20}{2015/12/07}{ToC entry style \texttt{part} added}
% This style exists with \cls*{scrbook}, \cls*{scrreprt} and
% \cls*{scrartcl}. The formatting of the entry and the page number is defined
% by the font elements \fnt{partentry} and \fnt{partentrypagenumber}.
%    \begin{macrocode}
%<*part>
%%%            (run: class,style,part)
\CloneTOCEntryStyle{tocline}{part}
\TOCEntryStyleStartInitCode{part}{%
  \expandafter\providecommand%
  \csname scr@tso@#1@linefill\endcsname{\hfill}%
  \expandafter\providecommand%
  \csname scr@tso@#1@entryformat\endcsname[1]{\usekomafont{partentry}{##1}}%
  \expandafter\providecommand%
  \csname scr@tso@#1@pagenumberformat\endcsname[1]{%
    \usekomafont{partentry}{\usekomafont{partentrypagenumber}{##1}}}%
  \expandafter\providecommand\expandafter*%
  \csname scr@tso@#1@beforeskip\endcsname{2.25em \@plus\p@}%
}
%</part>
%    \end{macrocode}
% \end{macro}^^A \scr@dte@def@l@part
%
% \begin{macro}{\scr@dte@def@l@chapter}
% \changes{v3.20}{2015/12/07}{ToC entry style \texttt{chapter} added}
% \changes{v3.27}{2019/10/28}{using font element \fnt{chapterentrydots}}
% This style exists with \cls*{scrbook} and \cls*{scrreprt} only.
%    \begin{macrocode}
%<*chapter>
%%%            (run: class,style,chapter)
\CloneTOCEntryStyle{tocline}{chapter}
\TOCEntryStyleStartInitCode{chapter}{%
  \expandafter\providecommand%
  \csname scr@tso@#1@linefill\endcsname{%
    \if@chapterentrywithdots
      {\usekomafont{chapterentrydots}{\TOCLineLeaderFill}}\relax
    \else
      \hfill
    \fi
  }%
  \expandafter\providecommand%
  \csname scr@tso@#1@entryformat\endcsname{\usekomafont{chapterentry}}%
  \expandafter\providecommand%
  \csname scr@tso@#1@pagenumberformat\endcsname[1]{%
    \usekomafont{chapterentry}{\usekomafont{chapterentrypagenumber}{##1}}}%
  \expandafter\providecommand\expandafter*%
  \csname scr@tso@#1@beforeskip\endcsname{1.0em \@plus\p@}%
}
%</chapter>
%    \end{macrocode}
% \end{macro}^^A \scr@dte@def@l@chapter
%
% \begin{macro}{\scr@dte@def@l@section}
% \changes{v3.20}{2015/12/07}{ToC entry style \texttt{section} added}
% \changes{v3.27}{2019/10/28}{using font element \fnt{sectionentrydots}}
% With classes \cls*{scrbook} and \cls*{scrreprt} this is the style of the
% \emph{minor} entry level. With \cls*{scrartcl} this is the style of the top
% entry level (below the part level). So with \cls*{scrartcl} it is similar
% to the chapter style of \cls*{scrbook} or \cls*{scrreprt}.
%    \begin{macrocode}
%<*section>
%%%            (run: class,style,section)
\CloneTOCEntryStyle{tocline}{section}
%<*book|report>
\TOCEntryStyleStartInitCode{section}{%
  \expandafter\providecommand%
  \csname scr@tso@#1@linefill\endcsname{\TOCLineLeaderFill\relax}%
}
%</book|report>
%<*article>
\TOCEntryStyleStartInitCode{section}{%
  \expandafter\providecommand%
  \csname scr@tso@#1@linefill\endcsname{%
    \if@sectionentrywithdots
      {\usekomafont{sectionentrydots}{\TOCLineLeaderFill}}\relax
    \else
      \hfill
    \fi
  }%
%    \end{macrocode}
% Für die Einträge die Schrift von Element sectionentry verwenden.
%    \begin{macrocode}
  \expandafter\providecommand%
  \csname scr@tso@#1@entryformat\endcsname{\usekomafont{sectionentry}}%
  \expandafter\providecommand%
  \csname scr@tso@#1@pagenumberformat\endcsname[1]{\usekomafont{sectionentry}{\usekomafont{sectionentrypagenumber}{##1}}}%
  \expandafter\providecommand\expandafter*%
  \csname scr@tso@#1@beforeskip\endcsname{1.0em \@plus\p@}%
}
%</article>
%</section>
%    \end{macrocode}
% \end{macro}^^A \scr@dte@def@l@section
%
% \begin{macro}{\scr@dte@def@l@subsection}
% \changes{v3.20}{2015/12/07}{ToC entry style \texttt{subsection} added}
% This style exists with \cls*{scrartcl} only. It is the minor level style
% similar to the section style with \cls*{scrbook} and \cls*{scrreprt}.
%    \begin{macrocode}
%<*subsection&article>
%%%            (run: class,style,subsection)
\CloneTOCEntryStyle{tocline}{subsection}
\TOCEntryStyleStartInitCode{subsection}{%
  \expandafter\providecommand%
  \csname scr@tso@#1@linefill\endcsname{\TOCLineLeaderFill\relax}%
}
%</subsection&article>
%    \end{macrocode}
% \end{macro}^^A \scr@dte@def@l@subsection
%
% \begin{macro}{\scr@dte@def@l@default}
% \changes{v3.20}{2015/12/07}{ToC entry style \texttt{default} added}
% With classes \cls*{scrbook} and \cls*{scrreprt} this is a clone of the
% section style. With \cls*{scrartcl} this is a clone of the subsection style.
%    \begin{macrocode}
%<*default>
%%%            (run: class,style,default)
%<book|report>\CloneTOCEntryStyle{section}{default}
%<article>\CloneTOCEntryStyle{subsection}{default}
%</default>
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
%</style>
%</class>
%    \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:

