% -*- coding: iso-latin-1; -*-
%<*ins>
\def\pkgname{tableof}
\def\pkgdate{2013/03/04}
\def\pkgversion{v1.2}
\def\pkgdescription{tables of tagged contents (jfB)}
%</ins>
%%
%% Package `tableof' by Jean-Francois Burnol
%% Copyright (C) 2012,2013 by Jean-Francois Burnol
%%
%<*none>
\def\lasttimestamp{Time-stamp: <04-03-2013 21:29:27 CET jfb>}
\def\docdate{2013/03/04}
\def\striptimestamp#1 <#2 #3 #4 #5>{#2 at #3 #4}
\edef\dtxtimestamp{\expandafter\striptimestamp\lasttimestamp}
\ProvidesFile{\pkgname.dtx}
  [`\pkgname' source and documentation (\dtxtimestamp)]
%
% The copyright notice applies to `tableof.dtx' and to its derived files.
% 
%    They may be distributed and/or modified under the
%    conditions of the LaTeX Project Public License,
%    either version 1.3 of this license or (at your
%    option) any later version.  The latest version of
%    this license is in:
%
%    http://www.latex-project.org/lppl.txt 
%
%    and version 1.3 or later is part of all distributions of
%    LaTeX version 2003/12/01 or later.  
% 
%  Installation:
%  ============
%
% `latex tableof.dtx' or `pdflatex tableof.dtx'
%  Run twice to get the bookmarks right.
%
%  `tableof.sty', `tableof.ins' and `tableoftest.tex' are generated on
%  the first latex run.
%
%  Move `tableof.sty' to a suitable location within the TeX installation:
%          tableof.sty -> ..path..to../tex/latex/tableof/
%
%  `tableof.ins' is for TeX distributions expecting it.
%
%  `tableoftest.tex' is an example of use of the package commands. Run
%  latex twice on it to get examples of tagged tables of contents.
%
\begingroup
\input docstrip.tex
\askforoverwritefalse
\def\pkgpreamble{\defaultpreamble^^J\MetaPrefix^^J%
\string\ProvidesPackage{\pkgname}^^J%
\space[\pkgdate\space\pkgversion\space\pkgdescription]}
\generate{\nopreamble
\file{\pkgname.ins}{\from{\pkgname.dtx}{ins}}
\usepreamble\defaultpreamble
\file{\pkgname test.tex}{\from{\pkgname.dtx}{test}}
\usepreamble\pkgpreamble
\file{\pkgname.sty}{\from{\pkgname.dtx}{package}}}
\endgroup
\iffalse
%</none>
%<*ins>
%-------------------------------------------------------------------------------
%% This file `tableof.ins' is provided for compatibility with TeX
%% distributions expecting to find it for installation of `tableof.sty'.
%%
%% As usual `latex tableof.ins' produces `tableof.sty' from the source
%% `tableof.dtx'
%%
%% (an already existing `tableof.sty' in the same repertory will be
%% overwritten)
%% 
%% Move `tableof.sty' to a suitable location within the TeX installation:
%% tableof.sty -> ................/tex/latex/tableof/
%%
%% The generated auxiliary files may be discarded. 
%%
%% See `tableof.dtx' for the statements of copyright and conditions of
%% distribution and/or modification.
%%
\input docstrip.tex
\askforoverwritefalse
\def\pkgpreamble{\defaultpreamble^^J\MetaPrefix^^J%
\string\ProvidesPackage{\pkgname}^^J%
\space[\pkgdate\space\pkgversion\space\pkgdescription]}
\generate{\usepreamble\pkgpreamble
\file{\pkgname.sty}{\from{\pkgname.dtx}{package}}}
\endbatchfile
%-------------------------------------------------------------------------------
%</ins>
%<*test>
%-------------------------------------------------------------------------------
%% This file `tableoftest.tex' serves to demontrate the use of the
%% commands from the package `tableof'.
%%
%% (run on it `latex' or `pdflatex' twice.)
%%
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[colorlinks,linkcolor=blue]{hyperref}
\usepackage{tableof}
%%\usepackage{etoc} % for testing
\DeclareRobustCommand\lowast{\raisebox{-.25\height}{*}}
\begin{document}
%% \etoctoclines % (if using package etoc)
%%
%% we don't need here \tofOpenTocFileForWrite
%% as the document has \tableofcontents a few lines down.
%%
\section*{\string\tableof\{\}}
\tableof{}
\section*{\string\tableof\lowast\{A,B,C,D,E,F\}}
\tableof*{A,B,C,D,E,F}
\section*{\string\tableof\{A\}}
\tableof{A}
\section*{\string\tableof\lowast\{A\}}
\tableof*{A}
\section*{\string\tableof\{A,C\}}
\tableof{A,C}
\section*{\string\tableof\lowast\{A,C\}}
\tableof*{A,C}
\section*{\string\tableoftaggedcontents\lowast\{A,D\}\{B,F\}}
\tableoftaggedcontents*{A,D}{B,F}
\renewcommand\contentsname{\string\nexttocwithtags\lowast\{A,D\}\lowast\{B,F\}\string\tableofcontents}
\nexttocwithtags*{A,D}*{B,F}
\tableofcontents
%% requires package etoc 
%% \etoctocstyle{1}{with A and D and without B and without F}
%% \nexttocwithtags{A,D}{B,F}\tableofcontents
%% \etoctocstyle{1}{with (A or D) and without B and without F}
%% \nexttocwithtags*{A,D}{B,F}\tableofcontents
%% \etoctocstyle{1}{with A and D and (without B or without F)}
%% \nexttocwithtags{A,D}*{B,F}\tableofcontents
\section*{with B or with C (using \string\tableoftaggecontents)}
\tableoftaggedcontents*{B,C}{}
\section*{with B or with C (using \string\tableof\lowast)}
\tableof*{B,C}
\section*{with A and with B and with C}
\tableof{A,B,C}
\section*{with A or with B or with C}
\tableof*{A,B,C}
\section*{without B (and) (using \string\tableoftaggedcontents)}
\tableoftaggedcontents{}{B}
\section*{without A and without B (using \string\tableoftaggedcontents)}
\tableoftaggedcontents{}{A,B}
\section*{without A or without C}
\tablenotof*{A,C}
\section*{without A and without B and without C}
\tablenotof{A,B,C}
\section*{without A or without B or without C}
\tablenotof*{A,B,C}
\section*{with D and with E}
\tableof{D,E}
\section*{with E}
\tableof{E}
\section*{without D}
\tablenotof{D}
\section*{ecology and rabbits}
\tableof{ecology,rabbits}
\section*{rabbits and not ecology}
\tableoftaggedcontents{rabbits}{ecology}
\section*{kitchenware and not rabbits}
\tableoftaggedcontents{kitchenware}{rabbits}
\clearpage
\section{no tag}
nothing
\begin{verbatim}
\toftagstart{D,E,F}
\toftagthis{A}
\end{verbatim}
\toftagstart{D,E,F}
\toftagthis{A}
\section{A,D,E,F}
A,D,E,F
\begin{verbatim}
\toftagthis{B}
\end{verbatim}
\toftagthis{B}
\section{B,D,E,F}
B,D,E,F
\begin{verbatim}
\toftagthis{C}
\end{verbatim}
\toftagthis{C}
\section{C,D,E,F}
C,D,E,F
\begin{verbatim}
\toftagstop{F}
\toftagthis{A,B}
\end{verbatim}
\toftagstop{F}
\toftagthis{A,B}
\section{A,B,D,E}
A,B,D,E
\begin{verbatim}
\toftagthis{B,C}
\end{verbatim}
\toftagthis{B,C}
\section{B,C,D,E}
B,C,D
\begin{verbatim}
\toftagthis{A,C}
\toftagstop{E}
\end{verbatim}
\toftagthis{A,C}
\toftagstop{E}
\section{A,C,D}
A,C,D
\begin{verbatim}
\toftagstop{D}
\toftagthis{A,B,C}
\end{verbatim}
\toftagstop{D}
\toftagthis{A,B,C}
\section{A,B,C}
A,B,C
\begin{verbatim}
\toftagstop{A,B,C,D,E,F}
\toftagstart{kitchenware,rabbits}
\end{verbatim}
\toftagstop{A,B,C,D,E,F}
\toftagstart{kitchenware,rabbits}
\section{Knives and rabbits}
\begin{verbatim}
\tofuntagthis{kitchenware}
\end{verbatim}
\tofuntagthis{kitchenware}
\subsection{Hunting rabbits}
\begin{verbatim}
\tofuntagthis{rabbits}
\end{verbatim}
\tofuntagthis{rabbits}
\subsection{Best knives for cooking}
\subsection{Eating rabbits}
\begin{verbatim}
\toftagstart{ecology}\tofuntagthis{rabbits}
\end{verbatim}
\toftagstart{ecology}\tofuntagthis{rabbits}
\section{Knives and global climate}
\begin{verbatim}
\toftagstop{kitchenware}
\end{verbatim}
\toftagstop{kitchenware}
\section{The rabbit in the wild}
\subsection{Impact of the rabbit on global climate}
\begin{verbatim}
\toftagstop{rabbits}
\end{verbatim}
\toftagstop{rabbits}
\section{Other species of interest for cooking}
\end{document}\endinput
%-------------------------------------------------------------------------------
%</test>
%<*none>
\fi
\documentclass[a4paper,11pt,abstract]{scrdoc}
\pagestyle{headings}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[hscale=0.66,vscale=0.75]{geometry}

\usepackage{txfonts}
\DeclareFontFamily{T1}{txtt}{}
\DeclareFontShape{T1}{txtt}{m}{n}{	%medium
     <->s*[.96] t1xtt%
}{}
\DeclareFontShape{T1}{txtt}{m}{sc}{	%cap & small cap
     <->s*[.96] t1xttsc%
}{}
\DeclareFontShape{T1}{txtt}{m}{sl}{	%slanted
     <->s*[.96] t1xttsl%
}{}
\DeclareFontShape{T1}{txtt}{m}{it}{	%italic
     <->ssub * txtt/m/sl%
}{}
\DeclareFontShape{T1}{txtt}{m}{ui}{   	%unslanted italic
     <->ssub * txtt/m/sl%
}{}
\DeclareFontShape{T1}{txtt}{bx}{n}{	%bold extended
     <->t1xbtt%
}{}
\DeclareFontShape{T1}{txtt}{bx}{sc}{	%bold extended cap & small cap
     <->t1xbttsc%
}{}
\DeclareFontShape{T1}{txtt}{bx}{sl}{	%bold extended slanted
     <->t1xbttsl%
}{}
\DeclareFontShape{T1}{txtt}{bx}{it}{	%bold extended italic
     <->ssub * txtt/bx/sl%
}{}
\DeclareFontShape{T1}{txtt}{bx}{ui}{  	%bold extended unslanted italic
     <->ssub * txtt/bx/sl%
}{}
\DeclareFontShape{T1}{txtt}{b}{n}{	%bold
     <->ssub * txtt/bx/n%
}{}
\DeclareFontShape{T1}{txtt}{b}{sc}{	%bold cap & small cap
     <->ssub * txtt/bx/sc%
}{}
\DeclareFontShape{T1}{txtt}{b}{sl}{	%bold slanted
     <->ssub * txtt/bx/sl%
}{}
\DeclareFontShape{T1}{txtt}{b}{it}{   	%bold italic
     <->ssub * txtt/bx/it%
}{}
\DeclareFontShape{T1}{txtt}{b}{ui}{   	%bold unslanted italic
     <->ssub * txtt/bx/ui%
}{}

\usepackage{xspace}
\usepackage{color}

\definecolor{joli}{RGB}{225,95,0}
\definecolor{JOLI}{RGB}{225,95,0}
\definecolor{BLUE}{RGB}{0,0,255}
\definecolor{niceone}{RGB}{38,128,192}

\usepackage[english]{babel}

\usepackage[%dvipdfmx,%
pdfencoding=pdfdoc,bookmarks=true]{hyperref}

\hypersetup{%
linktoc=all,%
breaklinks=true,%
hidelinks,%
pdfauthor={Jean-Fran\c cois Burnol},%
pdftitle={The tableof package},%
pdfsubject={LaTeX, table of contents},%
pdfkeywords={LaTeX, table of contents},%
pdfstartview=FitH,%
pdfpagemode=UseOutlines}


\DeclareRobustCommand\csa[1]{{\ttfamily\char`\\#1}}
\DeclareRobustCommand\csb[1]{{\color{blue}\ttfamily\char`\\#1}}

\newcommand\csahyp[1]{\texorpdfstring{\csa{#1}}{\textbackslash #1}}
\newcommand\csbhyp[1]{\texorpdfstring{\csb{#1}}{\textbackslash #1}}
\newcommand\lowast{\raisebox{-.25\height}{*}}
\newcommand\starit[1]{\csa{#1\lowast}}
\newcommand\staritb[1]{\csb{#1\lowast}}

\makeatletter\let\check@percent\relax\makeatother

\def\MacroFont{\ttfamily\small\baselineskip12pt\relax\catcode`*\active}

\begingroup
\catcode`*\active
\def\x{\endgroup\let*\lowast}\x

\newcommand\tableof{%
    \texorpdfstring{{\color{joli}\ttfamily\bfseries tableof}}
                   {tableof}\xspace}
\newcommand\etoc{%
    \texorpdfstring{{\color{niceone}\ttfamily\bfseries etoc}}
                   {etoc}\xspace}

\frenchspacing

\renewcommand\familydefault\sfdefault

\begin{document}
\thispagestyle{empty}
\rmfamily

\begin{center}
  {\normalfont\Large The \tableof  package}\\
  \textsc{Jean-François Burnol}\par
  \footnotesize \ttfamily 
  jfbu (at) free (dot) fr\\
  Package version: \pkgversion\ (\pkgdate)\\
  Documentation generated from the source file\\
  with timestamp ``\dtxtimestamp''
\end{center}

\begin{abstract}
  The package commands \csa{toftagstart}, \csa{toftagstop}, \csa{toftagthis},
  \csa{tofuntagthis} are used to flag chapters or sections or anything ending up
  in the |.toc| file following an (implicit or explicit)
  \csa{addcontentsline}. Then\\
  \hbox to
  \linewidth{\hss\csa{nexttocwithtags}\marg{required1,required2,...}\marg{excluded1,excluded2,...}\hss}
  specifies which tags are to be required and which ones are to be excluded by
  the next \csa{tableofcontents} (or equivalent) document command. For document
  with classes where \csa{tableofcontents} is only single-use, the package
  provides:\\
  \hbox to
  \linewidth{\hss\csa{tableoftaggedcontents}\marg{required1,required2,...}\marg{excluded1,excluded2,...}\hss}
  which removes this restriction.
\end{abstract}

\tableofcontents


\section{Tagging commands}

\subsection{\csbhyp{toftagstart\{csv,list\}} and \csbhyp{toftagstop\{csv,list\}}}

These commands have a mandatory argument which is a comma separated list of
tags. The tags need not have been predeclared.
\begin{verbatim}
\toftagstart{kitchenware,weaponry,gastronomy} 
\section{Dealing with knives}    % tagged with kitchenware+weaponry+gastronomy

\toftagstop{kitchenware}
\section{Hunting rabbits}        % tagged with weaponry+gastronomy

\toftagstart{tag1}
\subsection{This is tagged, too} % tagged with weaponry+gastronomy+tag1

\toftagstop{weaponry}
\section{Eating rabbits}         % tagged with gastronomy+tag1
\end{verbatim}

\subsection{\csbhyp{toftagthis\{csv,list\}}  and \csbhyp{tofuntagthis\{csv,list\}}}

The \csa{toftagthis} command flags with the comma separated values from its list
argument only the \emph{next} sectioning command. The \csa{tofuntagthis} command
similarly untags only the \emph{next} entry.
\begin{verbatim}
\toftagstart{kitchenware,rabbits}
\section{Knives and rabbits}     % tagged with kitchenware and rabbits

\tofuntagthis{kitchenware}
\subsection{Hunting rabbits}     % tagged only with rabbits

\subsection{Best knives for cooking} % tagged with kitchenware and rabbits

\toftagstart{ecology}
\toftagthis{climate}
\section{Knives and global climate} % tagged with kitchenware+rabbits+ecology+climate

\toftagstop{kitchenware}
\section{The rabbit in the wild}    % tagged with rabbits+ecology
\end{verbatim}

\subsection{Spaces}

Spaces in tags are significant (as usual with \TeX{} multiple spaces count for
one). Do not use spaces after the opening brace or before the closing brace, do
not use spaces before or after a comma: |\toftagthis{one tag with spaces}| is
ok, |\toftagthis{tag1 }| or |\toftagthis{tag1, tag2}| are not.



\section{Table of contents commands}

\subsection{\csbhyp{tableoftaggedcontents\{required,csv,list\}\{excluded,csv,list\}}}

This command is provided in case the document class allows only a single use of
\csa{tableofcontents}: it can be used arbitrarily many times. However it does not
typeset a heading. Example:
\begin{verbatim}
\section*{A table of tagged contents}  % <- needs to be explicitely added
\tableoftaggedcontents{weaponry,hunting}{ecology,climate}
\end{verbatim}
This will limit the printed TOC entries to the ones which have been tagged with
|weaponry| and also with |hunting|, but not with |ecology| and neither with
|climate|.

\subsubsection{starred variants}

There are starred variants:
\begin{verbatim}
\tableoftaggedcontents{A,B}{C,D,E}   % A and B and neither C nor D nor E
\tableoftaggedcontents*{A,B}{C,D,E}  % (A or B) and neither C nor D nor E
\tableoftaggedcontents{A,B}*{C,D,E}  % A and B and (not C or not D or not E)
\tableoftaggedcontents*{A,B}*{C,D,E} % (A or B) and (not C or not D or not E)
\end{verbatim}

\subsection{\csbhyp{tableof\{required,csv,list\}}}

This is equivalent to |\tableoftaggedcontents{required,csv,list}{}|.
\begin{verbatim}
\tableof{weaponry,hunting}  % will print the entries tagged with weaponry 
                                                             AND hunting
\end{verbatim}
There is a starred variant:
\begin{verbatim}
\tableof*{weaponry,hunting} % will print the entries tagged with weaponry 
                                                              OR hunting
\end{verbatim}

\subsection{\csbhyp{tablenotof\{excluded,csv,list\}}}

This is equivalent to |\tableoftaggedcontents{}{excluded,csv,list}|.
\begin{verbatim}
\tablenotof{weaponry,hunting}  % will print the entries NOT tagged with weaponry
                                                        NEITHER with hunting
\end{verbatim}
There is a starred variant:
\begin{verbatim}
\tablenotof*{weaponry,hunting} % will print the entries NOT tagged with weaponry
                                                     OR NOT tagged with hunting
\end{verbatim}


\subsection{\csbhyp{nexttocwithtags\{required,csv,list\}\{excluded,csv,list\}}}

This command influences the next \csa{tableofcontents} (or equivalent) command:
\begin{verbatim}
\nexttocwithtags{A,B}{C,D,E}
\tableofcontents
\end{verbatim}
will let \csa{tableofcontents} print only the sectioning units having been
flagged with both |A| and |B| and none of |C|, |D|, or |E|.

Do not forget the second pair of braces if you only want to require some tags:
\csa{nexttocwithtags}|{tag1,tag2}{}|. 

\subsubsection{starred variants}

There are starred variants:
\begin{verbatim}
\nexttocwithtags{A,B}{C,D,E}   % A and B and neither C nor D nor E
\nexttocwithtags*{A,B}{C,D,E}  % (A or B) and neither C nor D nor E
\nexttocwithtags{A,B}*{C,D,E}  % A and B and (not C or not D or not E)
\nexttocwithtags*{A,B}*{C,D,E} % (A or B) and (not C or not D or not E)
\end{verbatim}


\subsection{\csbhyp{tofOpenTocFileForWrite}}

The |.toc| file is read (if it exists) into memory by \tableof at the time
of \csa{usepackage\{tableof\}}, for use by \csa{tableoftaggedcontents},
\csa{tableof} and \csa{tablenotof}.

But the creation
of the |.toc| file is not dealt with by \tableof itself: either this will be
done by a standard \csa{tableofcontents} command somewhere in the document, or,
one may use the package provided command \csa{tofOpenTocFileForWrite} which does
not display anything and just does what its name indicates. This command can be
used also in the preamble.

% \footnote{Note to people or packages wanting also to
%   access the |.toc| file: as happens with the standard \csa{tableofcontents}, the
%   |.toc| file becomes temporarily empty immediately after
%   \csa{tofOpenTocFileForWrite}.}

Again: this command should \emph{not} be used when the document makes use of its
own \csa{tableofcontents} or equivalent. It is provided only for the case where
the document uses exclusively \csa{tableoftaggedcontents}, \csa{tableof} and
\csa{tablenotof}.

\subsection{Compatibility with other packages}

\tableof checks if |hyperref| is loaded as |hyperref| modifies the format of the
lines in the |.toc| file (and this must be taken into account). This check is
done at the \csa{begin}|{document}| so the order of loading is not important.

\tableof adds the tag data to the |.toc| file, but this data self-defines
itself to do nothing when not activated by \tableof's own commands.

% Hence the generated |.toc| file may be imported for use
% by other \TeX{} documents.\footnote{this import must do \csa{makeatletter} and
%   also the new document must use |hyperref| if the original did so.}

No testing has actually been done of compatibility with packages manipulating
tables of contents, apart from
\etoc.\footnote{\url{http://www.ctan.org/pkg/etoc}} It went fine. 

\subsection{TODO}

Create a parser for arbitrary iterated boolean combinations of tags . . . but
this kind of thing must have been done a zillion times already, as it belongs to
the basics in computer science! ... and it surely is no easy task in \TeX{}!
so I cautiously retreated from re-doing something difficult which has already
been done somewhere by someone ...

\subsection{version history}

\begingroup
\parindent0pt 
\makeatletter
\settowidth{\dimen@}{\ttfamily 2013/03/04 v1.2: i.\space}
\everypar\expandafter{\expandafter\hangindent\the\dimen@
                                  \hangafter1 }
\makeatother

|2013/03/04 v1.2: i. |added \csa{tableoftaggedcontents} as a wrapper for using
\csa{nexttocwithtags} followed with |tableof|'s private copy of the |.toc| data.

|                ii. |added \csa{if@filesw} test to \csa{tofOpenTocFileForWrite}.

|2012/12/13 v1.1: i. |new command \csa{nexttocwithtags}.

|                ii. ||.toc| may be input in another document not loading \tableof.

|2012/12/06 v1.0:    |initial version.\par

\endgroup

\bigskip % pourquoi le faut-il?

\section{Generating the package file and the test file}

Running |latex| (or |pdflatex|) on |tableof.dtx| generates:
{1})~the package file |tableof.sty| (which should be moved to a suitable
location within the \TeX{} installation),
{2})~|tableof.ins| for \TeX{}
distributions expecting such a file,
{3})~|tableoftest.tex| which
demonstrates the package features (one should run |latex| twice on it),
and
{4})~the documentation itself (run |pdflatex| twice to get the
bookmarks.)


\section{Implementation}

\makeatletter
\StopEventually{\check@checksum\end{document}}
\makeatother

Writing-up source code comments is hopefully for a future
release. 

\makeatletter
\begingroup
\topsep\MacrocodeTopsep
\trivlist\parskip\z@\item[]
\macro@font
\leftskip\@totalleftmargin  \advance\leftskip\MacroIndent
\rightskip\z@  \parindent\z@  \parfillskip\@flushglue
\global\@newlistfalse \global\@minipagefalse
\ifcodeline@index
  \everypar{\global\advance\c@CodelineNo\@ne
  \llap{\theCodelineNo\ \hskip\@totalleftmargin}}%
\fi
\string\ProvidesPackage\string{\pkgname\string}\par
\noindent\space [\pkgdate\space\pkgversion\space\pkgdescription]\par
\nointerlineskip
\global\@inlabelfalse
\endtrivlist
\endgroup
\makeatother
% The catcode hackery next is to avoid to have <*package> to be listed
% in the commented source code...
% (c) 2012/11/19 jf burnol ;-)
\MakePercentIgnore
%
% \catcode`\<=0 \catcode`\>=11 \catcode`\*=11 \catcode`\/=11
% \let</none>\relax
% \def<*package>{\catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\/=12}
%
%</none>
%<*package>
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\DeclareOption*{\PackageWarning{tableof}{Option `\CurrentOption' is unknown.}}
\ProcessOptions\relax
%    \end{macrocode}
%    \begin{macrocode}
\newtoks\tof@toctoks
%    \end{macrocode}
%    \begin{macrocode}
\def\tof@readtoc#1{%
  \ifeof #1
     \let\tof@nextread\@gobble
     \global\tof@toctoks\expandafter{\the\tof@toctoks}%
  \else
     \let\tof@nextread\tof@readtoc
     \read #1 to \tof@buffer
     \tof@toctoks\expandafter\expandafter\expandafter
       {\expandafter\the\expandafter\tof@toctoks\tof@buffer}%
  \fi
  \tof@nextread{#1}}
%    \end{macrocode}
%    \begin{macrocode}
\IfFileExists{\jobname .toc}
    {{% \endlinechar-1
        \makeatletter
        \newread\tof@tf
        \openin\tof@tf\@filef@und
           \tof@readtoc\tof@tf
        \closein\tof@tf}}{}
%    \end{macrocode}
% 2013/03/04: \csa{string\{}->\{, idem with \}. And added \csa{if@filesw} test.
%    \begin{macrocode}
\AtBeginDocument{
    \addtocontents{toc}{\string\@ifundefined{tof@begin}}
    \addtocontents{toc}{{\let\string\tof@begin\string\relax%
        \string\let\string\tof@finish\string\relax%
        \string\let\string\tof@starttags\string\@gobble%
        \string\let\string\tof@stoptags\string\@gobble%
        \string\let\string\tof@tagthis\string\@gobble%
        \string\let\string\tof@untagthis\string\@gobble}{}}
    \addtocontents{toc}{\string\tof@begin}
    \@ifpackageloaded{hyperref}
       {\def\tof@gobblethree@orfour#1#2#3#4{}%
        \ifx\hyper@last\@undefined\tof@toctoks{}\fi}
       {\def\tof@gobblethree@orfour#1#2#3{}}}
\AtEndDocument{\addtocontents{toc}{\string\tof@finish}}
\newcommand\tofOpenTocFileForWrite{%
  \if@filesw 
   \newwrite \tf@toc 
   \immediate \openout \tf@toc \jobname .toc\relax 
  \fi}
%    \end{macrocode}
% Creating our booleans is not the most economical, (one could have used a
% single list macro) but heck, how many tags are there going to be anyhow in
% normal use? a dozen at the very most I think.
%    \begin{macrocode}
\def\tof@tags{}
\def\tof@tags@tmp{}
\def\tof@untags@tmp{}
\def\tof@true#1{\expandafter\let\csname tofsw@#1\endcsname\iftrue}
\def\tof@false#1{\expandafter\let\csname tofsw@#1\endcsname\iffalse}
\def\tof@secondiftrue#1{\csname tofsw@#1\endcsname
                       \let\tof@next\@secondoftwo\fi}
\def\tof@secondiffalse#1{\csname tofsw@#1\endcsname\else
                       \let\tof@next\@secondoftwo\fi}
%    \end{macrocode}
% Just using the \csa{@for} thing with no attempt at any more sophisticated
% parsing (for spaces in particular).
%    \begin{macrocode}
\def\tof@setflags#1{\let\tof@next\@firstoftwo
        \@for\@tempa:=#1\do{\tof@true{\@tempa}}%
        \@for\@tempa:=\tof@tags\do{\tof@false{\@tempa}}%
        \@for\@tempa:=\tof@tags@tmp\do{\tof@false{\@tempa}}%
        \@for\@tempa:=\tof@untags@tmp\do{\tof@true{\@tempa}}}  
%    \end{macrocode}
%    \begin{macrocode}
\def\tof@filter#1#2{\ifx#1#2\else
               \ifx\tof@tmptags\@empty\edef\tof@tmptags{#2}\else
               \edef\tof@tmptags{\tof@tmptags,#2}\fi\fi}
\def\tof@@starttags#1{%
        \ifx\tof@tags\@empty\edef\tof@tags{#1}\else
        \edef\tof@tags{\tof@tags,#1}\fi}
\def\tof@@stoptags#1{%
        \@for\@tempa:=#1\do{\def\tof@tmptags{}%
            \@for\@tempb:=\tof@tags\do{\tof@filter\@tempa\@tempb}%
            \edef\tof@tags{\tof@tmptags}}}
%    \end{macrocode}
%    \begin{macrocode}
\def\tof@init#1{%
    \def\tof@begin{%
        \begingroup
        \def\tof@finish{\endgroup\global\let\tof@begin\relax}%
        \let\tof@savedcontentsline\contentsline
        \let\tof@starttags\tof@@starttags
        \let\tof@stoptags\tof@@stoptags
        \def\tof@tagthis####1{\def\tof@tags@tmp{####1}}%
        \def\tof@untagthis####1{\def\tof@untags@tmp{####1}}%
        \def\contentsline{#1}}}
%    \end{macrocode}
%    \begin{macrocode}
\def\tof@and#1{%
    \tof@init{\tof@setflags{#1}\def\tof@tags@tmp{}\def\tof@untags@tmp{}%
        \@for\@tempa:=#1\do{\tof@secondiftrue{\@tempa}}%
        \tof@next\tof@savedcontentsline\tof@gobblethree@orfour}%
    \the\tof@toctoks}
\def\tof@or#1{%
    \tof@init{\tof@setflags{#1}\def\tof@tags@tmp{}\def\tof@untags@tmp{}%
        \@for\@tempa:=#1\do{\tof@secondiffalse{\@tempa}}%
        \tof@next\tof@gobblethree@orfour\tof@savedcontentsline}%
    \the\tof@toctoks}
\def\tof@nor#1{%
    \tof@init{\tof@setflags{#1}\def\tof@tags@tmp{}\def\tof@untags@tmp{}%
        \@for\@tempa:=#1\do{\tof@secondiffalse{\@tempa}}%
        \tof@next\tof@savedcontentsline\tof@gobblethree@orfour}%
   \the\tof@toctoks}
\def\tof@nand#1{%
    \tof@init{\tof@setflags{#1}\def\tof@tags@tmp{}\def\tof@untags@tmp{}%
        \@for\@tempa:=#1\do{\tof@secondiftrue{\@tempa}}%
        \tof@next\tof@gobblethree@orfour\tof@savedcontentsline}%
    \the\tof@toctoks}
\newcommand*\tableof{\@ifstar{\tof@or}{\tof@and}}
\newcommand*\tablenotof{\@ifstar{\tof@nand}{\tof@nor}}
%    \end{macrocode}
%    \begin{macrocode}
\def\tof@nextof@or#1{\toks\z@{\tof@setflags{#1}%
        \@for\@tempa:=#1\do{\tof@secondiffalse{\@tempa}}%
        \tof@next
        {\def\tof@tags@tmp{}\def\tof@untags@tmp{}\tof@gobblethree@orfour}}%
        \@ifstar{\tof@nextof@nand}{\tof@nextof@nor}}
\def\tof@nextof@and#1{\toks\z@{\tof@setflags{#1}%
             \@for\@tempa:=#1\do{\tof@secondiftrue{\@tempa}}%
             \tof@next\@secondoftwo\@firstoftwo
             {\def\tof@tags@tmp{}\def\tof@untags@tmp{}\tof@gobblethree@orfour}}%
        \@ifstar{\tof@nextof@nand}{\tof@nextof@nor}}
\def\tof@nextof@nor#1{%
       \toks\z@\expandafter{\the\toks\z@ 
             {\tof@setflags{#1}\def\tof@tags@tmp{}\def\tof@untags@tmp{}%
              \@for\@tempa:=#1\do{\tof@secondiffalse{\@tempa}}%
              \tof@next\tof@savedcontentsline\tof@gobblethree@orfour}}%
       \expandafter\tof@init\expandafter{\the\toks\z@}%
       \tof@printtoc}
\def\tof@nextof@nand#1{%
       \toks\z@\expandafter{\the\toks\z@ 
             {\tof@setflags{#1}\def\tof@tags@tmp{}\def\tof@untags@tmp{}%
              \@for\@tempa:=#1\do{\tof@secondiftrue{\@tempa}}%
              \tof@next\tof@gobblethree@orfour\tof@savedcontentsline}}%
       \expandafter\tof@init\expandafter{\the\toks\z@}%
       \tof@printtoc}
\newcommand*{\nexttocwithtags}{\let\tof@printtoc\relax
             \@ifstar{\tof@nextof@or}{\tof@nextof@and}}
\newcommand*{\tableoftaggedcontents}{\def\tof@printtoc{\the\tof@toctoks}%
             \@ifstar{\tof@nextof@or}{\tof@nextof@and}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\toftagthis[1]{\addtocontents{toc}
          {\string\tof@tagthis{#1}}}
\newcommand*\tofuntagthis[1]{\addtocontents{toc}
          {\string\tof@untagthis{#1}}}
\newcommand*\toftagstart[1]{\addtocontents{toc}
          {\string\tof@starttags{#1}}}
\newcommand*\toftagstop[1]{\addtocontents{toc}
          {\string\tof@stoptags{#1}}}
\endinput
%    \end{macrocode}
% \MakePercentComment
\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         \~}

\CheckSum{473}

\Finale
%%
%% End of file `tableof.dtx'.

