% \CheckSum{656}
% \iffalse meta-comment
% ======================================================================
% tocbasic.dtx
% Copyright (c) Markus Kohm, 2008-2009
%
% 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 files `tocbasic.dtx' and `scrlogo.dtx' at least.
%
% To create `tocbasic.sty' run `tex tocbasic.dtx'.  Using LaTeX instead
% of TeX would generate the implementation documentation.
% ----------------------------------------------------------------------
% tocbasic.dtx
% Copyright (c) Markus Kohm, 2008-2009
%
% 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 mindestens aus den Dateien `tocbasic.dtx' und
% `scrlogo.dtx'.
%
% `tocbasic.sty' kann durch den Aufruf `tex tocbasic.dtx' erzeugt 
% werden. Bei Verwendung von LaTeX statt TeX wird hingegen die
% Implementierungsdokumentation erzeugt.
% ======================================================================
% \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: tocbasic.dtx
%<*dtx|package|driver|doc|load>
% \fi
\def\tocbasicversion{2009/06/08 v3.03b}
% \iffalse
%</dtx|package|driver|doc|load>
%<*dtx>
\def\LaTeXformat{LaTeX2e}
\ifx\fmtname\LaTeXformat\def\MainBodyWork{%
\ProvidesFile{tocbasic.dtx}
%</dtx>
%<package>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
%<driver>\ProvidesFile{tocbasic.drv}
%<doc>\ProvidesFile{tocbasic.tex}
%<package>\ProvidesPackage{tocbasic}
%<*dtx|package|driver|doc>
                [\tocbasicversion\space KOMA-Script package
%</dtx|package|driver|doc>
%<driver>                 (driver)%
%<package>                (handling toc-files)%
%<doc>                    (manual)%
%<*dtx>
                 (dtx)%
%</dtx>
%<*dtx|package|driver|doc>
                ]
%</dtx|package|driver|doc>
%<*dtx|driver>
\IfFileExists{scrdoc.cls}{%
  \documentclass[halfparskip-]{scrdoc}
}{%
  \documentclass{ltxdoc}
  \DeclareRobustCommand{\KOMAScript}{\textsf{K\kern.05em O\kern.05em%
      M\kern.05em A\kern.1em-\kern.1em Script}}
}
\usepackage[latin1]{inputenc}
\usepackage[english]{babel}
\usepackage{listings}
\lstset{breaklines,prebreak=\mbox{$\hookleftarrow$},language=[LaTeX]TeX,
  basicstyle=\small}
\CodelineIndex
\RecordChanges
\GetFileInfo{tocbasic.dtx}
\sloppy
\DocInput{\filename}
\end{document}
%</dtx|driver>
%<*dtx>
}%
\else
  \let\MainBodyWork\relax
\fi

\MainBodyWork

\def\batchfile{tocbasic.dtx}
%</dtx>
%<ins>\def\batchfile{tocbasic.ins}
%<*dtx|ins>
\input docstrip.tex

\let\ifbeta=\iffalse

\ifToplevel{\ifx\generate\undefined
    \errhelp{Install a new version of docstrip.}
    \errmessage{Old docstrip in input path}
    \batchmode
    \csname @@end\endcsname
  \fi
  \Msg{************************************************************}
  \Msg{*}
  \Msg{* KOMA-Script}
  \Msg{* a versatile LaTeX2e bundle}
  \Msg{*}
  \Msg{* This is `\batchfile', a batchfile to unpack some or all}
  \Msg{* parts of KOMA-Script. See `liesmich.txt' (german) or}
  \Msg{* `readme.txt' (english) for additional information.}
  \Msg{*}
  \Msg{* Files of an old KOMA-Script installation may be}
  \Msg{* overwritten without asking!}
  \Msg{*}
  \Msg{************************************************************}
}

% ---------- some docstrip switchs -------------------------------------

\ifToplevel{%
  \keepsilent
  \askforoverwritefalse
}

% ---------- defining preambles ----------------------------------------

\preamble

Copyright (c) 2007-2009
Markus Kohm and any individual authors listed elsewhere in this file.

This file was generated from file(s) of the 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 file may only be distributed together with the files
`scrlogo.dtx' and `tocbasic.dtx'. You may however distribute the files
`scrlogo.dtx' and `tocbasic.dtx' without this file. 
See also `tocbasic.dtx' for additional information.

If this file is a beta version, you are not allowed to distribute it.

Currently there is only a short english manual at `tocbasic.dtx', that
should also be found as `tocbasic.pdf'.

The KOMA-Script bundle (but maybe not this file) was based upon the
LaTeX2.09 Script family created by Frank Neukam 1993 and the LaTeX2e
standard classes created by The LaTeX3 Project 1994-1996.

\endpreamble

% ---------- File generation -------------------------------------------

\generate{\usepreamble\defaultpreamble
  \file{tocbasic.ins}{%
    \from{tocbasic.dtx}{ins}%
  }%
%  \file{tocbasic.drv}{%
%    \from{tocbasic.dtx}{driver}%
%  }%
  \file{tocbasic.tex}{%
    \from{tocbasic.dtx}{doc}%
  }%
}

\generate{\usepreamble\defaultpreamble
  \file{tocbasic.sty}{%
    \ifbeta\from{scrbeta.dtx}{package,tocbasic}\fi
    \from{tocbasic.dtx}{package}%
    \from{scrlogo.dtx}{logo}%
  }%
}%

% ---------- end of docstrip process -----------------------------------

\ifToplevel{%
  \Msg{************************************************************}
  \Msg{*}
  \Msg{* KOMA-Script}
  \Msg{* a versatile LaTeX2e bundle}
  \Msg{*}
  \Msg{* To finish the installation you have to move some}
  \Msg{* files into a directory searched by TeX.}
  \Msg{* See INSTALL.TXT (english) or INSTALLD.TXT (german)}
  \Msg{* from KOMA-Script bundle for additional information.}
  \Msg{*}
  \Msg{* You may also produce the implementation documentation}
  \Msg{* including also a short version of the english manual.}
  \Msg{* To produce it, do}
  \Msg{* \space\space pdflatex tocbasic.dtx}
  \Msg{* \space\space mkindex tocbasic}
  \Msg{* \space\space pdflatex tocbasic.dtx}
  \Msg{* after finishing the installation.}
  \Msg{*}
  \Msg{* Happy TeXing}
  \Msg{*}
  \Msg{************************************************************}
}

\bye
%</dtx|ins>
%<*dtx>
% \fi
%
% \providecommand*{\DescribeCounter}{\DescribeMacro}
% \let\Macro\cs
% \let\Class\textsf
% \let\Package\textsf
% \let\File\texttt
% \let\Parameter\marg
% \let\OParameter\oarg
% \let\PName\meta
% \let\PValue\texttt
% \newenvironment{Example}{\quote
%   \hspace*{-\leftmargin}\textbf{Example:}\enskip\ignorespaces
% }{\endquote}
% \newlength\descwidth
% \newenvironment{desctabular}{
%   \setlength{\descwidth}{\linewidth}
%   \addtolength{\descwidth}{-1em}
%   \addtolength{\descwidth}{-2\tabcolsep}
%   \tabular{@{}lp{\descwidth}@{}}
%   \hline
% }{%
%   \hline
%   \endtabular
% }
% \newcommand{\pventry}[2]{\multicolumn{2}{@{}l@{}}{\PValue{#1}}\\
%   ~ & #2 \\ }
% \providecommand*{\autoref}[1]{\expandafter\AUTOREF#1:}
% \newcommand*{\AUTOREF}{}
% \makeatletter
% \def\AUTOREF#1:#2:{\edef\@tempa{#1}\edef\@tempb{tab}\ifx\@tempa\@tempb 
%   table~\fi
%   \edef\@tempb{sec}\ifx\@tempa\@tempb section~\fi
%   \ref{#1:#2}}
% \makeatother
%
% \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}
% \iffalse
%</dtx>
%<*doc>

\chapter{Package \Package{tocbasic} for Class and Package Authors}
\labelbase{tocbasic}

\textsc{Note: This is only a short version of the documentation.  The german
  \KOMAScript{} guide does contain a long version with usefull examples, that
  should also be translated!}

%</doc>
%<*doc|dtx>
% \fi
If a package creates it's list ``list of something''---something like ``list
of figures'', ``list of tables'', ``list of listings'', ``list of
algorithms'', etc. also known as \emph{toc-files}---have to do some
operations, that are equal for all those packages. Also it may be usefull
for classes and other packages to know about these additional
toc-files. This packages implements some basic functionality for all those
packages. Using this package will also improve compatibility with
\KOMAScript{} and---let us hope---other classes and packages.
% \iffalse
%<*dtx>
% \fi
% \end{abstract}
%
% \tableofcontents
% 
% \iffalse
%</dtx>
% \fi
%

\section{Legal Note}
\label{sec:tocbasic.legalnote}

You are allowed to destribute this part of \KOMAScript{} without the main
part of \KOMAScript{}. The files ``\File{scrlogo.dtx}'' and
``\File{tocbasic.dtx}'' may be distributed together under the conditions
of the \LaTeX{} Project Public License, either version~1.3c of this license
or (at your option) any later version.

The latest version of this license is in
\mbox{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.

% \iffalse
%<*dtx>
% \fi
% \KOMAScript{} comes with a detailed manual in English and German. But for
%  this package theres currently only this short English manual, because this
%  package should be used by package authors, not users.
%
% The \KOMAScript{} bundle may be found at
% CTAN:/\mbox{macros}/\linebreak[3]\mbox{latex}/\linebreak[3]\mbox{contrib}/%
% \linebreak[3]\mbox{koma-script}/. 
% ``CTAN:'' is a shortcut for every ``tex-archive'' directory at every
% CTAN-server or CTAN-mirror. See \mbox{http://www.ctan.org} for a list of all
% those servers and mirrors.
% \iffalse
%</dtx>
% \fi

\section{Using Package \Package{tocbasic}}
\label{sec:tocbasic.usage}

This package was made to be used by class and package authors.  Because of
this the package has no options.  If different packages would load it with
different options a option clash would be the result.  So using options
would'nt be a good idea.

There are two kind of commands.  The first kind are basic command.  Those
are used to inform other packages about the extensions used for files that
represent a list of something.  Classes or packages may use this information
e.g, for putting something to every of those files.  Packages may also ask,
if an extension is already in use.  This does even work, if \Macro{nofiles}
was used. The second kind are commands to create the list of something.


\subsection{Basic Commands}
\label{sec:tocbasic.basics}

Basic commands are used to handle a list of all extensions known for files
representing a list of something.  Entries to such files are written using
\Macro{addtocontents} or \Macro{addcontentsline} typically.  There are also
commands to do something for all known extensions.  And there are commands to
set or unset features of an extension or the file represented by the
extension.  Typically an extension also has an owner.  This owner may be a
class or package or a term decided by the author of the class or package
using \Package{tocbasic}, e.g., \KOMAScript{} uses the owner \texttt{float}
for list of figures ans list of tables and the default owner for the table of
contents.

% \iffalse
\begin{Declaration}
  \Macro{ifattoclist}\Parameter{extension}\Parameter{true
    part}\Parameter{false part}
\end{Declaration}
\BeginIndex{Cmd}{ifattoclist}%
This command
%<*dtx>
%\fi
\DescribeMacro{\ifattoclist}
Command \Macro{ifattoclist}\Parameter{extension}\Parameter{true
  part}\Parameter{false part}
% \iffalse
%</dtx>
% \fi
may be used to ask, wether a \PName{extension} is already a known extension or
not.  If the \PName{extension} is already known the \PName{true part} will be
used, otherwise the \PName{false part} will be used.
\begin{Example}
  Maybe you want to know if the extension ``\File{foo}'' is already in use to
  report an error, if you can not use it:
  \begin{lstlisting}
  \ifattoclist{foo}{%
    \PackageError{bar}{%
      extension `foo' already in use%
    }{%
      Each extension may be used only 
      once.\MessageBreak
      The class or another package already 
      uses extension `foo'.\MessageBreak
      This error is fatal!\MessageBreak  
      You should not continue!}%
  }{%
    \PackageInfo{bar}{using extension `foo'}%
  }
  \end{lstlisting}
\end{Example}
% \iffalse
\EndIndex{Cmd}{ifattoclist}%

\begin{Declaration}
  \Macro{addtotoclist}\OParameter{owner}\Parameter{extension}
\end{Declaration}
\BeginIndex{Cmd}{addtotoclist}%
This command
%<*dtx>
%\fi
\DescribeMacro{\addtotoclist}
Command \Macro{addtotoclist}\OParameter{owner}\Parameter{extension}
% \iffalse
%</dtx>
% \fi
adds the \PName{extension} to the list of known extensions.  If the optional
argument, \OParameter{owner}, was given this \PName{owner} will be stored to
be the owner of the \PName{extension}.  If you omit the optional argument,
\Package{tocbasic} tries to find out the filename of the current processed
class or package and stores this as owner.  This will fail if
\Macro{addtotoclist} was not used, loading a class or package but using a
command of a class or package after loading this class or package.  In this
case the owner will be set to ``\PValue{.}''.  Note that an empty
\PName{owner} is not the same like omitting the optional argument, but an
empty owner.

\begin{Example}
  You want to add the extension ``\File{foo}'' to the list of known extension,
  while loading your package with file name ``\File{bar.sty}'':
  \begin{lstlisting}
  \addtotoclist{foo}
  \end{lstlisting}%
  This will add the extension ``\PValue{foo}'' with owner ``\PValue{bar.sty}''
  to the list of known extensions, if it was not already at the list of known
  extensions. If the class or another package already added the extension you
  will get the error:
  \begin{lstlisting}
  Package tocbasic Error: file extension `#2' cannot be used twice

  See the tocbasic package documentation for explanation.
  Type  H <return>  for immediate help.
  \end{lstlisting}
  and after typing \texttt{H <return>} you will get the help:
  \begin{lstlisting}
  File extension `foo' is already used by a toc-file, while bar.sty
  tried to use it again for a toc-file.
  This may be either an incompatibility of packages, an error at a package,
  or a mistake by the user.
  \end{lstlisting}
  
  Maybe you package has a command, that creates list of files dynamically.  In
  this case you should use the optional argument of \Macro{addtotoclist} to
  set the owner.
  \begin{lstlisting}
  \newcommand*{\createnewlistofsomething}[1]{%
    \addtotoclist[bar.sty]{#1}%
    % Do something more to make this list of something available
  }
  \end{lstlisting}
  If the user calls know, e.g.
  \begin{lstlisting}
  \createnewlistofsomething{foo}
  \end{lstlisting}
  this would add the extension ``\PValue{foo}'' with the owner
  ``\PValue{bar.sty}'' to the list of known extension or report an error, if the
  extension is already in use.  You may use any owner you want.  But it should
  be unique!  So, if you are the author of package \Package{float} you may
  use for example owner ``\PValue{float}'' instead of owner
  ``\PValue{float.sty}'', so the \KOMAScript{} options for list of figure and
  list of table will also handle the lists of this package, that are already
  added to the known extensions, when the option is used.
\end{Example}
% \iffalse
\EndIndex{Cmd}{addtotoclist}%

\begin{Declaration}
  \Macro{AtAddToTocList}\OParameter{owner}\Parameter{commands}
\end{Declaration}
\BeginIndex{Cmd}{AtAddToTocList}%
This command
%<*dtx>
%\fi
\DescribeMacro{\AtAddtoTocList}
Command \Macro{AtAddToTocList}\OParameter{owner}\Parameter{commands}
% \iffalse
%</dtx>
% \fi
adds the \PName{commands} to a internal list of commands, that should be
processed, if a toc-file with the given \PName{owner} will be added to the
list of known extensions using \Macro{addtoloclist}.  If you omit the optional
argument, \Package{tocbasic} tries to find out the filename of the current
processed class or package and stores this as owner.  This will fail if
\Macro{AtAddToTocList} was not used, loading a class or package but using a
command of a class or package after loading this class or package.  In this
case the owner will be set to ``\PValue{.}''.  Note that an empty
\PName{owner} is not the same like omitting the optional argument. With an
empty \PName{owner} you may add \Parameter{commands}, that will be processed
at every succefull \Macro{addtotoclist}, after processing the commands for the
indivdual owner.  While processing the \PValue{commands}, \Macro{@currext} wil
be set to the extension of the currently added extension.
\begin{Example}
\Package{tocbasic} itself uses
\begin{lstlisting}
  \AtAddToTocList[]{%
    \expandafter\tocbasic@extend@babel
    \expandafter{\@currext}%
  }
\end{lstlisting}
to add every extension to the \Package{tocbasic}-internal babel handling of
toc-files.  The \Macro{expandafter} are needed, because the argument of
\Macro{tocbasic@extend@babel} has to expanded!  See the description of
\Macro{tocbasic@extend@babel} at \autoref{sec:tocbasic.internals}%
% \iffalse
, \autopageref{desc:tocbasic.cmd.tocbasic@extend@babel}
% \fi
for more information.
\end{Example}
% \iffalse
\EndIndex{Cmd}{AtAddToTocList}%

\begin{Declaration}
  \Macro{removefromtoclist}\OParameter{owner}\Parameter{extension}
\end{Declaration}
\BeginIndex{Cmd}{removefromtoclist}%
This command
%<*dtx>
%\fi
\DescribeMacro{\removefromtoclist}
Command \Macro{removefromtotoclist}\OParameter{owner}\Parameter{extension}
% \iffalse
%</dtx>
% \fi
removes the \PName{extension} from the list of known extensions.  If the
optional argument, \OParameter{owner}, was given the \PName{extension} will
only be removed, if it was added by this \PName{owner}.  If you omit the
optional argument, \Package{tocbasic} tries to find out the filename of the
current processed class or package and use this as owner.  This will fail if
\Macro{removefromtoclist} was not used, loading a class or package but using a
command of a class or package after loading this class or package.  In this
case the owner will be set to ``\PValue{.}''.  Note that an empty
\PName{owner} is not the same like omitting the optional argument, but removes
the \PName{extension} without any owner test.
% \iffalse
\EndIndex{Cmd}{removefromtoclist}%

\begin{Declaration}
  \Macro{doforeachtocfile}\OParameter{owner}\Parameter{commands}
\end{Declaration}
\BeginIndex{Cmd}{doforeachtocfile}%
This command
%<*dtx>
% \fi
\DescribeMacro{\doforeachtocfile}
Command \Macro{doforeachtocfile}\OParameter{owner}\Parameter{commands}
% \iffalse
%</dtx>
% \fi
processes \PName{commands} for every known toc-file of the given
\PName{owner}.  While processing the \PName{commands} \Macro{@currext} ist the
extension of the current toc-file for every known toc-file.  If you omit the
optional argument, \OParameter{owner}, every known toc-file will be used. If
the optional argument is empty, only toc-files with an empty owner will be
used.
\begin{Example}
  If you want to type out all known extensions, you may simply write:
  \begin{lstlisting}
  \doforeachtocfile{\typeout{\@currext}}
  \end{lstlisting}
  and if only the extensions of owner ``\PValue{foo}'' should be typed out:
  \begin{lstlisting}
  \doforeachtocfile[foo]{\typeout{\@currext}}
  \end{lstlisting}
\end{Example}
% \iffalse
\EndIndex{Cmd}{doforeachtocfile}%

%<*dtx>
% \fi
\DescribeMacro{\tocbasicautomode}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{tocbasicautomode}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{tocbasicautomode}%
This command
% \fi
redefines \LaTeX{} kernel macro \Macro{@starttoc} to add all not yet added
extensions to the list of known extensions and use \Macro{tocbasic@starttoc}
instead of \Macro{@starttoc}.
% \iffalse
\EndIndex{Cmd}{tocbasicautomode}%
% \fi

\subsection{Creating a List of Something}
\label{sec:tocbasic.more}

At the previous section you've seen commands to handle a list of known
extensions and to trigger commands while adding a new extension to this
list. You've also seen a command to do something for all known extensions or
all known extensions of one owner. In this section you will see commands to
handle the file corresponding with an extension or the list of known
extensions.

% \iffalse
\begin{Declaration}
  \Macro{addtoeachtocfile}\OParameter{owner}\Parameter{contents}
\end{Declaration}
\BeginIndex{Cmd}{addtoeachtocfile}%
This command
%<*dtx>
% \fi
\DescribeMacro{\addtoeachtocfile}
Command \Macro{addtoeachtocfile}\OParameter{owner}\Parameter{contents}
% \iffalse
%</dtx>
% \fi
writes \PName{contents} to every known toc-file of \PName{owner}. If you omit
the optional argument, \PName{contents} it written to every known
toc-file. While writing the contents, \Macro{@currext} is the extension of
the currently handled toc-file.
\begin{Example}
  You may add a vertical space of one text line to all toc-files.
  \begin{lstlisting}
    \addtoeachtocfile{%
      \protect\addvspace{\protect\baselineskip}%
    }
  \end{lstlisting}
  And if you want to do this, only for the toc-files of owner
  ``\PValue{foo}'':
  \begin{lstlisting}
    \addtoeachtocfile[foo]{%
      \protect\addvspace{\protect\baselineskip}%
    }
  \end{lstlisting}
\end{Example}
% \iffalse
\EndIndex{Cmd}{addtoeachtocfile}%

\begin{Declaration}
  \Macro{addcontentslinetoeachtocfile}\OParameter{owner}\Parameter{level}%
  \Parameter{contentsline}
\end{Declaration}
\BeginIndex{Cmd}{addcontentslinetoeachtocfile}%
This command
%<*dtx>
% \fi
\DescribeMacro{\addcontentslinetoeachfile}
Command \Macro{addcontentslinetoeachtocfile}\OParameter{owner}%^^A
\Parameter{level}\Parameter{contentsline} 
% \iffalse
%</dtx>
% \fi
is something like \Macro{addcontentsline} not only for one file, but all known
toc-files or all known toc-files of a given owner.
\begin{Example}
  You are a class author and want to write the chapter entry not only to the
  table of contents toc-file but to all toc-files, while \texttt{\#1} is the
  title, that should be written to the files.
  \begin{lstlisting}
    \addcontentslinetoeachtocfile{chapter}{%
      \protect\numberline{\thechapter}#1}
  \end{lstlisting}
\end{Example}
% \iffalse
\EndIndex{Cmd}{addcontentslinetoeachtocfile}%

%<*dtx>
% \fi
\DescribeMacro{\listoftoc}
\DescribeMacro{\listoftoc*}
Commands
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{listoftoc*}\Parameter{extension}
% \iffalse
\\
%<*dtx>
% \fi
and
% \iffalse
%</dtx>
% \fi
  \Macro{listoftoc}\OParameter{list of title}\Parameter{extension}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{listoftoc*}%
\BeginIndex{Cmd}{listoftoc}%
This commands
% \fi
may be used to set the ``list of'' of a toc-file. The star version
\Macro{listoftoc*} needs only one argument, the extension of the toc-file. It
does setup the vertical and horizontal spacing of paragraphs, calls before and
after hooks and reads the toc-file.  You may use it as direct replacement of
the \LaTeX{} kernel macro \Macro{@starttoc}.

The version without star, sets the whole toc-file with title, optional table
of contents entry, and running heads. If the optional argument
\OParameter{list of title} was given, it will be used as title term, optional
table of contents entry and running head. Note: If the optional argument is
empty, this term will be empty, too! If you omit the optional argument, but
\Macro{listof\PName{extension}name} was defined, that will be used.

\begin{Example}
  You have a new ``list of algorithms'' with extension \PValue{loa} and want to
  show it.
  \begin{lstlisting}
  \listof[list of algorithm]{loa}
  \end{lstlisting}
  Maybe you want, that the ``list of algorithms'' will create an entry at the
  table of contents. You may set
  \begin{lstlisting}
  \setuptoc{loa}{totoc}
  \end{lstlisting}
  But maybe the ``list of algorithms'' should not be set with a title. So you
  may use
  \begin{lstlisting}
  \listof*{loa}
  \end{lstlisting}
  Note that in this case no entry at the table of contents will be created,
  even if you'd used the setup command above.
\end{Example}

The default heading new following features using \Macro{setuptoc}:
\begin{description}
\item[\texttt{totoc}] writes the title of the list of to the table of contents
\item[\texttt{numbered}] uses a numbered headings for the list of
\item[\texttt{leveldown}] uses not the top level heading (e.g., \Macro{chapter}
  with book) but the first sub level (e.g., \Macro{section} with book).
\end{description}
% \iffalse
\EndIndex{Cmd}{listoftoc*}%
\EndIndex{Cmd}{listoftoc}%

%<*dtx>
% \fi
\DescribeMacro{\BeforeStartingTOC}
\DescribeMacro{\AfterStartingTOC}
The Commands
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{BeforeStartingTOC}\OParameter{extension}\Parameter{commands}
% \iffalse
\\
%<*dtx>
% \fi
and
% \iffalse
%</dtx>
% \fi
  \Macro{AfterStartingTOC}\OParameter{extension}\Parameter{commands}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{BeforeStartingTOC}%
\BeginIndex{Cmd}{AfterStartingTOC}%
This commands
% \fi
may be used to process \PName{commands} before or after loading the toc-file
with given \PName{extension} using \Macro{listoftoc*} or \Macro{listoftoc}. If
you omit the optional argument (or set an empty one) the general hooks will be
set. The general before hook will be called before the individuel one and the
general after hook will be called after the individuel one. While calling the
hooks \Macro{@currext} is the extension of the toc-file and should not be
changed.
% \iffalse
\EndIndex{Cmd}{AfterStartingTOC}%
\EndIndex{Cmd}{BeforeStartingTOC}%

%<*dtx>
% \fi
\DescribeMacro{\BeforeTOCHead}
\DescribeMacro{\AfterTOCHead}
The Commands
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{BeforeTOCHead}\OParameter{extension}\Parameter{commands}
% \iffalse
\\
%<*dtx>
% \fi
and
% \iffalse
%</dtx>
% \fi
  \Macro{AfterTOCHead}\OParameter{extension}\Parameter{commands}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{BeforeTOCHead}%
\BeginIndex{Cmd}{AfterTOCHead}%
This commands
% \fi
may be used to process \PName{commands} before or after setting the title of a
toc-file with given \PName{extension} using \Macro{listoftoc*} or
\Macro{listoftoc}. If you omit the optional argument (or set an empty one) the
general hooks will be set. The general before hook will be called before the
individuel one and the general after hook will be called after the individuel
one. While calling the hooks \Macro{@currext} is the extension of the toc-file
and should not be changed.
% \iffalse
\EndIndex{Cmd}{AfterTOCHead}%
\EndIndex{Cmd}{BeforeTOCHead}%

%<*dtx>
% \fi
\DescribeMacro{\listofeachtoc}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{listofeachtoc}\OParameter{owner}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{listofeachtoc}%
This command
% \fi
sets all toc-files or all toc-files of the given \PName{owner} using
\Macro{listoftoc}. You should have defined
\Macro{listof\PName{extension}name} for each toc-file, otherwise you'll get a
warning.
% \iffalse
\EndIndex{Cmd}{listofeachtoc}%

%<*dtx>
% \fi
\DescribeMacro{\MakeMarkcase}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{MakeMarkcase}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{MakeMarkcase}%
This command
% \fi
will be used to change the case of the letters at the running
head. The default is, to use \Macro{@firstofone} for \KOMAScript{} classes and
\Macro{MakeUppercase} for all other classes. If you are the class author you
may define \Macro{MakeMarkcase} on your own. If \Package{scrpage2} or another
package, that defines \Macro{MakeMarkcase} will be used, \Package{tocbasci}
will not overwrite that Definition.
% \iffalse
\EndIndex{Cmd}{MakeMarkcase}%

%<*dtx>
% \fi
\DescribeMacro{\deftocheading}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{deftocheading}\Parameter{extension}\Parameter{definition}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{deftocheading}%
This command
% \fi
defines a heading command, that will be used instead of the
default heading using \Macro{listoftoc}. The heading command has exactly one
argument. You may reference to that argument using \texttt{\#1} at your
\PName{defintion}.
% \iffalse
\EndIndex{Cmd}{deftocheading}%

%<*dtx>
% \fi
\DescribeMacro{\setuptoc}
\DescribeMacro{\unsettoc}
The Commands
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{setuptoc}\Parameter{extension}\Parameter{featurelist}
% \iffalse
\\
%<*dtx>
% \fi
and
% \iffalse
%</dtx>
% \fi
  \Macro{unsettoc}\Parameter{extension}\Parameter{featurelist}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{setuptoc}%
\BeginIndex{Cmd}{unsettoc}%
This commands
% \fi
set up and unset features binded to an \PName{extension}. The
\PName{featurelist} is a comma seperated list of single
features. \Package{tocbasic} does know following features:
\begin{description}
\item[\texttt{totoc}] writes the title of the list of to the table of contents
\item[\texttt{numbered}] uses a numbered headings for the list of
\item[\texttt{leveldown}] uses not the top level heading (e.g., \Macro{chapter}
  with book) but the first sub level (e.g., \Macro{section} with book).
\item[\texttt{onecolumn}] switch to internal one column mode, if the toc
  is set in internal two column mode and no \texttt{leveldown} was used.
\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.
\end{description}
Classes and packages may know features, too, e.g, the \KOMAScript{} classes
know following additional features:
\begin{description}
\item[\texttt{chapteratlist}] activates special code to be put into the list
  at start of a new chapter. This code may either be vertical space or the
  heading of the chapter.
\end{description}
% \iffalse
\EndIndex{Cmd}{unsettoc}%
\EndIndex{Cmd}{setuptoc}%

%<*dtx>
% \fi
\DescribeMacro{\iftocfeature}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{iftocfeature}\Parameter{extension}\Parameter{feature}%^^A
  \Parameter{true-part}\Parameter{false-part}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{iftocfeature}%
This command
% \fi
may be used, to test, if a \PName{feature} was set for \PName{extension}. If
so the \PName{true-part} will be processed, otherwise the \PName{false-part}
will be.
% \iffalse
\EndIndex{Cmd}{iftocfeature}%
% \fi


\subsection{Internal Commands for Class and Package Authors}
\label{sec:tocbasic.internals}

Commands with prefix \Macro{tocbasic@} are internal but class and package
authors may use them. But even if you are a class or package author you
should not change them!

% \iffalse
%<*dtx>
% \fi
\DescribeMacro{\tocbasic@extend@babel}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{tocbasic@extend@babel}\Parameter{extension}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{tocbasic@extend@babel}%
This command
% \fi
extends the babel handling of toc-files. By default babel writes language
selections only to \PValue{toc}, \PValue{lot} and
\PValue{lof}. \Package{tocbasic} adds every \PName{extension} added to the
list of known extensions (see \Macro{addtotoclist}, \autoref{sec:tocbasic.basics}%
% \iffalse
, \autopageref{desc:tocbasic.cmd.addtotoclist}%
% \fi
) using \Macro{tocbasic@extend@babel}. Note: This should be called only once
per \PName{extension}. \Macro{tocbasic@extend@babel} does nothing, if the
feature \PValue{nobabel} was set for \PName{extension} before using
\Macro{addtotoclist}.
% \iffalse
\EndIndex{Cmd}{tocbasic@extend@babel}%

%<*dtx>
% \fi
\DescribeMacro{\tocbasic@starttoc}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{tocbasic@starttoc}\Parameter{extension}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{tocbasic@starttoc}
This command is something like the \LaTeX{} kernel macro \Macro{@starttoc},
but does some additional settings before using \Macro{@starttoc}. It does set
\Macro{parskip} zu zero, \Macro{parindent} to zero, \Macro{parfillskip} to
zero plus one fil, \Macro{@currext} to the \PName{extension}, and processes
hooks before and after reading the toc-file.
\EndIndex{Cmd}{tocbasic@starttoc}
% \fi
%


% \iffalse
%<*dtx>
% \fi
\DescribeMacro{\tocbasic@@before@hook}
\DescribeMacro{\tocbasic@@after@hook}
\def\\{ and }%^^A
Macros
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{tocbasic@@before@hook}\\
  \Macro{tocbasic@@after@hook}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{tocbasic@@before@hook}%
\BeginIndex{Cmd}{tocbasic@@after@hook}%
This macros
% \fi
are processed before and after loading a toc-file. If you don't use
\Macro{listoftoc} or \Macro{listoftoc*} or \Macro{tocbasic@starttoc} to load
the toc-file, you should call these, too. But you should not redefine them!
% \iffalse
\EndIndex{Cmd}{tocbasic@@before@hook}%
\EndIndex{Cmd}{tocbasic@@after@hook}%

%<*dtx>
% \fi
\DescribeMacro{\tocbasic@\PName{extension}@before@hook}
\DescribeMacro{\tocbasic@\PName{extension}@after@hook}
\def\\{ and }%^^A
Macros
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{tocbasic@\PName{extension}@before@hook}\\
  \Macro{tocbasic@\PName{extension}@after@hook}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{tocbasic@\PName{extension}@before@hook}%
\BeginIndex{Cmd}{tocbasic@\PName{extension}@after@hook}%
This macros
% \fi
are processed before and after loading a toc-file. If you don't use
\Macro{listoftoc} or \Macro{listoftoc*} or \Macro{tocbasic@starttoc} to load
the toc-file, you should call these, too. But you should not redefine them!
The first macro is processed just before \Macro{tocbasic@@before@hook}, the
second one just after \Macro{tocbasic@@after@hook}
% \iffalse
\EndIndex{Cmd}{tocbasic@\PName{extension}@after@hook}%
\EndIndex{Cmd}{tocbasic@\PName{extension}@before@hook}%

%<*dtx>
% \fi
\DescribeMacro{\tocbasic@listhead}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{tocbasic@listhead}\Parameter{title}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{tocbasic@listhead}%
This command
% \fi
is used by \Macro{listoftoc} to set the heading of the list, either the
default heading or the indiviually defined heading. If you define your own
list command not using \Macro{listoftoc} you may use
\Macro{tocbasic@listhead}. In this case you should define \Macro{@currext} to
be the extension of the toc-file before using \Macro{tocbasic@listhead}.
% \iffalse
\EndIndex{Cmd}{tocbasic@listhead}%

%<*dtx>
% \fi
\DescribeMacro{\tocbasic@listhead@\PName{extension}}
Command
% \iffalse
%</dtx>
\begin{Declaration}
% \fi
  \Macro{tocbasic@listhead@\PName{extension}}\Parameter{title}
% \iffalse
\end{Declaration}
\BeginIndex{Cmd}{tocbasic@listhead@\PName{extension}}%
This command
% \fi
is used in \Macro{tocbasic@listhead} to set the individual headings, optional
toc-entry, and running head, if it was defined. If it was not defined it will
be defined and used in \Macro{tocbasic@listhead}.
% \iffalse
\EndIndex{Cmd}{tocbasic@listhead@\PName{extension}}%
%</doc|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.
%
% \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
% \Macro{RequiresPackage}. Using different options by different packages would
% result in an option clash.
%
%
% \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}
\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}}.%
%   \changes{v1.0a}{2008/11/11}{internal \cs{@@addtotoclist} renamed to
%     \cs{scr@@addtotoclist} because of package \textsf{floatfram}}.%
%   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}{%
  \@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
    }%
  }{%
    \g@addto@macro\tb@listoftocs{\do{#2}{#1}}%
    \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}{\AtAddToTocList}
%   Action to be done, when adding a toc-file of a known owner. The first
%   optional argument is the owner. The second, mandatory argument is the
%   action. While doing the action \cs{@currext} will be the extension of the
%   added toc-file. If the first argument was omitted \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}{%
  \@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]{%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \ifx\csname bbl@set@language\endcsname\relax
    \PackageInfo{tocbasic}{babel extension for `#1' omitted\MessageBreak
      because of missing \string\bbl@set@language}%
  \else
    \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}}%
      }%
    }%
  \fi
}
%    \end{macrocode}
%   This feature should be used for all toc-files (unless feature
%   \texttt{nobabl} was set for the toc-file.
%    \begin{macrocode}
\AtAddToTocList[]{\expandafter\tocbasic@extend@babel\expandafter{\@currext}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\removefromtoclist}
%   This command will remove an extension from the list of toc-files. If the
%   first, optional argument is given, the extension will only be removed, if
%   it was added by the given owner. NOTE: An empty first argument is not the
%   same like omitting the first argument!
%    \begin{macrocode}
\newcommand*{\removefromtoclist}{%
  \@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\reserved@a{##2}%
          \edef\reserved@b{#1}%
          \ifx\reserved@a\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}\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}\let\tb@listoftocs\@empty
    \tb@oldlist
  \endgroup
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\doforeachtocfile}
%   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}{%
  \@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}}
%   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}{%
  \@ifnextchar [%]
    \@addtoeachtocfile\@@addtoeachtocfile
}
\newcommand{\@addtoeachtocfile}[2][]{%
  \doforeachtocfile[{#1}]{\addtocontents{\@currext}{#2}}%
}
\newcommand{\@@addtoeachtocfile}[1]{%
  \doforeachtocfile{\addtocontents{\@currext}{#1}}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\addcontentslinetoeachtocfile}
%   Something like a combination of \cs{addtoeachtocfile} and
%   \cs{addcontentsline}.
%    \begin{macrocode}
\newcommand{\addcontentslinetoeachtocfile}{%
  \@ifnextchar [%]
    \@addcontentslinetoeachtocfile\@@addcontentslinetoeachtocfile
}
\newcommand{\@addcontentslinetoeachtocfile}[3][]{%
  \doforeachtocfile[{#1}]{\addcontentsline{\@currext}{#2}{#3}}%
}
\newcommand{\@@addcontentslinetoeachtocfile}[2]{%
  \doforeachtocfile{\addcontentsline{\@currext}{#1}{#2}}%
}
%    \end{macrocode}
% \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}
%   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}
\newcommand*{\tocbasic@starttoc}[1]{%
  \begingroup
    \setlength{\parskip}{\z@}%
    \setlength{\parindent}{\z@}%
    \setlength{\parfillskip}{\z@\@plus 1fil}%
    \def\@currext{#1}%
    \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}
% \begin{macro}{\AfterStartingTOC}
%   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][]{%
  \expandafter\g@addto@macro\csname tb@#1@before@hook\endcsname{#2}%
}
\newcommand{\AfterStartingTOC}[2][]{%
  \expandafter\g@addto@macro\csname tb@#1@after@hook\endcsname{#2}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\listoftoc}
% \begin{macro}{\listoftoc*}
%   \changes{1.0a}{2008/11/12}{\cs{twocolumn} fixed}%
%   \changes{1.01}{2008/11/13}{new feature \texttt{onecolumn}}
%   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}{%
  \@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
    }%
    \def\@currext{#2}%
    \iftocfeature{\@currext}{onecolumn}{%
      \iftocfeature{\@currext}{leveldown}{}{%
        \if@twocolumn
          \aftergroup\twocolumn\onecolumn
        \fi
      }%
    }{}%
    \tocbasic@listhead{#1}%
    \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}}
%   Another example of using \cs{doforeachtocfile}.
%    \begin{macrocode}
\newcommand*{\listofeachtoc}{%
  \@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''}
%   Setting the headings of a list of something. The heading is the only
%   argument.
%    \begin{macrocode}
\newcommand*{\tocbasic@listhead}[1]{%
  \@ifundefined{tocbasic@listhead@\@currext}{%
    \begingroup\expandafter\expandafter\expandafter\endgroup
    \expandafter\ifx\csname chapter\endcsname\relax
      \expandafter\def\csname tocbasic@listhead@\@currext\endcsname##1{%
        \iftocfeature{\@currext}{leveldown}{%
          \iftocfeature{\@currext}{numbered}{%
            \subsection[##1]{##1}%
          }{%
            \subsection*{##1}%
            \ifx\@mkboth\@gobbletwo\else\markright{\MakeMarkcase{##1}}\fi
            \iftocfeature{\@currext}{totoc}{%
              \addcontentsline{toc}{subsection}{##1}%
            }{}%
          }%
        }{%
          \iftocfeature{\@currext}{numbered}{%
            \section[##1]{##1\@mkboth{##1}{##1}}%
          }{%
            \section*{##1}%
            \@mkboth{\MakeMarkcase{##1}}{\MakeMarkcase{##1}}%
            \iftocfeature{\@currext}{totoc}{%
              \addcontentsline{toc}{section}{##1}%
            }{}%
          }%
        }%
      }%
    \else
      \expandafter\def\csname tocbasic@listhead@\@currext\endcsname##1{%
        \iftocfeature{\@currext}{leveldown}{%
          \iftocfeature{\@currext}{numbered}{%
            \section{##1}%
          }{%
            \section*{##1}%
            \iftocfeature{\@currext}{totoc}{%
              \addcontentsline{toc}{section}{##1}%
            }{}%
            \ifx\@mkboth\@gobbletwo\else\markright{\MakeMarkcase{##1}}\fi
          }%
        }{%
          \iftocfeature{\@currext}{numbered}{%
            \chapter[##1]{##1\@mkboth{##1}{##1}}%
          }{%
            \chapter*{##1}%
            \@mkboth{\MakeMarkcase{##1}}{\MakeMarkcase{##1}}%
            \iftocfeature{\@currext}{totoc}{%
              \addcontentsline{toc}{chapter}{##1}%
            }{}%
          }%
        }%
      }%
    \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}
% \begin{macro}{\AfterTOCHead}
%   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][]{%
  \expandafter\g@addto@macro\csname tb@#1@beforehead@hook\endcsname{#2}%
}
\newcommand{\AfterTOCHead}[2][]{%
  \expandafter\g@addto@macro\csname tb@#1@afterhead@hook\endcsname{#2}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\MakeMarkcase}
%   Use upper-case or not?
%    \begin{macrocode}
\AtBeginDocument{%
  \@ifundefined{MakeMarkcase}{%
    \begingroup\expandafter\expandafter\expandafter\endgroup
    \expandafter\ifx\csname KOMAClassName\endcsname\relax
      \let\MakeMarkcase\MakeUppercase
    \else
      \let\MakeMarkcase\@firstofone
    \fi
  }{}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\deftocheading}
%   Define a toc headings command with one argument (the title).
%    \begin{macrocode}
\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{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.
%   \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]{%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname tocbasic@#1@feature@#2\endcsname\relax
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\tocbasicautomode}
%   \changes{v1.0a}{2008/11/11}{use of \cs{addtotoclist} instead of internal}
%   \Package{tocbasic} can overtake \Macro{@starttoc} to automaticly add all
%   used extensions to the list of known extensions and use
%   \Macro{tocbasic@starttoc} instead of \Macro{@starttoc} from \LaTeX{}
%   kernel.
%    \begin{macrocode}
\newcommand*{\tocbasicautomode}{%
  \let\tb@saved@starttoc\@starttoc
  \BeforeStartingTOC{%
    \let\@starttoc\tb@saved@starttoc
    \expandafter\ifattoclist\expandafter{\@currext}{}{%
      \addtotoclist[tocbasicautomode]{\@currext}%
    }%
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \iffalse
%</package>
%<*load>
% Used at \KOMAScript{} classes to load and initialize the package.
%    \begin{macrocode}
\edef\@tempa{\noexpand\RequirePackage{tocbasic}[\tocbasicversion]}
\@tempa
%    \end{macrocode}
% \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}
%</load>
% \fi
%
% \Finale
%
\endinput
%
% end of file `tocbasic.dtx'
%%% Local Variables:
%%% mode: doctex
%%% coding: iso-latin-1
%%% TeX-master: t
%%% End:
