% \CheckSum{1535}
% \iffalse meta-comment
% ======================================================================
% tocbasic.dtx
% Copyright (c) Markus Kohm, 2008-2016
%
% 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.txt.
% ----------------------------------------------------------------------
% tocbasic.dtx
% Copyright (c) Markus Kohm, 2008-2016
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
% Die neuste Version dieser Lizenz ist
%   http://www.latex-project.org/lppl.txt
% und Version 1.3c ist Teil aller Verteilungen von LaTeX
% Version 2005/12/01 oder spaeter und dieses Werks.
%
% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
% (allein durch den Autor verwaltet).
%
% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
% \fi
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \iffalse
%%% From File: $Id: tocbasic.dtx 2499 2016-09-06 07:00:45Z kohm $
%<identify>%%%            (run: identify)
%<prepare>%%%            (run: prepare)
%<option>%%%            (run: option)
%<execoption>%%%            (run: execoption)
%<body>%%%            (run: body)
%<exit>%%%            (run: exit)
%<*dtx>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
  \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
  \filedate$Date: 2016-09-06 09:00:45 +0200 (Tue, 06 Sep 2016) $
  \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
  \filerevision$Revision: 1962 $
\endgroup
\ProvidesFile{tocbasic.dtx}[\filedate\space\filerevision\space
%</dtx>
%<package&identify>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%<package&identify>\ProvidesPackage{tocbasic}[%
%<*dtx|(package&identify)|driver>
%!KOMAScriptVersion
  package
%</dtx|(package&identify)|driver>
%<driver>  (driver)%
%<package&identify>  (handling toc-files)%
%<*dtx>
  (dtx)%
%</dtx>
%<*dtx|(package&identify)|driver>
]
%</dtx|(package&identify)|driver>
%<*dtx>
\ifx\documentclass\undefined
  \input scrdocstrip.tex
  \@@input scrkernel-version.dtx
  \@@input scrstrip.inc
  \KOMAdefVariable{COPYRIGHTFROM}{2008}
  \generate{\usepreamble\defaultpreamble
    \file{tocbasic.sty}{%
      \from{tocbasic.dtx}{package,identify}%
      \from{tocbasic.dtx}{package,prepare}%
      \from{scrkernel-tocstyle.dtx}{package,prepare}%
      \from{tocbasic.dtx}{package,option}%
      \from{scrkernel-tocstyle.dtx}{package,option}%
      \from{tocbasic.dtx}{package,body}%
      \from{scrkernel-tocstyle.dtx}{package,body}%
      \from{scrkernel-tocstyle.dtx}{package,style,gobble}%
      \from{scrkernel-tocstyle.dtx}{package,style,dottedtocline}%
      \from{scrkernel-tocstyle.dtx}{package,style,undottedtocline}%
      \from{scrkernel-tocstyle.dtx}{package,style,largetocline}%
      \from{scrkernel-tocstyle.dtx}{package,style,tocline}%
      \from{scrkernel-tocstyle.dtx}{package,style,default}%
      \from{tocbasic.dtx}{package,exit}%
      \from{scrlogo.dtx}{logo}%
    }%
  }%
  \@@input scrstrop.inc
\else
  \let\endbatchfile\relax
\fi
\endbatchfile
%</dtx>
%<*driver>
\documentclass[halfparskip-]{scrdoc}
\usepackage[latin1]{inputenc}
\usepackage[english]{babel}
\usepackage{array}
\usepackage{listings}
\lstset{breaklines,prebreak=\mbox{$\hookleftarrow$},language=[LaTeX]TeX,
  basicstyle=\small}
\lstnewenvironment{lstcode}[1][]{%
  \lstset{breaklines,prebreak=\mbox{$\hookleftarrow$},language=[LaTeX]TeX,
    basicstyle=\ttfamily\small,#1}%
}{}
\lstnewenvironment{lstoutput}[1][]{}{}
\CodelineIndex
\RecordChanges
\GetFileInfo{tocbasic.dtx}
\sloppy
\DocInput{\filename}
\end{document}
%</driver>
%<*dtx>
% \fi
%
% \begin{document}
% \title{\KOMAScript{} \partname\ \texttt{\filename}%
%   \thanks{Diese Datei ist Version \fileversion\ von \texttt{\filename}.}}
% \date{\filedate}
% \author{Markus Kohm\thanks{mailto:komascript(at)gmx.info}}
% \maketitle
% \begin{abstract}
%   The main purpose of package \textsf{tocbasic} is to provide features for
%   authors of classes and packages to create own tables or lists of contents
%   like the list of figures and the list of tables and thereby allow other
%   classes or packages some types of control over these. For examples package
%   \textsf{tocbasic} delegates language control of all these tables and lists
%   of contents to package \textsf{babel}. So automatic change of language
%   will be provided inside all these tables and lists of contents. Using
%   \textsf{tocbasic} will exculpate authors of classes and packages from
%   implementation of such features.
%
%   \KOMAScript{} itself uses \textsf{tocbasic} not only for the table of
%   contents but also for the already mentioned lists of figures and tables.
% \end{abstract}
%
% \tableofcontents
% 
% \iffalse
%</dtx>
% \fi
%
% \StopEventually{\PrintIndex\PrintChanges}
%
%
% \section{Implementation}
% \label{sec:implementation}
%
% All macros with prefix \texttt{tb@} or \texttt{@} are internal macros and
% should not be used by package and class authors. Macros with prefix
% \texttt{tocbasic@} are internal macros, that may be used by class and
% packages authors. Macros without \texttt{@} are interface macros and may be
% used by class and package authors and users.
%
% Note: Parts of the implementation of package \textsf{tocbasic} are
% out-sourced into file \texttt{scrkernel-tocbasic.dtx}.
%
% \iffalse
%<*package>
% \fi
%
% \subsection{Options}
% \label{sec:options}
%
% There are no options because the package should be used by class and package
% authors not by users. So the package will be loaded using
% \cs{RequiresPackage}. Using different options by different packages would
% result in an option clash.
%    \begin{macrocode}
%<*option>
\ProcessOptions\relax
%</option>
%    \end{macrocode}
%
%
% \subsection{Required Packages}
% \label{sec:packages}
%
% Package \textsf{scrbase} is needed to process all macro options. As long as
% no package options are provided, the \texttt{body}-run is early enough to
% load it.
%    \begin{macrocode}
%<*body>
\RequirePackage{scrbase}
%</body>
%    \end{macrocode}
% We load it after processing the options, because we don't need it for
% processing options.
%
%
% \subsection{Having a List of All Tocs}
% \label{sec:listoftocs}
%
% If we have a list of all toc-files we may do commands for all
% toc-files. Somethimes it may be usefull to known the package, that created
% the toc-file, so this information will be stored additionally.
%
% \begin{macro}{\tb@listoftocs}
%   This is the list of toc-files. The list will be:
%   \begin{quote}
%   \cs{do}\marg{extension}\marg{class or
%   package}\cs{do}\marg{extension}\marg{class or package}\dots
%   \end{quote}
%   With this, adding and processing the list will be very fast but removing
%   an element will be very slow.
%
%   The initial state of the list will be \emph{empty}.
%    \begin{macrocode}
%<*body>
\newcommand*{\tb@listoftocs}{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifattoclist}
%   This command tests, if an extension is already at the list of
%   toc-files. The extension has to be the first argument. The second argument
%   will be done, if the extension is already at the list of toc-files. The
%   third argument will be done, if the extension is at the list of toc-files
%   not yet.
%    \begin{macrocode}
\newcommand{\ifattoclist}[1]{%
  \begingroup
    \def\do##1##2{%
      \edef\reserved@a{##1}%
      \ifx\reserved@a\reserved@b\@tempswatrue\fi
    }%
    \edef\reserved@b{#1}\@tempswafalse\tb@listoftocs
    \if@tempswa\aftergroup\@firstoftwo\else\aftergroup\@secondoftwo\fi
  \endgroup
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\addtotoclist}
%   \changes{v1.0a}{2008/11/11}{internal \cs{@addtotoclist} renamed to
%     \cs{scr@addtotoclist} because of package \textsf{floatfram}}.^^A
%   \changes{v1.0a}{2008/11/11}{internal \cs{@@addtotoclist} renamed to
%     \cs{scr@@addtotoclist} because of package \textsf{floatfram}}.^^A
%   \changes{v3.06a}{2010/09/14}{expand the arguments while adding them to the
%     internal list}^^A
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
%   This command adds an extension to the list of toc-files. The first,
%   optional argument is the class or package name with the corresponding
%   extension of class or package files. If this argument was omitted
%   \textsf{tocbasic} tries to get it automatically. This should be
%   successfull while loading a class or package but not while processing any
%   command of a class or package after loading the class or package. The
%   second, mandatory argument is the extension of the toc-file. NOTE: An
%   empty first argument is not the same like omitting the first argument!
%    \begin{macrocode}
\newcommand*{\addtotoclist}{%
  \kernel@ifnextchar [%]
    \scr@@addtotoclist\scr@addtotoclist
}
\newcommand*{\scr@addtotoclist}{%
  \ifx\@currname\@empty
    \def\reserved@a{\scr@@addtotoclist[]}%
  \else
    \edef\reserved@a{\noexpand\scr@@addtotoclist[\@currname.\@currext]}%
  \fi
  \reserved@a
}
\newcommand*{\scr@@addtotoclist}[2][]{%
  \ifattoclist{#2}{%
    \PackageError{tocbasic}{%
      file extension `#2' cannot be used twice
    }{%
      File extension `#2' is already used by a toc-file, while
      \ifx\relax#1\relax someone\else #2\fi\MessageBreak
      tried to use it again for a toc-file.\MessageBreak
      This may be either an incompatibility of packages, an error at a
      package,\MessageBreak
      or a mistake by the user.\MessageBreak
    }%
  }{%
    \begingroup
      \protected@edef\reserved@a{%
        \noexpand\g@addto@macro\noexpand\tb@listoftocs{%
          \noexpand\do{#2}{#1}}}\reserved@a
    \endgroup
    \ifx\relax #1\relax\else
      \@ifundefined{tb@#1@add@hook}{}{%
        \edef\reserved@a{%
          \noexpand\def\noexpand\@currext{#2}%
          \noexpand\@nameuse{tb@#1@add@hook}%
          \noexpand\def\noexpand\@currext{\@currext}%
        }\reserved@a
      }%
    \fi
    \edef\reserved@a{%
      \noexpand\def\noexpand\@currext{#2}%
      \noexpand\@nameuse{tb@@add@hook}%
      \noexpand\def\noexpand\@currext{\@currext}%
    }\reserved@a
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\owneroftoc}
%   \changes{v3.22}{2016/08/09}{new}
%   Returns the owner of a TOC or uses the owner of a TOC as argument of the
%   optional argument, if it exists.
%    \begin{macrocode}
\newcommand*{\owneroftoc}[2][\@firstofone]{%
  \begingroup
    \let\reserved@a\endgroup
    \def\do##1##2{\ifstr{#2}{##1}{\def\reserved@a{\endgroup#1{##2}}}{}}%
    \tb@listoftocs
  \reserved@a
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\AtAddToTocList}
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
%   Action to be done, when adding a toc-file of a known owner. The first
%   optional argument is the owner. The second, mandatory argument is the
%   action. While doing the action \cs{@currext} will be the extension of the
%   added toc-file. If the first argument was omitted \textsf{tocbasic} tries
%   to get it automatically. This should be successfull while loading a class
%   or package but not while processing any command of a class or package
%   after loading the class or package. The second, mandatory argument is the
%   extension of the toc-file. NOTE: An empty first argument is not the same
%   like omitting the first argument, but set's up the general hook. The
%   general hook will be done for every adding after the individual hook (this
%   means, you may dactivate features at the individual hook before processing
%   the general hook). But the individual hook will not be processed for
%   toc-files without any owner!
%    \begin{macrocode}
\newcommand*{\AtAddToTocList}{%
  \kernel@ifnextchar [%]
    \@@AtAddToTocList\@AtAddToTocList
}
\newcommand*{\@AtAddToTocList}{%
  \ifx\@currname\@empty
    \def\reserved@a{\@@AtAddToTocList[]}%
  \else
    \edef\reserved@a{\noexpand\@@AtAddToTocList[\@currname.\@currext]}%
  \fi
  \reserved@a
}
\newcommand*{\@@AtAddToTocList}[1][]{%
  \@ifundefined{tb@#1@add@hook}{\@namedef{tb@#1@add@hook}{}}{}%
  \expandafter\g@addto@macro\csname tb@#1@add@hook\endcsname
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\tocbasic@extend@babel}
%   NOTE: To extend the original \cs{bbl@set@language} the argument of
%   \cs{tocbasic@extend@babel} must not be a local macro (like \cs{@currext})
%    \begin{macrocode}
\newcommand*{\tocbasic@extend@babel}[1]{%
  \scr@ifundefinedorrelax{bbl@set@language}{%
    \PackageInfo{tocbasic}{babel extension for `#1' omitted\MessageBreak
      because of missing \string\bbl@set@language}%
  }{%
    \iftocfeature{#1}{nobabel}{%
      \PackageInfo{tocbasic}{omitting babel extension for `#1'\MessageBreak
        because of feature `nobabel' available\MessageBreak
        for `#1'}%
    }{%
      \PackageInfo{tocbasic}{setting babel extension for `#1'}%
      \expandafter\gdef\expandafter\bbl@set@language\expandafter##\expandafter1%
      \expandafter{%
        \bbl@set@language{##1}%
        \addtocontents{#1}{\xstring\select@language{\languagename}}%
      }%
    }%
  }%
}
%    \end{macrocode}
%   This feature should be used for all toc-files (unless feature
%   \texttt{nobabel} was set for the toc-file.
%    \begin{macrocode}
\AtAddToTocList[]{\expandafter\tocbasic@extend@babel\expandafter{\@currext}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\removefromtoclist}
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
% \begin{macro}{\@removefromtoclist}
%   \changes{v3.22}{2016/09/06}{missing \cs{global} added}^^A
% \begin{macro}{\@@removefromtoclist}
%   \changes{v3.22}{2016/09/06}{missing \cs{global} added}^^A
%   This command will remove an extension from the list of toc-files. If the
%   first, optional argument is given, the extension will only be removed, if
%   it was added by the given owner. NOTE: An empty first argument is not the
%   same like omitting the first argument!
%    \begin{macrocode}
\newcommand*{\removefromtoclist}{%
  \kernel@ifnextchar [%]
    \@removefromtoclist\@@removefromtoclist
}
\newcommand*{\@removefromtoclist}[2][]{%
  \begingroup
    \let\tb@oldlist\tb@listoftocs
    \def\do##1##2{%
      \edef\reserved@a{##1}%
      \ifx\reserved@a\reserved@b
        \begingroup
          \edef\@currext{##2}%
          \edef\reserved@b{#1}%
          \ifx\@currext\reserved@b
          \else
            \g@addto@macro\tb@listoftocs{\do{##1}{##2}}%
          \fi
        \endgroup
      \else
        \g@addto@macro\tb@listoftocs{\do{##1}{##2}}%
      \fi
    }%
    \edef\reserved@b{#2}\global\let\tb@listoftocs\@empty
    \tb@oldlist
  \endgroup
}
\newcommand*{\@@removefromtoclist}[1]{%
  \begingroup
    \let\tb@oldlist\tb@listoftocs
    \def\do##1##2{%
      \edef\reserved@a{##1}%
      \ifx\reserved@a\reserved@b
      \else
        \g@addto@macro\tb@listoftocs{\do{##1}{##2}}%
      \fi
    }%
    \edef\reserved@b{#1}\global\let\tb@listoftocs\@empty
    \tb@oldlist
  \endgroup
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\doforeachtocfile}
%   \changes{v3.09}{2011/03/01}{\cs{@currext} defined using \cs{edef} instead
%     of \cs{def}}^^A
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
%   This command does the second, mandatory argument for each toc-file at the
%   list of toc-files. If the first, optional argument was given this will be
%   done only for the toc-files of that owner. NOTE: An empty first argument
%   is not the same like omitting the first argument!
%
%   While processing the second argument \cs{@currext} is the extension of
%   the toc-file. The second argument will be processed with increased group
%   level!
%
%   See \cs{addtoeachtocfile} for an example of usage of
%   \cs{doforeachtocfile}.
%    \begin{macrocode}
\newcommand{\doforeachtocfile}{%
  \kernel@ifnextchar [%]
    \@doforeachtocfile\@@doforeachtocfile
}
\newcommand{\@doforeachtocfile}[2][]{%
  \def\do##1##2{%
    \edef\reserved@a{#1}\edef\reserved@b{##2}\ifx\reserved@a\reserved@b
      \edef\@currext{##1}#2%
    \fi
  }%
  \edef\reserved@a{%
    \noexpand\tb@listoftocs
    \noexpand\def\noexpand\@currext{\@currext}%
  }\reserved@a
  \let\do\relax
}
\newcommand{\@@doforeachtocfile}[1]{%
  \def\do##1##2{%
    \edef\@currext{##1}#1%
  }%
  \edef\reserved@a{%
    \noexpand\tb@listoftocs
    \noexpand\def\noexpand\@currext{\@currext}%
  }\reserved@a
  \let\do\relax
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\addtoeachtocfile}
% \begin{macro}{\@addtoeachtocfile}
% \begin{macro}{\@@addtoeachtocfile}
%   \changes{v3.03b}{2009/06/08}{typo fix at usage of \cs{doforeachtocfile}}^^A
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
%   This command calls \cs{addtocontents} with the section, mandatory
%   argument for each toc-file at the list of toc-files. If the first,
%   optional argument was given this will be done only for the toc-files of
%   that owener. NOTE: An empty first argument is not the same like omitting
%   the first argument! And don't forget to protect the commands, that should
%   not be expanded, at the mandatory argument.
%    \begin{macrocode}
\newcommand{\addtoeachtocfile}{%
  \kernel@ifnextchar [%]
    \@addtoeachtocfile\@@addtoeachtocfile
}
\newcommand{\@addtoeachtocfile}[2][]{%
  \doforeachtocfile[{#1}]{\addtocontents{\@currext}{#2}}%
}
\newcommand{\@@addtoeachtocfile}[1]{%
  \doforeachtocfile{\addtocontents{\@currext}{#1}}%
}
%</body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsection{Adding Entries into Toc-Files}
%
% We have a new general command to add entries to several toc-files at
% once. And we have some special commands for the table of contents.
%
% \begin{macro}{\addcontentslinetoeachtocfile}
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
%   Something like a combination of \cs{addtoeachtocfile} and
%   \cs{addcontentsline}.
%    \begin{macrocode}
%<*body>
\newcommand{\addcontentslinetoeachtocfile}{%
  \kernel@ifnextchar [%]
    \@addcontentslinetoeachtocfile\@@addcontentslinetoeachtocfile
}
\newcommand{\@addcontentslinetoeachtocfile}[3][]{%
  \doforeachtocfile[{#1}]{\addcontentsline{\@currext}{#2}{#3}}%
}
\newcommand{\@@addcontentslinetoeachtocfile}[2]{%
  \doforeachtocfile{\addcontentsline{\@currext}{#1}{#2}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\addxcontentsline}
%   \changes{v3.12}{2013/09/24}{new}
%   \changes{v3.12}{2013/09/24}{Take care of new feature \texttt{numberline}}
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
% \begin{macro}{\@addxcontentsline}
%   \changes{v3.12}{2013/09/24}{new (internal)}
% This will be used instead of \cs{addcontentsline} to generate numbered or
% not numbered entries to a toc-file. First argument is the toc-file, second
% the entry type, e.g., \texttt{chapter}, the third is the entry number or
% empty and the fourth and last is the entry text.
%    \begin{macrocode}
\newcommand*{\addxcontentsline}[2]{%
  \kernel@ifnextchar [%]
  {\@addxcontentsline{#1}{#2}}%
  {\@addxcontentsline{#1}{#2}[]}%
}
\newcommand*{\@addxcontentsline}{}
\def\@addxcontentsline#1#2[#3]#4{%
  \scr@ifundefinedorrelax{add#2#1entry}{%
    \tocbasic@addxcontentsline{#1}{#2}{#3}{#4}%
  }{%
    \@nameuse{add#2#1entry}{#3}{#4}%
  }%
}
%    \end{macrocode}
% \begin{macro}{\nonumberline}
%   \changes{v3.12}{2013/09/24}{new}
% Either \cs{relax} or \cs{numberline} depending on the feature
% \texttt{numberline}.
%    \begin{macrocode}
\newcommand*{\nonumberline}{}%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\addxcontentsline}
% This may be used to either use a heading type command or the general default
% one. You are not allowed to use it in the definition of a heading type
% command like \cs{addchaptertocentry}! You may use
% \cs{tocbasic@addxcontentsline} at the definition of those commands.
%    \begin{macrocode}
\newcommand*{\tocbasic@addxcontentsline}[4]{%
  \if\relax\detokenize{#3}\relax
    \addcontentsline{#1}{#2}{\protect\nonumberline#4}%
  \else
    \addcontentsline{#1}{#2}{\protect\numberline{#3}#4}%
  \fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\addxcontentslinetoeachtocfile}
%   \changes{v3.12}{2013/09/24}{new}
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
% \begin{macro}{\@addxcontentslinetoeachtocfile}
%   \changes{v3.12}{2013/09/24}{new (internal)}
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
% \begin{macro}{\@@addxcontentslinetoeachtocfile}
%   \changes{v3.12}{2013/09/24}{new (internal)}
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
% \begin{macro}{\@@@addxcontentslinetoeachtocfile}
%   \changes{v3.12}{2013/09/24}{new (internal)}
% \begin{macro}{\@@@@addxcontentslinetoeachtocfile}
%   \changes{v3.12}{2013/09/24}{new (internal)}
% Similar to \cs{addcontentslinetoeachtocfile} using
% \cs{addxcontentsline} instead of \cs{addcontentsline}.
%    \begin{macrocode}
\newcommand{\addxcontentslinetoeachtocfile}{%
  \kernel@ifnextchar [%]
    \@addxcontentslinetoeachtocfile\@@addxcontentslinetoeachtocfile
}
\newcommand{\@addxcontentslinetoeachtocfile}[2][]{%
  \kernel@ifnextchar [%]
    {\@@@addxcontentslinetoeachtocfile[{#1}]{#2}}%
    {\@@@addxcontentslinetoeachtocfile[{#1}]{#2}[]}
}
\newcommand*{\@@@addxcontentslinetoeachtocfile}{}
\def\@@@addxcontentslinetoeachtocfile[#1]#2[#3]#4{%
  \doforeachtocfile[{#1}]{\addxcontentsline{\@currext}{#2}[#3]{#4}}%
}
\newcommand{\@@addxcontentslinetoeachtocfile}[1]{%
  \kernel@ifnextchar [%]
    {\@@@@addxcontentslinetoeachtocfile{#1}}%
    {\@@@@addxcontentslinetoeachtocfile{#1}[]}%
}
\newcommand*{\@@@@addxcontentslinetoeachtocfile}{}
\def\@@@@addxcontentslinetoeachtocfile#1[#2]#3{%
  \doforeachtocfile{\addxcontentsline{\@currext}{#1}[{#2}]{#3}}%
}
%</body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \subsection{Show List of Toc-File}
% \label{sec:showlistoftocfile}
%
% If you have a toc-file you want a list-of-command for this toc-file,
% too. Here are basics and high level commands for this.
%
% \begin{macro}{\tocbasic@starttoc}
%   \changes{v3.17}{2015/03/23}{usage of feature \texttt{noparskipfake}}^^A
%   Some basics are done like setting up \cs{parskip}, \cs{parindent} and
%   \cs{parfillskip}, a general hook will be called, an individual hook will
%   be called, the toc will be started, an individual hook will be called, an
%   general hook wil be called, that's it.
%    \begin{macrocode}
%<*body>
\newcommand*{\tocbasic@starttoc}[1]{%
  \begingroup
    \edef\@currext{#1}%
    \iftocfeature{\@currext}{noparskipfake}{}{%
      \ifvmode
        \@tempskipa\lastskip
        \vskip-\lastskip
        \addtolength{\@tempskipa}{\parskip}%
        \vskip\@tempskipa
      \fi
    }%
    \setlength{\parskip}{\z@}%
    \setlength{\parindent}{\z@}%
    \setlength{\parfillskip}{\z@\@plus 1fil}%
    \csname tocbasic@@before@hook\endcsname
    \csname tb@#1@before@hook\endcsname
    \@starttoc{#1}%
    \csname tb@#1@after@hook\endcsname
    \csname tocbasic@@after@hook\endcsname
  \endgroup
}
%    \end{macrocode}
% \begin{macro}{\tocbasic@@before@hook}
% \begin{macro}{\tocbasic@@after@hook}
%   These are the general hooks. They may be used by classes and packages for
%   commands, that should be used for all lists of not only the own lists of,
%   e.\,g., \KOMAScript{} may use it to handle option \texttt{tocleft}.
%    \begin{macrocode}
\newcommand*{\tocbasic@@before@hook}{}
\newcommand*{\tocbasic@@after@hook}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\BeforeStartingTOC}
%   \changes{v3.04b}{2010/01/05}{fix: define the hook if not already defined}
%   \changes{v3.06}{2010/06/09}{fix: using \cs{@ifundefined} instead of
%     undefined \cs{scr@ifundefinedorrelax}}
% \begin{macro}{\AfterStartingTOC}
%   \changes{v3.04b}{2010/01/05}{fix:define the hook if not already defined}
%   \changes{v3.06}{2010/06/09}{fix: using \cs{@ifundefined} instead of
%     undefined \cs{scr@ifundefinedorrelax}}
%   These are the commands to add code to the general or individual hooks. If
%   the first, optional argument was given, the second, mandatory argument
%   will be added to the individual hook, otherwise the general hook will be
%   extended.
%    \begin{macrocode}
\newcommand{\BeforeStartingTOC}[2][]{%
  \ifx\relax#1\relax
    \g@addto@macro\tocbasic@@before@hook{#2}%
  \else
    \@ifundefined{tb@#1@before@hook}{%
      \PackageInfo{tocbasic}{defining new hook before starting `#1'}%
      \expandafter\global\expandafter\let\csname tb@#1@before@hook\endcsname
      \@empty
    }{}%
    \expandafter\g@addto@macro\csname tb@#1@before@hook\endcsname{#2}%
  \fi
}
\newcommand{\AfterStartingTOC}[2][]{%
  \ifx\relax#1\relax
    \g@addto@macro\tocbasic@@after@hook{#2}%
  \else
    \@ifundefined{tb@#1@after@hook}{%
      \PackageInfo{tocbasic}{defining new hook after starting `#1'}%
      \expandafter\global\expandafter\let\csname tb@#1@after@hook\endcsname
      \@empty
    }{}%
    \expandafter\g@addto@macro\csname tb@#1@after@hook\endcsname{#2}%
  \fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\listoftoc}
%   \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
%     ersetzt}^^A
% \begin{macro}{\@listoftoc}
%   \changes{v1.0a}{2008/11/12}{\cs{twocolumn} fixed}^^A
%   \changes{v1.01}{2008/11/13}{new feature \texttt{onecolumn}}^^A
%   \changes{v3.09}{2011/03/01}{\cs{@currext} defined using \cs{edef} instead
%     of \cs{def}}^^A
%   Command to handle the hole list of something. There are additional hooks
%   for this. The first optional argument is the title for this list. If the
%   optional argument was omitted \cs{listof\#2name} will be used. The star
%   version does not set up a heading or switch the column number!
%    \begin{macrocode}
\newcommand*{\listoftoc}{%
  \kernel@ifstar \tocbasic@starttoc\@listoftoc
}
\newcommand*{\@listoftoc}[2][\list@fname]{%
  \begingroup
    \@ifundefined{listof#2name}{%
      \let\list@fname\relax
      \ifx\relax#1\relax
        \PackageWarning{tocbasic}{%
          You should either define \expandafter\string\csname
          listof#2name\endcsname\MessageBreak
          or use the optional argument of \string\listoftoc\space\MessageBreak
          to set the term to be used for the\MessageBreak
          heading of list of #2}%
        \def\list@fname{\listofname~#2}%
      \fi
    }{%
      \expandafter\let\expandafter\list@fname\csname listof#2name\endcsname
    }%
    \edef\@currext{#2}%
    \iftocfeature{\@currext}{onecolumn}{%
      \iftocfeature{\@currext}{leveldown}{}{%
        \if@twocolumn
          \aftergroup\twocolumn\onecolumn
        \fi
      }%
    }{}%
    \iftocfeature{\@currext}{numberline}{\def\nonumberline{\numberline{}}}{}%
    \tocbasic@listhead{#1}%
    \scr@ifundefinedorrelax{microtypesetup}{}{%
      \iftocfeature{\@currext}{noprotrusion}{}{%
        \microtypesetup{protrusion=false}%
        \PackageInfo{tocbasic}{%
          character protrusion at \@currext\space deactivated}%
      }%
    }%
    \tocbasic@starttoc{#2}%
  \endgroup
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\listofname}
%   While this is only an emergancy command, we don't support languages.
%    \begin{macrocode}
\newcommand*{\listofname}{List of}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listofeachtoc}
% \begin{macro}{\@listofeachtoc}
% \begin{macro}{\@@listofeachtoc}
%   \changes{v3.03b}{2009/06/08}{typo fix at usage of \cs{doforeachtocfile}}^^A
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
%   Another example of using \cs{doforeachtocfile}.
%    \begin{macrocode}
\newcommand*{\listofeachtoc}{%
  \kernel@ifnextchar [%]
    \@listofeachtoc\@@listofeachtoc
}
\newcommand{\@listofeachtoc}[1][]{%
  \doforeachtocfile[{#1}]{\listoftoc{\@currext}}%
}
\newcommand{\@@listofeachtoc}[1]{%
  \doforeachtocfile{\listoftoc{\@currext}}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\tocbasic@listhead}
%   \changes{v3.02a}{2009/01/20}{no explicite marks if ``numbered''}%
%   \changes{v3.09a}{2011/04/12}{again no explicite marks if ``numbered''}%
%   \changes{v3.12}{2013/09/24}{usage of new
%     \cs{tocbasic@addxcontentsline}}%
%   \changes{v3.15}{2014/12/10}{moved \cs{@mkboth} inside \cs{chapter*}}^^A
%   \changes{v3.15}{2014/12/10}{usage of \cs{addsec} if available}^^A
%   \changes{v3.15}{2014/12/10}{usage of \cs{@mkright} if available}^^A
%   \changes{v3.17}{2015/03/08}{moved \cs{@mkboth} outside \cs{chapter*}}^^A
%   \changes{v3.17}{2015/03/08}{usage of \cs{@mkdouble} if available}^^A
%   \changes{v3.17}{2015/03/25}{penalty and skip reconstruction after
%     \cs{@mkright}, \cs{@mkboth}, or \cs{@mkdouble}}^^A
%   Setting the headings of a list of something. The heading is the only
%   argument.
%    \begin{macrocode}
\newcommand*{\tocbasic@listhead}[1]{%
  \@ifundefined{tocbasic@listhead@\@currext}{%
    \scr@ifundefinedorrelax{chapter}{%
      \expandafter\def\csname tocbasic@listhead@\@currext\endcsname##1{%
        \iftocfeature{\@currext}{leveldown}{%
          \iftocfeature{\@currext}{numbered}{%
            \subsection[##1]{##1}%
          }{%
            \subsection*{##1}%
            \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
            \begingroup
              \iftocfeature{\@currext}{totoc}{%
                \addxcontentsline{toc}{subsection}{##1}%
              }{}%
              \@ifundefined{@mkright}{%
                \ifx\@mkboth\@gobbletwo\else\markright{\MakeMarkcase{##1}}\fi
              }{%
                \@mkright{\MakeMarkcase{##1}}%
              }%
            \endgroup
            \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
          }%
        }{%
          \iftocfeature{\@currext}{numbered}{%
            \section[##1]{##1}%
          }{%
            \section*{##1}%
            \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
            \begingroup
              \iftocfeature{\@currext}{totoc}{%
                \addxcontentsline{toc}{section}{##1}%
              }{}%
              \@ifundefined{@mkdouble}{%
                \@mkboth{\MakeMarkcase{##1}}{\MakeMarkcase{##1}}%
              }{%
                \@mkdouble{\MakeMarkcase{##1}}%
              }%
            \endgroup
            \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
          }%
        }%
      }%
    }{%
      \expandafter\def\csname tocbasic@listhead@\@currext\endcsname##1{%
        \iftocfeature{\@currext}{leveldown}{%
          \iftocfeature{\@currext}{numbered}{%
            \section{##1}%
          }{%
            \iftocfeature{\@currext}{totoc}{%
              \begingroup
                \@ifundefined{addsec}{%
                  \section*{##1}%
                  \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
                  \begingroup
                    \@ifundefined{@mkright}{%
                      \ifx\@mkboth\@gobbletwo
                      \else\markright{\MakeMarkcase{##1}}\fi
                    }{%
                      \@mkright{\MakeMarkcase{##1}}%
                    }%
                    \addxcontentsline{toc}{section}{##1}%
                  \endgroup
                  \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
                }{%
                  \addsec{##1}%
                }%
              \endgroup
            }{%
              \section*{##1}%
              \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
              \begingroup
                \@ifundefined{@mkright}{%
                  \ifx\@mkboth\@gobbletwo
                  \else\markright{\MakeMarkcase{##1}}\fi
                }{%
                  \@mkright{\MakeMarkcase{##1}}%
                }%
              \endgroup
              \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
            }%
          }%
        }{%
          \iftocfeature{\@currext}{numbered}{%
            \chapter[##1]{##1}%
          }{%
            \chapter*{##1}%
            \ifvmode\@tempcnta\lastpenalty\@tempskipa\lastskip\unskip\fi
            \begingroup
              \@ifundefined{@mkdouble}{%
                \@mkboth{\MakeMarkcase{##1}}{\MakeMarkcase{##1}}%
              }{%
                \@mkdouble{\MakeMarkcase{##1}}%
              }%
              \iftocfeature{\@currext}{totoc}{%
                \addxcontentsline{toc}{chapter}{##1}%
              }{}%
            \endgroup
            \ifvmode\penalty\@tempcnta\vskip\@tempskipa\fi
          }%
        }%
      }%
    }%
  }{}%
  \csname tb@@beforehead@hook\endcsname
  \csname tb@\@currext @beforehead@hook\endcsname
  \csname tocbasic@listhead@\@currext\endcsname{#1}%
  \csname tb@\@currext @afterhead@hook\endcsname
  \csname tb@@afterhead@hook\endcsname
}
%    \end{macrocode}
% \begin{macro}{\BeforeTOCHead}
%   \changes{v3.04b}{2010/01/05}{fix: define the hook if not already defined}
%   \changes{v3.06}{2010/06/09}{fix: using \cs{@ifundefined} instead of
%     undefined \cs{scr@ifundefinedorrelax}}
% \begin{macro}{\AfterTOCHead}
%   \changes{v3.04b}{2010/01/05}{fix: define the hook if not already defined}
%   \changes{v3.06}{2010/06/09}{fix: using \cs{@ifundefined} instead of
%     undefined \cs{scr@ifundefinedorrelax}}
%   These are the commands to add code to the general or individual hooks. If
%   the first, optional argument was given, the second, mandatory argument
%   will be added to the individual hook, otherwise the general hook will be
%   extended.
%    \begin{macrocode}
\newcommand{\BeforeTOCHead}[2][]{%
  \@ifundefined{tb@#1@beforehead@hook}{%
    \PackageInfo{tocbasic}{defining new hook before heading of `#1'}%
    \expandafter\global\expandafter\let\csname tb@#1@beforehead@hook\endcsname
    \@empty
  }{}%
  \expandafter\g@addto@macro\csname tb@#1@beforehead@hook\endcsname{#2}%
}
\newcommand{\AfterTOCHead}[2][]{%
  \@ifundefined{tb@#1@afterhead@hook}{%
    \PackageInfo{tocbasic}{defining new hook after heading of `#1'}%
    \expandafter\global\expandafter\let\csname tb@#1@afterhead@hook\endcsname
    \@empty
  }{}%
  \expandafter\g@addto@macro\csname tb@#1@afterhead@hook\endcsname{#2}%
}
%</body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\MakeMarkcase}
%   Use upper-case or not?
%    \begin{macrocode}
%<*exit>
\AtBeginDocument{%
  \@ifundefined{MakeMarkcase}{%
    \scr@ifundefinedorrelax{KOMAClassName}{%
      \let\MakeMarkcase\MakeUppercase
    }{%
      \let\MakeMarkcase\@firstofone
    }%
  }{}%
}
%</exit>
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\deftocheading}
%   Define a toc headings command with one argument (the title).
%    \begin{macrocode}
%<*body>
\newcommand*{\deftocheading}[1]{%
  \@namedef{tocbasic@listhead@#1}##1}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setuptoc}
% \begin{macro}{\unsettoc}
%   Known features are:
%   \begin{description}
%   \item[\texttt{totoc}] writes the title of the list of to the table of
%     contents
%   \item[\texttt{numberline}] redefines \cs{nonumberline} to use
%     \cs{numberline}
%   \item[\texttt{numbered}] uses a numbered headings for the list of
%   \item[\texttt{leveldown}] uses not the top level heading (e.\,g.,
%     \cs{chapter} with book) but the first sub level (e.\,g., \cs{section} with
%     book).
%   \item[\texttt{nobabel}] prevents the extension to be added to the babel
%     handling of toc-files.  To make this work, you have to set the feature
%     before adding the extension to the list of known extension.
%   \item[[\texttt{noprotrusion}]] prevents disabling character protrusion at
%     the toc.
%   \end{description}
%   Other features may be package dependent. You may test the feature using:
%   \begin{quote}
%   \cs{@ifundefined}\texttt{\{tocbasic@\meta{toc}@feature@\meta{feature}\}}\\
%   \phantom{\cs{@ifundefined}}\marg{do if feature not set}\\
%   \phantom{\cs{@ifundefined}}\marg{do if feature set}
%   \end{quote}
%   See \cs{tocbasic@listhead} for an example of this.
%    \begin{macrocode}
\newcommand*{\setuptoc}[2]{%
  \@for\@tempa:=#2\do{%
    \expandafter\tb@@sp@def\expandafter\@tempa\expandafter{\@tempa}%
    \@namedef{tocbasic@#1@feature@\@tempa}{}%
  }%
}
\newcommand*{\unsettoc}[2]{%
  \@for\@tempa:=#2\do{%
    \expandafter\tb@@sp@def\expandafter\@tempa\expandafter{\@tempa}%
    \expandafter\let\csname tocbasic@#1@feature@\@tempa\endcsname\relax
  }%
}
\def\@tempa#1{%
  \def\tb@@sp@def##1##2{%
    \futurelet\tb@sp@tempa\tb@@sp@d##2\@nil\@nil#1\@nil\relax##1}%
  \def\tb@@sp@d{%
    \ifx\tb@sp@tempa\@sptoken
      \expandafter\tb@@sp@b
    \else
      \expandafter\tb@@sp@b\expandafter#1%
    \fi}%
  \def\tb@@sp@b#1##1 \@nil{\tb@@sp@c##1}%
}
\@tempa{ }
\def\tb@@sp@c#1\@nil#2\relax#3{\@temptokena{#1}\edef#3{\the\@temptokena}}
%    \end{macrocode}
%   Do not add the files, that babel handles by default.
%    \begin{macrocode}
\setuptoc{toc}{nobabel}
\setuptoc{lof}{nobabel}
\setuptoc{lot}{nobabel}
%    \end{macrocode}
% \begin{macro}{\iftocfeature}
%   We need a test for the features
%    \begin{macrocode}
\newcommand*{\iftocfeature}[2]{%
  \scr@ifundefinedorrelax{tocbasic@#1@feature@#2}{%
    \expandafter\@secondoftwo
  }{%
    \expandafter\@firstoftwo
  }%
}
%</body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\tocbasicautomode}
%   \changes{v1.0a}{2008/11/11}{use of \cs{addtotoclist} instead of internal}%
%   \changes{v3.07a}{2010/11/25}{fix: added missing
%     \cs{let}\cs{@starttoc}\cs{tocbasic@starttoc}}%
% \textsf{tocbasic} can overtake \cs{@starttoc} to automaticly add all
% used extensions to the list of known extensions and use
% \cs{tocbasic@starttoc} instead of \cs{@starttoc} from \LaTeX{}
% kernel. Please note, that we don't need a fix for the unfriendly
% redefinition of \cs{@starttoc} by \textsf{hyperref}, because hyperref
% does it only at the first \LaTeX{} run. So this action of \textsf{hyperref}
% may only result in the need of one more \LaTeX{} run, but not in a permanent
% mistake.
%    \begin{macrocode}
%<*body>
\newcommand*{\tocbasicautomode}{%
  \let\tb@saved@starttoc\@starttoc
  \let\@starttoc\tocbasic@starttoc
  \BeforeStartingTOC{%
    \let\@starttoc\tb@saved@starttoc
    \expandafter\ifattoclist\expandafter{\@currext}{}{%
      \addtotoclist[tocbasicautomode]{\@currext}%
    }%
  }%
}
%</body>
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{High Level Interface for Generating New TOCs and Floats}
% \label{sec:newfloats}
%
% \begin{macro}{\DeclareNewTOC}
%   \changes{v3.06}{2010/06/01}{new high level command}^^A
%   \changes{v3.18}{2015/06/20}{\cs{tb@nt@types} and \cs{tb@nt@listname} are
%     initialised \cs{relax}}^^A
%   \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
%     \cs{kernel@ifnextchar}}^^A
%   This command defines only a new TOC and a new caption command for this
%   TOC.  It does not define a new foat unless option float was set!  It does
%   not define a new nonfloat unless option nonfloat was set!  The optional
%   argument is used to set up several settings using \textsf{keyval}.  The
%   mandatory argument is the shortcut.  The default type is the shortcut.
%   The extension is the shortcut.  The default owner is ``\texttt{float}''.
%    \begin{macrocode}
%<*body>
\DefineFamily{KOMAarg}
\DefineFamilyMember[.toc]{KOMAarg}
\newcommand*{\DeclareNewTOC}[2][]{%
  \newif\iftb@nt@float
  \newif\iftb@nt@nonfloat
  \newif\iftb@nt@forcenames
  \def\tb@nt@floattype{\tb@nt@autofloattype}%
  \def\tb@nt@floatpos{tbp}%
  \def\tb@nt@ext{#2}%
  \edef\tb@nt@type{#2}%
  \let\tb@nt@types\relax
  \def\tb@nt@owner{float}%
  \def\tb@nt@name{\expandafter\protect\expandafter\MakeUppercase\tb@nt@type}%
  \let\tb@nt@listname\relax
  \let\tb@nt@counterwithin\@empty
  \let\tb@nt@atbegin\@empty
  \let\tb@nt@atend\@empty
  \def\tb@nt@tocentrystyle{default}%
%    \end{macrocode}
%   \changes{v3.20}{2016/04/29}{need more initialization for empty optional
%     argument}^^A
%    \begin{macrocode}
  \def\tb@nt@tocstyle@options{level=1}%
  \IfArgIsEmpty{#1}{%
%    \end{macrocode}
% Also need to call the style init code, to set the defaults for options
% \texttt{numwidth} and \texttt{indent}.
%    \begin{macrocode}
    \begingroup
      \let\scr@dte@current\tb@nt@type
      \@ExecuteTOCEntryStyleInitCode{\tb@nt@tocentrystyle}{\tb@nt@type}%
      \def\do@endgroup{\endgroup}%
      \def\do##1{%
        \ifstr{##1}{numwidth}{%
          \l@addto@macro\do@endgroup{%
            \l@addto@macro{\tb@nt@tocstyle@options}{,numwidth=1.5em}%
          }%
        }{%
          \ifstr{##1}{indent}{%
            \l@addto@macro\do@endgroup{%
              \l@addto@macro{\tb@nt@tocstyle@options}{,indent=1em}%
            }%
          }{}%
        }%
        \kernel@ifnextchar[%]
          {\@dodefault}%
          {}%
      }%
      \def\@dodefault[##1]{}%
      \scr@dte@doopts
    \do@endgroup
  }{%
    \let\tb@nt@extra@relax@opts\@empty
%    \end{macrocode}
%   After initialisation of the local values we need to know the style of the
%   toc entry, to define style dependend options.
% \begin{macro}{\tb@nt@type}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   The type of list is used for environment and counter names and as part of
%   several internal and user macros. It is needed before defining the style
%   dependend options. So we use a first run to set it up.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{type}{%
      \tb@ifvalueisnotempty{##1}{\edef\tb@nt@type{##1}}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@tocentrystyle}
%   \changes{v3.20}{2015/12/16}{neu (intern)}
%   The style of the toc entry. It is needed before defining the style
%   dependend options. So we use a first run to set it up.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{tocentrystyle}[default]{%
      \IfArgIsEmpty{##1}{%
        \edef\tb@nt@tocentrystyle{##1}%
        \FamilyKeyStateProcessed
      }{%
        \scr@ifundefinedorrelax{scr@dte@def@l@##1}{%
          \FamilyKeyStateUnknownValue
        }{%
          \edef\tb@nt@tocentrystyle{##1}%
          \FamilyKeyStateProcessed
        }%
      }%
    }%
%    \end{macrocode}
% \end{macro}
%   After this we define pseudo option \texttt{@else@} to ignore all currently
%   not needed options. After this we do the first option execution run.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{@else@}{\FamilyKeyStateProcessed}%
    \FamilyExecuteOptions[.toc]{KOMAarg}{#1}%
    \RelaxFamilyKey[.toc]{KOMAarg}{@else@}%
%    \end{macrocode}
%   For the second run we do not need to set up these options again. So define
%   it as no-opt.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{type}{\FamilyKeyStateProcessed}%
    \DefineFamilyKey[.toc]{KOMAarg}{tocentrystyle}{\FamilyKeyStateProcessed}%
%    \end{macrocode}
%   \changes{v3.20}{2015/12/16}{defining toc style depending options}^^A
%   \changes{v3.20}{2016/06/12}{using prefix \texttt{tocentry} instead of
%     \texttt{toc}}^^A
%   If the toc style is empty we won't define any \cs{l@\dots}. Otherwise we
%   need to define additional options.
%    \begin{macrocode}
    \ifstr{\tb@nt@tocentrystyle}{}{}{%
      \begingroup
        \let\scr@dte@current\tb@nt@type
        \@ExecuteTOCEntryStyleInitCode{\tb@nt@tocentrystyle}{\tb@nt@type}%
        \def\do@endgroup{\endgroup}%
        \def\do##1{%
          \l@addto@macro\do@endgroup{%
            \l@addto@macro\tb@nt@extra@relax@opts{%
              \RelaxFamilyKey[.toc]{KOMAarg}{toc##1}%
              \RelaxFamilyKey[.toc]{KOMAarg}{tocentry##1}%
            }%
          }%
          \kernel@ifnextchar[%]
            {\@dodefault{##1}}%
            {\@donodefault{##1}}%
        }%
        \def\@donodefault##1{%
          \l@addto@macro\do@endgroup{%
            \DefineFamilyKey[.toc]{KOMAarg}{toc##1}{%
              \PackageWarning{tocbasic}{you should use `tocentry##1'
                instead\MessageBreak
                of `toc##1'}%
              \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
              \FamilyKeyStateProcessed
            }%
            \DefineFamilyKey[.toc]{KOMAarg}{tocentry##1}{%
              \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
              \FamilyKeyStateProcessed
            }%
          }%
        }%
        \def\@dodefault##1[##2]{%
          \l@addto@macro\do@endgroup{%
            \DefineFamilyKey[.toc]{KOMAarg}{toc##1}[##2]{%
              \PackageWarning{tocbasic}{you should use `tocentry##1'
                instead\MessageBreak
                of `toc##1'}%
              \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
              \FamilyKeyStateProcessed
            }%
            \DefineFamilyKey[.toc]{KOMAarg}{tocentry##1}[##2]{%
              \l@addto@macro{\tb@nt@tocstyle@options}{,##1={####1}}%
              \FamilyKeyStateProcessed
            }%
          }%
        }%
        \scr@dte@doopts
      \do@endgroup
    }%
%    \end{macrocode}
%   After this, we need to define all the other options and do the real option
%   execution.
% \begin{macro}{\tb@nt@atbegin}
%   \changes{v3.09}{2011/03/01}{new optional identifier \texttt{atbegin}}
%   \changes{v3.11c}{2013/02/01}{\texttt{atbegin} argument may be empty}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Additional code executed at the begin of a new defined environment.
%    \begin{macrocode}
    \FamilyStringKey[.toc]{KOMAarg}{atbegin}{\tb@nt@atbegin}%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@atend}
%   \changes{v3.09}{2011/03/01}{new optional identifier \texttt{atbend}}
%   \changes{v3.11c}{2013/02/01}{\texttt{atend} argument may be empty}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Additional code executed at the end of a new defined environment.
%    \begin{macrocode}
    \FamilyStringKey[.toc]{KOMAarg}{atend}{\tb@nt@atend}%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@counterwithin}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   If a counter will be defined, this counter may depend on another counter
%   (like figure counter depends on chapter counter at book classes). If the
%   value is empty, the counter does not depend on any other counter.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{counterwithin}{%
      \edef\tb@nt@counterwithin{##1}\FamilyKeyStateProcessed
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@ext}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Don't tell the user, that the mandatory argument of the command may be
%   overloaded by this option. This was only done to simplify the definition.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{extension}{%
      \tb@ifvalueisnotempty{##1}{\edef\tb@nt@ext{##1}}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\iftb@nt@float}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   \changes{v3.06}{2010/06/01}{new internal}
%   This boolean indicates, that float environments should also be defined.
%    \begin{macrocode}
    \FamilyBoolKey[.toc]{KOMAarg}{float}{tb@nt@float}%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@floatpos}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Simply the value for the |\fps@...| macro.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{floatpos}{%
      \tb@ifvalueisnotempty{##1}{\edef\tb@nt@floatpos{##1}}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@floattype}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Simply the value for the |\ftype@...| macro. It has to be
%   $1<=\textrm{value}<=31$.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{floattype}{%
      \FamilySetCounterMacro{KOMAarg}{floattype}{\reserved@d}{##1}%
      \ifx\FamilyKeyState\FamilyKeyStateProcessed
        \ifnum 0=
          \ifnum\reserved@d<1 0 \else\ifnum\reserved@d>31 0 \else 1 \fi\fi
          \FamilyKeyStateUnknownValue
        \else
          \let\tb@nt@floattype\reserved@d
        \fi
      \fi
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\iftb@nt@forcenames}
%   \changes{v3.06}{2010/06/01}{new internal}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   The |\...name| commands will only be defined, if they are not already
%   defined. But some users may want to define their own names even if there
%   are already definitions. So this boolean option may switch to force the
%   definition.
%    \begin{macrocode}
    \FamilyBoolKey[.toc]{KOMAarg}{forcenames}{tb@nt@forcenames}%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@hang}
%   \changes{v3.20}{2015/12/16}{undefined}^^A
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Earch entry of a TOC/list of is idented on the left side. This is the
%   amount of the indention of the text of the entry.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{hang}{%
      \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocnumwidth}{%
        \PackageWarning{tocbasic}{%
          deprecated option `hang'.\MessageBreak
          Option will be ignored, because toc entry style\MessageBreak
          `\tb@nt@tocentrystyle' does not provide option `numwidth'%
        }%
      }{%
        \PackageWarning{tocbasic}{%
          deprecated option `hang'.\MessageBreak
          You should replace option `hang' by option\MessageBreak
          `tocentrynumwidth'%
        }%
        \l@addto@macro\tb@nt@tocstyle@options{,numwidth={##1}}%
      }%
      \FamilyKeyStateProcessed
    }%
    \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocnumwidth}{}{%
      \l@addto@macro\tb@nt@tocstyle@options{,numwidth=1.5em}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@indent}
%   \changes{v3.20}{2015/12/16}{undefined}^^A
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Earch entry of a TOC/list of is idented on the left side. This is the
%   amount of the indention of the number part.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{indent}{%
      \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocindent}{%
        \PackageWarning{tocbasic}{%
          deprecated option `indent'.\MessageBreak
          Option will be ignored, because toc entry style\MessageBreak
          `\tb@nt@tocentrystyle' does not provide option `indent'%
        }%
      }{%
        \PackageWarning{tocbasic}{%
          deprecated option `indent'.\MessageBreak
          You should replace option `indent' by option\MessageBreak
          `tocentryindent'%
        }%
        \l@addto@macro\tb@nt@tocstyle@options{,indent={##1}}%
      }%
      \FamilyKeyStateProcessed
    }%
    \scr@ifundefinedorrelax{KV@KOMAarg.toc@tocindent}{}{%
      \l@addto@macro\tb@nt@tocstyle@options{,indent=1em}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@level}
%   \changes{v3.20}{2015/12/16}{undefined}^^A
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Each entry to a TOC/list of has a numeric level. You may set up your own
%   level.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{level}{%
      \PackageWarning{tocbasic}{%
        deprecated option `level'.\MessageBreak
        You should replace option `level' by option\MessageBreak
        `tocentrylevel'
      }%
      \l@addto@macro\tb@nt@tocstyle@options{,level={##1}}%
      \FamilyKeyStateProcessed
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@listname}
%   \changes{v3.18}{2015/06/20}{using \cs{def} instead of \cs{edef}}^^A
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   The list itself has a heading. A |\list<type>name| will also be defined.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{listname}{%
      \tb@ifvalueisnotempty{##1}{\def\tb@nt@listname{##1}}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@name}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   We need a name/term for the entries of the new list. This may e.\,g. be used
%   for |caption| output. A |\<type>name| will also be defined.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{name}{%
      \tb@ifvalueisnotempty{##1}{\edef\tb@nt@name{##1}}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\iftb@nt@nonfloat}
%   \changes{v3.06}{2010/06/01}{new (internal)}^^A
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   This boolean indicates, that non-float environment should also be
%   defined. The environment has the postfix ``-''.
%    \begin{macrocode}
    \FamilyBoolKey[.toc]{KOMAarg}{nonfloat}{tb@nt@nonfloat}%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@owner}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   The owner of the new list extension.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{owner}{%
      \tb@ifvalueisnotempty{##1}{\edef\tb@nt@owner{##1}}%
    }%
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@nt@types}
%   \changes{v3.20}{2015/12/16}{local valid only}^^A
%   Sometimes the plural of the type is needed and may be defined by a
%   seperate option.
%    \begin{macrocode}
    \DefineFamilyKey[.toc]{KOMAarg}{types}{%
      \tb@ifvalueisnotempty{##1}{\edef\tb@nt@types{##1}}%
    }%
%    \end{macrocode}
% \end{macro}
%   Last but not least we have to execute the options and reset the option
%   definitions.
%    \begin{macrocode}
    \FamilyExecuteOptions[.toc]{KOMAarg}{#1}%
    \RelaxFamilyKey[.toc]{KOMAarg}{types}%
    \RelaxFamilyKey[.toc]{KOMAarg}{owner}%
    \RelaxFamilyKey[.toc]{KOMAarg}{nonfload}%
    \RelaxFamilyKey[.toc]{KOMAarg}{name}%
    \RelaxFamilyKey[.toc]{KOMAarg}{listname}%
    \RelaxFamilyKey[.toc]{KOMAarg}{level}%
    \RelaxFamilyKey[.toc]{KOMAarg}{indent}%
    \RelaxFamilyKey[.toc]{KOMAarg}{hang}%
    \RelaxFamilyKey[.toc]{KOMAarg}{forcenames}%
    \RelaxFamilyKey[.toc]{KOMAarg}{floatpos}%
    \RelaxFamilyKey[.toc]{KOMAarg}{float}%
    \RelaxFamilyKey[.toc]{KOMAarg}{extension}%
    \RelaxFamilyKey[.toc]{KOMAarg}{counterwithin}%
    \RelaxFamilyKey[.toc]{KOMAarg}{atend}%
    \RelaxFamilyKey[.toc]{KOMAarg}{atbegin}%
    \tb@nt@extra@relax@opts
    \RelaxFamilyKey[.toc]{KOMAarg}{tocentrystyle}%
    \RelaxFamilyKey[.toc]{KOMAarg}{type}%
  }%
%    \end{macrocode}
%   First of all, every TOC needs a extension, that should be added to the
%   list of known extensions.
%    \begin{macrocode}
  \expandafter\newcommand\csname ext@\tb@nt@type\endcsname{}%
  \expandafter\let\csname ext@\tb@nt@type\endcsname\tb@nt@ext
  \addtotoclist[\tb@nt@owner]{\csname ext@\tb@nt@type\endcsname}%
%    \end{macrocode}
% And we save the type of the extension at \cs{tb@nt@type@\meta{extension}}
% for later usage.
%    \begin{macrocode}
  \expandafter\let\csname tb@nt@type@\tb@nt@ext\endcsname\tb@nt@type
%    \end{macrocode}
% Then we need the TOC itself with a name:
%    \begin{macrocode}
  \scr@ifundefinedorrelax{tb@nt@types}{%
    \edef\tb@nt@types{\tb@nt@type s}%
  }{}%
  \scr@ifundefinedorrelax{tb@nt@listname}{%
    \protected@edef\tb@nt@listname{List of \protect\MakeUppercase\tb@nt@types}%
  }{}%
  \@ifundefined{\tb@nt@type name}{%
    \expandafter\protected@edef\csname \tb@nt@type name\endcsname{\tb@nt@name}%
  }{%
    \iftb@nt@forcenames
      \expandafter\protected@edef\csname \tb@nt@type name\endcsname
      {\tb@nt@name}%
    \fi
  }%
  \@ifundefined{list\tb@nt@type name}{%
    \expandafter\let\csname list\tb@nt@type name\endcsname\tb@nt@listname
  }{%
    \iftb@nt@forcenames
      \expandafter\let\csname list\tb@nt@type name\endcsname\tb@nt@listname
    \fi
  }%
  \expandafter\newcommand\csname listof\tb@nt@ext name\expandafter\endcsname
    \expandafter{\csname list\tb@nt@type name\endcsname}%
  \begingroup\edef\@tempa{\endgroup
    \noexpand\newcommand*\csname listof\tb@nt@types\endcsname{%
      \noexpand\listoftoc{\tb@nt@ext}%
    }%
  }\@tempa
%    \end{macrocode}
% The list entry:
%   \changes{v3.20}{2016/04/05}{warning if \cs{l@\dots} is undefined}^^A
%    \begin{macrocode}
  \ifstr{\tb@nt@tocentrystyle}{}{%
    \@ifundefined{l@\tb@nt@type}{%
      \PackageWarning{tocbasic}{%
        \expandafter\string\csname l@\tb@nt@type\endcsname\space
        undefined!\MessageBreak
        I hope you know, what you are doing, but\MessageBreak
        maybe it would be better to use proper\MessageBreak
        `tocentrystyle` settings%
      }%
    }{}%
  }{%
    \edef\reserved@a{%
      \noexpand\DeclareTOCStyleEntry[%
        {\unexpanded\expandafter{\tb@nt@tocstyle@options}}%
      ]{\tb@nt@tocentrystyle}{\tb@nt@type}%
    }%
    \reserved@a
  }%
%    \end{macrocode}
% \changes{v3.12}{2013/05/03}{fixed: definition of
%   \cs{listof\meta{type}entryname} added as explained in the manual}
%    \begin{macrocode}
  \@ifundefined{listof\tb@nt@ext entryname}{%
    \expandafter\let\csname listof\tb@nt@ext entryname\endcsname\tb@nt@name
  }{}%
%    \end{macrocode}
% The setup command:
%    \begin{macrocode}
  \begingroup\edef\@tempa{\endgroup
    \noexpand\newcommand*\csname setup\tb@nt@types\endcsname{%
      \noexpand\setuptoc{\tb@nt@ext}%
    }%
  }\@tempa
  \@tempswafalse
%    \end{macrocode}
% The float environments:
% \changes{v3.09a}{2011/05/30}{fixed: floats may have an optional argument}
% \changes{v3.12}{2013/12/10}{fixed: usage of default placement}
%    \begin{macrocode}
  \iftb@nt@float
    \expandafter\newcommand\expandafter*\csname fps@\tb@nt@type\expandafter
    \endcsname\expandafter{\tb@nt@floatpos}%
    \expandafter\newcommand\expandafter*\csname ftype@\tb@nt@type\expandafter
    \endcsname\expandafter{\tb@nt@floattype}%
    \begingroup
      \edef\@tempa{%
        \noexpand\endgroup
        \noexpand\newenvironment{\tb@nt@type}{%
          \noexpand\kernel@ifnextchar[%]
          {\noexpand\tb@atbegin@after\noexpand\@float{\tb@nt@type}}%
          {\noexpand\edef\noexpand\reserved@a{%
              \noexpand\noexpand\noexpand\tb@atbegin@after
              \noexpand\noexpand\noexpand\@float{\tb@nt@type}%
              [\noexpand\csname fps@\tb@nt@type\noexpand\endcsname]}%
            \noexpand\reserved@a}%
        }{%
          \noexpand\csname \tb@nt@type @atend\noexpand\endcsname
          \noexpand\end@float
        }%
        \noexpand\newenvironment{\tb@nt@type*}{%
          \noexpand\kernel@ifnextchar[%]
          {\noexpand\tb@atbegin@after\noexpand\@dblfloat{\tb@nt@type}}%
          {\noexpand\edef\noexpand\reserved@a{%
              \noexpand\noexpand\noexpand\tb@atbegin@after
              \noexpand\noexpand\noexpand\@dblfloat{\tb@nt@type}%
              [\noexpand\csname fps@\tb@nt@type\noexpand\endcsname]}%
            \noexpand\reserved@a}%
        }{%
          \noexpand\csname \tb@nt@type @atend\noexpand\endcsname
          \noexpand\end@dblfloat
        }%
      }%
    \@tempa
    \@tempswatrue
  \fi
%    \end{macrocode}
% The nonfloat environment:
%    \begin{macrocode}
  \iftb@nt@nonfloat
    \begingroup
      \edef\@tempa{%
        \noexpand\endgroup
        \noexpand\newenvironment{\tb@nt@type-}{%
          \noexpand\trivlist\noexpand\item\noexpand\relax
          \noexpand\minipage{\noexpand\linewidth}%
          \noexpand\def\noexpand\@captype{\tb@nt@type}%
          \noexpand\csname \tb@nt@type @atbegin\noexpand\endcsname
        }{%
          \noexpand\csname \tb@nt@type @atend\noexpand\endcsname
          \noexpand\endminipage\noexpand\endtrivlist
        }%
      }%
    \@tempa
    \@tempswatrue
  \fi
%    \end{macrocode}
% The counter and hooks of float and nonfloat environments:
%   \changes{v3.10b}{2012/04/04}{\cs{noexpand} added to fix problems using
%     \cs{autodot}}^^A
%   \changes{v3.13}{2014/07/31}{add \cs{autodot} only to hierachical
%     counters}^^A
%    \begin{macrocode}
  \if@tempswa
    \@ifundefined{c@\tb@nt@type}{%
      \newcounter{\tb@nt@type}%
    }{%
      \PackageWarning{tocbasic}{using already defined counter `\tb@nt@type'}%
    }%
    \ifx\tb@nt@counterwithin\@empty\else
      \@addtoreset{\tb@nt@type}{\tb@nt@counterwithin}%
      \begingroup\edef\@tempa{%
        \noexpand\endgroup
        \noexpand\renewcommand*\expandafter\noexpand
        \csname the\tb@nt@type\endcsname{%
          \expandafter\noexpand\csname the\tb@nt@counterwithin\endcsname
          .\noexpand\arabic{\tb@nt@type}%
        }%
      }\@tempa
    \fi
    \begingroup
      \edef\@tempa{%
        \noexpand\endgroup
        \noexpand\newcommand*\expandafter\noexpand
        \csname \tb@nt@type format\endcsname{%
          \expandafter\noexpand\csname \tb@nt@type name\endcsname
          \noexpand\nobreakspace
          \expandafter\noexpand\csname the\tb@nt@type\endcsname
          \ifx\tb@nt@counterwithin\@empty\else
            \noexpand\csname autodot\endcsname
          \fi
        }%
        \noexpand\newcommand*\expandafter\noexpand
        \csname fnum@\tb@nt@type\endcsname{%
          \expandafter\noexpand\csname \tb@nt@type format\endcsname
        }%
      }%
    \@tempa
    \expandafter\newcommand\expandafter*\csname \tb@nt@type @atbegin\expandafter
    \endcsname\expandafter{\tb@nt@atbegin}%
    \expandafter\newcommand\expandafter*\csname \tb@nt@type @atend\expandafter
    \endcsname\expandafter{\tb@nt@atend}%
  \fi
}
%    \end{macrocode}
% \begin{macro}{\tb@atbegin@after}
%   \changes{v3.09a}{2011/05/30}{new internal}%
%   Processes command \#1 with argument \#2 and optional argument \#3 and than
%   \verb|\csname #2@atbegin\endcsname|. This is used to add
%   \verb|csname #2@atbegin\endcsname| at begin part of a float (but after
%   optional argument of the float).
%    \begin{macrocode}
\newcommand*{\tb@atbegin@after}[3]{}
\def\tb@atbegin@after#1#2[#3]{%
  #1{#2}[#3]%
  \csname #2@atbegin\endcsname
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@ifvalueisnotempty}
%   \changes{v3.06}{2010/05/21}{new internal}^^A
%   \changes{v3.20}{2015/12/16}{simpler definition}^^A
%   This is only a helper for defining some of the keys.
%    \begin{macrocode}
\newcommand*{\tb@ifvalueisnotempty}[1]{%
  \ifstr{#1}{}{%
    \FamilyKeyStateUnknownValue
    \expandafter\@gobble
  }{%
    \FamilyKeyStateProcessed
    \expandafter\@firstofone
  }%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\tb@boolkey}
%   \changes{v3.06}{2010/05/21}{new (internal)}^^A
%   \changes{v3.20}{2015/12/16}{undefined}^^A
% \end{macro}
% \begin{macro}{\tb@dimkey}
%   \changes{v3.06}{2010/05/21}{new (internal)}^^A
%   \changes{v3.20}{2015/12/16}{undefined}^^A
% \end{macro}
% \begin{macro}{\tb@numkey}
%   \changes{v3.06}{2010/05/21}{new internal}%
%   \changes{v3.20}{2015/12/16}{undefined}^^A
% \end{macro}
% \begin{macro}{\tb@nt@autofloattype}
%   \changes{v3.06}{2010/06/01}{new internal}
%   This macro saves the float type for auto generated float types.
%    \begin{macrocode}
\newcommand*{\tb@nt@autofloattype}{16}
%</body>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \iffalse
%</package>
%<*load>
% Used at \KOMAScript{} packages and classes to load the package.
%    \begin{macrocode}
\RequirePackage{tocbasic}[%
%!KOMAScriptVersion
]
%    \end{macrocode}
%
%<*class>
% \KOMAScript{} classes need some additional initialization.
%
% \changes{v1.00}{auto-activation of feature \texttt{onecolumn}}
% Set feature \texttt{onecolumn} for every toc file if feature
% \texttt{leveldown} was not used.
%    \begin{macrocode}
%<*chapter>
\AtAddToTocList[\@currname.\@currext]{\setuptoc{\@currext}{onecolumn}}%
\AtAddToTocList[float]{\setuptoc{\@currext}{onecolumn}}%
%</chapter>
%    \end{macrocode}
% Tell the package, what files are used:
%    \begin{macrocode}
\addtotoclist{toc}
\addtotoclist[float]{lof}
\addtotoclist[float]{lot}
%    \end{macrocode}
%</class>
%</load>
% \fi
%
% \Finale
%
\endinput
%
% end of file `tocbasic.dtx'
%%% Local Variables:
%%% mode: doctex
%%% coding: iso-latin-1
%%% TeX-master: t
%%% End:
