% -*- coding: iso-latin-1; -*-
%<*none>
{\def\doctimestamp {Time-stamp: <10-03-2015 22:22:48 CET>}% 
 \def\getdtxtimestamp #1 <#2 #3 #4>{#2 at #3 #4}%
 \xdef\tofdtxtimestamp {\expandafter\getdtxtimestamp\doctimestamp }}%
\def\docdate{2015/03/10}
%</none>
%%
%% Package: tableof
%% Version: 1.4a (2015/03/10)
%% License: LPPL 1.3c
%% Copyright (C) 2012-2015 Jean-Francois Burnol <jfbu at free dot fr>
%%
%     This Work may be distributed and/or modified under the
%     conditions of the LaTeX Project Public License, either
%     version 1.3c of this license or (at your option) any later
%     version. This version of this license is in 
%          http://www.latex-project.org/lppl/lppl-1-3c.txt
%     and 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 2005/12/01 or later. 
%
% The Author of this Work is: Jean-Francois Burnol <jfbu at free dot fr> 
% 
%  Installation:
%  ============
%
%       latex tableof.dtx
%
% `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 -> <TDS>/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 see examples of tagged tables of contents.
%
% To generate the documentation, run once more latex on tableof.dtx,
% then run dvipdfmx on tableof.dvi
%
%<*ins>
\def\pkgname        {tableof}
\def\pkgdate        {2015/03/10}
\def\pkgversion     {v1.4a}
\def\pkgdescription {Tables of tagged contents (jfB)}
%</ins>
%<*none>
\ProvidesFile{\pkgname.dtx}%
  [\pkgname source and documentation (\tofdtxtimestamp)]
\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 `tex 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 -> <TDS>/tex/latex/tableof/
%%
%% The generated auxiliary files may be discarded. 
%%
\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\}}
% vérifions que c'est bon avec les espaces: (1.3 de 2015/02/11)
\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\tableoftaggedcontents)}
\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
\makeatletter
   \@for\@tempa:=hyperref,bookmark,graphicx,color\do
            {\PassOptionsToPackage{dvipdfmx}\@tempa}
   %
   \PassOptionsToPackage{dvipdfm}{geometry}
   \PassOptionsToPackage{bookmarks=true}{hyperref}
   \PassOptionsToPackage{dvipdfmx-outline-open}{hyperref}
   \PassOptionsToPackage{dvipdfmx-outline-open}{bookmark}
   %
\makeatother
\documentclass[a4paper,fontsize=11pt,abstract]{scrdoc}
\pagestyle{headings}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[hscale=0.66,vscale=0.76]{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[pdfencoding=pdfdoc]{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}

\usepackage{bookmark}

\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

\usepackage{framed}
\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 ``\tofdtxtimestamp''
\end{center}

\begin{abstract}
The commands \csa{toftagstart}, \csa{toftagstop}, \csa{toftagthis},
\csa{tofuntagthis} are used to tag chapters, sections or any other sectioning
units destined to end up in the table(s) of contents. Then:
\begin{quote}
  \csa{nexttocwithtags}\{req. 1, req. 2, ...\}\{excl. 1,
    excl. 2, ...\}\\
  \csa{tableofcontents} |% or equivalent command|
\end{quote}
specifies which tags are to be required and which ones are to be
excluded from the typeset TOC.

For documents with classes where \csa{tableofcontents} is only single-use,
the package provides:
\begin{quote}
  \csa{tableoftaggedcontents}\{req. 1, req. 2, ...\}\{excl. 1,
    excl. 2, ...\}
\end{quote}
which does not have this restriction.
\end{abstract}

\tableofcontents


\section{Tagging commands}

\subsection{\csbhyp{toftagstart \{tag1, tag2, ...\}} and
  \csbhyp{toftagstop \{tag1, tag2, ...\}}}

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 \{tag1, tag2, ...\}}  and
  \csbhyp{tofuntagthis \{tag1, tag2, ...\}}}

The \csa{toftagthis} command flags with the comma separated values from its
list argument only the \emph{next} sectioning command. The effect is not
cumulative: it is the last use of \csa{toftagthis} which counts; use it for
all the needed tags at once.

The \csa{tofuntagthis} command similarly untags only the \emph{next} entry.
Similarly, only the tags in the last call of \csa{tofuntagthis} are taken into
account.
\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 and around commas in tag lists are transparently removed.
(\emph{new with release} |1.3|). Tags may be macros, they are completely
expanded before use.

\section{Table of contents commands}

\subsection{\csbhyp{nexttocwithtags \{required tag1, required tag2,
    ...\}\{excluded tag1, excluded tag2, ...\}}}

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|.

\begin{framed}
  \noindent\textbf{DO NOT FORGET THE SECOND PAIR OF BRACES EVEN IF YOU ONLY
    WANT TO REQUIRE SOME TAGS:} \csa{nexttocwithtags}|{tag1, tag2}{}|.
\end{framed}

\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{tableoftaggedcontents \{required tag1, required tag2,
    ...\}\{excluded tag1, excluded tag2, ... \}}}

This command is provided in case the document class allows only a single use
of \csa{tableofcontents}, indeed \csa{tableoftaggedcontents} can be used
arbitrarily many times. \textbf{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 tag1, required tag2, ...\}}}

This is equivalent to |\tableoftaggedcontents{required tag1, ...}{}|.
\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 tag1, excluded tag2, ...\}}}

This is equivalent to |\tableoftaggedcontents{}{excluded tag1, ...}|.
\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{tofOpenTocFileForWrite}}

The contents of the |.toc| file (if it already exists) are read into memory by
\tableof once, at the time of |\begin{document}|.\footnote{New with |1.3|.
    Earlier versions read the |.toc| file at the time of
    \csa{usepackage\{tableof\}}. But this could cause a problem if the |.toc|
    file used characters not yet activated by Babel.} 
Notice that this reading of the |.toc| file into memory is only of relevance
if the document makes use of one of the \csa{tableoftaggedcontents},
\csa{tableof} or \csa{tablenotof} commands.

The creation of the |.toc| file is \emph{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 should \textbf{not} be used in the
preamble, however
\begin{verbatim}
    \usepackage{tableof}
    \AtBeginDocument{\tofOpenTocFileForWrite}
\end{verbatim}
is possible.

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

\section{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 requires the document |.toc| file to use the |\contentsline| macro
(possibly patched by other packages). It is thus incompatible with the
|beamer| class. However, if |beamer| is used in an article mode, i.e., with
the article class in conjunction with the |beamerarticle| package, then \tableof
should work.

\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. Since
release |1.3|, these redefinitions are done in \emph{one single} line of the
|.toc| file to circumvent interference of |biblatex| which adds
commands to the |.toc| line on every other line (thus, potentially right in
the middle of multi-line commands \verb+:-(+.)

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. 

\section{Version History}

\begingroup
\parindent0pt 
\makeatletter
\settowidth{\dimen@}{\ttfamily 2015/03/10 v1.4a: i.\space}
\everypar\expandafter{\expandafter\hangindent\the\dimen@
                                  \hangafter1 }
\makeatother

|2015/03/10 v1.4a: i. |changes in the code to make it more easily patchable by
other packages (I have especially the next release of \etoc in mind): changes
to the way |\tof@begin|, |\tof@finish| are set up, new |\tof@global| which
defaults to nothing but may be set to be |\global| (this is in view of doing
TOCs as tabulars of longtables, in the way \etoc |1.08| will permit).

|                 ii. |improved sectioning of the documentation.

|2015/02/20 v1.4:  i. |some code efficiency improvements (some
|\edef|'s replaced by a bunch of |\expandafter|'s.)

|                 ii. |improved documentation.

|2015/02/11 v1.3:  i. |comma separated lists of tags now allow spaces.

|                 ii. |only one line used for the |.toc| code silently
unactivating |tableof| if its |\usepackage{tableof}| has been removed from the
document source. (needed due to aggressive |biblatex| interference with |.toc|
files.)

|                iii. |reading of .toc file is delayed to |\begin{document}| to
account for possible Babel active characters used therein. Not relevant if
document uses standard |\tableofcontents| or like commands.

|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| 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. After running |latex| twice, use |dvipdfmx| to
produce the pdf documentation.


\section{Implementation}

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

% Suite à mésaventure le 9 mars 2015 dans etoc.dtx:

% ATTENTION QU'AVANT DE COMMENCER DES MACROCODE IL FAUT OBLIGATOIREMENT UN
% PARAGRAPHE APRÈS \section (SINON ESPACEMENTS VERTICAUX POST MACROCODE
% SUPPRIMÉS :((((( )

% ceci faisait donc l'affaire :

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

% maintenant je fais:

\indent

\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
\newtoks\tof@toctoks
%    \end{macrocode}
% |1.3| codes this |\tof@readtoc| slightly better (copied from \etoc.dtx).
%    \begin{macrocode}
\def\tof@readtoc {%
  \ifeof \tof@tf
  \else
     \read\tof@tf to \tof@buffer
     \tof@toctoks\expandafter\expandafter\expandafter
       {\expandafter\the\expandafter\tof@toctoks\tof@buffer}%
     \expandafter\tof@readtoc
  \fi }
%    \end{macrocode}
% |1.3| of |2015/02/11| moves the reading of the toc file to At Begin
% Document. This is needed for Babel activated characters. I also re-use
% |\endlinechar-1| which I had commented out since release |1.1|. Notice
% though that this is irrelevant if the document uses |tableof| only via its
% tagging abilities, and has standard |\tableofcontents| command to print the
% TOC.
%    \begin{macrocode}
\AtBeginDocument{\IfFileExists{\jobname.toc}
    {{\endlinechar\m@ne
        \makeatletter
        \newread\tof@tf
        \openin\tof@tf\@filef@und
        \tof@readtoc
        \global\tof@toctoks=\expandafter{\the\tof@toctoks}%
        \closein\tof@tf}}{}}
%    \end{macrocode}
% The trick is that |\@ifundefined| chooses the undefined branch if the
% meaning is |\relax|. Thus it is possible for \tableof to define and use
% |\tof@begin| and later set it to |\relax|, the entire influence of \tableof
% will then be turned off.
%
% |1.2| of |2013/03/04|: \csa{string\{}->\{, idem with
% \}. And added \csa{if@filesw} test.
%
% |1.3| of |2015/02/11|: to circumvent aggressive biblatex manipulation of the
% |.toc| file, I put things to the |.toc| file in one-go; else weird commands
% might get inserted right in the middle of arguments to a multi-line macro!
% also removed a bunch of |\string|'s: when I first wrote this package I had
% still limited understanding of \TeX's macros.
%
% |1.4a| uses |\@empty| for the default |\tof@finish| rather than |\relax|,
% for no special reason. Also the |\let|'s in case |\tof@begin| is undefined
% or |\relax| are all made global, because for compatibility with the fancy
% things \etoc |1.08| will allow for TOC as table we need a global mode, and
% the simplest is here to do the things global by default.
%    \begin{macrocode}
\AtBeginDocument{
    \addtocontents{toc}{\string\@ifundefined{tof@begin}%
       {\global\let\string\tof@begin\relax
        \global\let\string\tof@finish\string\@empty
        \global\let\string\tof@starttags\string\@gobble
        \global\let\string\tof@stoptags\string\@gobble
        \global\let\string\tof@tagthis\string\@gobble
        \global\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}}
%    \end{macrocode}
% |1.4a| makes the things more easily patchable by other packages, especially
% I have \etoc in mind.
%
% |\tof@@starttags| and |\tof@@stoptags| are defined a bit later in the code.
% And we use |\tof@global|. And we need |\tof@@finish| to reset |\tof@tags| to
% empty, just in case |\tof@global| was |\global|. And also |\contentsline| !!
% But here it is a problem redefining it globally. In normal use of \tableof,
% nothing needs to be done, because the |\tof@endgroup| closes the scope. In
% global mode (triggered only by \etoc with |\etocglobaldefs| for tabulars),
% it needed to globally modify |\contentsline|, thus it or \etoc has to
% globally unmodify it. \etoc |1.08| by itself without \tableof doesn't have
% to reset |\contentsline| because it re-defined it \emph{before} an eventual
% tabular. But as it forced \tableof to do global things, in such case \etoc
% will have to proceed globally as well.
%    \begin{macrocode}
\let\tof@global     \@empty
\let\tof@begingroup \begingroup
\let\tof@endgroup   \endgroup
\def\tof@@finish   {\tof@global\let\contentsline\tof@savedcontentsline
                    \tof@endgroup\global\let\tof@begin\relax
                                 \global\let\tof@tags\@empty }
\def\tof@@tagthis   #1{\def\tof@tags@tmp{#1}}
\def\tof@@untagthis #1{\def\tof@untags@tmp{#1}}
\def\tof@init#1{%
    \def\tof@begin{%
        \tof@begingroup
        \tof@global\let\tof@tagthis  \tof@@tagthis
        \tof@global\let\tof@untagthis\tof@@untagthis
        \tof@global\let\tof@starttags\tof@@starttags
        \tof@global\let\tof@stoptags \tof@@stoptags
        \tof@global\let\tof@finish   \tof@@finish
        \tof@global\let\tof@savedcontentsline\contentsline
        \tof@global\def\contentsline {#1}}}
%    \end{macrocode}
% place holder for comments
%    \begin{macrocode}
\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.
%
% |1.4a|: fortunately no need for the |\tof@global| thing! However, careful
% with |\tof@tags| it will have to be reset to empty by |\tof@finish| in case
% |\tof@global| is |\global|.
%    \begin{macrocode}
\let\tof@tags      \@empty
\let\tof@tags@tmp  \@empty
\let\tof@untags@tmp\@empty
\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}
% |1.4a|: fortunately no need for the |\tof@global| thing; the |\tof@setflags|
% is used at \emph{each} |\contentsline|. Quite useful design, congrats to the
% original architect !
%    \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}
% Release |1.4| uses here a bunch of |\expandafter|'s in place of some
% |\edef|'s.
%    \begin{macrocode}
\def\tof@filter#1#2{\ifx#1#2\else
    \ifx\tof@tmptags\@empty
         \expandafter\def\expandafter\tof@tmptags\expandafter{#2}%
    \else
         \expandafter\expandafter\expandafter\def
         \expandafter\expandafter\expandafter\tof@tmptags
         \expandafter\expandafter\expandafter{\expandafter
         \tof@tmptags\expandafter,#2}%
    \fi\fi}
%    \end{macrocode}
% |1.4a| needs the |\tof@global| in the hope for \tableof to be compatible with
% future \etoc |1.08| when employed in the delicate art of TOC as a table !
%    \begin{macrocode}
\def\tof@@starttags#1{%
    \ifx\tof@tags\@empty
      \tof@global\def\tof@tags{#1}%
    \else
      \tof@global
      \expandafter\def\expandafter\tof@tags\expandafter{\tof@tags,#1}%
    \fi }
\def\tof@@stoptags#1{%
    \@for\@tempa:=#1\do{%
          \def\tof@tmptags{}%
          \@for\@tempb:=\tof@tags\do{\tof@filter\@tempa\@tempb}%
          \tof@global
          \expandafter\def\expandafter\tof@tags\expandafter{\tof@tmptags}%
         }%
    }
%    \end{macrocode}
% Until |1.3|, I was just using the \csa{@for} thing with no attempt at any
% extra parsing, for spaces in particular. With |1.3| of |2015/02/11| I use an
% |\edef| to remove all spaces first, using a |\zapspaces| macro pioneered in
% |xintkernel.sty|. Thus, comma separated lists of tags can have spaces. They
% will be removed if not protected by braces.
%    \begin{macrocode}
\def\tof@zapspaces #1 #2{#1#2\tof@zapspaces }%
\def\tof@cleanspaces #1#2{\edef\tof@tmp {{\tof@zapspaces #2 \@gobble}}%
    \expandafter #1\tof@tmp } 
%    \end{macrocode}
% placeholder for comments
%    \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@cleanspaces\tof@or}
                             {\tof@cleanspaces\tof@and}}
\newcommand*\tablenotof{\@ifstar{\tof@cleanspaces\tof@nand}
                                {\tof@cleanspaces\tof@nor}}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\tof@nextof@or #1{\toks@{\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@cleanspaces\tof@nextof@nand}
                {\tof@cleanspaces\tof@nextof@nor}}
\def\tof@nextof@and #1{\toks@{\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@cleanspaces\tof@nextof@nand}
                {\tof@cleanspaces\tof@nextof@nor}}
\def\tof@nextof@nor #1{%
       \toks@\expandafter{\the\toks@ 
             {\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@}%
       \tof@printtoc }
\def\tof@nextof@nand #1{%
       \toks@\expandafter{\the\toks@ 
             {\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@}%
       \tof@printtoc }
\newcommand*{\nexttocwithtags}{\let\tof@printtoc\relax
             \@ifstar{\tof@cleanspaces\tof@nextof@or}
                     {\tof@cleanspaces\tof@nextof@and}}
\newcommand*{\tableoftaggedcontents}{\def\tof@printtoc{\the\tof@toctoks}%
             \@ifstar{\tof@cleanspaces\tof@nextof@or}
                     {\tof@cleanspaces\tof@nextof@and}}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\newcommand*\toftagthis[1]
  {\addtocontents{toc}{\string\tof@tagthis  {\tof@zapspaces #1 \@gobble }}}
\newcommand*\tofuntagthis[1]
  {\addtocontents{toc}{\string\tof@untagthis{\tof@zapspaces #1 \@gobble }}}
\newcommand*\toftagstart[1]
  {\addtocontents{toc}{\string\tof@starttags{\tof@zapspaces #1 \@gobble }}}
\newcommand*\toftagstop[1]
  {\addtocontents{toc}{\string\tof@stoptags {\tof@zapspaces #1 \@gobble }}}
\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{552}

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

