% -*- coding: utf-8; time-stamp-format: "%02d-%02m-%:y at %02H:%02M:%02S %Z" -*-
% N.B.: this dtx file is NOT for use with \DocInput. The latex source of the
% user manual is not prefixed with percent signs.
%<*none>
\def\etocdtxtimestamp {Time-stamp: <20-01-2023 at 21:03:03 CET>}%
%</none>
%<*!readme>
%%
%% Package: etoc
%% Version: 1.1c
%% License: LPPL 1.3c
%% Copyright (C) 2012-2023 Jean-Francois Burnol
%%                         <jfbu at free dot fr>
%</!readme>
%<*none>
\def\etocpkgdate        {2023/01/20}
\def\etocdocdate        {2023/01/20}
\def\etocpkgversion     {1.1c}
\def\etocpkgdescription {Completely customisable TOCs (JFB)}
%% German translation was last udpated on April 2015 and all new material
%% was included since in English.  During 2020/2021/2022 emerged a still
%% unresolved texdoc problem which always displays etoc-DE.pdf preferentially.
%% On 2022/08/26, decision is made to stop shipping this etoc-DE.pdf.
%% The dtx gets purged from its soure as well.
%% Not sure if I will make pdf available for download from some web site,
%% but this can always be done if requests emerge; but I hesitate for
%% the location.
% Definition of \etocLicense
% --------------------------
\begingroup
    \long\def\firstofone #1{#1}\catcode1=14\catcode2=0
    \catcode`\%=12\catcode`\_=12\endlinechar13\catcode13=13 ^^A
    \catcode32=13\catcode`\\=12^^Brelax^^A
^^Bfirstofone{^^Bendgroup^^Bdef^^BetocLicense^^A
{% Package: etoc
% Version: 1.1c
% License: LPPL 1.3c
% Copyright (C) 2012-2023 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, in its
%     version 1.3c. 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>
%
% This Work consists of the main source file etoc.dtx and the derived
% files etoc.sty, etoc.tex, etoc.pdf, etoc.dvi, README.md.
%
% Running etex (or latex or pdflatex) on etoc.dtx extracts etoc.sty,
% etoc.tex and README.md. See README.md for further instructions.
}}%
\bgroup\catcode2 0 \catcode`\\ 12 ^^Biffalse
%</none>
%<*readme>
<!-- -->

    Source:  etoc.dtx (1.1c)
    Author:  Jean-Francois Burnol
    Info:    Completely customisable TOCs
    License: LPPL 1.3c
    Copyright (C) 2012-2023 Jean-Francois Burnol.
    <jfbu at free dot fr>

ABSTRACT
========

The etoc package gives to the user complete control on how the entries
of the table of contents should be constituted from the *name*,
*number*, and *page number* of each sectioning unit. This goes via the
definition of *line styles* for each sectioning level used in the
document. The package provides its own custom line styles. Simpler
ones are given as examples in the documentation. The simplest usage
will be to take advantage of the layout facilities of packages dealing
with list environments.

Regarding the *global toc display*, etoc provides pre-defined styles
based on a multi-column format, with, optionally, a ruled title or
framed contents.

The `\tableofcontents` command may be used arbitrarily many times and
it has a variant `\localtableofcontents` which prints tables of
contents 'local' to the current surrounding document unit. An
extension of the `\label/\ref` syntax allows to reproduce (with
another layout) a local table of contents defined somewhere else in
the document.

Via *depth tags*, one gets an even finer control for each table of
contents of which sectioning units it should, or not, display.

The formatting inherited (and possibly customized by other packages)
from the document class will be used when in compatibility mode.

The assignment of levels to the sectioning units can be changed at any
time, and etoc can thus be used in a quite general manner to create
custom ''lists of'', additionally to the tables of contents related to
the document sectioning units. No auxiliary file is used additionally
to the standard `.toc` file.

INSTALLATION
============

To extract the package (.sty) and driver (.tex) files from etoc.dtx,
execute `etex etoc.dtx`.

It is also possible to execute latex or pdflatex directly on etoc.dtx.

To produce etoc.pdf one can run pdflatex directly on etoc.dtx or on
the file etoc.tex which was extracted from `etex etoc.dtx` step.

Options can be set in etoc.tex:

- scrartcl class options (paper size, font size, ...)
- with or without source code,
- with dvipdfmx or with latex+dvips or pdflatex.

Since release 1.08h pdflatex is the default in etoc.tex (prior it
was latex+dvipdfmx as it produces smaller PDFs) in order to allow
inclusion via the use of package `attachfile` of about 25 code
samples as file attachment annotations.

Installation:

    etoc.sty    -> TDS:tex/latex/etoc/etoc.sty
    etoc.dtx    -> TDS:source/latex/etoc/etoc.dtx
    etoc.pdf    -> TDS:doc/latex/etoc/etoc.pdf
    README.md   -> TDS:doc/latex/etoc/README.md

The other files may be discarded.

LICENSE
=======

This Work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, in its
version 1.3c. 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>

This Work consists of the main source file etoc.dtx and the derived files
etoc.sty, etoc.tex, etoc.pdf, etoc.dvi.

RECENT CHANGES
==============

1.1c \[2023/01/20\]
-------------------

Fix a brace removal bug in the construction of `\etocname`.  It
remained without visible effects in documents using `hyperref` and
default settings, thanks to the hyperlink wrapper, but e.g.
`\section{{\color{blue}Blue}}` in a document not using `hyperref`,
and not using etoc only in "compatibility mode", could cause a
color leak in the table of contents.

With the KOMA-script numberline toc feature, unnumbered entries in
TOCs typeset via etoc user-defined or package provided line styles
but using compatibility mode for the global display style were
(knowingly) considered to be numbered with an empty number.  They
are now considered by `\etocifnumbered` to be not numbered and the
empty `\etocnumber` will carry no hyperlink.

Fix a 1.1a regression in the context of KOMA-script unnumbered TOC
entries: `\etocthelinkedname` could lose its hyperlink.

Continue internal trimming of old code branches which became
un-needed after the 1.1a refactoring.  Add relatively decent
code comments to accompany the 1.1a-c refactoring.  Update
warning messages to use more consistently LaTeX's templates.

1.1b \[2023/01/15\]
-------------------

Documentation fix, 1.1a forgot to mention the following change:
`\etocthelinkedname`, `\etocthelinkednumber`, `\etocthelinkedpage`
are now always hyperlinks independently of linktoc status.

1.1a \[2023/01/14\]
-------------------

This version brings no new functionality, despite the number bump.
It implements a complete rewrite of old legacy core internals.
Formerly, etoc waited for
[hyperref](https://ctan.org/pkg/hyperref)
(if present) to have added hyperlinks via its patch to LaTeX's
`\contentsline`. etoc examined the arguments of `\l@section` and
other commands to extract hyperlinking information, if any.
With this release etoc decides earlier according to
[hyperref](https://ctan.org/pkg/hyperref)
linktoc status whether section names and page numbers
should be hyperlinked, and adds links itself via `\hyperlink`.
etoc is thus now immune to the details of how hyperref patches
the `\contentsline` command, which is not executed anymore.
Overall, the code is greatly simplified.

`\etoclink` now wraps its argument in an hyperlink even if
[hyperref](https://ctan.org/pkg/hyperref) is configured via
`linktoc=none`.  Formerly no hyperlink was added then.

Deprecation of `\etocsavedsectiontocline` and similarly named
commands.  They are not needed as `\l@section` et al. are with this
release left unmodified during the table of contents typesetting.

LaTeX kernel from `2020/10/01` or later is required (to allow
assuming the `\contentsline` entries in the TOC file always have
four arguments).

1.09i \[2022/11/21\]
--------------------

Fix bug showing when a document uses both `\etocchecksemptiness` and
`\etocsetlocaltop.toc`: the `start` and `finish` parts of some levels
were executed possibly causing extra printed output.

More hyperlinking in the implementation part of the documentation.

1.09h \[2022/11/20\]
--------------------

Documentation improvements.  In particular, attached code snippets
are now visible via their filenames in the page margins.  Also,
command names are doubly hyperlinked: first half links to the devoted
part of the user manual, second half links to the implementation part.

1.09g \[2022/11/17\]
--------------------

Compatibility hotfix with recent hyperref `7.00u` of `2022-11-13`.
Thanks to Denis Bitouzé for signaling the breakage to the author.

1.09f \[2022/08/30\]
--------------------

No more shipping of a German translation of the documentation, as
it was last updated in April 2015.

(etoc.pdf) User level commands hyperlink from their code source
definitions to their descriptions in the documentation part.  Macros
used in the code source hyperlink to where they first got defined
there.

Wrap the `\etocpartname` (from etoc's package provided toc line style)
together with the part number in a potential common hyperlink.

Try to sync the emulation of the global display style with KOMA-script
`v3.37` (in particular regarding the `noparskipfake` KOMA toc feature).

Improve documentation of some aspects under `memoir` class.

Remove the `\nonumberline` token, even though empty, from the meaning of
`\etocthename` (KOMA-script classes).

Add `\etocimmediatedepthtag.toc` to work around problems related to
`\include` (see user doc).  Thanks to Norman Ramsey who reported the problem
and proposed a work-around in July 2016.  Apologies for the somewhat longish
delay in incorporating it...

Also add `\etocimmediatesettocdepth.toc`.

Also add `\etocimmediatetoccontentsline` and its starred variant.

Also add `\etocimmediatesetlocaltop.toc`.

Fix an obscure bug (see source code comments) in the `\etocsetlocaltop.toc`
mechanism.
%</readme>
%<*tex>-------------------------------------------------------------------------
%% To produce the documentation etoc.pdf with source code included:
%%   latexmk -pdf etoc.tex
%% Or 
%%   pdflatex etoc.tex
%% enough times.  For customizations see comments and classe options below.
\chardef\Withdvipdfmx 0 % replace 0 by 1 for using latex+dvipdfmx
\chardef\NoSourceCode 0 % replace 0 by 1 for the doc *without* the source code
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile {etoc.tex}[Driver for etoc documentation]%
\PassOptionsToClass   {a4paper,fontsize=11pt,twoside}{scrartcl}
\PassOptionsToPackage {ngerman,english}{babel}
\input etoc.dtx
%%% Local Variables:
%%% mode: latex
%%% End:
%</tex>-------------------------------------------------------------------------
%<*none>------------------------------------------------------------------------
^^Bfi^^Begroup
%
\chardef\noetex 0
\ifx\numexpr\undefined\chardef\noetex 1 \fi
\ifnum\noetex=1 \chardef\extractfiles 0 % extract files, then stop
\else
    \ifx\ProvidesFile\undefined
      \chardef\extractfiles 0 % etex etc.. on etoc.dtx, only file extraction.
    \else % latex/pdflatex on etoc.tex or on etoc.dtx
      \ifx\Withdvipdfmx\undefined
        % latex/pdflatex run is on etoc.dtx
        \chardef\extractfiles 1 % 1 = extract files and typeset manual, 2 = only typeset
        \chardef\Withdvipdfmx 0 % 0 = pdflatex or latex+dvips, 1 = dvipdfmx
        \chardef\NoSourceCode 1 % 0 =  include source code, 1 = do not
        \NeedsTeXFormat {LaTeX2e}%
        \PassOptionsToClass   {a4paper,fontsize=11pt,twoside}{scrartcl}%
        \PassOptionsToPackage {ngerman,english}{babel}%
      \else % latex run is on etoc.tex
        \chardef\extractfiles 2 % do not extract files, only typeset
      \fi
      \ProvidesFile{etoc.dtx}%
        [etoc source and documentation (\etocdtxtimestamp)]%
    \fi
\fi
\ifnum\extractfiles<2 % extract files
\def\MessageDeFin{\newlinechar10 \let\Msg\message
\Msg{********************************************************************^^J}%
\Msg{*^^J}%
\Msg{* To finish the installation you have to move the following^^J}%
\Msg{* file into a directory searched by TeX:^^J}%
\Msg{*^^J}%
\Msg{*\space\space\space\space etoc.sty^^J}%
\Msg{*^^J}%
\Msg{* To produce the documentation with source code included run pdflatex^^J}%
\Msg{* thrice on file etoc.tex^^J}%
\Msg{*^^J}%
\Msg{* Happy TeXing!^^J}%
\Msg{*^^J}%
\Msg{********************************************************************^^J}%
}%
\begingroup
    \input docstrip.tex
    \askforoverwritefalse
    \generate{\nopreamble\nopostamble
    \file{README.md}{\from{etoc.dtx}{readme}}%
    \usepostamble\defaultpostamble
    \file{etoc.tex}{\from{etoc.dtx}{tex}}%
    \usepreamble\defaultpreamble
    \file{etoc.sty}{\from{etoc.dtx}{package}}}%
\endgroup
\fi % end of file extraction (from etex/latex/pdflatex run on etoc.dtx)
\ifnum\noetex=1 % warning for README.md
    \expandafter\def\expandafter\MessageDeFin\expandafter 
{\MessageDeFin
\Msg{* warning: to get correct utf-8 encoded README.md ^^J}%
\Msg{* do etex etoc.dtx and not as here tex etoc.dtx   ^^J}%
\Msg{********************************************************************^^J}}%
\fi
\ifnum\extractfiles=0 % tex/etex/xetex/etc on etoc.dtx, files extracted, stop
      \MessageDeFin\expandafter\end
\fi
% From this point on, run is necessarily with e-TeX.
% Check if \MessageDeFin got defined, if yes put it at end of run.
\ifdefined\MessageDeFin\AtEndDocument{\MessageDeFin}\fi
%-------------------------------------------------------------------------------
% START OF USER MANUAL TEX SOURCE
\documentclass[abstract]{scrartcl}

\makeatletter
%%% START OF CUSTOM doc.sty LOADING (May 21, 2022 in xint.dtx)
%%% (August 26, 2022 here, comments trimmed)
%
% For some legacy reason (because I started like this and it
% worked to my satisfaction) I had used scrdoc.cls all those
% years, without in fact needing most of its features.
%
% It loads ltxdoc class, from which again I need very little.  On
% testing May 20, 2022 the upcoming LaTeX 2022-06-01 I had some
% problems with ltxdoc not having suitable interface for rolling
% back to doc=V2.
%
% ...
%
% Thus it turns out I need very little of doc.sty, and almost
% nothing of ltxdoc.cls and scrdoc.cls.
%
% (maybe provisory, try to see if usage of cross-hyperlinking
%  as in sourcexint.pdf makes sense here for rendering of
%  implementation part - loading time of etoc.pdf in viewer
%  in increased, though. 2022/08/26)
%
% Let's load the doc=V2 version to avoid having to work around
% hypdoc loading interfering with my use of hyperref.
\ifdefined\IfFormatAtLeastTF
  \IfFormatAtLeastTF{2022/06/01}%
  {%
    \IfFileExists{doc-2021-06-01.sty}%
     {\usepackage{doc}[=v2]}%
% Why on earth do I lose my time doing this?
     {\GenericError
          {(etoc build doc)\@spaces}%
          {etoc build error: %
      Your LaTeX installation seems to be broken, format is\MessageBreak
      2022-06-01 or later but `doc' package in its `v2' version\MessageBreak
      seems to not be available. \space Will try with `doc' but if\MessageBreak
      its `v3' is used there will be an option clash error\MessageBreak
      regarding hyperref.}%
          {}%
          {Please make sure `doc' package matches your LaTeX format.}%
      \usepackage{doc}%
     }%
  }%
  {\usepackage{doc}}%
\else
\usepackage{doc}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MACROS OF doc.sty WILL BE HACKED (2022/06/06) FOR THE IMPLEMENTATION PART
%
% First we want to turn CodelineNo into a real LaTeX counter
% This will spare defining an extra counter for the hyperlinks with \hyperref
\begingroup\let\newcount\@gobble\@definecounter{CodelineNo}\endgroup
% Let's now reenact the doc.sty default for \theCodeLineNo
\def\theCodelineNo{\reset@font\scriptsize\arabic{CodelineNo}}
% But as we will reset CodelineNo at each style file we need some unique id
\def\theHCodelineNo{\the\value{section}.\the\value{CodelineNo}}
% This is all for now.
% The further hacks are to be found after the \StopEventually (i.e. a few
% thousands lines down from here if you don't have access to the private
% sources, which is probably the case if you are not the author).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% As explained above I was formerly using scrdoc hence ltxdoc indirectly.
% Let's emulate here the little I appear to need from ltxdoc.cls and
% srcdoc.cls.
%
\AtBeginDocument{\MakeShortVerb{\|}}
\DeclareFontShape{OT1}{cmtt}{bx}{n}{<-> ssub * cmtt/m/n}{}
\DeclareFontFamily{OMS}{cmtt}{\skewchar\font 48}  % '60
\DeclareFontShape{OMS}{cmtt}{m}{n}{<-> ssub * cmsy/m/n}{}
\DeclareFontShape{OMS}{cmtt}{bx}{n}{<-> ssub * cmsy/b/n}{}
\DeclareFontShape{OT1}{cmss}{m}{it}{<->ssub*cmss/m/sl}{}
\ifnum\NoSourceCode=1
  \OnlyDescription
\fi
\CodelineNumbered
\EnableCrossrefs  % but this will be hacked
% \setcounter{StandardModuleDepth}{1} % we don't use this mechanism currently
\def\cmd#1{\cs{\expandafter\cmd@to@cs\string#1}}
\def\cmd@to@cs#1#2{\char\number`#2\relax}
% Here I am loading doc=v2 but formerly I was using ltxdoc via scrdoc
% which I dropped at release 1.4l (2022-05-29) and without much
% thinking I had kept this.
\DeclareRobustCommand\cs[1]{\texttt{\bslash#1}}
% As I may have the * active, or macro names with _ or ^, I should
% add \detokenize.  But see below for a redefinition anyhow.
%
% More urgent is that I am also using hyperref and this definition gives wrong
% bookmarks if \cs is used in section titles.  As I had very very few usags of
% \cs in the whole of xint.dtx, it took me a while to realize the problem
% here.  Turns out that doc=v3 by default loads hypdoc which includes this
% configuation for hyperref compatibility:
\AtBeginDocument{%
\pdfstringdefDisableCommands{\def\cs#1{\textbackslash\detokenize{#1}}}%
}%
% As I have not loaded hyperref yet I must delay it to AtBeginDocument.
\providecommand\marg[1]{%
  {\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
\providecommand\oarg[1]{%
  {\ttfamily[}\meta{#1}{\ttfamily]}}
\providecommand\parg[1]{%
  {\ttfamily(}\meta{#1}{\ttfamily)}}
% \@addtoreset{CodelineNo}{part}% No need for this here
% \def\partname{File}% \partname is "fixed" somewhere further down anyhow
% No need for this, anyhow I don't build the indices
% \gdef\codeline@wrindex#1{\if@filesw
%       \begingroup
%         \let\protect\noexpand
%         \immediate\write\@indexfile
%             {\string\indexentry{#1}%
%             {\filesep\number\c@CodelineNo}}%
%       \endgroup\fi}
% \let\filesep\@empty

% There is very little we seem to need from the scrdoc extras: page geometry
% is set by geometry package and a4paper option from xint.tex file.  So it
% seems I only need the hologo loading:
\usepackage{hologo}
\DeclareRobustCommand*{\eTeX}{\hologo{eTeX}}%
\DeclareRobustCommand*{\LuaTeX}{\hologo{LuaTeX}}%
%
\makeatother
%%% end of ltxdoc+srcdoc emulation from June 2022 xint.dtx,
%%% copied over almost verbatim to etoc.dtx on 2022/08/26.
%%% See after \StopEventually for doc.sty hacks.

\usepackage{ifpdf}
\ifpdf\chardef\Withdvipdfmx 0 \fi

\makeatletter
\ifnum\Withdvipdfmx=1
   \@for\@tempa:=hyperref,bookmark,graphicx,xcolor,pict2e\do
            {\PassOptionsToPackage{dvipdfmx}\@tempa}
   %
   \PassOptionsToPackage{dvipdfm}{geometry}
   \PassOptionsToPackage{bookmarks=true}{hyperref}
   \PassOptionsToPackage{dvipdfmx-outline-open}{hyperref}
   \PassOptionsToPackage{dvipdfmx-outline-open}{bookmark}
   %
   \def\pgfsysdriver{pgfsys-dvipdfm.def}
\else
   \PassOptionsToPackage{bookmarks=true}{hyperref}
\fi
\makeatother

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[hscale=0.66,vscale=0.75]{geometry}
\pagestyle{headings}
% \sectionmark uses \markboth in twoside but
% with an empty right mark!  As a result if a section starts
% on an odd page, it does not appear in the header mark.
% Perhaps there was a subsection of 3 lines on that page
% and it is the subsection which decides what is in the header.
\makeatletter

% Some custom \sectionmark to get headers more to my taste.
% But it is hard to find algorithm giving satisfaction in all cases.

\renewcommand *{\sectionmark }[1]{%
% Que c'est pénible cette syntaxe \markboth/\markright de LaTeX !
% Pourquoi est-ce que \markright n'a pas été définie comme #1#2-> truc avec #2 ??
  \if@twoside \expandafter \markboth \else 
   \expandafter\expandafter\expandafter \markright\expandafter \@firstoftwo
  \fi 
  {\MakeMarkcase {\Ifnumbered {section}{\sectionmarkformat }{}#1}}%
  {\MakeMarkcase {\Ifnumbered {section}{\sectionmarkformat }{}#1}}%
}

% Par ailleurs je vais remplacer \firstmark par \botmark dans \rightmark
% dont la définition par défaut est :

% \rightmark:
% macro:->\expandafter \@rightmark \firstmark \@empty \@empty 

\renewcommand*\rightmark{\expandafter\@rightmark\botmark \@empty\@empty}
% Au passage l'output de latexdef à un : supplémentaire bizarre
% $ latexdef botmark
%
% \botmark:
% \botmark:
%

% Néanmoins pour les \part il ne faut clairement pas utiliser \botmark
% Tous mes \part sont après un \clearpage explicite
% Je crois que le plus simple est encore de faire ceci:
\def\ps@mypartheadings{%
    \ps@headings
    \let\@evenhead\@empty
    \let\@oddhead\@empty
}

% peut-être serait-ce mieux de mettre le \thispagestyle après mon \clearpage,
% explicitement dans la source
\def\part{\thispagestyle{mypartheadings}\scr@startpart {part}}

\makeatother

\usepackage{centeredline}% replaces the 2013/03/07 original code 

\makeatletter
% pour maintenir les % en début de ligne dans les blocs verbatim
%

   \let\original@check@percent\check@percent
   \let\check@percent\relax
\makeatother


% pour les environnements verbatim
% uniformisé finalement, avec quelques exceptions, pour dtx du 3 déc 2013
\def\MacroFont{\ttfamily\small\hyphenchar\font45 \baselineskip11pt\relax}


%----
% better \verb pour doc.
% 12 octobre 2013, importé de xint.dtx
% je rajoute pour { afin que truc{machin puisse avoir hyphénation
% retire \leavemmode, pas nécessaire pour emploi ici

% NOTE 9 mars 2015. J'ai depuis une version plus aboutie dans xint.dtx
% mais je laisse ici tel quel.

\def\MicroFont{\ttfamily\hyphenchar\font45 }
% modif de \do@noligs: \char`#1} --> \char`#1 }
\makeatletter 
\def\do@noligs #1%
{%
    \catcode `#1\active 
    \begingroup \lccode `\~=`#1\relax 
    \lowercase {\endgroup \def ~{\kern \z@ \char `#1 }}%
}% 
\def\dobackslash
{%
    \catcode92 \active 
    \begingroup \lccode `\~=92\relax 
    \lowercase {\endgroup \def ~{\kern \z@ \char 92 }}%
}% 
\def\dobraces
{%
    \catcode123 \active 
    \begingroup \lccode `\~=123\relax 
    \lowercase {\endgroup \def ~{\hskip \z@\@plus.1pt\@minus.1pt
                                 \char 123 }}%
    \catcode125 \active 
    \begingroup \lccode `\~=125\relax 
    \lowercase {\endgroup \def ~{\char 125 \hskip \z@\@plus.1pt\@minus.1pt }}%
}% 
\def\verb 
{%
  \relax \ifmmode\hbox\else\leavevmode\null\fi
  \bgroup \MicroFont
  \let\do\do@noligs  \verbatim@nolig@list
  \let\do\@makeother \dospecials 
  \catcode32 10 
  \dobackslash \dobraces \makestarlowast 
  \@jfverb 
}% 
\def\@jfverb #1{\catcode`#1\active
                \lccode`\~`#1\lowercase{\def~{\egroup\unskip}}}%
% (\unskip ajouté le 14 octobre)
% \lowast est défini plus loin
\begingroup
   \lccode`\~=`\*
\lowercase{%
\endgroup
\def\makestarlowast {\catcode`\*\active\let~\lowast}}%
\makeatother
%
\usepackage{txfonts}


% -start- font adjustment 2013




\DeclareFontFamily{T1}{txtt}{\hyphenchar\font 45\relax}
\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%
}{}
% ---- /added scale factor 2023
\DeclareFontShape{T1}{txtt}{bx}{n}{ %bold extended
     <->s*[.96] t1xbtt%
}{}
% The above s*[.96] added 2023/01/18, next two untested
\DeclareFontShape{T1}{txtt}{bx}{sc}{    %bold extended cap & small cap
     <->s*[.96] t1xbttsc%
}{}
\DeclareFontShape{T1}{txtt}{bx}{sl}{    %bold extended slanted
     <->s*[.96] t1xbttsl%
}{}
% ---- /end of 2023 change
\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%
}{}
% -end- font adjustment 2013
% -start- font adjustment 2023
\DeclareFontFamily{T1}{txss}{}
\DeclareFontShape{T1}{txss}{m}{n}{	%medium
     <->s * [0.89]t1xss%
}{}
\DeclareFontShape{T1}{txss}{m}{sc}{	%cap & small cap
     <->s * [0.89]t1xsssc%
}{}
\DeclareFontShape{T1}{txss}{m}{sl}{	%slanted
     <->s * [0.89]t1xsssl%
}{}
\DeclareFontShape{T1}{txss}{m}{it}{	%italic
     <->ssub * txss/m/sl%
}{}
\DeclareFontShape{T1}{txss}{m}{ui}{   	%unslanted italic
     <->ssub * txss/m/sl%
}{}
\DeclareFontShape{T1}{txss}{bx}{n}{	%bold extended
     <->s * [0.89]t1xbss%
}{}
\DeclareFontShape{T1}{txss}{bx}{sc}{	%bold extended cap & small cap
     <->s * [0.89]t1xbsssc%
}{}
\DeclareFontShape{T1}{txss}{bx}{sl}{	%bold extended slanted
     <->s * [0.89]t1xbsssl%
}{}
\DeclareFontShape{T1}{txss}{bx}{it}{	%bold extended italic
     <->ssub * txss/bx/sl%
}{}
\DeclareFontShape{T1}{txss}{bx}{ui}{  	%bold extended unslanted italic
     <->ssub * txss/bx/sl%
}{}
\DeclareFontShape{T1}{txss}{b}{n}{	%bold
     <->ssub * txss/bx/n%
}{}
\DeclareFontShape{T1}{txss}{b}{sc}{	%bold cap & small cap
     <->ssub * txss/bx/sc%
}{}
\DeclareFontShape{T1}{txss}{b}{sl}{	%bold slanted
     <->ssub * txss/bx/sl%
}{}
\DeclareFontShape{T1}{txss}{b}{it}{   	%bold italic
     <->ssub * txss/bx/it%
}{}
\DeclareFontShape{T1}{txss}{b}{ui}{   	%bold unslanted italic
     <->ssub * txss/bx/ui%
}{}
% -end- font adjustment 2023

\usepackage{xspace}
% added svgnames 2022/08/26 on occasion of transfer from xint colouring scheme
\usepackage[dvipsnames,svgnames]{xcolor}
\usepackage{graphicx}
\usepackage[inline]{enumitem}
\usepackage{array}
\usepackage{longtable}

\definecolor{joli}{RGB}{225,95,0}
\definecolor{JOLI}{RGB}{225,95,0}
\definecolor{BLUE}{RGB}{0,0,255}
\colorlet{niceone}{green!35!blue!75}

\usepackage {babel} % ngerman and english options have been passed to babel
\AtBeginDocument {
  \renewcommand\partname{Part}%
  \addto\captionsenglish {\renewcommand\partname{Part}}
}

\usepackage{tikz}
\usetikzlibrary{trees}    % added for "cyclic" grow function 2013/03/02

\usepackage{forest}[2015/05/04]



% 12 mars 2015, pour 1.08a, see http://tex.stackexchange.com/a/232584/4686
\usetikzlibrary{mindmap} 

\usepackage{hyperref}% I had used [pdfencoding=pdfdoc] until 1.09f
\hypersetup{%
linktoc=all,%
%%linktoc=none,% STRESS TEST OF 1.1a
%% bookmarksdepth=3,% (not needeed anymore now, 1.07g)
breaklinks=true,%
colorlinks,%   
linkcolor=RoyalBlue,% Orchid
urlcolor=OliveGreen,%
pdfauthor={Jean-François Burnol},% on peut y aller maintenant avec ç en 2022...
pdftitle={The etoc package},%
pdfsubject={Tables of contents with LaTeX},%
pdfkeywords={LaTeX, table of contents},%
pdfstartview=FitH,%
%%pdfpagemode=UseOutlines,% commented-out for 1.09h
}

% added usage of package bookmark 2013/10/10
\usepackage{bookmark} 

\usepackage{framed}
\usepackage{varioref}

\usepackage{etoc}  % loads multicol
% for etoc's own default line styles. <1.08b had \partname by default but this
% does not work well with babel+frenchb hence the default is now simply Part.
% Here we can use \partname as we do (did) the documentation for English or German.
% Careful with the customization of \partname done by scrdoc class! (obsolete remark)
\renewcommand{\etocpartname}{\partname}
% see the \AtBeginDocument with \addto\captionsngerman etc...


%--------
% 10 octobre 2013:
\AtBeginDocument{\addtocontents{toc}{\protect\hypersetup{hidelinks}}}

%--------
% add-ons for the new section `surprising uses of etoc' (2013/01/24)
\newcounter{visibletoc}
\renewcommand{\etocaftertitlehook}
   {\stepcounter{visibletoc}%
    \phantomsection
    \etoctoccontentsline{visibletoc}{\thevisibletoc}}
\etocsetlevel{visibletoc}{6}
\makeatletter
\newcommand*{\MyQuasiStandardTOC}[1]{%
  \begingroup
  \etocsetstyle{section}
    {}
    {\ifnum\etocthenumber=4 % <- check this if new sections added to user manual
      \etocsetstyle{subsection}
        {\par\nopagebreak\begingroup
         \leftskip1.5em \rightskip\@tocrmarg
         \parfillskip \@flushglue 
         \parindent 0pt
         \normalfont\normalsize\rmfamily\itshape
         \etocskipfirstprefix}
        {\allowbreak\,--\,}
        {\etocname\ \textup{(\etocnumber)}}
        {.\par\endgroup}%
     \else
        \etocsetstyle{subsection}
        {}%
        {}%
        {\l@subsection{\numberline{\etocnumber}\etocname}{\etocpage}}%
        {}%
     \fi
    }% prefix for section sets the style dynamically for subsections! 
     % direct usage of \l@subsection, \l@section allowed here since 1.1a
    {\l@section{\numberline{{\color{cyan}\etocthenumber}}\etocname}{\etocpage}}%
    {}%
  \etocstandarddisplaystyle
  \etocsetnexttocdepth {2}%
  \tableofcontents #1
  \endgroup
}
\makeatother
%--------
% Statistics on sections and subsections in a part \thispartstats:
% 2 mars 2013
% cette version utilise des box, plutôt que des macros.
% mais on ne peut plus alors changer de police etc...

% 11 octobre 2013, je retire les \color{teal}.

\newsavebox\firstnamei
\newsavebox\firstnumberi
\newsavebox\lastnamei
\newsavebox\lastnumberi
\newsavebox\firstnameii
\newsavebox\firstnumberii
\newsavebox\lastnameii
\newsavebox\lastnumberii
\newcounter{mycounti}
\newcounter{mycountii}

\newcommand*{\thispartstatsauxi}{}
\newcommand*{\thispartstatsauxii}{}
\newcommand*{\oldtocdepth}{}

\newcommand*{\thispartstats}{%
  \setcounter{mycounti}{0}%
  \setcounter{mycountii}{0}%
  \def\thispartstatsauxi{%
         \sbox{\firstnamei}{\footnotesize\etocname}%
         \sbox{\firstnumberi}{\footnotesize\etocnumber}%
         \def\thispartstatsauxi{}}%
  \def\thispartstatsauxii{%
         \sbox{\firstnameii}{\footnotesize\etocname}%
         \sbox{\firstnumberii}{\footnotesize\etocnumber}%
         \def\thispartstatsauxii{}}%
  \begingroup
  \etocsetstyle{subsection}
    {}
    {}
    {\thispartstatsauxii
     \stepcounter{mycountii}%
     \sbox{\lastnameii}{\footnotesize\etocname}%
     \sbox{\lastnumberii}{\footnotesize\etocnumber}}
    {}
  \etocsetstyle{section}
    {}
    {}
    {\thispartstatsauxi
     \stepcounter{mycounti}%
     \sbox{\lastnamei}{\footnotesize\etocname}%
     \sbox{\lastnumberi}{\footnotesize\etocnumber}}
    {{\footnotesize\itshape
      Here are some statistics for this part: it contains \arabic{mycounti}
      section\ifnum\value{mycounti}>1 s\fi{} and
      \arabic{mycountii} subsection\ifnum\value{mycountii}>1 s\fi. The name of
     the first section is 
     ``\unhbox\firstnamei{}'' and the corresponding number is 
     ``\unhbox\firstnumberi''. The name of the last section is 
     ``\unhbox\lastnamei{}'' and its number is
     ``\unhbox\lastnumberi''. 
     \ifnum\value{mycountii}>0 The name of
     the first subsection is 
     ``\unhbox\firstnameii{}'' and the corresponding number is 
     ``\unhbox\firstnumberii''. The name of the last subsection is 
     ``\unhbox\lastnameii{}'' and its number is
     ``\unhbox\lastnumberii''.\fi
     \par}}
  \etocinline 
% october 10, 2013. 
  \etocsetnexttocdepth {2}%
  \etocsettocstyle {\pdfbookmark[1]{Statistics}{\thepart.STATS}}{}
  \localtableofcontents
  \endgroup
}
%%
% pour les TOC à la TikZ
\newtoks\treetok
\newtoks\parttok
\newtoks\sectiontok
\newtoks\subsectiontok
\newtoks\tmptok

\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
  #1\expandafter\expandafter\expandafter{\expandafter\the\expandafter #1#2}}

% 12 et 13 mars 2015 pour la mind map de title page
% pour les Mindmap avec branch color
\def\appendpart #1#2#3{% 
   \edef\tmpstuff {\the#1 child [branch color = #3]{\the#2}}%
   #1\expandafter {\tmpstuff }%
}
% for 1.09f mind map on title page
\def\prependpart #1#2#3{% 
   \edef\tmpstuff {child [branch color = #3]{\the#2} \the#1}%
   #1\expandafter {\tmpstuff }%
}

% Vendredi 13 mars 2015 à 18:10:40
% POUR LA TOC DE TITLE PAGE
\usepackage{eso-pic}
\usepackage{picture}

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


% hyperlinks to source code... added November 20, 2022
% works in sync with macrocode hacks explained after \StopEventually
% which were added in August 2022
% imported/adapted from code originally added to xint.dtx

% FINALLY, after many hesitations and great suffering with \marginpar
% I decide to simply divide the name into two parts and use two
% distinct hyperlinks, so as to not render the reading to painful.
\usepackage{xinttools}


% use a slightly different colour for second half?
% MEMO: we can change \ttfamily as hyperref uses a scope limiting group.
\DeclareRobustCommand\csb[1]{%
    \edef\nbmoitie{\the\numexpr\xintLength{#1}/2}%
    \ifcsname r@#1\endcsname
        \hyperref[#1]{\ttfamily\hyphenchar\font45 \char`\\ \xintKeepUnbraced{\nbmoitie}{#1}}%
        \ifcsname r@etocmacro-#1\endcsname
          \hyperref[etocmacro-#1]{\ttfamily\hyphenchar\font45 \xintTrim{\nbmoitie}{#1}}%
        \else
          % for .toc suffixed macros
          \ifcsname r@etocmacro-\xintTrimUnbraced{-4}{#1}\endcsname
            \hyperref[etocmacro-\xintTrimUnbraced{-4}{#1}]{\ttfamily\hyphenchar\font45 
                                                           \xintTrim{\nbmoitie}{#1}}%
          \else
            \hyperref[#1]{\ttfamily\hyphenchar\font45 \xintTrim{\nbmoitie}{#1}}%
          \fi
        \fi
    \else
        \textcolor{red}{\ttfamily\hyphenchar\font45 \char`\\ #1}%
    \fi
}

\DeclareRobustCommand\csa [1]
                {{\ttfamily\hyphenchar\font45 \char`\\ #1}}

\newcommand\cshyp[1]{\texorpdfstring{\csa{#1}}{\textbackslash #1}}

\newcommand\csbhyp[1]{\texorpdfstring{\csa{#1}}{\textbackslash #1}}

\DeclareRobustCommand\ctanpkg[1]
      {\texorpdfstring{\href{https://ctan.org/pkg/#1}{#1}}{#1}}

\newcommand\toc{\csb{tableofcontents}\xspace}
\newcommand\localtoc{\csb{localtableofcontents}\xspace}
\newcommand\localtocwrdp{\csb{localtableofcontentswithrelativedepth}\xspace}

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

\hyphenation{
table-of-con-tents
local-table-of-con-tents
local-table-of-con-tents-with-rel-a-tive-depth
}

\hyphenation{toc-depth sec-num-depth con-tents-line}

\hyphenation{etoc-stan-dard-lines
etoc-de-fault-lines
etoc-toc-lines
etoc-set-style
etoc-name
etoc-page
etoc-skip-first-pre-fix
etoc-num-ber
etoc-if-first
etoc-x-if-first
etoc-if-num-bered
etoc-x-if-num-bered
etoc-if-was-empty
etoc-x-if-was-empty
etoc-checks-empti-ness
etoc-no-toc-if-no-toc
etoc-the-name
etoc-the-num-ber
etoc-the-page
etoc-link
etoc-the-linked-name
etoc-the-linked-num-ber
etoc-the-linked-page
etoc-the-link
etoc-set-level
etoc-set-toc-depth
etoc-set-next-toc-depth
etoc-set-toc-depth
etoc-obey-toc-toc-depth
etoc-ig-nore-toc-depth
etoc-depth-tag
etoc-set-tag-depth
etoc-obey-depth-tags
etoc-ig-nore-depth-tags
etoc-toc-con-tents-line
etoc-set-local-top
etoc-stan-dard-dis-playstyle
etoc-ar-ti-cle-style
etoc-book-style
etoc-set-toc-style
etoc-mul-ti-col-style
etoc-mul-ti-col
etoc-lo-cal-mul-ti-col
etoc-toc-style
etoc-toc-style-with-marks
etoc-toc-style-with-marks-nouc
etoc-ruled-style
etoc-ruled
etoc-lo-cal-ruled
etoc-framed-style
etoc-framed
etoc-lo-cal-framed
etoc-in-line
etoc-af-ter-ti-tle-hook
etoc-af-ter-con-tents-hook
etoc-af-ter-toc-hook
etoc-skip-first-pre-fix
etoc-only-on-first
}

\hyphenation{ 
etoc-font-mi-nus-two 
etoc-font-mi-nus-one 
etoc-font-zero 
etoc-font-one 
etoc-font-two 
etoc-font-three 
etoc-sep-mi-nus-two 
etoc-sep-mi-nus-one 
etoc-sep-zero 
etoc-sep-one 
etoc-sep-two 
etoc-sep-three 
etoc-mi-nus-two-left-mar-gin 
etoc-mi-nus-two-right-mar-gin 
etoc-mi-nus-one-left-mar-gin 
etoc-mi-nus-one-right-mar-gin 
etoc-base-line-spread-mi-nus-two 
etoc-base-line-spread-mi-nus-one 
etoc-base-line-spread-zero 
etoc-base-line-spread-one 
etoc-base-line-spread-two 
etoc-base-line-spread-three 
etoc-toc-line-lead-ers 
etoc-ab-brev-page-name 
etoc-part-name 
etoc-book-name 
etoc-above-toc-skip 
etoc-be-low-toc-skip 
etoc-column-sep 
etoc-mul-ti-col-sep 
etoc-mul-ti-col-pre-tol-er-ance 
etoc-mul-ti-col-tol-er-ance 
etoc-de-fault-nb-col 
etoc-in-ner-top-sep 
etoc-top-rule 
etoc-top-rule-col-or-cmd 
etoc-in-ner-left-sep 
etoc-in-ner-right-sep 
etoc-in-ner-bot-tom-sep 
etoc-left-rule 
etoc-right-rule 
etoc-bot-tom-rule 
etoc-left-rule-col-or-cmd 
etoc-right-rule-col-or-cmd 
etoc-bot-tom-rule-col-or-cmd 
etoc-bkg-col-or-cmd 
etoc-framed-mp-hook
etoc-keep-orig-i-nal-table-of-con-tents
etoc-im-me-di-ate-set-toc-dep-th
etoc-im-me-di-ate-depth-tag
etoc-im-me-di-ate-toc-con-tents-line
etoc-im-me-di-ate-set-local-top
}

\hyphenation{next-toc-with-tags}
% removed, 2022/08/26
% \frenchspacing

\renewcommand\familydefault\sfdefault

% for illustration only. Not to be recommended in general.
\setcounter{secnumdepth}{4}

% Vendredi 16 septembre 2016
% pour rendre accessibles les exemples
% Fait package filecontentsdef le Samedi 17.
\usepackage{filecontentsdef}

%\ifnum\Withdvipdfmx=1
%% I have an issue that with \thesubsection or \the\value{section} in code
%% snippet filename, the file is not correctly attached, it appears in the pdf
%% interface but with a wrong filename and one can not obtain the file from
%% the pdf (tested on Acrobat Reader 11 Vendredi 16 septembre 2016).
%  \usepackage[dvipdfmx]{attachfile2}
%\else
  \usepackage{attachfile}% no op with dvipdfmx
%\fi
% 
\def\CEST{+02'00'}\def\CET{+01'00'}
\def\ExtractDateStamp #1<#2-#3-#4 at #5:#6:#7 #8>%
    {D:#4#3#2#5#6#7\csname#8\endcsname}
\edef\DateForSamples {\expandafter\ExtractDateStamp\etocdtxtimestamp}
\attachfilesetup{%icon=Paperclip,% attention Paperclip pas PaperClip !!
                 mimetype=application/x-tex,
                 %appearance=false,
%                 author={Jean-François Burnol},
%                 author={\pdfescapestring{Jean-François Burnol}},
% TODO: resolve this at some point in my future life
                 author={Jean-Francois Burnol},
% doing this has fixed the date shown in Acrobat annotation panel
% but now some strange seemingly unrelated date is printed in
% the "Comment panel"
                 created=\DateForSamples,
                 modified=\DateForSamples,
% allright this one next sets the dates shown in the "Comment Panel",
% whereas the above two (or only modified) impacts the panel of
% annotations on the left in my (very old) Adobe Reader.  Not yet
% tested with evince
                 date=\DateForSamples
                 }%

\colorlet{etocsnippet}{blue}
\newcommand\marginattach[1]{% #1 is from some legacy mark-up and is ignored
  \noindent Depending on your PDF viewer\normalmarginpar
% syntaxe pénible n'y-a-t-il pas un moyen plus commode
% j'hésite à tester \value{page}
  \marginpar
  [% left
   {\hfill
   \textattachfile[description={in section \the\value{section}}]%
                  {etocsnippet-\snippetno.tex}%
                  {\textcolor{etocsnippet}{etocsnippet-\snippetno.tex}}%
   }%
  ]%
  {% right
   \textattachfile[description={in section \the\value{section}}]%
                  {etocsnippet-\snippetno.tex}%
                  {\textcolor{etocsnippet}{etocsnippet-\snippetno.tex}}%
   \hfill
  },
  clicking on the margin filename may allow to extract it.%
  \stepcounter{snippet}%
}
% Sadly, on non-attachement supporting viewers such as Skim.app,
% the filename is not even searchable : entering "etocsnippet"
% in the PDF viewer search form does not find the margin texts.

% But I did not want to add to the filename the section number,
% or perhaps even the page number (which could have been perilous
% and I did not want to have to test and experiment, as I have
% done enough for today with these code snippets).

% In Acrobat the description field gives rise to some "tooltip"
% display on hover, which displays the description field.

\newcounter{snippet}%[section]
\stepcounter{snippet}
\makeatletter
\newcommand\snippetno{%
  \ifnum\value{snippet}<10 0\fi\the\value{snippet}%
%%%  emulating former manual mark-up (with reset at each section) but I drop this
%%%  \ifnum\value{snippet}>0 -\@Alph{\numexpr\value{snippet}+\@ne\relax}\fi
}
\makeatother
%\usepackage{layout}

\usepackage{ragged2e}
\begin{document}%\normalmarginpar\layout %marginparwidth is 96pt
\marginparsep 6bp
\rmfamily
\thispagestyle{empty}

% START ENGLISH VERSION
\bookmark[named=FirstPage,level=1]{Title page}

\begingroup
\newcount\tikznumberofcurrentgrandchild
\newcount\tikzdeltaofcurrentgrandchild
%\newcount\tikzoffset
% copié de http://tex.stackexchange.com/a/232914
% THIS WAS NOT USED FOR 1.08a--1.09e RELEASES AND IS NOW AGAIN USED AT 1.09f,
% BUT IS MANUALLY ADJUSTED TO HANDLE ESPECIALLY THE "Surprising" 
% (now rather "Examples") AND "Tip" PARTS
% AND FALL-BACK FOR THEM TO CIRCULAR GROWTH FUNCTION
% hence stuff is hard-coded and interacts with other hard-coded things
% further down; in particular with the configuration of depth tags,
% here all sections are included (except the first two, "Foreword" and "License",
% which are not in any part).
% But etoc documentation is not likely to receive new sections soon.
\def\tikzmycustomgrowth {%
    \pgftransformreset
    \ifnum\tikztreelevel=1
        \pgftransformrotate{-65.4545+((\pgfkeysvalueof{/tikz/sibling angle})*(1+\tikznumberofcurrentchild)}%
        \pgftransformxshift{\the\tikzleveldistance}%
    \fi
    \ifnum\tikztreelevel=2
    % hard-coded section numbers for branching
    % il y a un décalage de 3 avec les numéros de sections numérotées
      \if1\ifnum\tikznumberofcurrentgrandchild>2
          \ifnum\tikznumberofcurrentgrandchild<6  0%
            \else
          \ifnum\tikznumberofcurrentgrandchild>20  % était 21 mais
                                % \etocsetlocaltop déplacé
          \ifnum\tikznumberofcurrentgrandchild<27 0% était 28 mais
                                % \etocsetlocaltop déplacé
            \else
          \ifnum\tikznumberofcurrentgrandchild>50  % était 51
          \ifnum\tikznumberofcurrentgrandchild<58 0%
          \fi\fi\fi\fi\fi\fi
         1%
        % ceci correspond aux sections qui seront sur le bord rectangulaire
        % le "9+" choisi manuellement jusqu'à obtenir quelque chose de bien
        \pgfmathsetmacro\tikzoffsetofcurrentchild{(\tikzsiblingdistance)*(7+\tikznumberofcurrentgrandchild
          +\tikzdeltaofcurrentgrandchild)}%
        \ifdim\tikzoffsetofcurrentchild pt<\tikzlevelheight
            \pgftransformxshift{\tikzlevelwidth/2}
            \pgftransformyshift{-\tikzlevelheight/2+\tikzoffsetofcurrentchild}
        \else
        \pgfmathsetmacro\tikzoffsetofcurrentchild{\tikzoffsetofcurrentchild-\tikzlevelheight}%
        \ifdim\tikzoffsetofcurrentchild pt<\tikzlevelwidth
            \pgftransformxshift{\tikzlevelwidth/2-\tikzoffsetofcurrentchild}
            \pgftransformyshift{\tikzlevelheight/2}
        \else
        \pgfmathsetmacro\tikzoffsetofcurrentchild{\tikzoffsetofcurrentchild-\tikzlevelwidth}%
        \ifdim\tikzoffsetofcurrentchild pt<\tikzlevelheight
            \pgftransformxshift{-\tikzlevelwidth/2}
            \pgftransformyshift{\tikzlevelheight/2-\tikzoffsetofcurrentchild}
        \else
        \pgfmathsetmacro\tikzoffsetofcurrentchild{\tikzoffsetofcurrentchild-\tikzlevelheight}%
        \ifdim\tikzoffsetofcurrentchild pt<\tikzlevelwidth

            \pgftransformxshift{-\tikzlevelwidth/2+\tikzoffsetofcurrentchild}
            \pgftransformyshift{-\tikzlevelheight/2}
        \else
        \pgfmathsetmacro\tikzoffsetofcurrentchild{\tikzoffsetofcurrentchild-\tikzlevelwidth}%
        %\ifdim\tikzoffsetofcurrentchild pt<\tikzlevelheight
            \pgftransformxshift{\tikzlevelwidth/2}
            \pgftransformyshift{-\tikzlevelheight/2+\tikzoffsetofcurrentchild}
        %\fi
        \fi\fi\fi\fi
      \else
        % les sections spéciales pas mises sur bord rectangulaires mais à
        % distance constante du parent
        % NEW BRANCH ADDED AT 1.09f
        \ifnum\tikznumberofcurrentgrandchild<6
          \tikzset{level distance=8cm}% TikZ est tout de même assez génial dans l'interface
        \fi
        \pgftransformrotate {\ifnum\tikznumberofcurrentgrandchild<6 -12
                             \else\ifnum\tikznumberofcurrentgrandchild<27 180
                             \else0\fi\fi +
                             \pgfkeysvalueof{/tikz/sibling angle}*\tikznumberofcurrentgrandchild}%
        \pgftransformxshift {\the\tikzleveldistance}%
        \ifnum\tikznumberofcurrentgrandchild=5
          \global\advance\tikzdeltaofcurrentgrandchild by-3
        \fi
        \ifnum\tikznumberofcurrentgrandchild=26 % était 27 mais déplacement \etoclocaltop
          \global\advance\tikzdeltaofcurrentgrandchild by-6
        \fi
        \ifnum\tikznumberofcurrentgrandchild=57
          \global\advance\tikzdeltaofcurrentgrandchild by-7 % était -6
        \fi
      \fi
      \global\advance\tikznumberofcurrentgrandchild by1
    \fi
}

%version circulaire utilisée avec les versions 1.08a--1.09e du manuel.
% \def\tikzmycustomgrowth {%
%   \pgftransformreset
%   \ifnum\tikztreelevel=1
%     \pgftransformrotate {126+(\pgfkeysvalueof{/tikz/sibling angle})*(\tikznumberofcurrentchild-1)}%
%   \fi
%   \ifnum\tikztreelevel=2
%     \pgftransformrotate {(\pgfkeysvalueof{/tikz/sibling angle})*(2+\tikznumberofcurrentgrandchild)}%
%     \global\advance\tikznumberofcurrentgrandchild by 1
%  \fi
%  \pgftransformxshift {\the\tikzleveldistance}%
% }

\newcounter{partco}
% 1,2,3,4,5,... -> 1,2,3,1,2,3,1,2,3
\def\pseudomodthree #1{\numexpr #1 + 3 - 3*((#1+1)/3)\relax}

% For etoc.toctree file was used to test the Mind map separately
%\newwrite\TOCasTree

\newbox\TitlePageMindmapTOC


\etocsetstyle{part}
  {\etocskipfirstprefix}
  {\ifcase\pseudomodthree{\value{partco}}%
   \or  \appendpart\treetok\parttok {teal!30}%   first (60 avant 1.09f)
   \or  \appendpart\treetok\parttok {yellow!80}% second
   \else\appendpart\treetok\parttok {green!50}%  third
   \fi
   }
  {\stepcounter{partco}%
   \edef\treenode{node
                  {\noexpand\textbf{\etocifnumbered{\unexpanded\expandafter{\etocthelinkednumber}.}{}
                   \unexpanded\expandafter{\etocthelinkedname}}}}%
   \parttok\expandafter{\treenode}}
  {% 1.09f prepends...
   \ifcase\pseudomodthree{\value{partco}}%
   \or  \prependpart\treetok\parttok {teal!30}%   first (60 avant 1.09f)
   \or  \prependpart\treetok\parttok {yellow!80}% second
   \else\prependpart\treetok\parttok {green!50}%  third
   \fi
   }

\etocsetstyle{section}
  {}
  {}
  {% define the section node
   \edef\childnode{child {node
       {\noexpand\itshape\noexpand\bfseries
        \unexpanded\expandafter{\etocthelinkedname}\hfil\break
         p. \unexpanded\expandafter{\etocthelinkedpage}}}
                        }%
   \appendtotok\parttok\childnode 
   }
  {}

\etocsetnexttocdepth{section}

% title page toc
% 1.09f uses a prepend for last part so we need to delay
% start of tree construction in \treetok
\treetok{}
\makeatletter
\etocsettocstyle
  {\setcounter{partco}{0}%
   }
  {%
   \toks@{\node [root concept]{\normalfont{The \etoc package}\par {\normalsize\textsc
    {Jean-François Burnol}\par \ttfamily jfbu (at) free (dot) fr}\par
    {\normalsize Package version:\par \etocpkgversion{} (\etocpkgdate )\par}}%
   }%
   \global\treetok\expandafter\expandafter\expandafter{\expandafter\the\expandafter\toks@\the\treetok;}%
  }

% depth tags for title page toc
\etocsettagdepth {preamble}{section}
\etocsettagdepth {overview}{section}
\etocsettagdepth {arbitrarily}{section}
\etocsettagdepth {examples}{section}
\etocsettagdepth {surprising}{section}
\etocsettagdepth {linestyles}{section}
\etocsettagdepth {globalcmds}{section}
\etocsettagdepth {custom}{section}
\etocsettagdepth {tips}{section}
\etocsettagdepth {etocandworld}{section}
\etocsettagdepth {code}{all}

% fill in the \treetok
\etocinline\tableofcontents\label{toc:mindmaptitlepage}

% \immediate\openout\TOCasTree=\jobname.toctree
% \immediate\write\TOCasTree{\the\treetok}%


\tikzset {branch color/.style={concept color=#1!white,
                               every child/.append style={concept color=#1!white!30!white,
                                                          opacity=0.3, text opacity=1},
                             },
% ajout pour version de 1.08g
          level width/.store in=\tikzlevelwidth,
          level height/.store in=\tikzlevelheight
         }%

\global
\setbox\TitlePageMindmapTOC\hbox {%
\resizebox{\dimexpr\paperwidth-1cm\relax}!{%
\begin{tikzpicture}[mindmap,
                    text width=2cm,
                    align = flush center,
% pour 1.09 je reviens à version circulaire simplifiée
% pour 1.09f je reviens à version rectangulaire
                    growth function=\tikzmycustomgrowth,
                    nodes={concept},
                    concept color=orange!60,
                    % root concept/.append style={font=\huge, text width = 6cm},
                    root concept/.append style={font=\Large, text width = 5cm},
                    % level 1/.append style={level distance=7cm, sibling
                    level 1/.append style={level distance=6cm,
                                           sibling angle=360/11},% une partie de plus
                    % level 1 concept/.append style={font=\Large, text width = 3cm},
                    % ancienne version circulaire
                    % level 2/.append style={level distance=12.5cm, sibling angle=360/39},% 
        % pour version rectangulaire, par tâtonnements:
        % réactivée pour 1.09f (étonnamment, juste quelques petits ajustements, mais ça
        % a tout de même pris pas mal de temps...)
        level 2/.append style={level width=21cm,
                               level height=30cm,
                               sibling distance=2.22cm,% ajusté à la
                                                       % main... dépend de ce qui qu'on conserve par
                                                       % les depth tags...
                               % 1.09f pour essayer certaines parties en circulaire
                               level distance=10cm,% DISTANCE DEPUIS LE CENTRE !
                               sibling angle=12,% ajusté manuellement
                               },
        level 2 concept/.append style={text width=2cm},
                   ]
\the\treetok
\end{tikzpicture}%
}%
}% end of \hbox
\endgroup% fin de la défintion de la mind map pour la page de titre

\noindent\null\par\vskip-5cm\hbox{\hypertarget{FRONTPAGE}{}}\vskip5cm

% On l'envoie au shipout
\AddToShipoutPictureFG*{\put(.5\paperwidth,.5\paperheight)
                        {\makebox(0,0){\box\TitlePageMindmapTOC}}}

\clearpage

\etocdepthtag.toc {preamble}

%----
% MAIN TOC
%
\etocsettocdepth {subsubsection}
\etoctoclines
\etocmarkboth\contentsname
\etocmulticolstyle[1]
     {\noindent 
      \bfseries\Large
      \leaders\hrule height1pt\hfill
      TABLE OF CONTENTS\let\thefootnote\empty
 \footnote{Documentation (\etocdocdate) generated from the source file
  with timestamp ``\etocdtxtimestamp''.}\setcounter{footnote}{0}%
}

\pdfbookmark[1]{Table of contents}{MAINTOC}%
      
%\begin{framed}
\begingroup\footnotesize\itshape
  Starting with 1.08h, about 25 code samples (especially the longer ones)
  are incorporated into the PDF file (thanks to \textsc{Scott
    Pakin}'s \href{http://www.ctan.org/pkg/attachfile}{attachfile} package) as
  \textbf{file attachement annotations}. Each file is represented by its
  filename in the margin after the verbatim rendering of the corresponding
  code.  Clicking on this filename will on supporting viewers trigger some
  dialog for extracting the file, or perhaps even will extract it
  automatically and open it in some text editor.  This is much better than
  copy-paste which often loses indentation.
At 1.09h the formerly used icon in the text body has been replaced by the
filename itself, placed in the page margin.

  In some PDF viewers side panels may provide a convenient clickable list of
  all these \textbf{attachments annotations}.

\endgroup
%\end{framed}
% https://helpx.adobe.com/acrobat/using/comments.html

% I move colours mostly used only after stopeventually
\definecolor{etocnamecolor}{RGB}{228,57,0}
\colorlet{verbcolor}{Maroon}
\colorlet{privatecommentcolor}{cyan}
\colorlet{macrocodecommentcolor}{gray}
\colorlet{macrocodenewmacrocolor}{verbcolor}
\colorlet{macrocodelinktouserdoccolor}{etocnamecolor}% and bold face
\colorlet{macrocodelinktosectioncolor}{DarkBlue}% and bold face
\colorlet{macrocodelinktocodelinecolor}{Blue}
\colorlet{macrocodenoncscolor}{Green}

%\ifnum\NoSourceCode=0
\begin{framed}
  Throughout the documentation the command names displayed
  {\textcolor{RoyalBlue}{with this colour}} are doubly hyperlinked: the left
  half of the name links to the user documentation, the second half links to
  the source code.  You can try it out now: \csb{localtableofcontents}.  But
  read this first: if you get lost inside the source code, clicking on control
  sequences displayed {\textcolor{macrocodelinktouserdoccolor}{with this
      colour}} brings you back to the part of the user manual discussing that
  specific command. \ifnum\NoSourceCode=1 (but this PDF does not include the source code)\fi
\end{framed}
%\fi

\begingroup
  \etocsetlevel{subsection}{3}
  \etocsetlevel{subsubsection}{6}
  \tableofcontents \label{toc:main}
\endgroup

% ATTENTION Vendredi 09 septembre 2016 à 21:46:51
\clearpage

% refactoring 2022/08/30 via ajout de ce \part* et déplacement de l'abstract
% pour avoir une TOC mindmap plus complète
\part*{\etoc}
\addcontentsline{toc}{part}{\etoc}

\phantomsection\addcontentsline{toc}{section}{\abstractname}

\begin{abstract}
  The \etoc package gives to the user complete control on how
  the entries of the table of contents should be constituted
  from the \emph{name}, \emph{number}, and \emph{page number}
  of each sectioning unit. This goes via the definition of
  \emph{line styles} for each sectioning level used in the
  document. The package provides its own custom line styles.
  Simpler ones are given as examples in the documentation. The
  simplest usage will be to take advantage of the layout facilities
  of packages dealing with list environments.
  
  Regarding the \emph{global toc display}, \etoc provides pre-defined styles
  based on a multi-column format, with, optionally, a ruled title or framed
  contents.

  The \toc command may be used arbitrarily many times%
%
\footnote{\label{etockeeporiginaltableofcontents}%
  If \csb{etockeeporiginaltableofcontents} is issued in the preamble
  after package loading, then \toc keeps the non-\etoc meaning and one must
  use \csb{etoctableofcontents} in its place to get the \etoc features. This
  was added to fix a compatiblity issue with \ctanpkg{listings}'s
  \texttt{\string\lstlistoflistings}, as it needs the
  \texttt{\string\tableofcontents} macro to keep its original meaning.}
%
 and it
  has a variant \csa{localtableofcontents} which prints tables of contents
  `local' to the current surrounding document unit. An extension of the
  \csa{label}/\csa{ref} syntax allows to reproduce (with another layout) a local
  table of contents defined somewhere else in the document.

  Via ``depth tags'', one gets an even finer control for each table of contents
  of which sectioning units it should, or not, display.

  The formatting inherited (and possibly customized by other
  packages) from the document class will be used when in
  \emph{compatibility mode}.

  The assignment of levels to the sectioning units can be changed at any
  time, and \etoc can thus be used in a quite general manner to
  create custom ``lists of'', additionally to the tables of contents
  related to the document sectioning units. No auxiliary file is used
  additionally to the standard |.toc| file.
\end{abstract}

\section{Foreword}

%\ifnum\NoSourceCode=0
\begin{framed}
  Throughout the documentation the command names displayed
  {\textcolor{RoyalBlue}{with this colour}} are doubly hyperlinked: the left
  half of the name links to the user documentation, the second half links to
  the source code.  You can try it out now: \csb{localtableofcontents}.  But
  read this first: if you get lost inside the source code, clicking on control
  sequences displayed {\textcolor{macrocodelinktouserdoccolor}{with this
      colour}} brings you back to the part of the user manual discussing that
  specific command. \ifnum\NoSourceCode=1 (but this PDF does not include the source code)\fi
\end{framed}
%\fi

Popular packages dealing with TOCs include \ctanpkg{tocloft}, \ctanpkg{titletoc}
and \ctanpkg{minitoc}. Why another one? I started \etoc
for my own use, and found out only later about these mentioned
packages.

As is well explained in the \ctanpkg{tocloft} package documentation,
the standard \LaTeX{} layout for the Table of Contents is
buried in the class definitions. In particular, most of the
lengths therein are hardcoded, and the only way for the user
to change them is to recopy the class definitions into the
document and then change them to obtain what is desired
(within suitable \csa{makeatletter} and \csa{makeatother}).
The more reasonable alternative is to use a dedicated package such as
\ctanpkg{tocloft} or to use another flexible document class.

However, although now things are hopefully not hard-coded, one
still has to go through the package or class interface. This
means one has to memorize a (possibly large) number of macros
which will serve only to this task, and one will always be
constrained to customizing one initially given layout.

The spirit of \etoc is something else. The user will deal with
the \emph{name}, the \emph{number} and the \emph{page number}
corresponding to each document sectional division (and
found in a line of the |.toc| file) in a completely arbitrary
manner: they are made available via the \csb{etocname},
\csb{etocnumber}, and \csb{etocpage} commands. 

\etoc appears to be (at least partially) compatible with the
|article|, |book|, |report|, \ctanpkg{scrartcl}, \ctanpkg{scrbook}, \ctanpkg{scrreprt} and
\ctanpkg{memoir} classes. 

\section{License}

\begingroup\ttfamily\small\hyphenchar\font -1
           \parindent0pt 
           \obeyspaces\obeylines %
\etocLicense\endgroup


\clearpage

\etocsettocdepth {subsection}

\etocdepthtag.toc{overview}

\part{Overview}\label{part:overview}

\thispartstats

\invisiblelocaltableofcontents \label{toc:overview}

\section{Do I need to be a geek to use \etoc?}

Not quite. The simplest way is to use |enumerate| environments,
with the customizing facilities of packages such as
\ctanpkg{enumitem}, to
display the data fetched by \etoc from the |.toc| file. The data
consists of the \emph{name} (\csb{etocname}), \emph{number}
(\csb{etocnumber}), and \emph{page number} (\csb{etocpage}) as
extracted
% \footnote{although \LaTeX{} has been promoted as
%   separating contents from form, there are some areas where its
%   real implementation is very far from this ideal. And the |.toc|
%   file is a case in point; not to mention the hard-coded
%   dimensions, with use of the @ sign,
%   in the macros responsible for constructing the typeset table of
%   contents.} 
from the |.toc| file.

This is
illustrated \hyperref[toc:a]{at the start} of
\autoref{part:linestyles}. More
sophisticated examples would use more sophisticated |enumitem|
options. One may say then that again the user has to memorize some
customizing! indeed, but the syntax and option names to memorize
are in no way related only to matters of tables of contents, hence
an economy of use of the poor brain.

% People who
% know the internals of \LaTeX2e well (which is not my case) could
% happily use directly a |\list| command;  

Next in ease of use, perhaps, is the method explained
\hyperref[sec:firstexample]{later in this part}
(\autoref{sec:firstexample}). For this some knowledge of |\leftskip|,
|\rightskip|, etc... is necessary. And a slight elaboration of this
method, whose code is to be found in \autoref{ssec:tocwithdepthtags},
allows to mimick very well, if so desired, the standard looks. An even
closer emulation of the |book| class design is now included in this
documentation as \autoref{sec:thirdexample}.

As will be amply illustrated in this manual, \etoc is quite
versatile (especially as it allows to re-define at any point in
the document the hierarchy of sectioning units) and one can
achieve surprising effects with it: \autoref{part:surprising} is
devoted to this, and some more is to be found in
\autoref{part:tipsandtricks}.

\begin{framed}
\setcounter{mycounti}{0}%
  \etocinline
\etocsetlevel{part}{1}
\etocsetlevel{chapter}{1}
\etocsetlevel{visibletoc}{0}
\etocsetstyle{visibletoc}
    {}
    {\stepcounter{mycounti}}
    {}
    {}
\etocsettocstyle{}{}
\etocsetnexttocdepth{0}
\tableofcontents
A very important aspect of \etoc is that it is geared towards making many TOCs
in the same document, \emph{using only one} |.toc| \emph{file}! The present
documentation contains \arabic{mycounti} visible tables of contents (and a few
invisible ones) and uses only one |.toc| file!\footnotemark{} So one should
think 
twice before adding manually extra commands to the |.toc| file (see
\autoref{sec:addingtotoc}).
\end{framed}

\footnotetext{and the counting itself has been achieved by a table of contents
  which was inserted in the framed paragraph! \dots the technique for this kind
  of effect will be explained later.}


\subsection{Limitations in the use of list environments for
  tables of contents}
\label{ssec:limitations}

There are some limitations to the use of list environments
for typesetting TOCs. One of them is intrinsic to the scope
limitations created by the groups associated to the
environments: the |.toc| file
may contain, besides the information to be typeset in the
TOCs, some other commands, such as language changing
commands, which do not expect to see their scope limited in
this way inside a group (\LaTeX's environments create scope limiting groups).

Therefore the built-in ``line styles'' proposed by \etoc as an example
(and which are illustrated\footnote{with a twist, subsections having
  been downgraded to the subsubsection style\dots} by the
\hyperref[toc:main]{main table of contents} in this document) do not
make use of environments. Actually, in this user manual, only the
\hyperref[toc:a]{table of contents} at the start of
\autoref{part:linestyles}, the \autoref{toc:allsubsections} (which is a
TOC!) and examples from \autoref{etocthelink} have their line
styles expressed in terms of enumerate or itemize environments.

\section{Line styles and toc display style}

A distinction shall be made between the \emph{line styles},
\emph{i.e.} the way the name, number and page numbers are
used at each level, and the \emph{toc display style} (for
lack of a better name) which tells how the title should be
set, whether an entry in the |.toc| file should be made,
whether the contents should be typeset with multiple columns,
etc... the latter is governed by the command
\csb{etocsettocstyle} (or some higher-level commands) and the
former by the command \csb{etocsetstyle}.


\subsection{\csbhyp{etocsetstyle} for the line styles}

The command to inform \etoc of what to do with \csb{etocname}, \csb{etocnumber},
and \csb{etocpage} is called \csb{etocsetstyle}. It has five mandatory
arguments. The first one is the name of the sectional unit: a priori known names
are |book|, |part|, |chapter|, |section|, |subsection|, |subsubsection|,
|paragraph|, and |subparagraph|, and any other name can be declared and assigned
to a (numeric) level via the \csb{etocsetlevel} command.\footnote{under the
  \texttt{memoir} class, \etoc knows \texttt{appendix} as a sectioning
  name.} 

The four other arguments of \csb{etocsetstyle} specify: 1) \emph{what to do when
  this level is first encountered, down from a more general one,} then 2) \& 3)
(two arguments, a `prefix' and a `contents') \emph{what to do when a new entry
  of that type is found,} and 4) \emph{the last argument is the code to execute
  when a division unit of higher importance is again hit upon.}

\subsection{\csbhyp{etocsettocstyle} for the toc display}

The \csb{etocsettocstyle} command allows to specify what
should be done before and after the line entries of the TOC
are typeset, and in particular how the title should be
printed. It has two arguments, the first one is executed
before the TOC contents (typically it will print
``Contents'' and define suitable marks for the page headings) and
the second is executed after the TOC contents.

\etoc provides four (customizable) higher level toc styles:
\csb{etocmulticolstyle}, \csb{etoctocstyle},
\csb{etocruledstyle}, and \csb{etocframedstyle}. All use the
\ctanpkg{multicol} package with a default of two columns
(single-column mode is obtained with the optional argument |[1]|).

These commands must be followed either by \toc or \localtoc.

\subsection{Compatibility mode}\label{subs:compat}
\label{etoctoclines}
\label{etocstandardlines}

Both for the ``line styles'' and the ``toc display style'', \etoc defaults to
a compatibility mode which uses the defaults from the document
class.%
%
\footnote{\label{fn:compat}for the ``toc display style'' \etoc checks if it knows the class,
  and then uses emulation code which was added manually to its source, and
  if not it defaults to the |article| class layout.  No automated way to recover
  the global toc display for arbitrary document classes is implemented. But \etoc
  will detect if \ctanpkg{tocloft} has customized the TOC title.}
%
This can always be re-activated by:\\
% \makebox[5.2cm][l]{\csb{etocstandardlines}}
% |% `line entries' as without \usepackage{etoc}|\\
% \makebox[5.2cm][l]{\csb{etocstandarddisplaystyle}}
% |% `toc display' as without \usepackage{etoc}|
\csb{etocstandardlines}\hfill
|% `line entries' as without \usepackage{etoc}|\\
\csb{etocstandarddisplaystyle}\hfill
|% `toc display' as without \usepackage{etoc}|


If the command \csb{etocsetstyle} has \emph{not been used in the
preamble} the package will be at |\begin{document}| in this
  compatibility mode: hence just adding \csa{usepackage\{etoc\}}
  should hopefully not change anything to the look of a
  previously existing document, under the |article|, |book|,
  |report|, \ctanpkg{scrartcl}, \ctanpkg{scrbook}, \ctanpkg{scrreprt} and \ctanpkg{memoir}
  classes.

  Any use of \csb{etocsetstyle} in the \emph{preamble or body} of
  the document turns off from that point on the compatibility mode
  for line styles, but maintains the compatibility mode for the
  TOC title. One re-activates the compatibility mode for line
  styles with \csb{etocstandardlines}; and 
  \csb{etoctoclines} will re-activate the line styles as defined
  with the help of \csb{etocsetstyle}, if their scope was not
  limited to a group or environment.

  The command \csb{etocdefaultlines} sets the line styles to custom ones
  pre-defined internally by \etoc and described in
  \autoref{etocdefaultlines}.

Even if \csb{etocsetstyle} has been used, the global display style
remains initially as defined by the document class or the
\ctanpkg{tocloft} package (but see footnote\footref{fn:compat}); one needs to use the command
\csb{etocsettocstyle} or its variants to exit from this
compatibility mode at the ``toc display style'' level. It will be
re-activated if use if made of \csb{etocstandarddisplaystyle}.

See further \autoref{sec:anothercompat}.

\section{A first example}
\label{sec:firstexample}
\label{invisiblelocaltableofcontents}

Let us present a first example of specification for line styles.
Immediately after the start of \autoref{part:overview} we inserted in the
source file:
\centeredline{\csb{invisiblelocaltableofcontents} |\label{toc:overview}|} This
sets-up the label |toc:overview|, and we can use it at any location in the
document: \centeredline{|\tableofcontents \ref{toc:overview}|} And as we used
|\invisible...|,\footnote{this is a shortcut for setting temporarily the
  |tocdepth| to |-3|, which has the effect to tell \etoc not to print the TOC,
  and not even the heading.} the local TOC will exist only through its clones
elsewhere in the document. 

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begingroup\parindent 0pt \parfillskip 0pt \leftskip 0cm \rightskip 1cm
\etocsetstyle {section}
              {}
              {\leavevmode\leftskip 0cm\relax}
              {\bfseries\normalsize\makebox[.5cm][l]{\etocnumber.}%
               \etocname\nobreak\hfill\nobreak
               \rlap{\makebox[1cm]{\mdseries\etocpage}}\par}
              {}
\etocsetstyle {subsection}
              {}
              {\leavevmode\leftskip .5cm\relax }
              {\mdseries\normalsize\makebox[1cm][l]{\etocnumber}%
               \etocname\nobreak\hfill\nobreak
               \rlap{\makebox[1cm]{\etocpage}}\par}
              {}
\etocsetstyle {subsubsection}
              {}
              {\leavevmode\leftskip 1.5cm\relax }
              {\mdseries\normalsize\makebox[1cm][l]{\etocnumber}%
               \etocname\nobreak\hfill\nobreak
               \rlap{\makebox[1cm]{\etocpage}}\par}
              {}
\etocruledstyle[1]{\bfseries \Large My first \etoc: TOC of
  \autoref{part:overview} (\nameref{part:overview})}
\tableofcontents \ref {toc:overview}
\endgroup
\end{filecontentsdef}

\filecontentsexec\foo

We could have used the line styles defined by \etoc, with
\csb{etocdefaultlines}, or the default document class styles with
\csb{etocstandardlines}, but we were a bit more ambitious here and wanted to
design our own. The technique is a simple one: each heading is in its own
paragraph, which may extend on multiple lines; it is responsible for setting
its own |\leftskip|.

This is a simple design which does not make provisions for page breaks
which should be discouraged in-between a section and a subsection
etc\dots{} as we only used it for the table of contents of this part, thus
with sections as top levels, there was no need to specify a style for
parts too (we defined a subsubsection line style but as it turns
out there are no subsubsections in this part). The two commands used are
\csb{etocsetstyle} for specifying the line styles, and
\csb{etocruledstyle} for the TOC global style.

The |\rightskip| is shared by all, and creates space where the page
numbers get printed. For an elaboration of this technique see the next
\autoref{sec:secondexample} as well as \autoref{ssec:tocwithdepthtags}
which provides a TOC with parts and paragraphs. Both allow multi-line
headings and employ a technique for putting page numbers in the right margin
which was inspired from what \LaTeX2e's |\@dottedtocline| macro does.

Here is how it was produced:

\filecontentsprint\foo
\marginattach{}

\section{A second example}
\label{sec:secondexample}

This second example displays only the contents from
\autoref{part:linestyles} and \autoref{part:globalcmds}. This selection
is done via the technique of \emph{depth tags}, described in
\autoref{etocsettagdepth} and \autoref{ssec:tocwithdepthtags}. Its
layout is a bit like the one of the \hyperref[toc:main]{main document
  TOC}, although the line styles are coded very differently.

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begingroup
\newcommand*{\DotsAndPage}
{\nobreak\leaders\hbox{\bfseries\normalsize\hbox to .75ex {\hss.\hss}}%
         \hfill\nobreak
         \makebox[\rightskip][r]{\bfseries\normalsize\etocpage}\par}

\etocsetstyle {part}
{\parindent 0pt
 \nobreak
 \etocskipfirstprefix}
{\pagebreak[3]\bigskip}
{\large\rmfamily\bfseries\scshape\centering
 \etocifnumbered{Part \etocnumber{} -- }{}\etocname\par}
{}

\etocsetstyle {section}
{\leftskip 0pt \rightskip .75cm \parfillskip-\rightskip
 \nobreak\medskip
 \etocskipfirstprefix}
{\leftskip 0pt \rightskip .75cm \parfillskip-\rightskip
 \pagebreak[1]\smallskip}
{\normalsize\rmfamily\bfseries\scshape
 \etocnumber. \etocname\DotsAndPage }
{\parfillskip 0pt plus 1fil\relax }

\etocsetstyle {subsection}
{\leftskip1cm\rightskip .75cm \parfillskip 0pt plus 1fil\relax 
 \nobreak\smallskip}
{}
{\footnotesize\sffamily\mdseries\itshape
 \etocname{} (\etocnumber, p. \etocpage). }
{\par\medskip}

\etocsettagdepth {preamble}   {none}
%\etocsettagdepth {overview}   {none}% not needed explicitely, keeps value
%\etocsettagdepth {arbitrarily}{none}
%\etocsettagdepth {examples}   {none}
%\etocsettagdepth {surprising} {none}
\etocsettagdepth {linestyles} {subsection}
\etocsettagdepth {globalcmds} {subsection}
\etocsettagdepth {custom}     {none}
%\etocsettagdepth {tips}       {none}
%\etocsettagdepth {etocandworld}{none}
%\etocsettagdepth {code}       {none}

\etocsettocstyle {\centering\LARGE\textsc{\contentsname}\par\nobreak\medskip}{}
\etocsetnexttocdepth {subsection}
\tableofcontents
\endgroup
\end{filecontentsdef}
\filecontentsexec\foo

The code:
\filecontentsprint\foo
\marginattach{}

\section{A Beautiful Thesis example}

Here is a relatively  simple example of use of the package
functionalities. 
Let us set up some line styles. We choose a style for sections and
sub-sections which would be suitable for, respectively, sections and
sub-sections in an average length memoir. The line style specifications have
some redundancy for clarity, and do not care about what to do at possible page
breaks. Also, they do not worry about potential multi-column use.

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begingroup % we start a group to keep the style changes local
\newlength{\tocleftmargin}    \setlength{\tocleftmargin}{5cm}
\newlength{\tocrightmargin}   \setlength{\tocrightmargin}{1cm}

\etocsetstyle{section}              % will pretend to be a Chapter
{\addvspace{1ex}\parfillskip0pt
 \leftskip\tocleftmargin            % (already done in title)
 \rightskip\the\tocrightmargin plus 1fil
 \parindent0pt\color{cyan}}         % (already done)
{\bfseries\LARGE\upshape\addvspace{1ex}\leavevmode}
{\llap{Chapter\hspace{.5em}{\etocnumber}\hspace{.75cm}}\etocname
 \hfill\makebox[-\tocrightmargin][l]{\makebox[0pt]{\etocpage}}\par}
{}

\etocsetstyle{subsection}           % will pretend to be a Section
{}
{\mdseries\large\addvspace{.5ex}\leavevmode}
{\llap{\etocnumber\hspace{.75cm}}\textit{\etocname}%
 \hfill\makebox[-\tocrightmargin][l]{\makebox[0pt]{\etocpage}}\par}
{}

\def\tmptitle{My Beautiful Thesis}
\etocsettocstyle{\color{cyan}\parindent0pt \leftskip\tocleftmargin
  \leavevmode\leaders\hrule height 1pt\hfill\ 
  \huge\textit{\tmptitle}\par}{\bigskip}

\tableofcontents \ref{toc:overview}
\endgroup
\end{filecontentsdef}

\filecontentsexec\foo

\filecontentsprint\foo
\marginattach{}


\section{Linked list of the main package commands}





\begin{framed}\multicolsep0pt\relax
  \begin{multicols}{3}\parindent0pt\relax
\flushleft
    \csb{tableofcontents}\par
    (optional \csa{ref} or \csa{label})\par
    \csb{localtableofcontents}\par\columnbreak
    \csb{etocsettocstyle}\par
    \mbox{}\par
    \csb{etocsetnexttocdepth}\par\columnbreak
\flushright
    \makebox[\widthof{\csa{etocnumber}}][l]{\csb{etocname}}\par
% \llap does not trigger horizontal mode?
    \noindent
    \llap{\csb{etocsetstyle}
% \smash is not \long!
    \smash{$\left\{\parbox{0pt}{\mbox{}\endgraf
                                %\mbox{}\endgraf
                                \mbox{}\endgraf
                                \mbox{}\endgraf
                                \mbox{}\endgraf}\right.$}
    }%
    \csb{etocnumber}\par
    \makebox[\widthof{\csa{etocnumber}}][l]{\csb{etocpage}}\par
  \end{multicols}
\end{framed}

%\parshape 1 -1.5cm \dimexpr\linewidth+3cm\relax
%\begin{minipage}{\dimexpr\linewidth+3cm\relax}
\begin{multicols}{2}\parindent0pt\relax
  \csb{etocaftercontentshook}\par
  \csb{etocaftertitlehook}\par
  \csb{etocaftertochook}\par
  \csb{etocbeforetitlehook}\par
  \csb{etocdefaultlines}\par
  \csb{etocdepthtag.toc}\par
  \csb{etocdisplay}\par
  \csb{etocframedstyle}\par
  \csb{etocframed}\par
  \csb{etociffirst}\par
  \csb{etocifnumbered}\par
  \csb{etocignoredepthtags}\par
  \csb{etocignoretoctocdepth}\par
  \csb{etocimmediatedepthtag.toc}\par
  \csb{etocimmediatesettocdepth.toc}\par
  \csb{etocimmediatetoccontentsline}\par
  \csb{etocinline}\par
  \csb{etoclink}\par
  \csb{etoclocalframed}\par
  \csb{etoclocalmulticol}\par
  \csb{etoclocalruled}\par
  \csb{etocmulticolstyle}\par
  \csb{etocmulticol}\par
  \csb{etocname}\par
  \csb{etocnumber}\par
  \csb{etocobeydepthtags}\par\columnbreak
\flushright
  \csb{etocobeytoctocdepth}\par
  \csb{etocpage}\par
  \csb{etocruledstyle}\par
  \csb{etocruled}\par
  \csb{etocsetlevel}\par
  \csb{etocsetnexttocdepth}\par
  \csb{etocsetstyle}\par
  \csb{etocsettagdepth}\par
  \csb{etocsettocdepth}\par
  \csb{etocsettocdepth.toc}\par
  \csb{etocsettocstyle}\par
  \csb{etocskipfirstprefix}\par
  \csb{etocstandarddisplaystyle}\par
  \csb{etocstandardlines}\par
  \csb{etocthelinkedname}\par
  \csb{etocthelinkednumber}\par
  \csb{etocthelinkedpage}\par
  \csb{etocthelink}\par
  \csb{etocthename}\par
  \csb{etocthenumber}\par
  \csb{etocthepage}\par
  \csb{etoctoccontentsline}\par
  \csb{etoctoclines}\par
  \csb{localtableofcontents}\par
  \mbox{}\llap{\csb{localtableofcontentswithrelativedepth}}\par
  \csb{tableofcontents}\par
%\vspace{5\baselineskip}\hrule height 0pt
\end{multicols}
%\end{minipage}\par

The above is not an exhaustive list of all the package user commands.  And
for legacy arbitrary reasons some of the more obscure commands are included
here.

\clearpage
% 15 octobre, je teste les tags
\etocdepthtag.toc {arbitrarily}

\part{Arbitrarily many TOCs, and local ones too}
% 13 octobre, ceci était une section avant

\thispartstats

\etocsettocstyle{}{}
\etocstandardlines
\localtableofcontents

\section{The \csbhyp{tableofcontents}, \csbhyp{localtableofcontents} and
             \csbhyp{localtableofcontentswithrelativedepths} commands}
\label{tableofcontents}
\label{etoctableofcontents}
\label{localtableofcontents}
\label{localtableofcontentswithrelativedepth}

\begin{description}
\item[\toc] can be used arbitrarily many times in the document. Styling either
  globally the TOC or its individual entries is customizable at any time in
  the document.

  \csb{etoctableofcontents} is a synonym to \etoc's \toc. See
  footnote\footref{etockeeporiginaltableofcontents} on page \pageref{etockeeporiginaltableofcontents}.
\item[\localtoc] will print local tables of
contents: \emph{i.e.} all sections and sub-units inside a
given chapter, or all subsubsections and lower inside a given
subsection, etc... (see also \csb{etocsetnexttocdepth}).%
%
\footnote{As is explained in \autoref{sec:labeling} the syntax allows to
  create somewhere a local table of contents and to display it at some other
  location either before or after its origin.}%
\textsuperscript{,}%
\footnote{As is explained in \autoref{sec:tocdepth} \etoc allows at anytime to
  locally redefine the numeric levels associated to named ones, which brings
  great flexibility to achieve special effects, all done using only a single
  auxiliary file, the standard |.toc| file.}
%
\item[\localtocwrdp\marg{number}] can be used to override the document or
  current tocdepth setting (see \autoref{sec:tocdepth} for a discussion of
  tocdepth) to become relative to where the local TOC originates. For example,
  assuming the default numeric level assignments to standard sectioning units
\begin{verbatim}
\section{This is a section}
\localtableofcontentswithrelativedepth{+2}
\end{verbatim}
  will create a local table of contents taking into account the subsections
  and subsubsections inside this section, independently of what is the value
  of the |tocdepth| counter at this position in the document. If the numeric
  argument had been |3|, the local TOC would have displayed also paragraphs.
  If the section had been a chapter, and again for a relative tocdepth of |2|,
  the taken into account levels would have been sections and subsections.%
%
\footnote{The situation may be more complex, as the |.toc| file itself may
  well contain \texttt{\string\setcounter\{tocdepth\}\{...\}} commands. This
  is not recommended pratice with \etoc. See the discussion of
  \csb{etocsettocdepth.toc} and \csb{etocdepthtag.toc} for more on this.}
\end{description}

The macro \localtocwrdp is \textbf{new with |1.09|}.%
%
\footnote{Thanks to Tony \textsc{Roberts} for feature request.}
%

\section{Labeling and reusing elsewhere}
\label{sec:labeling}

\etoc allows the labeling of a TOC with (for example)
\csa{label\{toc:A\}} and will redisplay it elsewhere when
told \csa{tableofcontents}\csa{ref\{toc:A\}}. The actual
layout (title inclusive) used for the cloned TOC will be
decided locally. The line styles and toc display style
(including the title) will be the current ones and the
current value of the |tocdepth| counter is obeyed. As an
example the table of contents of 
\autoref{part:custom} is in a \hyperref[toc:d]{float} which appears
\vpageref{toc:d}. 
\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begin{figure}[ht!]
  \centering
  \begingroup
  \etocstandardlines 
  \renewcommand{\etocbkgcolorcmd}{\color{green!5}}
  \renewcommand{\etocbelowtocskip}{0pt\relax}
  \fboxsep1ex 
  \etocframedstyle [1]{\fbox{\makebox[.5\linewidth]{\etocfontminusone
        \hyperref[toc:c]{I am from far away}}}}
  \tableofcontents \label{toc:d} \ref{toc:c}
  \endgroup
\end{figure}
\end{filecontentsdef}
\filecontentsexec\foo

We used this: \filecontentsprint\foo
\marginattach{}
In the above example, not
only did we use |\ref{toc:c}| to print here the distant (local) table of
contents which has been labeled |toc:c| but we added a (possibly confusing)
|\label{toc:d}|.  This is done for the down-to-earth reason of being able
to use, as we did in the previous paragraph, |\vpageref{toc:d}|.
But if one wants to clone
again the original local table of contents, one must reference its original
label: \toc|\ref{toc:c}|.%
%
\footnote{Why does this author always give
complicated examples rather than down-to-earth ones?}
%
This original local table of contents is to be found \vpageref{toc:c}.

\section{A powerful functionality of \etoc: the
  re-assignment of levels with \csbhyp{etocsetlevel}}
\label{sec:tocdepth}

The intrinsic levels manipulated by \etoc are numeric: from
|-2| (which corresponds to |book| in the \ctanpkg{memoir} class)
down (from the big to the small)
to |5| (|subparagraph|). But the assignment of a numeric level
to a given name can be modified at any time with the command
\csb{etocsetlevel}\marg{level\_name}\marg{number}. In conjunction
with the use of the \LaTeX{} |tocdepth| counter, this has
powerful applications: \meta{level\_name} does not have to
coincide with an actual document sectioning command, and \etoc
can be used to print arbitrary ``lists of things'', using no
other auxiliary file than the |.toc| file. This is
explained further in \autoref{part:surprising}.

\begin{framed}
  It is often said that in the standard classes, the sectioning
  level of |\part| is |0| in the classes not having a |\chapter|
  command, and |-1| in classes having a |\chapter| command. This
  is \emph{correct} for what regards the \emph{automatic
    numbering}, as is governed by the value of the |secnumdepth|
  counter; but it is \emph{wrong} for what regards the effect of
  the |tocdepth| counter: setting the |tocdepth| to |-1| in the
  |article| class just before |\tableofcontents| does \emph{not}
  prevent Parts from appearing in the Table of Contents. One has
  to set it to |-2| for that, whether in the |article| or in the
  |book| class.

  The canonical levels, a priori known to \etoc, are those of
  relevance to the \textbf{|tocdepth|} counter in the standard
  classes and are recapitulated in this table: \centeredline{
    \fbox{\begin{tabular}{rc}
        (\ctanpkg{memoir} class) book&-2\\ part&-1\\ chapter&0 \\
        section&1\\ subsection&2 \\
        subsubsection&3 \\ paragraph&4 \\ subparagraph& 5
    \end{tabular}}}

\smallskip With \etoc, the user can easily print a local table of
contents inside a given subsection, where subsubsections will be
printed in the style of sections, paragraphs in the style of
subsections, and subparagraphs in the style of subsubsections, if
so desired. One can also decide to set everything to be at the level
|6| (never displayed by \etoc), except for example
paragraphs, promoted to be at level |1|, and then one obtains a nice
table of contents of all the paragraphs from the document! 
(|tocdepth| at least |1|)\footnotemark
\end{framed}

\footnotetext{and one should naturally not print this TOC of paragraphs in
  compatibility mode, which would insist on inserting a gigantic left
  margin.}

\section{The \csbhyp{etocsettocdepth} and \csbhyp{etocsetnexttocdepth} commands}
\label{etocsettocdepth}
\label{etocsetnexttocdepth}
\label{invisibletableofcontents}

The |tocdepth| counter has no bearing on what gets written to the |.toc| file;
its action is only on the actual typesetting of the table of
contents.\footnote{In the standard classes (at least), it also influences the
  \csa{listoftables} and \csa{listoffigures}, via \csa{@dottedtocline}.} In the
standard classes there is only one |\tableofcontents| possible, whereas with
\etoc, arbitrarily many are allowed, so one may change |tocdepth| to the
appropriate value (which decides the finest sectioning level displayed) again
and again each time a table of contents needs to be typeset.

\etoc provides \csb {etocsettocdepth}\marg{level} whose mandatory argument is
either 
numeric (from |-3| to |5|) or a division name such as |subsection| or
|subsubsection| or any name previously declared to \etoc with
\csb{etocsetlevel} (the keywords |all| and |none| are recognized, although not
corresponding to a document division). 
This does the appropriate |\setcounter{tocdepth}{numeric_level}|.

As is explained in the next subsection, |tocdepth| is used by \ctanpkg{hyperref}, and
one must take steps to prevent its changes from influencing the bookmarks, too.
So, \etoc has \csb {etocsetnexttocdepth}\marg{level} whose influence ceases
immediately after the next table of contents.  The package defines
\csb{invisibletableofcontents}
essentially as
\centeredline{\csb{etocsetnexttocdepth}|{none}|\csb{tableofcontents}}

The simplest organization is probably to have after |\begin{document}| and before the
  first |\tableofcontents| a single instance of the \csb{etocsettocdepth}
  command, with argument the deepest level (or most commonly used deepest level)
  among the tables of contents of the document, and to use locally,
  where needed, \csb{etocsetnexttocdepth} before |\tableofcontents| or
  |\localtableofcontents|.

\begin{framed}
  It is possible to use \csb{etocsettocdepth} inside the first argument of
  \csb{etocsettocstyle} (possibly in conjunction with checking the
  \csb{etoclocaltop} value, \emph{which however will be up-to-date there only if
  \csb{etocchecksemptiness} was executed}). There is no worry then about
  possible impact on hyperref bookmarks later on, because \etoc always resets
  the |tocdepth| counter after typesetting a TOC to the value it had before
  it.

  Since |1.09| the macro \csb{etocsetnexttocdepth} works also if located in
  first argument of \csb{etocsettocstyle}, but there is no reason to use it
  there as \csb{etocsettocdepth} has no durable effet on the |tocdepth|
  counter if executed there.

  Check \csb{localtableofcontentswithrelativedepth} for a simpler way to
  control the depth of local tables of contents. This has the advantage of
  working reliably whether or not the \csb{etocchecksemptiness} is used.
\end{framed}

\subsection{The hyperref option \emph{bookmarksdepth}}
\label{ssec:bookmarksdepth}

When modifying the counter |tocdepth| for the purposes of
multiple uses of \toc or \localtoc, one should be aware that
package \ctanpkg{hyperref} by default takes into account the
\emph{current} value of the |tocdepth| counter to decide
whether the |pdf| file will contain a bookmark corresponding
to sectioning commands encountered in the source file. Thus,
one typically needs to reset |tocdepth| to its previous
value after having temporarily modified it for a given table of
contents.

Or, there is the \emph{bookmarksdepth=n} option of package
\ctanpkg{hyperref}, with \emph{n} the desired document bookmarks
maximal depth, which can be numeric or the name of a level known to
\ctanpkg{hyperref}. This documentation previously passed |bookmarksdepth=3| as
option to \ctanpkg{hyperref}, so even if |tocdepth| was left to |1|
by inadvertance after printing a certain table of contents 
this did not modify the bookmark tree of the |pdf| file. Now that
\csb{etocsetnexttocdepth} has been added to the package, we have used it
systematically and there was no need for  |bookmarksdepth=3| anymore.

\section[The command \csbhyp{etocsettocdepth.toc}]{The command
  \csbhyp{etocsettocdepth.toc} and
  \csbhyp{etocimmediatesettocdepth.toc}}
\label{etocsettocdepth.toc}
\label{etocimmediatesettocdepth.toc}

This command \csb{etocsettocdepth.toc} implements some functionality of
\ctanpkg{tocvsec2}%
%
\footnote{I thank Denis \textsc{Bitouzé} for drawing
  my attention to the incompatibility of this package with \etoc.},
%
a package
which however was incompatible with \etoc (it can still be used for its
|secnumdepth|-related commands, but its |toc|-related activities will get
canceled by \etoc) and more-or-less designed for a single table of contents.

The action of \csb{etocsettocdepth.toc} is totally different than the one of
\csb{etocsettocdepth}. Rather than modifying the |tocdepth| counter immediately,
it adds a line to the |.toc| file which, when executed inside a table of
contents will enact this change. 

The command \csb{etocsettocdepth.toc}, like
\csb{etocsettocdepth}, accepts both numeric and named
arguments. In the case of a named argument, the actual numeric
value to be used is not yet decided at the time the |.toc|
file is created; it will be the value currently specified for
the named level at the time each table of contents (not having
done |\etocignoretoctocdepth|) is typeset. 

The |tocdepth| counter will never be set to a value finer than its initial value
at the start of the table of contents: so adding commands
\csb{etocsettocdepth.toc} in the document is a way to \emph{restrict} locally
the depth of the table of contents. For example to prevent inclusion in the
tables of contents of the sub-sub-sections of a given chapter.

This
{\fbox{gets executed in ALL tables of contents.}}

Also \csb{etocimmediatesettocdepth.toc} is provided.  For explanations,
refer to the discussion of \csb{etocimmediatedepthtag.toc} in the
next section.

\subsection{The commands \csbhyp{etocobeytoctocdepth} and \csbhyp{etocignoretoctocdepth}}
\label{etocobeytoctocdepth}
\label{etocignoretoctocdepth}


So \csb{etocignoretoctocdepth} is provided to cancel the
\csb{etocsettocdepth.toc} mechanism when
needed; and \csb{etocobeytoctocdepth} will
re-activate it. The package does initially \csb{etocobeytoctocdepth}.

\section[The commands \csbhyp{etocdepthtag.toc} and \csbhyp{etocsettagdepth}]{The commands
  \csbhyp{etocdepthtag.toc}, \csbhyp{etocimmediatedepthtag.toc} and
  \csbhyp{etocsettagdepth}}
\label{etocdepthtag.toc}
\label{etocimmediatedepthtag.toc}
\label{etocsettagdepth}



Release |1.07h| has a command \csb{etocdepthtag.toc} which
allows to control dynamically the which contents end up included in the
displayed TOCs (this documentation also decribed formerly a way
using \csb{etocsettocdepth.toc} with some dummy level name, which got
then set via \csb{etocsetlevel} according to what was locally needed,
but it was too hacky and I am not sure if it was understandable).

It is used as \csb{etocdepthtag.toc}\marg{tag\_name}, where the
\meta{tag\_name} is anything, and this will put the tag in the |.toc|
file. When typesetting a TOC, one issues a series of commands
\csb{etocsettagdepth}\marg{tag\_name}\marg{level} where the
\meta{level} may be either numeric (from |-3| to |5|) or the name of a
division unit known to \etoc, or |none| or |all|. The effect of the tag
inside the |.toc| file will then be to set the |tocdepth| counter to
the desired value, in real time (this can not get finer than the
initial value of |tocdepth| at the start of the TOC).

The added flexibility is thus that \csb{etocsetlevel} has not been used in a
kind of hacky way, that one may use named level depths, and the
keywords |none| and |all|.

As usual, once the tag depths have been set, they remain in effect until getting
redefined or seeing their scope expire via the closing of a group or of a
surrounding 
environment. For an example, see \autoref{ssec:tocwithdepthtags}.

When using \csb{etocdepthtag.toc} in combination with \LaTeX's |\include|,
data may not end up in the |.toc| file in the correct order.  For example in
this situation:
\begin{verbatim}
  \clearpage % or anything ending up causing its presence here right before
             % the \etocdepthtag.toc
  \etocdepthtag.toc{sometag}
  \include{some file containing sections}
\end{verbatim}
The tag will end up in the |.toc| file \emph{after} all section headings from
the included file.  The cause is that \LaTeX\ inserts immediately in the
main auxiliary file a command to input the auxiliary file of the included file
(which in turn, contains instructions to add data to the |.toc| file).  But
\csb{etocdepthtag.toc} does not internally use such immediateness, as it uses
the same interface as |\section| and alike commands when they want to write
extra data to the |.toc| file.

So%
%
\footnote{Thanks to Norman \textsc{Ramsey} who reported this problem, together
  with a fix, in July\dots 2016.  Sorry for long delay before updating
  \etoc six years later\dots}
%
|1.09f| adds \csb{etocimmediatedepthtag.toc} which will force the tag to be written
immediately to the |.toc| file (well, rather immediately to the |.aux| file,
so before the inclusion of the auxiliary file of the included file).

One should not use this variant systematically.  For example if your document
looks like:
\begin{verbatim}
\clearpage

\section{bbbb}

Some text

\etocdepthtag.toc{sometag}
\etocimmediatedepthtag.toc{someimmediatetag}
\section{cccc}

Some text

\end{document}
\end{verbatim}
then the |someimmediatetag| will end up being inserted in |.toc| file
\emph{before} the |bbbb| section.  This is because \LaTeX's |\section|
uses a \emph{delayed} write, not an \emph{immediate} one.  And
\csb{etocdepthtag.toc} wisely uses a \emph{delayed} write.

As it seems very hard programmatically to identify automatically if the
\emph{immediate} variant of \csb{etocdepthtag.toc} should be used, the package
provides two separate commands and it is up to user to make the correct
choice.


\subsection{The commands \csbhyp{etocobeydepthtags} and \csbhyp{etocignoredepthtags}}
\label{etocobeydepthtags}
\label{etocignoredepthtags}


After \csb{etocignoredepthtags}, the |.toc| depth tags are ignored (but
\csb{etocdepthtag.toc} still works). The package does initially
\csb{etocobeydepthtags} which makes \etoc react to the found tags in the
|.toc| file. 

\section{The commands \csbhyp{etocglobaldefs} and \csbhyp{etoclocaldefs}}
\label{etocglobaldefs}
\label{etoclocaldefs}

In \LaTeX{} the meaning of a command defined via |\newcommand\foo{...}| inside
an environment (or group) vanishes from \TeX's memory on exit from this
environment (or group). At times however it is needed to make definitions with
global scope, for this \TeX{} has the primitive prefix |\global|.

By default \etoc's definitions of \csb{etocname} etc... are local. This causes
problems in certain contexts such as TOC as tables (\autoref{sec:tocastable}, \autoref{ssec:tocastableold}) and also
with |enumitem| \emph{inline} variants of its standard environments, because
the command |\item| then closes a group (see \autoref{etocthelink}).

After \csb{etocglobaldefs}, \etoc will make its definitions of \csb{etocname}
etc... have global scope. For normal use this is not necessary. It does not hurt
either to activate it systematically. 

To return to the default, use \csb{etoclocaldefs}. Note that both
\csb{etocglobaldefs} and \csb{etoclocaldefs} actions are local to the
environment or group where they are used.


\section{Not displayed empty TOCs}

\subsection{The \csbhyp{etocchecksemptiness} command}
\label{etocchecksemptiness}
\label{etocdoesnotcheckemptiness}

The user needs to issue \csb{etocchecksemptiness} to tell \etoc to check whether
local tables of contents are empty and in case of emptiness to print nothing
at all.\footnote{Thanks to Paul Gaborit who asked for
such a feature.} This
can be useful to authors of \LaTeX{} classes who for example wish to have a
|\chapter| command doing systematically a \localtoc, or for
people producing files via automatic conversions and some of those might have
sectioning commands and others not.

«Emptiness» means that no \csa{contentsline} command would get executed within
the scope of the local table of contents --- empty line styles by themselves do
not make the TOC empty. \etoc always executes the \csb{etocaftertochook}
command; and the test for emptiness itself executes everything else found in
the |.toc| file. See \autoref{sec:addingtotoc} in this context.
\begin{enumerate}
\item the \csb{etocifwasempty} command discussed below can be used from inside
\csb{etocaftertochook}, and even from inside \csb{etocbeforetitlehook}.
\item there is also \csb{etocdoesnotcheckemptiness} (since |1.08i|.)
\end{enumerate}

The suppression of the heading (more precisely of the toc display style
elements) may be effective only for the final \LaTeX{} runs. For example in
the situation of a \toc|\ref{foo}| where the label |foo| is
not yet recognized, the heading (but not the contents) is printed and the TOC
is declared non-empty. Or, if one adds a \localtoc to a document, on the next
run, the test for emptiness will in fact apply to the next one, and the last
local TOC of the document will have its contents temporarily unknown to \etoc,
hence will be declared non empty, and the heading will be printed.

For a finalized document compiled with initially no auxiliary files, the first
\LaTeX{} run will declare all local TOCs non empty and print for each of them a
heading (and no contents naturally). The second \LaTeX{} run will then
correctly decide which local TOC is empty or not.

\subsection{The \csbhyp{etocnotocifnotoc} command}
\label{etocnotocifnotoc}

The user can then extend the emptiness-checking to the global TOCs with
\csb{etocnotocifnotoc}. May I respectfully give the advice then to rather do
none of |\usepackage{etoc}| nor \toc ? |;-)|. Well, there is always the case
of batch conversions of documents having or not sectioning units.

\subsection{The \csbhyp{etocifwasempty} command}
\label{etocifwasempty}
\label{etocxifwasempty}

The command \csb{etocifwasempty}\marg{YES}\marg{NO} executes \meta{YES} if
the previous TOC was found to be empty and \meta{NO} if its was not so. This
may serve to act appropriately after a truly empty TOC. If
\csb{etocchecksemptiness} has not been issued, this conditional always
executes the \meta{NO} branch.

This command is robust, and \csb{etocxifwasempty} is its expandable
version.

\fbox{Do not forget the second argument: at least an empty pair of braces |{}|
  must be present.}

This conditional may wrongly say that the local TOC is empty or not empty
until \LaTeX{} compilations stabilize. But if it says that a local TOC is
empty, this does mean that \etoc considered the just encountered local table
of contents to be empty (for that run) and thus printed nothing (not even a
|\par|).

\section{Adding commands to the \texorpdfstring{\texttt{.toc}}{.toc} file}
\label{sec:addingtotoc}

We described above \csb{etocsettocdepth.toc} and \csb{etocdepthtag.toc} which
both insert commands inside the |.toc| file. An even more general mechanism of
adding ``action tags'' to the |.toc| file could be envisioned, but this would
just be a wrapper for direct use of |\addtocontents{toc}{\something}|.

One should be cautious when adding in this way
things
to the |.toc| file. For example, inserting
\csa{addtocontents}|{toc}{\string\clearpage}|
just
before a \csa{part} to fix the problem when some part entry (in
the table of contents) is isolated at the bottom of one page,
will cause problems with multiple TOCs: this \csa{clearpage}
will be executed by \etoc each time a \toc or \localtoc
command is encountered! The more prudent thing is to do
rather: {\csa{addtocontents}|{toc}{\string\myclearpage}|,}
to have a |\let\myclearpage\relax| at the top level of the
document and  to use where needed something like:
\begin{verbatim}
\let\myclearpage\clearpage
\tableofcontents
\let\myclearpage\relax
\end{verbatim}
The \ctanpkg{memoir} class has the command \csa{settocdepth} which
writes a \csa{changetoc\-depth} command inside the |.toc| file.
This will impact the typesetting by \etoc of \emph{all} tables
of contents, with (possibly) unexpected results: imagine the
document has \csa{settocdepth}|{chapter}| at some point to
avoid having the sections from subsequent chapters be listed
in the main table of contents. Then a local table of contents
in one of these chapters will print a title but will be
without any entry. 

As the \ctanpkg{memoir} class by itself allows multiple\toc
  these issues already arise there,
  independently of \etoc, see page 170 of the \ctanpkg{memoir}
  manual.

For this specific issue, the commands \csb{etocsettocdepth.toc},
\csb{etocignoretoctocdepth} and \csb{etocobeytoctocdepth} are the way to go; or
their variants \csb{etocdepthtag.toc} and \csb{etocsettagdepth}.

As an aside, any |\setcounter{tocdepth}{n}| command added directly to the |.toc|
file sees its effect (since release |1.07g|) canceled at the end of each table
of contents, which automatically does a |\setcounter{tocdepth}{previous_value}|
with the value active on entering the table of contents.

\subsection{The hyperref option \emph{hidelinks}}\label{ssec:hidelinks}

The colored links (and also the rectangle links) are a bit
annoying when used in tables of contents, especially when
the document uses \etoc and has plenty of them! One may wish
for having colored links, \emph{except} for those within
table of contents!
Indeed, why would things in TOCs need to be either framed in
rectangles or colored, when the user \emph{already expects
  them to be links}?

I use the following trick:  either in the preamble using
|\AtBeginDocument|, or right after |\begin{document}|, I
  have the command
  \centeredline{|\addtocontents{toc}{\protect\hypersetup{hidelinks}}|}

  \begin{framed}
    All TOCs typeset by \etoc have their contents done
    within a group (as if enclosed in an environment). So
    the command \csa{hypersetup}|{hidelinks}| will be
    executed by \emph{each} TOC, but its effect will be
    limited to that TOC. 
  \end{framed}

  I found out experimentally that the option |hidelinks| could
  indeed be set many times with |\hypersetup| (this is not the
  case of all \ctanpkg{hyperref} options).


\clearpage
\etocdepthtag.toc {examples}
\part{Examples}\label{part:examples}

\thispartstats %% (pas de sous-section)

\etocstandardlines
\etocsettocstyle {}{\medskip}
\localtableofcontents

We present some additional examples. To understand all code snippets in detail,
one will possibly need to have first browsed through \autoref{part:linestyles}
and \autoref{part:globalcmds}.

\section{Testing the compatibility mode}

As a further example we now print the local table of contents
of \autoref{part:globalcmds}. First we will test the compatibility mode.\footnote{the
present document uses the \ctanpkg{scrartcl} class, and we check here that
the \etoc compatibility mode does respect the customizing done via the
class commands.}   The original was invisibly defined with a label at the
beginning of \autoref{part:globalcmds}.
\begin{verbatim}
\begingroup % to keep in particular toc=left with local effect
\KOMAoptions{toc=left}
\etocstandarddisplaystyle % necessary for the display to obey toc=left
\etocstandardlines
\tableofcontents \ref{toc:globalcmds}
\endgroup
\end{verbatim}
\begingroup
\KOMAoptions{toc=left}
\etocstandarddisplaystyle
\etocstandardlines
\tableofcontents \ref{toc:globalcmds}
\endgroup

\section{Another compatibility mode}\label{sec:anothercompat}

As explained in \autoref{subs:compat}, the commands
\csb{etocstandardlines} and \csb{etocstandarddisplaystyle} tell \etoc to,
essentially, act as an observer. The document class layout for the table of
contents is then perfectly obeyed. There is no way to customize this standard
layout (change fonts, margins, vertical spacings, etc...) from within the
package. For this, use some package dedicated to this task; because \etoc either
is (temporarily perhaps) in compatibility mode with no customization on its part
possible, or the user has specified the layout in \csb{etocsetstyle} commands
(and \csb{etocsettocstyle}) and is (supposedly...) in complete control.

Well, there is actually an alternative. It is possible to use the
\csb{etocsetstyle} commands to recreate an artificial compatibility mode, in
order to achieve effects like the following, all things being otherwise equal to
the document class defaults:
\begin{enumerate}[noitemsep]
\item get the \ctanpkg{hyperref} link to encapsulate only the names, but not the numbers
  of each entry of the table of contents,
\item use the document class style for chapters and sections, but modify it only
  for subsections,
\item do either of the above only for some portions of the table of contents.
\end{enumerate}

One only needs%
%
\marginpar{\normalfont\footnotesize\itshape Modified at \texttt{1.1a}} 
%
to use the \LaTeX{} standard \csa{l@chapter}, \csa{l@section},
etc... commands inside the TOC line style definitions via \csb{etocsetstyle},
re-constituting their arguments using \csb{etocname}, \csb{etocnumber},
\csb{etocpage} as one wishes.

The aliases \csb{etocsavedsectiontocline}, \csb{etocsavedchaptertocline}
etc... are set to have the exact same meanings as the \LaTeX{} |\l@chapter|,
|\l@section|, etc... commands each time a TOC is typeset.  They are
\fbox{DEPRECATED} as the latter \LaTeX\ commands are not modified (nor used) by
\etoc since release |1.1a|.

You should use directly |\l@chapter|, etc... within suitable
|\makeatletter/\makeatother|.  Here is an example.

\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\makeatletter
\newcommand{\MyStandardTOC}{%
  \begingroup
  % for the book or article classes:
  %\etocsetstyle{part}{}{}
  %  {\l@part{\etocnumber\hspace{1em}\etocname}{\etocpage}}{}%
  % for the scrbook or scrartcl classes:
  \etocsetstyle{part}{}{}
    {\l@part{\numberline{\etocnumber}\etocname}{\etocpage}}{}%
  % following is identical in book/article/scrbook/scrartcl classes:
  \etocsetstyle{chapter}{}{}   %%% only for book and scrbook
    {\l@chapter{\numberline{\etocnumber}\etocname}{\etocpage}}{}%
  \etocsetstyle{section}{}{} 
    {\l@section{\numberline{\etocnumber}\etocname}{\etocpage}}{}%
  \etocsetstyle{subsection}{}{}
    {\l@subsection{\numberline{\etocnumber}\etocname}{\etocpage}}{}%
  % etc... if further sectioning units are used
  \etocstandarddisplaystyle % this is for the title, page-marks, etc...
  \tableofcontents     
  \endgroup}
\makeatother
\end{filecontentshere}
\marginattach{-A}

One can add to the above arbitrary text formatting commands, for example
replace |\etocpage| by |\textcolor{blue}{\etocpage}|.

If the document has only one table of contents then there is no need
to put the commands inside a macro, or even inside a group.\footnote{and if
moreover one just wants to keep the same layout as in the default, one may
question why using \etoc... there is \emph{one} good reason: numbers and names
are separately \ctanpkg{hyperref} links, whereas normally there is only one link
holding both the number and the name corresponding to one toc entry.} With these
commands 
\etoc will construct a TOC completely identical to what would have been done by
one of the document class: |article|, |book|, \ctanpkg{scrartcl}, \ctanpkg{scrbook}.\footnote{For the
\ctanpkg{memoir} class, one needed prior to \etoc |1.08k| a bit more: each of the command \csa{booknumberline},
\csa{partnumberline} and \csa{chapternumberline} had to be saved. They can now
be used directly in the line styles, because their meanings are not modified
anymore by \etoc during its TOC typesetting.}
The number and the name of each entry are each separately an \ctanpkg{hyperref} link, as
is always the case with \etoc, when not in compatibility mode. Replacing
\csb{etocnumber} with \csb{etocthenumber} will give a TOC where the numbers are
not links anymore, but the names still are. Or one may decide to use \csb{etocthename}
and keep an hyperlinked number with
\csb{etocnumber}. 

Here is a subtler example where one only marginally modifies the
sections (adding color to the number and removing the \ctanpkg{hyperref} link) and keeps
the subsections as in the default, \emph{except} for those of one specific
section, for which the layout is completely modified:
\MyQuasiStandardTOC{\ref{toc:overview}}
\bigskip
This example only has sections and subsections (assumed to be numbered), and
the code used was:
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\makeatletter
\newcommand*{\MyQuasiStandardTOC}[1]{%
  \begingroup
  \etocsetstyle{section}
    {}
    {\ifnum\etocthenumber=4
      \etocsetstyle{subsection}
        {\par\nopagebreak\begingroup
         \leftskip1.5em \rightskip\@tocrmarg
         \parfillskip \@flushglue 
         \parindent 0pt
         \normalfont\normalsize\rmfamily\itshape
         \etocskipfirstprefix}
        {\allowbreak\,--\,}
        {\etocname\ \textup{(\etocnumber)}}
        {.\par\endgroup}%
     \else
        \etocsetstyle{subsection}
        {}%
        {}%
        {\l@subsection{\numberline{\etocnumber}\etocname}{\etocpage}}%
        {}%
     \fi
    }% prefix for section sets the style dynamically for subsections!
    {\l@section{\numberline{{\color{cyan}\etocthenumber}}\etocname}{\etocpage}}%
    {}%
  \etocstandarddisplaystyle
  \etocsetnexttocdepth {2}%
  \tableofcontents #1
  \endgroup
}
\makeatother
\end{filecontentshere}
\marginattach{-B}

The page heading (on the page where this TOC appears) may have been modified
as is expected from usage of \csb{etocstandarddisplaystyle} in the code.
Sections and subsections are printed exactly as in the default, \emph{except}
for the subsections of one specific user-chosen section and except for the
color of the section numbers. We had to examine the \ctanpkg{scrartcl} sources
to determine what to use for \csa{leftskip} and \csa{rightskip} for our
customized section entry (the one wih number 4).

\section{Emulating the book class}\label{sec:thirdexample}

As explained in \autoref{subs:compat}: without explicit use of an
\csb{etocsetstyle} command the package will leave to the document class the
hand regarding the ``toc line styles''. It is sometimes asked by users (for
example those using \etoc for its \csb{localtableofcontents}) how to stay
close to but not completely identical with the design implemented by the
standard classes, such as |book|. I can recommend package \ctanpkg{tocloft} for this,
as it is compatible with \etoc (see \autoref{subs:tocloft}) and thus \etoc will
obey the \ctanpkg{tocloft} customizations (as long as no use has been made of
\csb{etocsetstyle}). It is also possible to modify only the style for, say,
sections and leave the parts, chapters, subsections as in the document class,
via the technique from \autoref{sec:anothercompat}.

But for complete control, here is a translation of the |book| class code into
\etoc lingua. It is then easy to modify the relevant lengths or adjust the
used fonts. I thank \textsc{Denis Bitouzé} for prompting me to include this in
the \etoc manual, as it resulted from some conversation we had about this. The
code is not 100\% faithful to the |book| class, and particularly its rendering
of (multi-line) non-numbered units differs (... I think, as I copied pasted as
is the code from where I had stored it and did not do much thinking about it
again). Some proficiency in low-level \TeX\ and \LaTeX\ macros is needed to
understand what the code says, but for modifying fonts or some lengths such
in-depth understanding is not needed.

With some extra code one can \emph{automatically adjust the widths} assigned
to typesetting sectioning numbers in order to prevent overflows, even with for
example \MakeUppercase{\romannumeral 38}; but this is a more advanced feature
which I have moved to \autoref{sec:thirdexampleextra}.

First we set up some lengths. I use macro registers, not real \LaTeX\ lengths.
When using |em|'s however, this means that one must pay attention to when the
actual dimension assignment is made, as this will then depend upon the current
font settings. In the code below, at the location where the \csa{TOCnumwidthB}
and \csa{TOCnumwidthC} will be used, the |1em| from their specification will
be matched to the normal medium series font, not the bold font; this is
deliberate so that one can compare more readily with the other dimensions;
besides, with the \csa{TOCcomputenumwidths} from
\autoref{sec:thirdexampleextra} these macros will actually hold a dimension
using |pt| as dimensional unit.

\begin{filecontentshere}{etocsnippet-\snippetno.tex}
% it will be easy to globally shift the TOC horizontally if needed
\def\TOCleftmargin     {0pt}
\def\TOCrightmargin    {2.55em}% like LaTeX's \@tocrmarg

% this is for dotted leaders
\newbox\TOCleaderbox
\def\TOCleaderboxwidth {0.7777em}% about like what standard classes do

% vertical spacing
\def\TOCverysmallvskip {0pt plus .2pt}
\def\TOCmedvskip       {1em plus 1pt}
\def\TOCbigvskip       {2.25em plus 1pt}

% the ``numwidths'' for typesetting the numbering of division units.
% I don't recall exactly how (and for which fonts) these figures were chosen.
% They quickly prove too small if using Roman numerals (as do too the book
% class defaults even though they are a bit larger).
\def\TOCnumwidthB {1.5em} % chapter
\def\TOCnumwidthC {2.278em}% section, I think default is 2.3em
\def\TOCnumwidthD {3.056em}% analog in standard class is 3.2em
\def\TOCnumwidthE {3.833em}% analog in standard class is 4.1em
\def\TOCnumwidthF {4.611em}% analog in standard class is 5em
\def\TOCnumwidthG {5.389em}% analog in standard class is 6em

% The code for the ``global toc style''.

\newcommand*\TOCglobalstyle {%
\etocsettocstyle
   {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
    \parindent\z@ \leftskip\z@skip \rightskip \z@skip
    \setbox\TOCleaderbox\hbox to \TOCleaderboxwidth{\hss.\hss}%
    \chapter *{\noindent\kern\TOCleftmargin\relax % uses "pt"...
        \contentsname
        \@mkboth {\MakeUppercase \contentsname}{\MakeUppercase \contentsname}}%
    \rightskip    \TOCrightmargin\relax
    \parfillskip -\rightskip % or a smaller value if desired
    \leftskip     \TOCleftmargin \relax }
   {\if@restonecol \twocolumn \fi\cleardoublepage}%
%
\etocsetstyle{part}
 {}
 {\addpenalty {-\@highpenalty}%
  \addvspace \TOCbigvskip
  \leavevmode
   {\large \bfseries % use a group to limit font change
      \interlinepenalty\@M
      \etocifnumbered{\etocnumber\hspace{1em}}{}%
      \etocname
      \nobreak\hfil\makebox[-\parfillskip][r]{\etocpage}}\par
  \nobreak
  }
 {}
 {}%
%
\etocsetstyle{chapter}
 {\advance\leftskip\TOCnumwidthB\relax}
 {\addpenalty {-\@highpenalty }%
  \vskip \TOCmedvskip\relax
  \leavevmode
  {\interlinepenalty\@M
   \etocifnumbered
      {\llap{\makebox[\TOCnumwidthB][l]{\bfseries\etocnumber}}}
      {\advance\leftskip-\TOCnumwidthB\relax}%
   \bfseries\etocname
      \nobreak\hfil\makebox[-\parfillskip][r]{\etocpage}\par }%
  \penalty \@highpenalty 
  }
 {}
 {\advance\leftskip-\TOCnumwidthB\relax}%
%
 \TOCsetlinestyle {section}      {\TOCnumwidthC}%
 \TOCsetlinestyle {subsection}   {\TOCnumwidthD}%
 \TOCsetlinestyle {subsubsection}{\TOCnumwidthE}%
 \TOCsetlinestyle {paragraph}    {\TOCnumwidthF}%
 \TOCsetlinestyle {subparagraph} {\TOCnumwidthG}%
}% end of \TOCglobalstyle

%The common code for line styles is abstracted into a macro:
 
\newcommand\TOCsetlinestyle [2]{% #1= unit, #2= numwidth as macro
\etocsetstyle{#1}
 {\advance\leftskip#2\relax}
 {\vskip \TOCverysmallvskip\relax
  \leavevmode
  {\interlinepenalty\@M
   \etocifnumbered
     {\llap{\makebox[#2][l]{\etocnumber}}}{\advance\leftskip-#2\relax}%
   \etocname
   \nobreak\leaders \copy\TOCleaderbox
   \hfil\makebox[-\parfillskip][r]{\etocpage}%
   \par }%
 }
 {}
 {\advance\leftskip-#2\relax}%
}
\makeatother
\end{filecontentshere}
\marginattach{-A}
Nota Bene: the code deliberately handles the non-numbered sectioning units
unlike the way of the standard document classes (particularly regarding the
alignment of multi-line headings.)

The whole thing was encapsulated in \csa{TOCglobalstyle}, because we also want
a \csa{TOClocalstyle} for local tables of contents which typically will want
to use |\section*| rather than |\chapter*| and not insert page marks in the
headers. The \csa{TOClocalstyle} is to be issued once, after the main document
TOC, or rather before using \localtoc. If one wants a full
TOC at end of document one will naturally have to issue again
\csa{TOCglobalstyle} there.

\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\makeatletter
\newcommand*\TOClocalstyle {%
\etocsettocstyle
    {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
     \setbox\TOCleaderbox\hbox to \TOCleaderboxwidth{\hss.\hss}%
     \parindent\z@
     \dimen@ 2.25em % for left indenting
     \section *{\kern\dimen@ % use of \dimen@ works here by sheer luck
       \contentsname
       % un-comment this if marks are wanted:
       %\@mkboth {\MakeUppercase \contentsname}{\MakeUppercase \contentsname}%
       }% end of \section
     \parskip \z@skip
     \vspace{-1.25\baselineskip}% somewhat ad hoc
     \leftskip  2.25em
     \rightskip 4.5em
     \advance\rightskip-\TOCrightmargin\relax
     \leavevmode\leaders\hrule\@height\p@\hfill\kern\z@\par
     \rightskip 4.5em 
     \parfillskip -\TOCrightmargin\relax }
    {\nobreak\vskip-.5\baselineskip
     \leavevmode\leaders\hrule\@height\p@\hfill\kern\z@\par
     \bigskip
     \if@restonecol \twocolumn \fi }%
%
\etocsetstyle{section}
 {\advance\leftskip\TOCnumwidthC\relax}
 {\addpenalty \@secpenalty
  \etociffirst{}{\addvspace{\TOCmedvskip}}%
  \leavevmode
  {\interlinepenalty\@M
   \bfseries\etocifnumbered
      {\llap{\makebox[\TOCnumwidthC][l]{\etocnumber}}}
      {\advance\leftskip-\TOCnumwidthC}%
   \etocname\nobreak\hfil\makebox[-\parfillskip][r]{\etocpage}\par }%
  \penalty \@highpenalty }
 {}
 {\advance\leftskip-\TOCnumwidthC\relax}%
% the rest is identical with code for global tocs:
 \TOCsetlinestyle {subsection}   {\TOCnumwidthD}%
 \TOCsetlinestyle {subsubsection}{\TOCnumwidthE}%
 \TOCsetlinestyle {paragraph}    {\TOCnumwidthF}%
 \TOCsetlinestyle {subparagraph} {\TOCnumwidthG}%
}% end of \TOClocalstyle
\makeatother
\end{filecontentshere}
\marginattach{-B}
As mentioned previously, this handles non-numbered (multi-line) sectioning
units somewhat differently from what happens in the standard document classes.

For some reason this code has some hard-coded |2.25em| and |4.5em| which were
not abstracted into macros or lengths. The code inserts horizontal rules above
and below the TOC contents in a non-separable by pagebreak way.

See \autoref{sec:thirdexampleextra} for more.

\section{A framed display}

We now opt for a ``framed'' style, using the package default
line styles and some colors added (it has been put in a float which appears
\vpageref{toc:b}).


\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\etocdefaultlines
\begingroup 
\renewcommand{\etoccolumnsep}{2em}
\renewcommand{\etocinnerleftsep}{1.5em}
\renewcommand{\etocinnerrightsep}{1.5em}
% specify a background color for the toc contents
\renewcommand{\etocbkgcolorcmd}{\color{yellow!10}}
% set up the top and bottom rules 
\renewcommand{\etoctoprule}{\hrule height 1pt}
\renewcommand{\etoctoprulecolorcmd}{\color{red!25}}
\renewcommand{\etocbottomrule}{\hrule height 1pt}
\renewcommand{\etocbottomrulecolorcmd}{\color{red!25}}
% set up the left and right rules
\renewcommand{\etocleftrule}{\vrule width 5pt}
\renewcommand{\etocrightrule}{\vrule width 5pt}
\renewcommand{\etocleftrulecolorcmd}{\color{red!25}}
\renewcommand{\etocrightrulecolorcmd}{\color{red!25}}
% use \fcolorbox to set up a colored frame for the title
\fboxrule1pt
\renewcommand{\etocbelowtocskip}{0pt\relax}
\etocframedstyle {\normalsize\rmfamily\itshape
  \fcolorbox{red}{white}{\parbox{.8\linewidth}{\centering
      This is a table of contents \`a la \etoc, but just for
      the sections and subsections in this part. As it is put
      in a frame, it has to be small enough to fit on 
      one page. It has the label |toc:b|.}}}
\begin{figure}[ht!]
  \centering
\tableofcontents \label{toc:b} \ref{toc:globalcmds}
\end{figure}
\endgroup
\end{filecontentshere}
\marginattach{-A}

\filecontentsexec\filecontentsheremacro




\section{Another TOC with a background color}\label{ssec:again}

Let us now try out some more sophisticated line styles. The display will use
the \csb{etocframedstyle} package command, which requires that the produced
table of contents fits on a single page. We wrap it up in a
\hyperref[toc:floating]{figure environment} showing up
\vpageref{toc:floating}.

This design uses the \etoc `framed' style with a background color. The frame
borders have been set to have the same color as the one serving as background
for the entire thing. It would be advantageous to use rather inside
\csb{etocsettocstyle} commands from a package like |tcolorbox| as this allows
sophisticated breakable boxes (with |TikZ/pgf| for decoration.)

The details of the line styles used here are a bit involved, they were written
by the author at some early stage of this documentation and have only been
slightly revised to use more \LaTeX-commands and less \TeX-primitives. Similar
code is used also for \hyperref[toc:clone]{this other toc}.


\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\begin{figure}[htbp!]\centering
\colorlet{subsecnum}{black}
\colorlet{secbackground}{green!30}
\colorlet{tocbackground}{red!20!green!20}

\renewcommand{\etocbkgcolorcmd}{\color{tocbackground}}
\renewcommand{\etocleftrulecolorcmd}{\color{tocbackground}}
\renewcommand{\etocrightrulecolorcmd}{\color{tocbackground}}
\renewcommand{\etocbottomrulecolorcmd}{\color{tocbackground}}
\renewcommand{\etoctoprulecolorcmd}{\color{tocbackground}}

\renewcommand{\etocleftrule}{\vrule width 3cm}
\renewcommand{\etocrightrule}{\vrule width 1cm}
\renewcommand{\etocbottomrule}{\hrule height 12pt}
\renewcommand{\etoctoprule}{\hrule height 12pt}

\renewcommand{\etocinnertopsep}{0pt}
\renewcommand{\etocinnerbottomsep}{0pt}
\renewcommand{\etocinnerleftsep}{0pt}
\renewcommand{\etocinnerrightsep}{0pt}

\newcommand\shiftedwhiterule[2]{%
    \hbox to \linewidth{\color{white}%
    \hskip#1\leaders\vrule height1pt\hfil}\nointerlineskip
    \vskip#2}

\etocsetstyle{subsubsection}
{\etocskipfirstprefix}
{\shiftedwhiterule{\leftskip}{6pt}}
{\sffamily\footnotesize
  \leftskip2.3cm\hangindent1cm\rightskip.5cm\relax
  \makebox[1cm][l]{\color{subsecnum}\etocnumber}%
  \color{black}\etocname
  \nobreak\leaders\hbox to.2cm{\hss.}\hfill
  \rlap{\makebox[.5cm][r]{\etocpage\hspace{.1cm}}}\par
  \nointerlineskip\vskip3pt}
{}

\etocsetstyle{subsection}
{\etocskipfirstprefix}
{\shiftedwhiterule{1.5cm}{6pt}}
{\sffamily\small
  \leftskip1.5cm\hangindent.8cm\rightskip.5cm\relax
  \makebox[.75cm][l]{\color{subsecnum}\etocnumber}%
  \color{black}\etocname
  \nobreak\leaders\hbox to.2cm{\hss.}\hfill
  \rlap{\makebox[.5cm][r]{\etocpage\hspace{.1cm}}}\par
  \nointerlineskip\vskip3pt}
{}

\newcommand{\coloredstuff}[2]{%
            \leftskip0pt\rightskip0pt\parskip0pt
            \fboxsep0pt % \colorbox uses \fboxsep also when no frame!
       \noindent\colorbox{secbackground}
               {\parbox{\linewidth}{%
                    \vskip5pt
                    {\noindent\color{#1}#2\par}\nointerlineskip
                    \vskip3pt}}%
       \par\nointerlineskip}

\etocsetstyle{section}
{\coloredstuff{blue}{\hfil \bfseries\large Contents of Part One\hfil}}
{\vskip3pt\sffamily\small}
{\coloredstuff{blue}
    {\leftskip1.5cm\rightskip.5cm\parfillskip-\rightskip
     \makebox[0pt][r]{\makebox[.5cm][l]{\etocnumber}}%
     \etocname\nobreak\hfill\makebox[.5cm][r]{\etocpage\hspace{.1cm}}}%
 \vskip6pt}
{}

\etocframedstyle[1]{}
\tableofcontents \label{toc:floating} \ref{toc:overview}
\vspace{-\baselineskip}
\centeredline{|\tableofcontents \ref{toc:overview}| 
(\emph{cf.} \hyperref[toc:clone]{this other toc})}
\end{figure}
\end{filecontentshere}
\marginattach{}

\filecontentsexec\filecontentsheremacro

\section{A (crazy) inline display}

Let us finally make some crazy inline display of the table of
contents of this entire document. We will typeset the subsections as
footnotes... This kind of style is suitable for a hyperlinked
document, probably not for print! (although I like it, but my personal tastes in
many matters do not seem to be widely shared).

%%%% Note: 27 april 2014 

%%%% except for a miraculous situation depending from the quantity of previous
%%%% material this TOC will have links extending accross pagebreaks, which
%%%% dvipdfmx does not know how to handle completely. Apart from that the output
%%%% is ok, thus no need to try seriously to avoid them. 

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begingroup
\newsavebox{\forsubsections}
\etocsetstyle{part}{\upshape. \etocskipfirstprefix}
                   {. \upshape}
                   {\bfseries\etocname:~~}
                   {}
\etocsetstyle{section}{\itshape\etocskipfirstprefix}
                      {, }
                      {\mdseries\etocname}
                      {}
\etocsetstyle{subsection}
    {\begin{lrbox}{\forsubsections}\footnotesize\upshape\etocskipfirstprefix}
    {; }
    {\etocname}
    {.\end{lrbox}\footnote{\unhbox\forsubsections}}
\etocsetstyle{subsubsection}
    { (\itshape\etocskipfirstprefix}
    {, }
    {\etocname}
    {\/\upshape)}
\etocsettocstyle{Here is the inline table of contents. }{.\par}
\tableofcontents \label{toc:crazyinline}
\endgroup
\end{filecontentsdef}

\filecontentsexec\foo

The code used:
\filecontentsprint\foo
\marginattach{}


\clearpage
\etocdepthtag.toc {surprising}
\part{Surprising uses of \etoc}
\label{part:surprising}

\thispartstats %% (pas de sous-section)

\etocstandardlines
\etocsettocstyle {}{}
\localtableofcontents

\section{The TOC of TOCs}

\begingroup % \endgroup just after the \tableofcontents command
\etocinline
\etocsetlevel{part}{1}
\etocsetlevel{visibletoc}{0}
\etocsetstyle{visibletoc}
    {\etocskipfirstprefix}
    {, }
    {{\color{niceone}\etocname}}
    {}
\etocsettocstyle{}{}
\etocsetnexttocdepth{visibletoc}


Here is the numbered and linked list of all tables of contents which are
displayed within this document:\footnote{The TOCs put in
  floats may change the order: the numbers are listed
  in the order the TOCs are typeset in the document; but the numbering
  itself is from the order of the TOCs in the \emph{source} of
  this document... }
\tableofcontents\endgroup. And to obtain
it here we just wrote:\par\smallskip 
{\leftskip1cm\rightskip2cm
  \ttfamily\small\baselineskip11pt \noindent Here is the
  numbered and linked list of all tables of contents which are
  displayed within this
  document:~\string\tableofcontents.\par}

  The preparatory work was the following. First, we defined a
  counter |visibletoc| whose vocation is to get incremented at
  each displayed toc. \etoc has its own private counter but it
  counts all TOCs, even those not displayed because the |tocdepth|
  value was |-2| or |-3|.

  We could have added manually |\refstepcounter{visibletoc}|
  and |\label| commands at all suitable locations in the
  document source, and we would then have used here |\ref|
  commands, but this imposes heavy manual editing of the source.

  There is a much better way: there is a hook
  \csb{etocaftertitlehook} and we told it to increment the
  |visibletoc| counter and to write a line to the |.toc| file,
  in a manner analogous to what sectioning commands such as
  |chapter|, |section|, or |subsection| do. As \etoc
  increments its own private counter even before typesetting
  the title of a table of contents, this provides (most of the
  time) a better link destination than any counter manipulated
  from inside \csb{etocaftertitlehook} (for which the link
  would target the area just after the title). So, rather than
  including |\refstepcounter{visibletoc}| inside
  \csb{etocaftertitlehook}, we just put there
  |\stepcounter{visibletoc}| followed by the command
  \csb{etoctoccontentsline}|{visibletoc}{\thevisibletoc}|. This \etoc
  command \csb{etoctoccontentsline}\marg{level\_name}\marg{name} has the same
  effect as:
  \centeredline{|    ||\addcontentsline{toc}|\marg{level\_name}\marg{name}}
  but its usefulness is to circumvent\footnote{using \csa{addtocontents} rather
    than \csa{addcontentsline}} the patching for automatic creation
  of bookmarks done to \csa{addcontentsline} by the \ctanpkg{hyperref} package, 
  as pdf bookmarks don't make 
  much sense here (and would elicit a complaint
  of \ctanpkg{hyperref} that the bookmark level is `unknown').\footnote{%
  The package provides a starred variant
  \staritb{etoctoccontentsline}, which does allow the creation
  of bookmarks and has a third mandatory argument which is the
  Level to be used by these bookmarks; depending on the context
  the starred as well as the non-starred variants may be
  profitably preceded by \csa{phantomsection}.}

  Finally, the preamble of the document did
  |\etocsetlevel{visibletoc}{6}|. The level |6| (or anything
  with a higher number) is ignored, even if |tocdepth| has
  value |10| for example; this is independently of whether \etoc
  uses the document class default line styles or its own line
  styles, or the ones defined by the user with the
  \csb{etocsetstyle} command. So there is no need to worry that
  something could go wrong. 

  Then, only here we have set |\etocsetlevel{visibletoc}{0}|. And to display
  only this kind of entries we assign temporarily to |part| and |chapter| level
  |1| (or anything higher than zero) and set |tocdepth| to the value |0|. We
  also did \csa{etocsetstyle\{visibletoc\}\{\string\etocskipfirstprefix\}\{,
    \}\{\string\etocname\}\{\}} which defines an inline display with the comma
  as separator. Finally, as \etoc issues |\par| automatically by default just
  before typesetting a table of contents, we used the command \csb{etocinline}
  (also known as \cs{etocnopar}) which turns off this behavior.

Here are the implementation details:

\begingroup
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
   < in the preamble >
\newcounter{visibletoc}
\renewcommand{\etocaftertitlehook}
   {\stepcounter{visibletoc}\etoctoccontentsline{visibletoc}{\thevisibletoc}}
\etocsetlevel{visibletoc}{6}
\begin{document}
   < document body >
\subsection{Surprising uses of etoc}
\begingroup
    \etocinline
    \etocsetlevel{part}{1}
    % \etocsetlevel{chapter}{1} % (no chapters in scrartcl class)
    \etocsetlevel{visibletoc}{0}
    \etocsetstyle{visibletoc}
        {\etocskipfirstprefix}{, }{{\color{niceone}\etocname}}{}
    \etocsettocstyle{}{}     % don't set any title, rules or frame or multicol!
    \etocsetnexttocdepth{visibletoc} % display only the `visibletoc' entries from .toc

Here is the numbered and linked list of all tables of contents which are
displayed within this document: \tableofcontents.
\endgroup
\end{filecontentshere}
\marginattach{}
\endgroup

After |\etocsetstyle{visibletoc}{..}{..}{..}{..}|, all future TOCs (not in
compatibility mode) will use the
defined style for level |0| (which is normally the level for
chapters). To keep these changes strictly local the simplest
manner is to put everything inside a group.

The \autoref{subsec:interverting} gives another use of the
shuffling of levels. 


\section[Arbitrary ``Lists Of...'', \csbhyp{etoctoccontentsline}]{%
         Arbitrary ``Lists Of...'', \csbhyp{etoctoccontentsline} and
         \csbhyp{etocimmediatetoccontentsline}}
\label{etoctoccontentsline}
\label{etocimmediatetoccontentsline}

This idea of interverting the levels is very powerful and allows
to let \etoc display lists of arbitrary things contained in the
document. All of that still
using nothing else than the |.toc| file! 
Example: imagine a document with dozens of
exercises, perhaps defined as |\newtheorem{exercise}{}[section]|. Let
us explain how to instruct \etoc to display an hyperlinked list
of all these exercises. For this we put in the preamble:
\begin{verbatim}
 \newtheorem{exerci}{}[section] 
    % the exercice number will be recoverable via \etocname: v--here--v
 \newcommand*{\exercisetotoc}{\etoctoccontentsline{exercise}{\theexerci}}
 \newenvironment{exercise}{\begin{exerci}\exercisetotoc}{\end{exerci}}
 \etocsetlevel{exercise}{6}
\end{verbatim}
In this way, \csb{etocname} will give the exercise number (but \csb{etocnumber}
will be empty). Had we used instead
\begin{verbatim}
 \newcommand*{\exercisetotoc}
    {\etoctoccontentsline{exercise}{\protect\numberline{\theexerci}}}
\end{verbatim}
the exercise number would then have been available via \csb{etocnumber}, and
\csb{etocname} would have been empty. It doesn't matter which one of the two
methods is used. The \etoc command \csb{etoctoccontentsline}|{..}{..}| is
provided as a substitute to \csa{addcon\-tentsline}|{toc}{..}{..}|: this is to
avoid the patching which is done by \ctanpkg{hyperref} to \csa{addcontentsline} in its
process of creation of bookmarks. If one wants to authorize \ctanpkg{hyperref} to create
bookmarks at a specific level \meta{n}, one can use (here with \meta{n}$=$|2|)
the starred variant \starit{etoctoccontentsline} which has an additional
argument:
\begin{verbatim}
\newcommand{\exercisetotoc}{\etoctoccontentsline*{exercise}{\theexerci}{2}}
\end{verbatim}

The counter |exerci| is already
incremented by the |exerci| theorem environment, and
provides the correct destination for the link added by package
\ctanpkg{hyperref}. The command \csa{exercisetotoc} adds for each exercise a line
to the |.toc| file, corresponding to a fictitious document
unit with name `|exercise|'. A
four-column list, including the sections, can then be
typeset with the following code:
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
  \etocsetnexttocdepth{2}     % sections are at level 1 and will show up
\begingroup
  \etocsetlevel{exercise}{2}   % but:
  \etocsetlevel{chapter}{3}    %     no chapters
  \etocsetlevel{subsection}{3} %     no subsections
  \etocsetlevel{part}{3}       %     no parts
  \etocsetstyle{exercise}{}{}  % \etocname = exercise number
    {\noindent\etocname\strut\leaders\etoctoclineleaders\hfill\etocpage\par}
    {\pagebreak[2]\vskip\baselineskip}
  \etocsetstyle{section}{}{}
    {\noindent\strut{\bfseries\large\etocnumber\hskip.5em\etocname}\par
     \nopagebreak[3]}{}
  \etocruledstyle[4]{\Large\bfseries List of the exercises}
  \setlength{\columnseprule}{.4pt}
  \tableofcontents
\endgroup
\end{filecontentshere}
\marginattach{}

A related command \csb{etocimmediatetoccontentsline} (and its starred version)
is also provided.  For discussion and the meaning of ``immediate'', refer to
the analogous case of \csb{etocimmediatedepthtag.toc}.

\section{The TOC as a tree}\label{tocastree}

Using \ctanpkg{tikz} and the package
\ctanpkg{forest} we shall display the table
of contents of this part as a tree. The technique is to
use the \etoc modified command \toc not for typesetting, but to
prepare a macro, or rather here a \emph{token list} variable, with all the
instructions to be executed later. \textsc{Leslie Lamport}'s book has no mention
whatsoever of token lists, and \LaTeX{} gives the impression to not really
expect the general user to ever hear about them (or delimited macros); this
whole section and the next are thus for 
advanced users.

Putting the \csb{etocnumber} and \csb{etocname}
commands in \csa{treetok} would be of no use: to which number or name would they
then refer to, in a delayed execution? 

We need to store, not the macro names, but the macro contents. And also we wish
to maintain the correct \ctanpkg{hyperref} hyperlinks.\footnote{This manual up to the
version of May 14, 2013 used package |tikz-qtree| but there were problems with
hyperlinks. No such problem arises either when using |forest| or the native
|tikz| syntax for trees (which will be illustrated in the next section).} The
commands \csb{etocname}, etc\dots, are robust, it is easier to work with 
\csb{etocthelinkednumber}, \csb{etocthelinkedname}, and \csb{etocthelinkedpage}
which contain the same information in an easier accessible form.%
%
\normalmarginpar\marginpar{\footnotesize\rmfamily\itshape\RaggedRight At \texttt{1.1a} the commands \csa{etocthelinkedname}, etc\dots, are always providing an hyperlink, so it is not true that \csb{etocname}, etc\dots, are always simply their robust variants.}

For this |forest| tree we have designed very special \etoc styles for sections
and subsections. They use a token list register called |\treetok| and a
macro |\appendtotok| whose r\^ole is to append to a given token list variable
the contents of a macro given as second argument. All this will happen in
reaction to a |\tableofcontents| command, but \emph{nothing} has yet been
printed in the process.\footnote{There is always a \csa{par}, which here is not
a problem, but can be suppressed if need be via the command \csb{etocinline} or
its synonym \csb{etocnopar}.} This is the later job of a |forest| environment
which will be given the contents of |\treetok|.



\let\appendtotok\relax

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
% \newtoks\treetok % put this (uncommented) preferably in the preamble
% \newtoks\tmptok  % (idem)

\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
  #1\expandafter\expandafter\expandafter
    {\expandafter\the\expandafter #1#2}}

\newcommand*\PrepareSectionNode{%
  \tmptok {\centering\bfseries}%
  \appendtotok\tmptok\etocthelinkedname
  \edef\foresttreenode{ [{\noexpand\parbox{2cm}{\the\tmptok}}}% 
}

\newcommand*{\PrepareSubsectionNode}{%
  \tmptok {\raggedright}%
  \appendtotok\tmptok\etocthelinkedname
  \edef\foresttreenode{ [{\noexpand\parbox{6cm}{\the\tmptok}}}%
}

\etocsetstyle{section}
  {\etocskipfirstprefix}
  {\appendtotok\treetok{ ]}}
  {\PrepareSectionNode \appendtotok\treetok\foresttreenode}
  {\appendtotok\treetok{ ]}}

\etocsetstyle{subsection}
  {\etocskipfirstprefix}
  {\appendtotok\treetok{ ]}}
  {\PrepareSubsectionNode \appendtotok\treetok\foresttreenode}
  {\appendtotok\treetok{ ]}}

\etocsettocstyle
    {\treetok{[{\hyperref[part:overview]{Overview}}}}
    {\global\appendtotok\treetok{ ]}}

% forest does not like @\the\treetok if \treetok is empty. On first latex
% run, this will be the case because the TOC style defined above will not
% have been executed, as the label {toc:overview} does not refer to a valid 
% TOC yet. So we must give a safe default value to \treetok
\treetok{[{run latex again}]}

\begin{figure}[th!]\centering
     \etocsetnexttocdepth{subsection}
     \tableofcontents \label{toc:forest}\ref{toc:overview}
     \hypersetup{hidelinks}%
     \bracketset{action character=@}
     \begin{forest} 
                  for tree={anchor=center,child anchor=west,
                            grow'=east,draw,thick,
                            edge={draw,thick,dashed,color=teal}},
                  where={level()==1}{circle,thick,fill=blue!5,
                                    before computing xy={l=3cm}}{},
                  where={level()==2}{fill=red!5,
                                    before computing xy={l=6cm}}{},
                  rectangle, thick, fill=cyan!5, inner sep=6pt,
     @\the\treetok 
     \end{forest}
\end{figure}
\end{filecontentsdef}
\filecontentsexec\foo

The resulting tree has been put in a \hyperref[toc:forest]{float}, which
appears \vpageref[above]{toc:forest}. Here is the 
code used for its production:
\filecontentsprint\foo
\marginattach{}
Why |\hypersetup{hidelinks}|? as explained in
\autoref{ssec:hidelinks}, I prefer the links in TOCs not to be
colorized, nor framed, so this document inserts a command
%\csa{hypersetup}\texttt{\{hidelinks\}} % ok pour hyphénation
%\csa{hypersetup}|{hidelinks}| % pas ok
|\hypersetup{hidelinks}| % ok maintenant 12 octobre 2013
 in the |.toc| file. But at the time the
|\treetok| contents are unpacked the |\hyperlink| commands
originating in
|\etocthelinkedname|, etc\dots{} will be executed in the normal
environment for links (which, in this document, is to colorize
them). Rather than having \etoc's code try to guess what the current ``style''
for links is (a concept not really provided by \ctanpkg{hyperref} it
seems) and store it in |\etocthelinkedname|, etc\dots, I opted for
the simpler solution to leave it up to the user to recreate
whatever conditions are desired. So here  it is necessary to re-issue
|\hypersetup{hidelinks}| in the |figure| environment.

There are some other examples in this documentation where
|\tableofcontents| is used to prepare material for later
typesetting:
\begin{itemize}
\item printing the statistics at the start of each Part (see
  \autoref{ssec:statistics}) is done using save boxes (so the problem of the
  appearance of the links does not arise then).
\item the typesetting of the TOC as a table in the pre-|1.08| way (see
  \autoref{ssec:tocastableold}); there we also have to issue
  |\hypersetup{hidelinks}| after having collected the names, numbers and
  page numbers in a token list register.
\item and the two additional tree examples in the next section.
\end{itemize}


\section{The TOC as a molecule}\label{sec:molecule}

It is also possible to construct a TOC tree obeying the TikZ
syntax for trees: but this is a more complicated task for the
\etoc line styles for reasons related to the way braces are
handled by \TeX{} (they need, when filling up the token list to be
always balanced at each step, else complicated tricks must be
employed.)

The simplest strategy is to allocate a token list (or use a macro) for each
level used: we may need a \csa{parttok}, a \csa{chaptertok}, a
\csa{sectiontok} and a \csa{subsectiontok}, to help in the task of filling
up the total \csa{treetok}. As we are interested here in the table of
contents of this (or another) document part, only a \csa{sectiontok} and a
\csa{subsectiontok} will be needed.


\begin{filecontentshere}{etocsnippet-\snippetno.tex}
% \newtoks\treetok % put this (uncommented) preferably in the preamble
% \newtoks\sectiontok 
% \newtoks\subsectiontok 
\newcommand*{\treenode}{}

\newcommand*{\appendchildtree}[2]{% token list t1 becomes: t1 child {t2}
   \edef\tmp{\the#1 child {\the#2}}%
   #1\expandafter{\tmp}%
}
\newcommand*{\preparetreenode}{%
  \tmptok\expandafter{\etocthelinkednumber}% expanded one time (mandatory)
  \edef\treenode{node {\the\tmptok}}%
}

\etocsetstyle{section}
  {\etocskipfirstprefix}
  {\appendchildtree\treetok\sectiontok}
  {\preparetreenode \sectiontok\expandafter{\treenode}}
  {\appendchildtree\treetok\sectiontok}

\etocsetstyle{subsection}
  {\etocskipfirstprefix}
  {\appendchildtree\sectiontok\subsectiontok}
  {\preparetreenode \subsectiontok\expandafter{\treenode}}
  {\appendchildtree\sectiontok\subsectiontok}

\etocsettocstyle
  {\treetok{\node {\hyperref[part:overview]{Overview}}}}
  {\global\appendtotok\treetok{ ;}}

\begin{figure}[thbp!]\centering
   \etocsetnexttocdepth{subsection}
   \tableofcontents \label{toc:molecule} \ref{toc:overview}
   \hypersetup{hidelinks}%
   \begin{tikzpicture}
              [grow cyclic,
               level 1/.style={level distance=4cm,sibling angle=72},
               level 2/.style={level distance=2cm,sibling angle=60},
               every node/.style={ball color=red,circle,text=SkyBlue},
               edge from parent path={[dashed,very thick,color=cyan]
                           (\tikzparentnode) --(\tikzchildnode)}] 
     \the\treetok
   \end{tikzpicture}
\end{figure}
\end{filecontentshere}
\marginattach{}

\filecontentsexec\filecontentsheremacro


The |\tableofcontents| command appears just above the
|tikzpicture| environment in a figure float (to make sure that the label of the
table of contents
refers to the same page as the one where the picture will actually be printed).
We thus get the table of contents as a ``\hyperref[toc:molecule]{molecule}'',
which  
appears \vpageref[above]{toc:molecule}.

This \hyperref[toc:molecule]{TikZ TOC} is fully hyperlinked, like the
previous 
\hyperref[toc:forest]{Forest TOC}.

\etocsettocstyle
  {\treetok{\node {\autoref{part:globalcmds}}}}
  {\global\appendtotok\treetok{ ;}}

\etocsetnexttocdepth {subsection}
\tableofcontents \ref{toc:globalcmds}

\noindent  
\parbox{4cm}{\hypersetup{hidelinks}%
    \begin{tikzpicture}
              [grow cyclic,
               level 1/.style={level distance=2.5cm,sibling angle=60},
               level 2/.style={level distance=1cm,sibling angle=45},
               every node/.style={ball color=red!50,circle,text=black},
               edge from parent path={[very thick,color=cyan]
                       (\tikzparentnode) --(\tikzchildnode)}] 
     \the\treetok
   \end{tikzpicture}}%
\begin{minipage}{\dimexpr\linewidth-4cm\relax}
  On the side, the (fully hyperlinked) table of contents of
  \autoref{part:globalcmds}.
  \def\MacroFont{\ttfamily\small\hyphenchar\font-1 \baselineskip10pt\relax}%
\begin{verbatim}
\etocsettocstyle
  {\treetok{\node {\autoref{part:globalcmds}}}}
  {\global\appendtotok\treetok{ ;}}
\etocsetnexttocdepth {subsection}
\tableofcontents \ref{toc:globalcmds}
\noindent  
\parbox{4cm}{\hypersetup{hidelinks}%
   \begin{tikzpicture}
      [grow cyclic,
       level 1/.style={level distance=2.5cm,sibling angle=60},
       level 2/.style={level distance=1cm,sibling angle=45},
       every node/.style={ball color=red!50,circle,text=black},
       edge from parent path={[very thick,color=cyan]
               (\tikzparentnode) --(\tikzchildnode)}] 
     \the\treetok
   \end{tikzpicture}}%
...
\end{verbatim}
\end{minipage}

\section{The TOC as a TikZ mind map}
\label{sec:mindmap}

This is in the same spirit as the ``molecule'' example. The use of the \eTeX{}
primitive \csa{unexpanded} will simplify the code.\footnote{The ``molecule''
example was added to this documentation on |2013/03/03|. The ``mindmap''
example was motivated on |2015/03/11| by
\url{http://tex.stackexchange.com/a/232584/4686}. Further help was then obtained via
\url{http://tex.stackexchange.com/q/232816/4686} and this led to the  
\hyperref[toc:mindmaptitlepage]{title page} which is a further example.}


\let\appendchildtree\relax
\let\childnode\relax
\let\appendtotok\relax
\expandafter\let\csname c@partco\endcsname\relax

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begingroup
% \newtoks\treetok % done in preamble
% \newtoks\parttok

\newcommand*\partnode {}  % just to check we don't overwrite something
\newcommand*\childnode {}

\newcommand*\tmprotate {} % just to check we don't overwrite something
\newcommand*\tmpoption {} % just to check we don't overwrite something
\newcommand*\tmpstuff  {} % just to check we don't overwrite something

\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
   #1\expandafter\expandafter\expandafter{\expandafter\the\expandafter #1#2}}

\newcommand*{\appendchildtree}[3]{% 
% this is to construct "t1 child [#3]{t2}" from #1=t1 and #2=t2
% t1 and t2 are two toks variable (not macros)
% #3 = for example teal!60
   \edef\tmpstuff {\the#1 child [#3]{\the#2}}%
   #1\expandafter {\tmpstuff }%
}

\newcounter{partco}

% 1,2,3,4,5,... -> 1,2,3,1,2,3,1,2,3
\def\pseudomodthree #1{\numexpr #1 + 3 - 3*((#1+1)/3)\relax}

\etocsetstyle{part}
  {\etocskipfirstprefix}
% This updates the global tree with the data  from the previous
% part and all its children sections. Moved here because for some parts the
% sections are not displayed due to depth tags.
  {\ifnum\value{partco}=3
     \appendchildtree\treetok\parttok {branch color= green!50,level distance=10cm}%
   \else
\ifcase\pseudomodthree{\value{partco}}%
   \or \appendchildtree\treetok\parttok {branch color= teal!60}%   first
   \or \appendchildtree\treetok\parttok {branch color= yellow!80}% second
   \else\appendchildtree\treetok\parttok {branch color= green!50}% third and next ...
   \fi\fi
   }
  {\stepcounter{partco}%
% customize manually  some TikZ set-up (should be done inside the TikZ thing I guess)
   \def\tmpoption {}%
   \def\tmprotate {}% first
   %\ifnum\value{partco}=5 \def\tmprotate {[counterclockwise from =-40]}\fi
   %\ifnum\value{partco}=8 \def\tmprotate {[counterclockwise from =-50]}\fi
% define the part node
   \edef\partnode{node \tmpoption 
                  {\unexpanded\expandafter{\etocthelinkednumber}. 
                   \unexpanded\expandafter{\etocthelinkedname}}\tmprotate }%
% this is a starting point which will be filled it by the section children
   \parttok\expandafter{\partnode}}
  {\ifcase\pseudomodthree{\value{partco}}%
   \or \appendchildtree\treetok\parttok {branch color= teal!60}%   first
   \or \appendchildtree\treetok\parttok {branch color= yellow!80}% second
   \else\appendchildtree\treetok\parttok {branch color= green!50}% third and next ...
   \fi
   }

\etocsetstyle{section}
  {}
  {}
  {% define the section node
   \edef\childnode{child {node {\unexpanded\expandafter{\etocthelinkednumber} 
                        \unexpanded\expandafter{\etocthelinkedname}}}}%
   % append it to the current \parttok
   \appendtotok\parttok\childnode
    }
  {}

\etocsettocstyle
  {\setcounter{partco}{0}%
   \treetok{\node [root concept]{\textbf{The \etoc documentation}}}}
  {\global\appendtotok\treetok{ ;}}
% The \global above is mandatory because etoc always typesets TOC inside a group

\etocsetnexttocdepth{section}
% use of depth tags to cut out some sections.
\etocsettagdepth {preamble}   {none}
\etocsettagdepth {overview}   {part}
\etocsettagdepth {arbitrarily}{part}
\etocsettagdepth {examples}   {section}
\etocsettagdepth {surprising} {part}
\etocsettagdepth {linestyles} {part}
\etocsettagdepth {globalcmds} {part}
\etocsettagdepth {custom}     {section}
\etocsettagdepth {tips}       {part}
\etocsettagdepth {etocandworld}{part}
\etocsettagdepth {code}       {section}

\tikzset{
    branch color/.style={
        concept color=#1!white,
        every child/.append style={concept color=#1!white!30!white, font=\normalsize},
    }
}%

\begin{figure}[thp!]
\tableofcontents\label{toc:mindmap}%
\centeredline{\resizebox{.85\paperwidth}{!}%
{\begin{tikzpicture}[mindmap,
                    grow cyclic, 
                    text width=2cm, 
                    align=flush center, 
                    nodes={concept}, 
                    concept color=orange!60,
                    root concept/.append style={text width=4cm, font=\Large},
   level 1/.append style={level distance=5cm,sibling angle=40, text width=3cm},
   level 2/.append style={level distance=7cm,sibling angle=30, text width=3cm},
   level 1 concept/.append style={font=\normalsize},
                    ]
\the\treetok
\end{tikzpicture}}}
\end{figure}
\endgroup
\end{filecontentsdef}
\filecontentsexec\foo

It is difficult to get everything to fit on one page. However \csa{resizebox}
comes to the rescue. And it preserves hyperlinks. Nevertheless for this
example I excluded some sections from the display, using the technique of the
\etoc \hyperref[etocdepthtag.toc]{depth tags}. The fully hyperlinked TOC
appears \vpageref{toc:mindmap}.

\filecontentsprint\foo
\marginattach{}
An interesting alternative is to use \etoc rather to convert the entire TOC
into a TikZ tree (perhaps excluding some parts) and print it out to a file
from which it can be recovered and manipulated directly by the author of the
document. Things written to the |.log| file get broken into lines. Here is a
technique to get non-broken output. Once the \csa{treetok} has been computed
by \etoc (as in the \hyperref[toc:molecule]{molecule} example, or the current
example), this demo will write it out to file with extension
|.toctree|:
\begin{verbatim}
  \newwrite\TOCasTree
  \immediate\openout\TOCasTree=\jobname.toctree
  \immediate\write\TOCasTree{\the\treetok}%
\end{verbatim}
The author can then copy it from there and customize it manually to get a
suitable tikz picture. See also
\centeredline{\url{http://tex.stackexchange.com/a/232792}}
for an elaboration of this.


\section{The TOC as a (long) table}
\label{sec:tocastable}

With release |1.08| it is easier to typeset a TOC as a table. It is
possible to open a tabular in the title part of the TOC (first argument
to \csb{etocsettocstyle}) and then close it after the contents (second
argument to \csb{etocsettocstyle}), and specify in the line styles how
to use the tabulation |&| and tabular end of row |\\|. There are some
conditions and a few caveats:

\begin{enumerate}
\item it is mandatory to issue \csb{etocglobaldefs} for \etoc's
  definitions to have global scope,
\item it is impossible to start one of the \meta{start}, \meta{prefix},
  \meta{contents} or \meta{finish} specification with a sole |\hline|,
  \emph{i.e.} one not preceded by a |\\| (it is however possible to put
  |\\| at the end of \meta{prefix} and the |\hline| at the start of
  \meta{contents}).
\item as is explained next, it is recommended to put the
  |\\| at the start of the \meta{prefix} or \meta{contents}
  specifications in order to close the \emph{previous} row, rather
  that at the end with the idea to close the \emph{current} row;
  and when the TOC is a partial one (a \csa{localtableofcontents}) this
  is (in almost all situations) mandatory.
\end{enumerate}

Here is an example of a TOC as a |longtable| (yes this is only \emph{one} table),
as is possible relatively simply now with |1.08|. The code follows.

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begingroup
\etocglobaldefs % necessary for \etocname etc... to survive &
\makeatletter
% hack into longtable \hline to avoid annoying (here) stray lines at top
\def\LT@@hline{%
  \ifx\@let@token\hline
    \global\let\@gtempa\@gobble
    \global\let\@gtempb\@firstofone %%% ADDED
    \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
  \else
    \global\let\@gtempa\@empty 
    \global\let\@gtempb\@gobble     %%% ADDED
    \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%
  \fi
  \ifnum0=`{\fi}%
  \multispan\LT@cols
     \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
  \@gtempb{%                        %%% ADDED
  \noalign{\LT@sep}%
  \multispan\LT@cols
     \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
  \noalign{\penalty\@M}%
  }%                                %%% ADDED
  \@gtempa}
\makeatother

% observe the locations of the \\
\etocsetstyle{part}
  {}
  {}
  {\\\hline\multicolumn{3}{c}{\bfseries\vrule height6ex depth3ex width0pt
                              \etocifnumbered{\etocnumber. }{}\etocname}}
  {}

\etocsetstyle{section}
  {}
  {\etociffirst{\\\hline}{\\}}
  {\etocnumber&\etocname &\etocpage }
  {}

\etocsetstyle{subsection}
  {}
  {\\}
  {&\makebox[1cm][c]{\etocnumber}%
    \parbox[t]{\dimexpr6cm-\tabcolsep\relax}{\sloppy\itshape\etocname\strut}%
   &\itshape\etocpage }
  {}

\etocsettocstyle
    {\hypersetup{hidelinks}%
     \begin{longtable}{|>{\bfseries}c|p{7cm}|r|}
     \hline
     \multicolumn{3}{|c|}{\Large\bfseries\strut\strut TABLE OF CONTENTS}%
     }
    {\\\hline\end{longtable}}

\etocsetnexttocdepth {subsection}

\tableofcontents
\endgroup
\end{filecontentsdef}

\filecontentsexec\foo

\filecontentsprint\foo
\marginattach{-A}
Examining the code above the reader will wonder why the |\\| are
always given first in \meta{prefix+contents} and not, as is more
intuitive, rather last. In some favorable cases (but almost never
for local tables of contents) one may indeed construct
TOC-as-tables with the |\\| located at the end of the style
specifications. The problem in the previous example was with the
positioning of the |\hline|'s.

Due to technical aspects of how \TeX{} constructs alignments any
definition or assignment done after an |\\| starts a new row, and
thus makes |\hline| an illegal token (this shows as a |misplaced
\noalign| error.) Not only does \etoc have to do such definitions
to construct \csb{etocname} etc..., it is furthermore the case that
some packages put things in the |.toc| file and as a result there
is never any guarantee that between two \csa{contentsline} there
will not be such a token like |\relax| which in the contexts of
alignments forces \TeX{} to start a cell and thus makes it
impossible then to insert an |\hline|.

The safest way is thus to start with an |\\| each line style
specification in order to close the \emph{previous} table row. We
had a little problem with the fact that we wanted parts not only
to have a rule above them (easy, they do |\\\hline|) but also
below them: after each part there is a section, and it is these
sections which are used to insert the missing |\hline|
(this is done with the help of the \csb{etociffirst}
conditional). 


Last technical note: because we put the |\\\hline| inside the branches, there
was no need to employ the expandable variants \csb{etocxiffirst} and
\csb{etocxifnumbered}.

For the hardliner's old way see \autoref{ssec:tocastableold}.

Here is also a much simpler example. It is a local table of
contents.

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begin{center}
\etocsetstyle{section}
             {}
             {\etociffirst{\\\hline\hline}{\\\hline}}
             {\etocname & \etocnumber & \etocpage }
             {}

\etocsettocstyle
   {\hypersetup{hidelinks}\begin{tabular}{|p{4cm}|c|c|}\hline
    \multicolumn{1}{|c|}{\bfseries Section}&
    \bfseries number&
    \bfseries page}
   {\\\hline\end{tabular}}

\etocglobaldefs % MANDATORY !!
\etocsetnexttocdepth{1}

\tableofcontents\ref{toc:overview}
\end{center}
\end{filecontentsdef}

\filecontentsexec\foo

\filecontentsprint\foo
\marginattach{-B}

\section{A TOC self-adjusting widths for its typesetting}
\label{sec:thirdexampleextra}

This is a continuation of \autoref{sec:thirdexample}. The goal is to adjust
automatically the ``numwidths'' used for typesetting the unit numbers in the
(local) tables of contents.
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\makeatletter
\newcommand*\TOCcompute@numwidths [2]{% #1=empty/"local", #2=minimal indent
  \begingroup
    \def\TOCnumwidthB {0pt}%
    \def\TOCnumwidthC {0pt}%
    \def\TOCnumwidthD {0pt}%
    \def\TOCnumwidthE {0pt}%
    \def\TOCnumwidthF {0pt}%
    \def\TOCnumwidthG {0pt}%
    \etocsetstyle{part}{}{}{}{}%
    \etocsetstyle{chapter}{}
      {\setbox0\hbox{\bfseries\etocthenumber\kern#2}}
      {\ifdim\wd0>\TOCnumwidthB\edef\TOCnumwidthB{\the\wd0}\fi}{}%
    \etocsetstyle{section}{}
      {\setbox0\hbox{\bfseries\etocthenumber\kern#2}}
      {\ifdim\wd0>\TOCnumwidthC\edef\TOCnumwidthC{\the\wd0}\fi}{}%
    \etocsetstyle{subsection}{}
      {\setbox0\hbox{\etocthenumber\kern#2}}
      {\ifdim\wd0>\TOCnumwidthD\edef\TOCnumwidthD{\the\wd0}\fi}{}%
    \etocsetstyle{subsubsection}{}
      {\setbox0\hbox{\etocthenumber\kern#2}}
      {\ifdim\wd0>\TOCnumwidthE\edef\TOCnumwidthE{\the\wd0}\fi}{}%
    \etocsetstyle{paragraph}{}
      {\setbox0\hbox{\etocthenumber\kern#2}}
      {\ifdim\wd0>\TOCnumwidthF\edef\TOCnumwidthF{\the\wd0}\fi}{}%
    \etocsetstyle{subparagraph}{}
      {\setbox0\hbox{\etocthenumber\kern#2}}
      {\ifdim\wd0>\TOCnumwidthG\edef\TOCnumwidthG{\the\wd0}\fi}{}%
    %
    \etocsettocstyle{}
     {\global\let\TOCnumwidthB\TOCnumwidthB
      \global\let\TOCnumwidthC\TOCnumwidthC
      \global\let\TOCnumwidthD\TOCnumwidthD
      \global\let\TOCnumwidthE\TOCnumwidthE
      \global\let\TOCnumwidthF\TOCnumwidthF
      \global\let\TOCnumwidthG\TOCnumwidthG}%
    \etocnopar
    \csname #1tableofcontents\endcsname
\typeout{Next TOCs will use \TOCnumwidthB\space for chapter number width}%
\typeout{Next TOCs will use \TOCnumwidthC\space for section number width}%
\typeout{Next TOCs will use \TOCnumwidthD\space for subsection number width}%
\typeout{Next TOCs will use \TOCnumwidthE\space for subsubsection number width}%
\typeout{Next TOCs will use \TOCnumwidthF\space for paragraph number width}%
\typeout{Next TOCs will use \TOCnumwidthG\space for subparagraph number width}%
    \endgroup
}%
\newcommand*\TOCcomputenumwidths [1][0.5em]{%
  \TOCcompute@numwidths {}{#1}%
}%
\newcommand*\TOCcomputelocalnumwidths [1][0.5em]{%
  \TOCcompute@numwidths {local}{#1}%
}%
\makeatother
\end{filecontentshere}
\marginattach{}
The optional parameter to \csa{TOCcomputenumwidths} specifies the minimal
indent. In case nothing is numbered you may wish a higher value than |0.5em|.
For each local table of contents to have its own width computations, the macro
\csa{TOCcomputelocalnumwidths} is provided. As the code makes global
assignments, either use (once) \csa{TOCcomputenumwidths} or do
\csa{TOCcomputelocalnumwidths} for each local table of contents.
\begin{verbatim}
  \TOCcomputelocalnumwidths  % may use optional argument to replace 0.5em
  \localtableofcontents
\end{verbatim}
Notes:
\begin{enumerate}[nosep]
\item naturally these are only suggestions. For example one could put
  everything in single macros \csa{TOCtoc} and \csa{TOClocaltoc} to
  simultaneously compute the numwidths and then typeset the (local) table of
  contents.
\item if you want to adjust the |tocdepth| recall from
  \autoref{ssec:bookmarksdepth} that it influences \ctanpkg{hyperref} hence you may
  need to use a group |\begingroup...\endgroup|. Or, one can use
  \csb{etocsetnexttocdepth}\marg{level} but (with the code as here) this must
  then be issued twice, once for \csa{TOCcomputelocalnumwidths}, once for
  \csa{localtableofcontents}.
\item the bold font serves above for both chapter and section numwidth
  computations, but the code from \autoref{sec:thirdexample} uses |\bfseries|
  only in local TOCs. Thus the \csa{TOCcomputenumwidth} will set the parameter
  \csa{TOCnumwidthC} to a value slightly larger than needed in the main TOC.
  Hence the section style in \csa{TOCcompute@numwidths} should possibly insert
  the |\bfseries| in the box only after testing for the optional parameter
  |local|.
\end{enumerate}

\clearpage
\etocdepthtag.toc {linestyles}

\part{Commands for the toc line styles}
\label{part:linestyles}

\thispartstats

\etocsetstyle{section}
{\begin{enumerate}[leftmargin=.75cm, label=\etocifnumbered
      {{\fboxrule1pt\fcolorbox{green}{white}{\etocnumber}}}{}]}
{\normalsize\bfseries\rmfamily\item}
{\etocname{} (page \etocpage)}
{\end{enumerate}}

\etocsetstyle{subsection}
{\begin{enumerate}[leftmargin=0cm, label=\etocnumber]}
{\normalfont \item}
{\etocname{} (p.~\etocpage)}
{\end{enumerate}}

\etocsetstyle{subsubsection}
{\par\nobreak\begingroup\normalfont\footnotesize\itshape\etocskipfirstprefix}
{\allowbreak\,--\,}
{\etocname}
{.\hfil\par\endgroup\pagebreak[3]}

% 27 janvier 2013 22:30
% je définis les macros (non protégées) 
% \etocthename, \etocthenumber, \etocthepage

\etocruledstyle[1]{\etocfontminusone\color{green}%
     \fboxrule1pt\fboxsep1ex
     \framebox[\linewidth]
              {\normalcolor\hss Contents of \autoref{part:linestyles}\hss}}

\localtableofcontents \label{toc:a}

\section{The \csbhyp{etocsetstyle}, \csbhyp{etocname} and \csbhyp{etocpage} commands}\label{sec:etocsetstyle}
\label{etocsetstyle}
\label{etocname}
\label{etocpage}

Let us explain how \etoc was used to produce the table of
contents displayed at the beginning of this \autoref{part:linestyles}.
This
is a local table of contents, and we used the command \localtoc.


We shall distinguish between the \emph{line styles} and the
\emph{toc display style}. The line styles were (essentially)
obtained in the following manner:%
\footnote{the present document has
  {\ttfamily\string\renewcommand\string{%
      \string\familydefault\string}\string{\string\sfdefault\string}}
  in its preamble, hence \csa{normalfont} switches to the
  |sans| typeface; so in the section line-style, I wrote
  \csa{rmfamily} instead.}

\begingroup\small
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\etocsetstyle{section}
{\begin{enumerate}}
{\normalsize\bfseries\rmfamily\item}
{\etocname{} (page \etocpage)}
{\end{enumerate}}

\etocsetstyle{subsection}
{\begin{enumerate}}
{\normalfont\item}
{\etocname{} (p.~\etocpage)}
{\end{enumerate}}

\etocsetstyle{subsubsection}
{\par\nobreak\begingroup\normalfont
        \footnotesize\itshape\etocskipfirstprefix}
{\allowbreak\,--\,}
{\etocname}
{.\hfil\par\endgroup\pagebreak[3]}
\end{filecontentshere}
\marginattach{}
\endgroup

These provisory style definitions rely on the automatic
numbering generated by the |enumerate| environments but it is
much better to use the further command \csb{etocnumber} inside
the item label, which gives the real thing. The improved
definitions will thus be explained later.

With this style, one would have 
to be imaginative to design something then for paragraph and
subparagraph entries! perhaps as superscripts? Well, usually
one does not need paragraphs and subparagraphs numbered and
listed in the TOC, so our putative user here chose a design
where no provision is made for them and added the definitive:
\begin{verbatim}
\etocsetstyle{paragraph}{}{}{}{}
\etocsetstyle{subparagraph}{}{}{}{}
\end{verbatim}
This is also the situation with the default package line styles!

Each \csb{etocsetstyle} command has five mandatory arguments:
\centeredline
{\csb{etocsetstyle}\color{blue}\marg{levelname}%
  \marg{start}\marg{prefix}\marg{contents}\marg{finish}}
The initially recognized \meta{levelname}'s are the sectioning
levels of the standard document classes: from \emph{part} (or
\emph{book} which is used by the \ctanpkg{memoir} class) down to
\emph{subparagraph}.

The \meta{start} code is executed when a toc entry of that level is
encountered and the previous one was at a higher level. The
\meta{finish} code is executed when one again encounters a higher
level toc entry. In the meantime all entries for that level are
typeset by executing first the \meta{prefix} code and then the
\meta{contents} code. 

The (robust) commands \csb{etocname}, \csb{etocnumber} and \csb{etocpage} are
provided for use inside the \meta{prefix} and \meta{contents} parts of the
\csb{etocsetstyle} specification. They represent of course, the name, number,
and page number of the corresponding toc entry. If package \ctanpkg{hyperref} is
active in the document and has added hyperlinks to the TOC data, then these
links are kept in the commands \csb{etocname}, \csb{etocnumber} and
\csb{etocpage} (this last one will have a link only if \ctanpkg{hyperref} was passed
either option \emph{linktoc=all} or option \emph{linktoc=page}.)%
%
\footnote{As expected, in case of \emph{linktoc=page}, only \csb{etocpage} is
an hyperlink, not \csb{etocname} nor \csb{etocnumber}.  See \csb{etoclink} on
how to create hyperlinks with the entry target.}
%
In accordance with the \ctanpkg{hyperref} native behavior, no
link gets incorporated into \csb{etocpage} if the page number is empty.

\section{The \csbhyp{etocskipfirstprefix} and \csbhyp{etociffirst} commands}
\label{etocskipfirstprefix}
\label{etociffirst}
\label{etocxiffirst}

The chosen |subsubsection| style made use of the command
\csb{etocskipfirstprefix}, which instructs \etoc to \emph{not} use
for the first item the specified \meta{prefix} code.\footnote{With
versions earlier than |1.08| it had to be the very last token in
the \meta{start} code. It may now appear anywhere therein.}

The command \csb{etociffirst}\marg{YES CODE}\marg{NO CODE} (new
with |1.08|) is a more flexible way to customize the \meta{prefix}
(and \meta{contents}) specifications. It executes the \meta{YES
CODE} branch if this is the first unit at that level (inside a
lower level) and the \meta{NO CODE} if not. This is a robust
command which survives to expansion (for example in an |enumitem| label).

The variant \csb{etocxiffirst} does the same, but is expandable.


\section{The \csbhyp{etocnumber} command}
\label{etocnumber}

So far, our specifications would use the numbering generated
by the |enumerate| environments, but of course we generally want
the actual numbers as found in the |.toc| file. This is
available via the \csb{etocnumber} command. To get the labels
in the |enumerate| list to use it we can proceed with the
syntax {\ttfamily label=\char32} from the package |enumitem|:
\begin{verbatim}
\etocsetstyle{section}
{\begin{enumerate}[label=\etocnumber]}
{\normalsize\bfseries\rmfamily\item}
{\etocname{} (page \etocpage)}
{\end{enumerate}}
\end{verbatim}
Rather than just \csb{etocnumber} we then used something like
|\fbox{\etocnumber}|. Note that \csb{etocnumber} is a robust
command which explains why it can be used inside the label specification
without needing an added |\protect|.


\section{The \csbhyp{etocifnumbered} switch}
\label{etocifnumbered}
\label{etocxifnumbered}

The \csa{fbox} would give an unaesthetic result in the case of
an unnumbered section (which ended up in the table of
contents via an \csa{addcontentsline} command).\footnote{as
  seen we use \csa{fcolorbox} rather than \csa{fbox}. Due
  to some redefinition made by package |xcolor|, had we used
  \csa{fbox} (and not used \ctanpkg{hyperref}) we would have needed
  \csa{protect}\csa{fbox}.}

The \csb{etocifnumbered}\marg{A}\marg{B} command executes
\meta{A} if the number exists, and \meta{B} if not. So we use
it in the code which was finally chosen for the |section| level:
\begin{verbatim}
\etocsetstyle{section}
{\begin{enumerate}[leftmargin=.75cm, label=\etocifnumbered
      {{\fboxrule1pt\fcolorbox{green}{white}{\etocnumber}}}{}]}
{\normalsize\bfseries\rmfamily\item}
{\etocname{} (page \etocpage)}
{\end{enumerate}}

\etocsetstyle{subsection}
{\begin{enumerate}[leftmargin=0cm, label=\etocnumber]}
{\normalfont \item}
{\etocname{} (p.~\etocpage)}
{\end{enumerate}}
\end{verbatim}

If we had changed only the |section| level, and not the
|subsection| level, an error on compilation would have occurred
because the package style for subsections expects to start `in
vertical mode'. An additional \csa{par} token in the
\meta{contents} part of the |section| level would have fixed
this: |{...(page \etocpage)\par}|.

The command \csb{etocifnumbered} is robust;  \csb{etocxifnumbered}
(new with |1.08|) has the same effect but is expandable.


\section{The \csbhyp{etocthename}, \csbhyp{etocthenumber}, and
\csbhyp{etocthepage} commands}
\label{etocthename}
\label{etocthenumber}
\label{etocthepage}

It is sometimes desirable to have access to the name, number and page
number without the hyperref link data: something similar to the starred
variant of the \csa{ref} command, when package \ctanpkg{hyperref} is used. For
example one may wish to use the unit or page number in some kind of
numeric context, or change its formatting. This is provided by
\csb{etocthename}, \csb{etocthenumber}, and \csb{etocthepage}.

These commands are not protected, so in moving argument
contexts (for example in a label specification) they should be
preceded by |\protect|.

\section{The \csbhyp{etoclink} command}
\label{etoclink}

The command \csb{etoclink}\marg{text} can be used in the line style
specifications in a manner analogous to \csb{etocname}, \csb{etocnumber} and
\csb{etocpage}.  It creates a link (if \ctanpkg{hyperref} is present%
%
\footnote{Prior to \texttt{1.1a}, no such link was added if the \texttt{.toc}
 file entry was encountered
 with  \ctanpkg{hyperref}'s option \texttt{linktoc} set to \texttt{none}.})
%
whose target is the corresponding document unit and
whose name is the given \meta{text} mandatory argument.

Hence |\etoclink{\etocthename}| is under default conditions of \ctanpkg{hyperref} like
the original \csb{etocname}, because the latter is already hyperlinked.  Under
\emph{linktoc=page} context |\etoclink{\etocthename}| adds the hyperlink which
is missing from \csb{etocname}.  Similarly under the default \ctanpkg{hyperref}
condition (i.e.\@ \emph{linktoc=section}) \csb{etocpage} is not an hyperlink, but one
can use |\etoclink{\etocthepage}|.

The command \csb{etoclink} is robust.

%  Since |etoc 1.08j| it contains the link
% destination in an already expanded form, so for example can be used even after
% a |&| in a tabular construction, if \csb{etocglobaldefs} was issued.




\makeatletter\scr@activate@xsection{1}\makeatother
% [] goes to head but {} to toc

% What would really be useful is an option for the length of {} to be measured
% and opt for [] only if does not fit on one header line
\section[The \csbhyp{etocthelinkedname} et al.\protect\@{} commands]
  {The \csbhyp{etocthelinkedname}, \csbhyp{etocthelinkednumber},
       \csbhyp{etocthelinkedpage} and \csbhyp{etocthelink} commands}
\label{etocthelinkedname}
\label{etocthelinkednumber}
\label{etocthelinkedpage}
\label{etocthelink}

\makeatletter\scr@activate@xsection{0}\makeatother

The meanings of these commands
can be stored for delayed usage. For example this is
done in the \hyperref[tocastree]{examples with trees}.

There has been a \textbf{breaking change} at |1.1a|.  Here is the behavior
\emph{prior} to this release:
\begin{itemize}[noitemsep]
\item \csb{etocthelinkedname} and \csb{etocthelinkednumber} were hyperlinks
  only if \ctanpkg{hyperref} was configured via |linktoc=all| or
  |linktoc=section| (the default),
\item \csb{etocthelinkedpage} was an hyperlink only if \ctanpkg{hyperref} was
  configured via |linktoc=all| or |linktoc=page| and the page number was not empty.
\end{itemize}
This behavior was coherent with the commands \csb{etocname}, \csb{etocnumber},
and \csb{etocpage} being the robust variants of \csb{etocthelinkedname},
\csb{etocthelinkednumber}, and \csb{etocthelinkedpage}.

At |1.1a| it was decided that the commands should match their denominations.%
%
\footnote{To tell the whole truth, the author in refactoring the code completely at \texttt{1.1a} was tricked by the names and forgot to read the old documentation so the new behavior was implemented and it was decided to keep the change.}
%
So they are now \emph{always} hyperlinks independently of |linktoc| \ctanpkg{hyperref}
option (\csb{etocthelinkedpage} has no hyperlink if the page number is empty,
to match \ctanpkg{hyperref} behavior):
\begin{itemize}[noitemsep]
\item \csb{etocthelinkedname} and \csb{etocthelinkednumber} and
  \csb{etocthelinkedpage} are always (in presence of \ctanpkg{hyperref})
  hyperlinks (for \csb{etocthelinkedpage} the page number must not be empty).
\end{itemize}


A further command is provided: \csb{etocthelink}, which wraps%
%
\footnote{Prior to \texttt{1.1a}, there was a link added only if \ctanpkg{hyperref} option \texttt{linktoc} was not \texttt{none}.}
%
an hyperlink around its argument: |\etocthelink|\marg{foo} hyperlinks an
arbitrary text \meta{foo} to the target sectioning unit in the document.
The command \csb{etoclink} is its robust variant.


Obsolete example of \begingroup
        \etocsetstyle {section}
          {\begin{itemize*}[itemjoin={{; }}, itemjoin*={{, and }}]}
          {\global\let\TmpEtocNumber\etocthelinkednumber
           \global\let\TmpEtocName\etocthelinkedname 
           \global\let\TmpEtocPage\etocthelinkedpage }
          {\item [{\bfseries\TmpEtocNumber.}]\TmpEtocName\ 
                 (\emph{p. \TmpEtocPage})}
          {\end{itemize*}.}%
    \etocsetnexttocdepth {section}%
    \etocsettocstyle {a table of contents done as an inline 
                          \ctanpkg{enumitem} environment: }{}%
    \etocinline\tableofcontents \ref{toc:globalcmds}
\endgroup

\begin{verbatim}
Obsolete example of \begingroup
        \etocsetstyle {section}
          {\begin{itemize*}[itemjoin={{; }}, itemjoin*={{, and }}]}
          {\global\let\TmpEtocNumber\etocthelinkednumber
           \global\let\TmpEtocName\etocthelinkedname 
           \global\let\TmpEtocPage\etocthelinkedpage }
% (the above needed as \item closes a group in enumitem inline environments)
          {\item [{\bfseries\TmpEtocNumber.}]\TmpEtocName\ 
                 (\emph{p. \TmpEtocPage})}
          {\end{itemize*}.}%
    \etocsetnexttocdepth {section}%
    \etocsettocstyle {a table of contents done as an inline 
                          \texttt{enumitem} environment: }{}%
    \etocinline\tableofcontents \ref{toc:globalcmds}
\endgroup
\end{verbatim}

\etoc |1.08a| offers a simpler way to the same result: thanks to
\csb{etocglobaldefs} there is no need
anymore here for \csb{etocthelinkedname}, as \csb{etocname} works.
\begin{verbatim}
Example of 
\begingroup\etocglobaldefs % <-- NEW mit etoc 1.08.
        \etocsetstyle {section}
          {\begin{itemize*}[itemjoin={{; }}, itemjoin*={{, and }}]}
          {}
          {\item [{\bfseries\etocnumber.}] \etocname\ (\emph{p. \etocpage })}
          {\end{itemize*}.}%
    \etocsetnexttocdepth {section}%
    \etocsettocstyle {a table of contents done as an inline
                       \texttt{enumitem} environment: }{}%
    \etocinline\tableofcontents \ref{toc:globalcmds}
\endgroup
\end{verbatim}
Example of 
\begingroup\etocglobaldefs % <-- NEW mit etoc 1.08.
        \etocsetstyle {section}
          {\begin{itemize*}[itemjoin={{; }}, itemjoin*={{, and }}]}
          {}
          {\item [{\bfseries\etocnumber.}]
                 \etocname\ (\emph{p. \etocpage })}
          {\end{itemize*}.}%
    \etocsetnexttocdepth {section}%
    \etocsettocstyle {a table of contents done as an inline
                       \ctanpkg{enumitem} environment: }{}%
    \etocinline\tableofcontents \ref{toc:globalcmds}
\endgroup

\section{DEPRECATED \csbhyp{etocsavedsectiontocline}, etc... commands.}
\label{etocsavedsectiontocline}
\label{etocsavedchaptertocline}

Prior to |1.1a|, \etoc modified (locally) at each \csb{tableofcontents} or
\csb{localtableofcontents} encountered the meaning of the \LaTeX\ internal
commands |\l@part|, |\l@chapter|, |\l@section|, etc... It stored (since |1.08k|)
their original meanings (at the time of the encountered TOC), into
\csb{etocsavedchaptertocline}, \csb{etocsavedsectiontocline}, etc... commands,
which allowed to do some simple changes via \etoc of the rendering via the
technique explained in \autoref{sec:anothercompat}.

This is all obsolete at |1.1a| because \etoc does not modify anymore (even
locally) |\l@part|, |\l@chapter|, |\l@section|, etc... so they can be used
directly in the context of the techniques of \autoref{sec:anothercompat}.

Thus \csb{etocsavedchaptertocline}, \csb{etocsavedsectiontocline},
etc... raise some warning that they will be removed at some later release and
that you should stop using them.

\section{The \csbhyp{etocsetlevel} command}
\label{etocsetlevel}

As already explained in \autoref{part:surprising}, one
can inform \etoc of a level to associate to a given sectioning
command with \csb{etocsetlevel}. For example:
\begin{verbatim}
\etocsetlevel{cell}{0}
\etocsetlevel{molecule}{1}
\etocsetlevel{atom}{2}
\etocsetlevel{nucleus}{3}
\end{verbatim}
In compatibility mode, it will be assumed that the commands |\l@cell|,
|\l@molecule|, ..., have been defined somewhere either by the user or a class:
doing only |\etocsetlevel| is not enough for the corresponding level to work
out-of-the-box in compatibility mode.

However, if no table of contents is typeset in compatibility mode, then all that
matters  is that the various line styles have been set. If, for example
|section| is at level |1|, then there is no need to do some
\csb{etocsetstyle}|{molecule}{..}{..}{..}{..}| after
\csb{etocsetlevel}|{molecule}{1}| if
\csb{etocsetstyle}|{section}{..}{..}{..}{..}| has already been done (and it has
been done by the package itself in its definition of its own line styles).
 
The accepted levels run from |-2| to |6| inclusive.  Anything else is
mapped to |6|, which is a dummy level, never displayed. The package
does:
\begin{verbatim}
\etocsetlevel{book}{-2}
\etocsetlevel{part}{-1}
\etocsetlevel{chapter}{0}
\etocsetlevel{section}{1}
\etocsetlevel{subsection}{2}
\etocsetlevel{subsubsection}{3}
\etocsetlevel{paragraph}{4}
\etocsetlevel{subparagraph}{5}
\end{verbatim}
\etoc own custom styles are activated by \csb{etocdefaultlines}. They
are illustrated by the main table of contents of this
document. 

These level assignments can be modified at anytime: see
\autoref{part:surprising} for various applications of this
technique. As one 
further example, let's mention here that the \hyperref[toc:main]{main table of
contents} of this document was typeset following these instructions:
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\etocsettocdepth {subsubsection} % set the initial tocdepth
\etocdefaultlines % use the package default line styles. At this early stage in
                  % the document they had not yet been modified by \etocsetstyle
                  % commands, so \etoctoclines could have been used, too.
\etocmarkboth\contentsname
\etocmulticolstyle[1]                   % one-column display
    {\pdfbookmark[1]{Table of contents}{MAINTOC}% create a bookmark in the pdf
     \noindent\bfseries\Large
     \leaders\hrule height1pt\hfill
     \MakeUppercase{Table of Contents}}
\begingroup                             % use a group to limit the scope of the
  \etocsetlevel{subsection}{3}          %   subsection level change.
  \etocsetlevel{subsubsection}{4}       % anything > tocdepth=3.
  \tableofcontents \label{toc:main}
\endgroup
\end{filecontentshere}
\marginattach{}
In this way, the subsections used the style originally designed for
subsubsections, the subsubsections were not printed. Without this modification,
the appearance would have been very different: the package line styles were
targeted to be employed in documents with many many sub-sub-sections, in a
two-column layout, giving thus a more compact output that what is achieved by
the default \LaTeX{} table of contents. But here, we have few sub-sub-sections
and it is more interesting to drop them and print in a visually different manner
sections and subsections. 


\section{Scope of commands added to 
         the \texorpdfstring{\texttt{.toc}}{.toc} file}

\begingroup % pour \small et \MacroFont en particulier.
\small

\subsection{Testing the scope}

Let us switch to the color red, and also add this command to the |.toc| file:

\color{red!50}
\addtocontents{toc}{\string\color{red!50}}

\def\MacroFont{\ttfamily \footnotesize\hyphenchar\font45 }
\begin{verbatim}
   \color{red!50}                             % changing text color
   \addtocontents{toc}{\string\color{red!50}} % and also in the .toc file
\end{verbatim}


\subsection{This is a (pale) red subsection for illustrative purposes}

Actually, this title here was printed black, due to the way the \ctanpkg{scrartcl} class
works (it would have been red in the |article| class), but we are more
interested in how it looks in the tables of contents: it does appear red in the
\hyperref[toc:main]{main table of contents} at the beginning of
this document, and also in the \hyperref[toc:a]{table of
contents for this part}. Both entries obey as expected the
|\color{red!50}| command inserted in the |.toc| file.

But let us now close this subsection and start a section.


\section{Am I also red?}

The question is about how it appears in the tables of contents: the answer is
that, yes it is red in the \hyperref[toc:main]{main TOC}, and no
it is not red in the \hyperref[toc:a]{local TOC for this part}.
The reason is that the \meta{finish} code for the subsection level closed a
group, as it used |\end{enumerate}|.

This illustrates the discussion from \autoref{ssec:limitations}. 

The default package line styles do not contain group opening and closing
instructions: the influence of a command added to the |.toc| file will propagate
until cancelled by another explicit such command inserted in the |.toc|
file.

\begin{verbatim}
    \normalcolor
    \addtocontents{toc}{\string\normalcolor}
\end{verbatim}
\endgroup

\normalcolor
\addtocontents{toc}{\string\normalcolor}

Back to black. Note that this scope problem arises in real life in a
multi-lingual document, as the \ctanpkg{babel} package writes to the |.toc| file the
language changes occurring in the document. 


\clearpage
\etocdepthtag.toc {globalcmds}

\part{Commands for the toc display style}
\label{part:globalcmds}

\thispartstats

\etocsettocstyle{}{}
\etocstandardlines
\localtableofcontents \label{toc:globalcmds}


\section{Specifying the toc display style}


The \emph{toc display} style says whether the TOC appears with
multiple columns or just one, whether the title is typeset as
in the |article| or |book| class, or should be centered above
the entries, with rules on its sides, or if the entire TOC
should be put in a frame. For example, to opt for a ruled
heading and single column layout, one issues commands of the
following type:
\begin{verbatim}
\etocruledstyle[1]{Title} \tableofcontents    (or \localtableofcontents)
shortcuts:         \etocruled[1]{Title}  (or  \etoclocalruled[1]{Title})
\end{verbatim}

\subsection{The command \csbhyp{etocsettocstyle}}
\label{etocsettocstyle}

This is a command with two mandatory arguments:\\
\centeredline{\csb{etocsettocstyle}\marg{before\_toc}\marg{after\_toc}}
The \marg{before\_toc} part is responsible for typesetting the
heading, for example it can be something like
\starit{section}|{\contentsname}|. 

Generally speaking this heading
should leave \TeX{} in ``vertical mode'' when the actual
typesetting of the contents will start: the line styles (either
from the standard classes or the package default line styles)
all expect to get started in `vertical mode'.

The first argument to \csb{etocsettocstyle} can also contain
instructions to mark the page headings.  Or
it could check (book class) to see if two-column mode is on,
and switch to one-column style, and the \meta{after\_toc} part
would then reenact the two-column mode.

\textbf{\TeX\ hacker note:} We have seen in the previous chapter some examples
of using |\begin{enumerate}| and |\end{enumerate}| within TOC line styles.
There is a real difficulty with doing however something like this:
\begin{verbatim}
\etocsettocstyle{\begin{enumerate}}{\end{enumerate}}
\etocsetstyle{section}{}{\item \sectionname}{}{}
\end{verbatim}
Indeed for example on first compilation of a document, the |.toc| file is
empty and there will be the typical ``Something's wrong--perhaps a missing
\string\item''. Using \csb{etocchecksemptiness} does not help, because as is
explained there, on first encountering a new TOC added at end of a document,
\etoc considers it non-empty, hence querying \csb{etocifwasempty} serves
nothing. No, one must do something like this:
\begin{verbatim}
\makeatletter
\etocsettocstyle
  {\begin{enumerate}}
  {\if@newlist\item Please run \LaTeX\ again\fi
   \end{enumerate}}
\makeatother
\etocsetstyle{section}{}{\item \sectionname}{}{}
\end{verbatim}

The commands to be described next \csb{etocmulticolstyle},
\csb{etocruledstyle}, and \csb{etocframedstyle} all call
\csb{etocsettocstyle} as a lower-level routine, to start a 
\texttt{multi\-cols} environment in \marg{before\_toc} and close it in
\marg{after\_toc}. 

\subsection{The commands \csbhyp{etocmulticolstyle}, \csbhyp{etocmulticol}, and \csbhyp{etoclocalmulticol}}
\label{etocmulticolstyle}
\label{etocmulticol}
\label{etoclocalmulticol}

This is a command with one optional and one mandatory argument:
\centeredline{\csb{etocmulticolstyle}\oarg{number\_of\_columns}\marg{heading}}
The
\meta{number\_of\_columns} can go from 1 to 10 (it defaults to 2; if its
value is 1, naturally no |multicols| environment is then created). The
\meta{heading} will typically be some `vertical' material like:
  \meta{heading} = |\section*|\marg{title}
but one may also have horizontal material like |\fbox{Hello World}| (\etoc
adds automatically a |\par| at the end of this ``heading'' argument to
\csb{etocmulticolstyle}). Here is for example
how the main table of contents of this document was
configured:
\begin{verbatim}
\etocmulticolstyle{\noindent\bfseries\Large
                   \leaders\hrule height1pt\hfill
                   \MakeUppercase{Table of Contents}}
\end{verbatim}
After \csb{etocmulticolstyle} all future \csa{tableofcontents} will use the
specified style, if it does not get changed in-between. A shortcut for
just one table of contents and 
no impact on the styles of later TOCs is:
\centeredline{\csb{etocmulticol}\oarg{number\_of\_columns}\marg{heading}}
And there is also
\csb{etoclocalmulticol}\oarg{number\_of\_columns}\marg{heading}.

\subsection{The command \csbhyp{etoctocstyle}}
\label{etoctocstyle}

\centeredline{\csb{etoctocstyle}\oarg{kind}%
\marg{number\_of\_columns}\marg{title}}
\centeredline{=
\csb{etocmulticolstyle}|[|{\itshape number\_of\_columns}|]|%
|{\kind*{|\itshape title\upshape|}}|}
where |kind| is one of |chapter|, |section|, . . . and defaults
to |chapter| or |section| depending on the document class.

\subsubsection{The command \csbhyp{etoctocstylewithmarks}}
\label{etoctocstylewithmarks}
\label{etoctocstylewithmarksnouc}

\centeredline{\csb{etoctocstylewithmarks}\oarg{kind}%
\marg{number\_of\_columns}\marg{title}\marg{mark}}
\centeredline
{=\csb{etocmulticolstyle}|[|{\itshape number\_of\_columns}|]|%
|{\kind*{|\itshape title \ttfamily\upshape\string\markboth%
|{\MakeUppercase{|{\rmfamily\itshape mark}|}}}}|} 
where |kind| is one of |chapter|, |section|, ... The
actual display of the marks depends on the settings of the
page style. There is variant \csb{etoctocstylewithmarksnouc}
which does not uppercase.

\paragraph{Do we really want paragraph entries in the TOC?}

\paragraph{really?}

\subsection{The commands  \csbhyp{etocruledstyle}, \csbhyp{etocruled} and \csbhyp{etoclocalruled}}
\label{etocruledstyle}
\label{etocruled}
\label{etoclocalruled}

The general format of \csb{etocruledstyle} is:\\
\centeredline{\csb{etocruledstyle}%
\oarg{number of columns}\marg{title of the toc}}
\noindent 
The title is horizontal material (the |LR| mode of 
\emph{\LaTeX{}, a document preparation system}): if it
does not fit on one line it should be put in a \csa{parbox}  of
a given width.
The green frame for the heading of the table of contents at
the \hyperref[toc:a]{start of the second part of this
  document} was obtained with:
\begin{verbatim}
\etocruledstyle[1]{\etocfontminusone\color{green}%
     \fboxrule1pt\fboxsep1ex
     \framebox[\linewidth]
              {\normalcolor\hss Contents of this part\hss}}
\end{verbatim}


As a shortcut to set the style with \csb{etocruledstyle} and
then issue a
\toc, all inside a group
so that  future table of contents will not be
affected, there is:
\centeredline{\csb{etocruled}\oarg{number\_of\_columns}\marg{title}}
And the local form will be \csb{etoclocalruled}.

\subsection{The commands \csbhyp{etocframedstyle},  \csbhyp{etocframed}, and \csbhyp{etoclocalframed}}
\label{etocframedstyle}
\label{etocframed}
\label{etoclocalframed}

Same mechanism:
\centeredline{\csb{etocframedstyle}%
  \oarg{number\_of\_columns}\marg{title}}
and the accompanying shortcut:
\centeredline{\csb{etocframed}\oarg{number\_of\_columns}\marg{title}} The
shortcut is used if one does not want to modify the style of the next
TOCs (the other way is to put the whole thing inside braces or a
|\begingroup...\endgroup|; there is also \csb{etoclocalframed} for a
local table of contents).

The entire table of contents is framed. The title itself is not framed:
if one wants a frame one should set it up inside the \meta{title}
argument to \csb{etocframedstyle} or \csb{etocframed}. The colors for
the background and for the components (top, left, right, bottom) of the
border are specified via suitable |\renewcommand|'s (see
\autoref{ssec:customdisplay}).

A |minipage| is used, hence the produced table of contents isn't
compatible with a page break. For allowing page breaks, use of
the commands of
\ctanpkg{mdframed}
or 
\ctanpkg{tcolorbox}
in the arguments of \csb{etocsettocstyle}  
is recommended.

Examples in this document are on pages \pageref{toc:d},
\pageref{toc:floating}, \pageref{toc:b}, and \pageref{toc:clone}.


\subsection{Headings, titles, \csbhyp{etocoldpar}, \csbhyp{etocinnertopsep}}
\label{etocinnertopsep}
\label{etocoldpar}

For \csb{etocmulticolstyle} the mandatory \meta{heading} argument can be
either 
vertical mode material like |\section*{\emph{Table of Contents}}| or
horizontal mode material like in the simple |\etocmulticolstyle{Hello World}|.

No explicit |\par| or empty line can be inserted in the mandatory
argument of \csb{etocmulticolstyle}, but \etoc provides \csb{etocoldpar}
as a substitute: it does |\let\etocoldpar\par| before the |multicols|
environment and inserts this |\etocoldpar|\footnote{this command
  \csb{etocoldpar} (= working \csa{par} in the argument to
  \csb{etocmulticolstyle}) is not related to the switch \csb{etocinline}
  whose purpose is to tell \etoc not to do a \csa{par} before the table
  of contents.} at the end of the heading, then does a vertical skip of
value \csb{etocinnertopsep}. The command \csb{etocoldpar} can also be
used explicitely if needed in the mandatory argument to
\csb{etocmulticolstyle} (it is not allowed to insert an empty line
in this argument).

On the other hand the commands \csb{etocruledstyle} and
\csb{etocframedstyle} expect an argument ``in LR mode'' (to use the
terminology from \emph{LaTeX, a document preparation system}). This
means that multiline titles are only possible if enclosing
them inside something like a \csa{parbox}.



An important dimension used by all three of \csb{etocmulticolstyle},
\csb{etocruledstyle} and \csb{etocframedstyle} is
\csb{etocinnertopsep}. It gives the amount of separation
between the heading and the start of the contents. Its default
value is |2ex| and it is changed with
|\renewcommand*{\etocinnertopsep}|\marg{new\_value}, not with
|\setlength|. 



\subsection{The compatibility mode \csbhyp{etocstandarddisplaystyle}}
\label{etocstandarddisplaystyle}

\etoc will then emulate what the document class would have
done regarding the global display style of the table of
contents, in its absence. All customizing from inside the
class should be obeyed, too.

\subsubsection{The commands \csbhyp{etocarticlestyle}, \csbhyp{etocbookstyle},
  \dots}
\label{etocarticlestyle}
\label{etocbookstyle}

These are the commands used internally by \etoc in compatibility mode
depending on the document class. For example \csb{etocarticlestyle} instructs
\etoc to use |\section*{\contentsname}| (with marks on the page) and
\csb{etocbookstyle} says to use |\chapter*{\contentsname}|. It can prove
useful to issue \csb{etocarticlestyle} for a \csa{localtableofcontents} inside
a chapter, in |book| class and compatibility mode for the global TOC display
style.

\subsection{The command \csbhyp{etocinline}}
\label{etocinline}
\label{etocnopar}
\label{etocdisplay}

With \csb{etocinline}, or its synonym |\etocnopar|, the
|\tableofcontents| command and its variants do \emph{not} first issue a
|\par| to close the previous paragraph. Hence, the table of contents can
be printed in an inline style; or, if used only for preparing some token
list or macro, it will leave nothing in the token stream on execution.

Issue \csb{etocdisplay} to return to the default situation that
|\tableofcontents| and variants issue a |\par| to switch to vertical
mode before typesetting the TOC title and contents.

\section{Starred variants and hooks}
\label{tableofcontents*}
\label{localtableofcontents*}
\label{etocbeforetitlehook}
\label{etocaftertitlehook}
\label{etocaftercontentshook}
\label{etocaftertochook}

The \toc, \localtoc, \csb{etocmulticol}, and all their cousins have starred
variants (the star must be before the other arguments). The non-starred
variants execute the \csb{etocaftertitlehook}, whose default definition is to
do nothing. The starred variants do not execute this hook.

For example, imagine you are using |book| class and want \localtoc to use a
section-like title, but unnumbered. Assuming the main \toc comes first in the
document, you can insert this after it:
\begin{verbatim}
  \etocarticlestyle
  \renewcommand{\etocaftertitlehook}{\addcontentsline{toc}{section}{\contentsname}}
\end{verbatim}
This configures the way \localtoc will behave (or \toc) from now on in the
document.

The first line tells essentially to use |\section*{\contentsname}|, and the
second line says to insert the title in the |.toc| file itself (thus to be
displayed by the main table of contents). Notice that \ctanpkg{hyperref} package will
then automatically create suitable anchor and one should \emph{not} use
explicitly \cs{phantomsection} here (it would let the anchor be located below
not above the title).

% problème avec \xspace
With this set-up issuing \localtoc\unskip|*| will ignore the \csb{etocaftertitlehook}
hence not send the local toc title to the |.toc| file. This mimicks the
\ctanpkg{memoir} class behavior, and can also be used with it. For more on \ctanpkg{memoir}
class with \etoc, see \autoref{ssec:memoir}.

There are further hook macros:
\csb{etocaftercontentshook}, \csb{etocbeforetitlehook} and
\csb{etocaftertochook} which are initially defined to do nothing and can be
used for some special effects. They are executed whether or not the table of
contents command was starred.%
%
\footnote{Hackers can test within these hooks if the context is starred or not
  via an \cs{ifx}\cs{Etoc@aftertitlehook}\cs{@empty} conditional. Perhaps a
  future release will provide \cs{etociftocisstarred} wrapper.}


\clearpage
\etocdepthtag.toc {custom}

\part{Using and customizing the \etoc own styles}
\label{part:custom}

\thispartstats

\etocdefaultlines
\renewcommand{\etoctoprule}{\hrule height2pt depth0pt}
\renewcommand{\etoctoprulecolorcmd}{\color{red}}

\etocruledstyle{\normalfont\normalsize\rmfamily\fboxrule1pt\color{red}%
  \fbox{\parbox{.8\linewidth}{\centering\normalcolor This is a table of
      contents for the sections and
      subsections in this part. It carries the label |toc:c|}}} 

\localtableofcontents \label{toc:c}


\section{Summary of the main style commands}

\subsection{Setting up local styles}

\hbox{\color{green}\fboxrule1pt\fboxsep1em
\setbox0\hbox{\csb{etocthename}, \csb{etocthenumber}, \csb{etocthepage}, \csb{etoclink}\marg{linkname}}%
\framebox[\linewidth][c]
{\vbox{\hsize\wd0\normalcolor\noindent
\csb{etocsetstyle}\marg{levelname}%
  \marg{start}\marg{prefix}\marg{contents}\marg{finish}\\
\csb{etocname}, \csb{etocnumber}, \csb{etocpage},
\csb{etocifnumbered}\marg{A}\marg{B}\\
\csb{etocthename}, \csb{etocthenumber}, \csb{etocthepage}, \csb{etoclink}\marg{linkname}
}}}

\subsection{Setting up toc display styles}

\medskip
\hbox{\color{green}\fboxrule1pt\fboxsep1em
\setbox0\hbox{\csb{etoctocstylewithmarksnouc}\oarg{kind}%
\marg{number\_of\_columns}\marg{title}\marg{mark}}%
\framebox[\linewidth][c]
{\vbox{\hsize\wd0
\normalcolor\noindent
\csb{etocmulticolstyle}\oarg{number\_of\_columns}\marg{heading}\\
\csb{etoctocstyle}\oarg{kind}\marg{number\_of\_columns}\marg{title}\\
\csb{etoctocstylewithmarks}\oarg{kind}\marg{number\_of\_columns}%
\marg{title}\marg{mark}\\
\csb{etoctocstylewithmarksnouc}\oarg{kind}\marg{number\_of\_columns}%
\marg{title}\marg{mark}\\
\csb{etocruledstyle}\oarg{number\_of\_columns}\marg{title}\\
\csb{etocframedstyle}\oarg{number\_of\_columns}\marg{title}\\
\csb{etocsettocstyle}\marg{before\_toc}\marg{after\_toc}}}}

\subsection{Displaying tables of contents}


\medskip \hbox{\color{green}\fboxrule1pt\fboxsep1em
  \setbox0\hbox{\csb{etocname}, \csb{etocnumber},
    \csb{etocpage}, \csb{etocifnumbered}\marg{A}\marg{B}}%
  \framebox[\linewidth][c]
  {\vbox{\hsize\wd0\normalcolor\noindent
      \toc\\
      \localtoc\\
      \csb{etocmulticol}\oarg{number\_of\_columns}\marg{heading}\\
      \csb{etoclocalmulticol}\oarg{number\_of\_columns}\marg{heading}\\
      \csb{etocruled}\oarg{number\_of\_columns}\marg{title}\\
      \csb{etoclocalruled}\oarg{number\_of\_columns}\marg{title}\\
      \csb{etocframed}\oarg{number\_of\_columns}\marg{title}\\
      \csb{etoclocalframed}\oarg{number\_of\_columns}\marg{title}\\
      \hbox{}{\itshape\ttfamily\ \ \ \  and their starred variants}
   }}}

\subsection{Labels and references}
\label{ssec:labelref}

The commands (starred or not) to actually display the table of contents
can be followed with optional labels or references:\par

\medskip \hbox{\color{green}\fboxrule1pt\fboxsep1em
  \setbox0\hbox{\csb{etocname}, \csb{etocnumber},
    \csb{etocpage}, \csb{etocifnumbered}\marg{A}\marg{B}}%
  \framebox[\linewidth][c]
  {\vbox{\hsize\wd0\normalcolor\noindent
      \toc \csa{label}|\{toc:here\}|\\ 
      \toc \csa{ref}|\{toc:far\}| \\
      \toc \csa{label}|\{toc:here\}| \csa{ref}|\{toc:far\}| \\
      \localtoc \csa{label}|\{toc:here\}|\\ 
      \localtoc \csa{ref}|\{toc:far\}| \\
      \localtoc \csa{label}|\{toc:here\}| \csa{ref}|\{toc:far\}| \\
      \hbox{}{\itshape\ttfamily\ \ \ \ similarly with\ }%
      \csb{etocmulticol}{\itshape\ttfamily\ etc . . . }
   }}}


\medskip 

%New with |1.08e|: 

\localtoc \csa{ref}|{toc:far}| acts the same as \toc
\csa{ref}|{toc:far}|.


When re-displaying another toc, only its contents are transferred:
both the line styles and the toc display style are the ones
currently defined, not the ones from the cloned toc.


\section{The package default line styles: \csbhyp{etocdefaultlines}}
\label{etocdefaultlines}

These line styles were written at an early stage in the
development of the package; although the next section explains how
to customize the font choicess or vertical spaces, etc\dots, used
by these line styles, most other changes would require copying
them from the sources and modify them directly. Admittedly they
have been written at a rather scary low-\TeX{} level, and will not
serve as a very friendly starting point. 

Activating their use is done via \csb{etocdefaultlines}, or
\csb{etoctoclines} if the line styles have not been modified with
\csb{etocsetstyle}. Sections and sub-sections are printed in
essentially the same manner, except that the leading for
sub-sections is a bit smaller (with document classes lacking a
\csa{chapter} command, the sections are printed in bold typeface;
this is the case in the present document). Sub-sub-sections are
printed inline, in one paragraph, with no numbers or page numbers.
This style was designed and tested with documents having lots of
sub-sub-sections, and should be used on a two-column layout: it
provides (only in that situation with many sub-sub-sections) a
more compact presentation than what is achieved by the \LaTeX{}
default.\footnote{and there will never be a Part or Chapter entry
  alone at the bottom of a column or page (except if it has no
  sub-unit).} On the other hand, used with a one-column layout,
and with few sub-sub-sections, the style is a bit more spread out
vertically than the \LaTeX{} default, sub-sections are not
visually much different from sections (especially for document
classes with a \csa{chapter} command), so the result is less
hierarchical in appearance than in the \LaTeX{} default.

In this document, for the \hyperref[toc:main]{main table of contents}, we did 
|\etocsetlevel{subsection}{3}| hence the sub-sections were printed with the
sub-sub-section inline style. 

Let us, to the contrary, typeset now this main table of contents as if the
document had been done with a class having the \csa{chapter} command: we will
print sections as chapters, and subsections as sections. We use
\csb{etocsetlevel} for that, and also we need to change the font style of
``sections'' (which in truth are our subsections) to use not the bold but the
medium series; we modify the \csb{etocfontone} command for that. Also we use dot
leaders which are less spread out than in the package default.


\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\etocruledstyle[2]{\normalfont\normalsize\rmfamily\itshape
  \fbox{\parbox{.6\linewidth}{
      \leftskip 0pt plus .5fil
      \rightskip 0pt plus -.5fil
      \parfillskip 0pt plus 1fil This is the global table of
      contents on two columns, using \etoc default line styles, but with
      sections as chapters, and subsections as sections.
      }}}
\etocdefaultlines
\etocsetnexttocdepth{1}
\begingroup
\etocsetlevel{section}{0}
\etocsetlevel{subsection}{1}
\renewcommand*{\etocfontone}{\normalfont \normalsize}
\renewcommand*{\etoctoclineleaders}
        {\hbox{\normalfont\normalsize\hbox to 1ex {\hss.\hss}}}
\sloppy
\tableofcontents
\endgroup
\end{filecontentshere}
\marginattach{}

\filecontentsexec\filecontentsheremacro

\section{Customizing \etoc}

\subsection{Customizing  the \etoc pre-defined line styles}
\label{etocfontminustwo}
\label{etocfontminusone}
\label{etocfontzero}
\label{etocfontone}
\label{etocfonttwo}
\label{etocfontthree}
\label{etocsepminustwo}
\label{etocsepminusone}
\label{etocsepzero}
\label{etocsepone}
\label{etocseptwo}
\label{etocsepthree}
\label{etocminustwoleftmargin}
\label{etocminustworightmargin}
\label{etocminusoneleftmargin}
\label{etocminusonerightmargin}
\label{etocbaselinespreadminustwo}
\label{etocbaselinespreadminusone}
\label{etocbaselinespreadzero}
\label{etocbaselinespreadone}
\label{etocbaselinespreadtwo}
\label{etocbaselinespreadthree}
\label{etoctoclineleaders}
\label{etocabbrevpagename}
\label{etocpartname}
\label{etocbookname}


We will simply list the relevant commands as defined in the
package. Customizing them goes through suitable
\csa{renewcommand}s:
\begin{verbatim}
\newcommand*\etocfontminustwo{\normalfont \LARGE \bfseries}
\newcommand*\etocfontminusone{\normalfont \large \bfseries}
\newcommand*\etocfontzero{\normalfont \large \bfseries}
\newcommand*\etocfontone{\normalfont \normalsize \bfseries}
% (in classes with chapter, \etocfontone does not do \bfseries)
\newcommand*\etocfonttwo{\normalfont \normalsize}
\newcommand*\etocfontthree{\normalfont \footnotesize}

\newcommand*\etocsepminustwo{4ex plus .5ex minus .5ex}
\newcommand*\etocsepminusone{4ex plus .5ex minus .5ex}
\newcommand*\etocsepzero{2.5ex plus .4ex minus .4ex}
\newcommand*\etocsepone{1.5ex plus .3ex minus .3ex}
\newcommand*\etocseptwo{.5ex plus .1ex minus .1ex}
\newcommand*\etocsepthree{.25ex plus .05ex minus .05ex}

\newcommand*\etocminustwoleftmargin{1.5em plus 0.5fil}
\newcommand*\etocminustworightmargin{1.5em plus -0.5fil}
\newcommand*\etocminusoneleftmargin{1em}
\newcommand*\etocminusonerightmargin{1em}

\newcommand*\etocbaselinespreadminustwo{1}
\newcommand*\etocbaselinespreadminusone{1}
\newcommand*\etocbaselinespreadzero{1}
\newcommand*\etocbaselinespreadone{1}
\newcommand*\etocbaselinespreadtwo{1}
\newcommand*\etocbaselinespreadthree{.9}
\newcommand*\etoctoclineleaders
    {\hbox{\normalfont\normalsize\hbox to 2ex {\hss.\hss}}}
\newcommand*\etocabbrevpagename{p.~}  % initial of "page"
\newcommand*\etocpartname{Part}  % prior to 1.08b, was \partname
% but this didn't make sense e.g. with babel+frenchb whose \frenchpartname
% takes into account the value of the part counter.
\newcommand*\etocbookname{Book} % to be modified according to language
\end{verbatim}

No customizing of the standard line styles is possible from
within \etoc. As already explained, when
\csb{etocstandardlines} has been issued, the package just makes
itself very discrete and acts only at the global level, and
the TOC entries are (hopefully) formatted as would have
happened in the absence of \etoc.\footnote{with the
  \ctanpkg{KOMA-script} classes, we noticed that
  \csb{etocstandarddisplaystyle} was apparently needed for the
  KOMA options |toc=left| to be active at the level of the line entries.}  


The \csb{etocstandardlines} compatibility mode will work also with
sectioning commands made known to \etoc via \csb{etocsetlevel},
under the condition of course that these sectioning commands
are accompanied with all the relevant definitions for
typesetting toc entries in the \LaTeX{} default manner
(existence of the macros \csa{l@something} . . .).

Using the command \csb{etocsetstyle}, be it in the preamble or
in the body of the document, has the secondary effect of
switching off the compatibility mode.

\subsection{Customizing the toc display styles}
\label{ssec:customdisplay}
\label{etocabovetocskip}
\label{etocbelowtocskip}
\label{etoccolumnsep}
\label{etocmulticolsep}
\label{etocmulticolpretolerance}
\label{etocmulticoltolerance}
\label{etocdefaultnbcol}
%\label{etocinnertopsep}% déjà défini
\label{etoctoprule}
\label{etoctoprulecolorcmd}
\label{etocinnerleftsep}
\label{etocinnerrightsep}
\label{etocinnerbottomsep}
\label{etocleftrule}
\label{etocrightrule}
\label{etocbottomrule}
\label{etocleftrulecolorcmd}
\label{etocrightrulecolorcmd}
\label{etocbottomrulecolorcmd}
\label{etocbkgcolorcmd}
\label{etocframedmphook}

Again we list the relevant macros, what they do should be
legible from their names. Note that \csa{renewcommand}'s and
not \csa{setlength}'s have to be used for what appear to be
lengths, and that color commands are not just color
specifications, they must include \csa{color}, and are canceled
by re-defining them to do \csa{relax}.
\begin{verbatim}
\newcommand*\etocabovetocskip{3.5ex plus 1ex minus .2ex} 
\newcommand*\etocbelowtocskip{3.5ex plus 1ex minus .2ex}

\newcommand*\etoccolumnsep{2em}
\newcommand*\etocmulticolsep{0ex}
\newcommand*\etocmulticolpretolerance{-1}
\newcommand*\etocmulticoltolerance{200}
\newcommand*\etocdefaultnbcol{2}
\newcommand*\etocinnertopsep{2ex}
\newcommand*\etoctoprule{\hrule}
\newcommand*\etoctoprulecolorcmd{\relax}

% for the framed style only:
\newcommand*\etocinnerleftsep{2em}
\newcommand*\etocinnerrightsep{2em}
\newcommand*\etocinnerbottomsep{3.5ex}

\newcommand*\etocleftrule{\vrule}
\newcommand*\etocrightrule{\vrule}
\newcommand*\etocbottomrule{\hrule}
\newcommand*\etocleftrulecolorcmd{\relax}
\newcommand*\etocrightrulecolorcmd{\relax}
\newcommand*\etocbottomrulecolorcmd{\relax}

\newcommand*\etocbkgcolorcmd{\relax}

% hooks
\newcommand\etocframedmphook{\relax}
\end{verbatim}

The \csa{etocframedmphook} is positioned immediately
after the beginning of a minipage environment where the
contents of the framed TOC are typeset. 

The \csa{...colorcmd} commands are initially set to expand to
\csa{relax} (hence do not require package |color| or |xcolor|
to be loaded). If one has modified a command such as
\csa{etocbkgcolorcmd} to expand to a color command and wants
to reset it to do nothing, one \emph{must} use
|\renewcommand{\etocbkgcolorcmd}{\relax}| and not
\csa{let}\csa{etocbkgcolorcmd}\csa{relax}.

Regarding the dimensions of the top rule they can be specified
in |ex|'s or |em|'s as in this example:
\centeredline{|\renewcommand{\etoctoprule}{\hrule height 1ex}|} 
The package code is done in such a manner
that it is the font size in instance at the end of typesetting
the title argument to \csb{etocruled} or
\csb{etocframed} which will be used for the meaning of the
`1ex'. Of course also the other rule commands can have their
dimensions in font relative units, but their values are
decided on the basis of the font in effect just before the
table of contents.

The top and bottom rules do not have to be rules and can be
horizontal \emph{leaders} (of a specified height) in the general
\TeX{} sense. However the left and right rules are not
used as (horizontal) leaders but as objects of a given specified
width. Note that \emph{only} the Plain \TeX{} syntax for rules is
accepted here. 

\section{One more example of colored TOC layout}
\label{ssec:tocclone}

The command \csb{etocframedstyle} puts the title on the top
rule in a centered position. This is not very convenient for
this example so we included the title as part of the
\meta{start} code at section level, to get it \emph{inside}
the frame.

\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\begingroup
\definecolor{subsecnum}{RGB}{13,151,225}
\definecolor{secbackground}{RGB}{0,177,235}
\definecolor{tocbackground}{RGB}{212,237,252}

\renewcommand{\etocbkgcolorcmd}{\color{tocbackground}}
\renewcommand{\etocleftrulecolorcmd}{\color{tocbackground}}
\renewcommand{\etocrightrulecolorcmd}{\color{tocbackground}}
\renewcommand{\etocbottomrulecolorcmd}{\color{tocbackground}}
\renewcommand{\etoctoprulecolorcmd}{\color{tocbackground}}

\renewcommand{\etocleftrule}{\vrule width 1cm}
\renewcommand{\etocrightrule}{\vrule width .5cm}
\renewcommand{\etocbottomrule}{\hrule height 12pt}
\renewcommand{\etoctoprule}{\hrule height 12pt}

\renewcommand{\etocinnertopsep}{0pt}
\renewcommand{\etocinnerbottomsep}{0pt}
\renewcommand{\etocinnerleftsep}{0pt}
\renewcommand{\etocinnerrightsep}{0pt}

\newcommand\shiftedwhiterule[2]{%
    \hbox to \linewidth{\color{white}%
    \hskip#1\leaders\vrule height1pt\hfil}\nointerlineskip\vskip#2}

\etocsetstyle{subsubsection}{\etocskipfirstprefix}
  {\shiftedwhiterule{\leftskip}{6pt}}
  {\sffamily\footnotesize
     \leftskip2.5cm\hangindent1cm\rightskip1cm\noindent
     \hbox to 1cm{\color{subsecnum}\etocnumber\hss}%
     \color{black}\etocname\leaders\hbox to .2cm{\hss.}\hfill
     \rlap{\hbox to 1cm{\hss\etocpage\hskip.2cm}}\par
     \nointerlineskip\vskip3pt}
  {}

\etocsetstyle{subsection}{\etocskipfirstprefix}
  {\shiftedwhiterule{1.5cm}{6pt}}
  {\sffamily\small
     \leftskip1.5cm\hangindent1cm\rightskip1cm\noindent
     \hbox to 1cm{\color{subsecnum}\etocnumber\hss}%
     \color{black}\etocname\leaders\hbox to .2cm{\hss.}\hfill
     \rlap{\hbox to 1cm{\hss\etocpage\hskip.2cm}}\par
     \nointerlineskip\vskip6pt}
  {}

\newcommand{\coloredstuff}[2]{%
            \leftskip0pt\rightskip0pt\parskip0pt
            \fboxsep0pt % \colorbox uses \fboxsep also when no frame!
       \noindent\colorbox{secbackground}
               {\parbox{\linewidth}{%
                    \vskip5pt
                    {\noindent\color{#1}#2\par}\nointerlineskip
                    \vskip3pt}}%
       \par\nointerlineskip}

\etocsetstyle{section}
{\coloredstuff{white}
     {\hfil \hyperref[toc:b]{\bfseries\large I am a twin of  
     that other TOC (click me!)}\hfil}}
{\vskip3pt\sffamily\small}
{\coloredstuff{white}
    {\leftskip1.5cm\rightskip.5cm\parfillskip-\rightskip
     \makebox[0pt][r]{\makebox[.5cm][r]{\etocnumber\hspace{.2cm}}}%
     \etocname\hfill\makebox[.5cm][r]{\etocpage\hspace{.2cm}}}%
 \vskip6pt }
{}

\etocframedstyle[1]{}
\tableofcontents \label{toc:clone} \ref{toc:globalcmds}
\endgroup
\end{filecontentshere}
\marginattach{}

\filecontentsexec\filecontentsheremacro
% 1.07l on the occasion of traduction into German documentation 
     % APRIL 26, 2014 Improvement in the section style for better placement of
     % page number when the section name is more than one line long. Use of
     % \makebox rather than \hbox, to be more LaTeX like.

The TOC has been put in a \hyperref[toc:clone]{float} which appears
\vpageref{toc:clone}. The coding is a bit involved\footnote{and reveals the
  author's preference for the \TeX{} syntax...} as it does not use any
additional package. Also, it was written at some early stage and I have not
revised it since.

A better solution would be to use some package to set
up a background color possibly extending accross pages, as the
framed style (which we used to get this background
color) can only deal with material short enough to fit on one
page.

Regarding colors, generally speaking all color commands inside
\etoc are initially defined to do nothing, and the choice to
use or not colors is left to the user.

\clearpage
\etocdepthtag.toc {tips}

\part{Tips}
\label{part:tipsandtricks}

\thispartstats

%%%% \invisiblelocaltableofcontents \label{toc:tipsandtricks}

\etocsettocstyle{}{}
\etocstandardlines
\localtableofcontents

%\section{... and tricks}

% pas traduit
\section{The \csbhyp{etoclocaltop} command}
\label{etoclocaltop}

%\textbf{New with 1.09 (2019/03/09)}.

Within either the TOC style
(\csb{etocsettocstyle}) or the local title styles (\csb{etocsetstyle}), the
control sequence \csb{etoclocaltop} is made equivalent for the duration of
\csb{localtableofcontents} to a numeric (self-delimiting) denotation of the
current top level.

Thus: it will in numeric contexts (|\ifnum|, |\ifcase|, ...) represent zero
for a local TOC corresponding to chapter, or one if in a section, or two if in
a subsection, etc..., assuming of course here that the default levels are
obeyed (see \autoref{sec:tocdepth}).

\begin{framed}
  \csb{etoclocaltop} from inside the TOC heading (first argument of
  \csb{etocsettocstyle}) has the correct value \emph{only under
    \csb{etocchecksemptiness} regime}. Special circumstances correspond to
  some special values:
  \begin{description}[nolistsep]
  \item[|-3|] (|-\thr@@|)\newline
    signals that \etoc considers the local TOC to be
    ``unknown''; this happens at the last local TOC, for the first \LaTeX\ run
    after adding a new \localtoc to the document. In doubt, \etoc assumes the
    TOC will prove non empty, hence it prints (independently of whether the
    check for emptiness was activated or not) the heading as specified by
    \csb{etocsettocstyle}. Thus, check if \csb{etoclocaltop} gives |-3| as a
    a \meta{number} to detect that situation from within the first argument of
    \csb{etocsettocstyle}, if desired.
  \item[|-1000|](|-\@m|)\newline  is in case of a \localtoc
    being considered ``known'' (although it may still refer to the data in the
    |.toc| file from the previous run) but without the check for emptiness
    having been executed.
  \item[|-10000|](|-\@M|)\newline  is the value when accessed from the title
    of a global TOCs.
  \end{description}
\end{framed}
\begin{framed}
  When executed from within a local table of contents \textbf{line styles}
  (\csb{etocsetstyle}), \csb{etoclocaltop} always will hold the correct value,
  whether or not the emptiness check was executed.

  For a global table of contents however, it will always keep the value |-3|.
\end{framed}

Attention! \cs{etoclocaltop} is only to be queried; modifying it is strictly
forbidden and falls under the most rigorous prosecution allowed by federal
law.

\section[The \csbhyp{etocsetlocaltop.toc} command]
        {The \csbhyp{etocsetlocaltop.toc} and
          \csbhyp{etocimmediatesetlocaltop.toc} commands}
\label{etocsetlocaltop.toc}
\label{etocimmediatesetlocaltop.toc}

It is important to understand that \csb{localtableofcontents} works entirely
from data \emph{in the |.toc| file}. If the document, say with |article|
class, contains starred sectioning commands, which are not accompanied
by suitable \csa{addcontentsline}, then these units are completely
transparent to \csb{localtableofcontents}:
\begin{itemize}
\item If \localtoc is issued before |\section*{Foo}|, say locally to a |\section|,
  then the local TOC will include not only the |subsection|s between the
  |\section| and the |\section*{Foo}| but also those following, and it will
  stop only at encountering a later |\section| or |\part| from the document's body.
\item If the command is issued right after |\section*{Foo}| and the later was
  itself subsequent to a (numbered) |\subsection|, then \etoc will think it
  must display a TOC local to the \emph{subsection}.
\end{itemize}

Since release |1.08k|, \etoc provides the one-argument command
\csb{etocsetlocaltop.toc} to insert into the |.toc| file a kind
of ``ghost'' of a given sectioning unit. Here is an example:

\begin{verbatim}
\part*{Extra unnumbered part}
\etocsetlocaltop.toc{part}
\localtableofcontents
\end{verbatim}

So with no |\part| heading inserted into the table of contents via an
|\addcontentsline|, still \localtoc will know it is local to a part.  In this
example the local contents will be delimited by the next numbered |\part|, or
|\part*| with |\addcontentsline|, or also by a later, second,
|\etocsetlocaltop.toc{part}|.

As a (counter)-example consider this document:
\begin{verbatim}
\documentclass{article}
\usepackage{etoc}
\begin{document}
\tableofcontents

\part*{A}
\etocsetlocaltop.toc{part}
\localtableofcontents

\section{I}

\section{II}

\part*{B}

\section{III}

\part*{C}

\section{IV}
\end{document}
\end{verbatim}
It uses only |\part*|.  Thanks to the \csb{etocsetlocaltop.toc} the \localtoc
knows it should report only sections.  But the other |\part*| are invisible to
it as nothing is recorded in the |.toc| file.  So the local table of contents
in this example will list \emph{all} sections not only |I| and |II|.  To fix thix one may
e.g.\@ insert another |\etocsetlocaltop.toc{part}|, this time after |\part*{B}|
(or make this a numbered part, or use |\addcontentsline| for it).

The above document amended with added  |\etocsetlocaltop.toc{part}| after each
unnumbered part will thus have its main TOC without any |Part| heading, but
each |\part| can show a correct \localtoc.  The simpler
approach would be to use |\addcontentsline| with each unnumbered |\part| so
that it ends up in the |.toc| file, but \etoc is keen on allowing the most
diverse point of views.

It should be stressed that the various |\etocsetlocaltop.toc|\marg{sect. unit}
do impact the global \toc: they really act like actual sectioning units,
except for not inducing any typesetting.  In usual document classes, this
would appear to mean that they are completely transparent to the global \toc.
Not the case with \etoc, which adds a virtual assembly of levels: the |.toc|
data originating in |\etocsetlocaltop.toc|\marg{sect. unit} will trigger the
execution of the \marg{finish} parts of the line styles of finer sectioning
units encountered before (either in the global \toc or in an active
\localtoc); and it triggers the \marg{start} parts of the line styles of finer
units encountered after it (again in the global \toc, but also in any
\localtoc which is already activated at a coarser lever).

Depending on how the toc line styles are configured this may translate into
some visual effect; for example with the \etoc own line styles the
\marg{start} and \marg{finish} mostly insert penalties or vertical spaces.

It is a matter of debate if this is good design; a variant serving purely to
influence boundaries of local table of contents with no collateral effects
could be provided.  And the name of the macro was perhaps not so well chosen
as it suggests it acts as would such an hypothetical variant.  In absence of
feature requests we leave the matter standing for now.%
%
\footnote{This documentation was updated and this paragraph added for the
  |1.09f| release.}

Usage of \csb{etocsetlocaltop.toc} interacts with
\csb{etocchecksemptiness} in the expected way: it modifies (as explained
above) the selection made by \csb{localtableofcontents}, hence the decision
whether this local TOC will end up empty or not.

There is also \csb{etocimmediatesetlocaltop.toc}.  This may be useful in some
very special circumstances involving |\include|.  For related discussion see
the documentation of \csb{etocimmediatedepthtag.toc}.

\section{Hacking framed parboxes}

\begin{verbatim}
\etocdefaultlines
\renewcommand\etoctoprule{\hrule height 2pt depth 2pt}
\etocruled{\color{green}\fboxrule2pt\fboxsep1ex
               \fbox{\raisebox{-\fontdimen22\textfont2}
                    {\color{blue}\parbox{.5\linewidth}
                       {\normalfont This text is perfectly centered
                        vertically with respect to the
                        surrounding horizontal rules.}}}}
\ref{toc:globalcmds}
\end{verbatim}

\etocdefaultlines

\renewcommand\etoctoprule{\hrule height 2pt depth 2pt}

\etocruled{\color{green}\fboxrule2pt\fboxsep1ex
              \fbox{\raisebox{-\fontdimen22\textfont2}
                    {\color{blue}\parbox{.5\linewidth}
                       {\normalfont This text is perfectly centered
                        vertically with respect to the
                        surrounding horizontal rules.}}}}
              \ref{toc:globalcmds}


\section{Interverting the levels}
\label{subsec:interverting}

Let us display and count all subsections occurring in this
document (see \autoref{part:surprising} for other uses of
this technique):  
\begin{verbatim}
\etocsetnexttocdepth{2}
\begingroup
\etocsetlevel{part}{3}
\etocsetlevel{section}{3}
\etocsetstyle{subsection}
    {\small\begin{enumerate}[itemsep=0pt,label=,leftmargin=0pt]}
    {\normalfont\bfseries\item}
    {\roman{enumi}. \mdseries\etocname{} (\etocnumber, p.~\etocpage)}
    {\end{enumerate}}
\renewcommand{\etoccolumnsep}{2.75em}
\renewcommand{\columnseprule}{1pt}
\etocmulticol[3]{\subsection{All subsections of this document}}
\endgroup
\end{verbatim}

\etocsetnexttocdepth{2}

\begingroup
\etocdefaultlines
\etocstandarddisplaystyle
\etocsetlevel{book}{3}
\etocsetlevel{part}{3}
\etocsetlevel{chapter}{3}
\etocsetlevel{section}{3}
\etocsetstyle{subsection}{\small
\begin{enumerate}[itemsep=0pt,label=,leftmargin=0pt]}
{\normalfont\bfseries\item}
{\roman{enumi}. \mdseries\etocname{} (\etocnumber, p.~\etocpage)}
{\end{enumerate}}

\renewcommand{\etoccolumnsep}{2.75em}
\renewcommand{\columnseprule}{1pt}

%%\etocmarkbothnouc{List of all subsections}
%% le mark (\markright) est fait par \subsection

\etocmulticol[3]{\subsection{All subsections of this document}\label{toc:allsubsections}}

\endgroup

\section{Displaying statistics}\label{ssec:statistics}

Each part of this document starts with a paragraph telling how many
sections and subsections it has. Well, each one of this paragraph is a
table of contents! We designed a macro \csa{thispartstats} to do that.
It uses ``storage'' boxes to keep the information about the first and
last section or subsection. Using boxes is the simplest manner to
encapsulate the \ctanpkg{hyperref} link for later use (whether there is one or
none). However, one cannot modify then the font or the color.
%  (using the
% \TeX{} primitive \csa{setbox} rather than the \LaTeX{} \csa{sbox} would
% allow to change the color of the un-boxed saved box)
If such a need
arises, one must switch from using boxes to using macros, and store the
\ctanpkg{hyperref} data for later use as was done in the code presented in
\autoref{sec:molecule}. We present also this second method.

But first, the code of \csa{thispartstats}:\par
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\newsavebox\firstnamei  \newsavebox\firstnumberi
\newsavebox\lastnamei   \newsavebox\lastnumberi
\newsavebox\firstnameii \newsavebox\firstnumberii
\newsavebox\lastnameii  \newsavebox\lastnumberii
\newcounter{mycounti}   \newcounter{mycountii}
\newcommand*{\thispartstatsauxi}{} \newcommand*{\thispartstatsauxii}{}
\newcommand*{\oldtocdepth}{}
\newcommand*{\thispartstats}{%
  \setcounter{mycounti}{0}%
  \setcounter{mycountii}{0}%
  \def\thispartstatsauxi{%
         \sbox{\firstnamei}{\footnotesize\etocname}%
         \sbox{\firstnumberi}{\footnotesize\etocnumber}%
         \def\thispartstatsauxi{}}%
  \def\thispartstatsauxii{%
         \sbox{\firstnameii}{\footnotesize\etocname}%
         \sbox{\firstnumberii}{\footnotesize\etocnumber}%
         \def\thispartstatsauxii{}}%
  \begingroup
  \etocsetstyle{subsection} {} {}
    {\thispartstatsauxii
     \stepcounter{mycountii}%
     \sbox{\lastnameii}{\footnotesize\etocname}%
     \sbox{\lastnumberii}{\footnotesize\etocnumber}} {}%
  \etocsetstyle{section} {} {}
    {\thispartstatsauxi
     \stepcounter{mycounti}%
     \sbox{\lastnamei}{\footnotesize\etocname}%
     \sbox{\lastnumberi}{\footnotesize\etocnumber}}
    {{\footnotesize\itshape
    Here are some statistics for this part: it contains \arabic{mycounti}
    section\ifnum\value{mycounti}>1 s\fi{} and \arabic{mycountii}
    subsection\ifnum\value{mycountii}>1 s\fi. The name of the first section is
    \unhbox\firstnamei{} and the corresponding number is \unhbox\firstnumberi. 
    The name of the last section is \unhbox\lastnamei{} and its number is
    \unhbox\lastnumberi. The name of the first subsection is \unhbox\firstnameii{}
    and the corresponding number is \unhbox\firstnumberii. The name of the last
    subsection is \unhbox\lastnameii{} and its number is \unhbox\lastnumberii.\par}}%
  \etocinline % cancels the automatic \par automatically before the TOC
  \etocsettocstyle {}{}
  \etocsetnexttocdepth{2}%
  \localtableofcontents  % to be used at the top level of a Part.
  \endgroup
}
\end{filecontentshere}
\marginattach{-A}
And now, the variant with macros rather than boxes (this variant as it
stands here is for using within a section).
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\makeatletter
\newcommand*\firstsubname   {}  \newcommand*\lastsubname    {}
\newcommand*\firstsubnumber {}  \newcommand*\lastsubnumber  {}
\newcommand*\thisspecialstatsaux{}
\newcommand*{\thisspecialstats}{%
  \setcounter{mycounti}{0}%
  \def\thisspecialstatsaux{%
         \let\firstsubname\etocthelinkedname
         \let\firstsubnumber\etocthelinkednumber
         \def\thisspecialstatsaux{}}
  \begingroup
  \etocsetstyle{subsection} {} {}
    {\thisspecialstatsaux
     \stepcounter{mycounti}%
     \let\lastsubname\etocthelinkedname
     \let\lastsubnumber\etocthelinkednumber }
    {Here are some statistics for this section. It contains \arabic{mycounti}
      subsections. The name of its first is \emph{\firstsubname{}} and the 
      corresponding number is {\firstsubnumber}. The name of the last 
      subsection is \emph{\lastsubname{}} and its number is {\lastsubnumber}.}% 
   \etocsettocstyle {}{}
   \etocinline
   \etocsetnexttocdepth {1}%
   \localtableofcontents % to be used within a section
  \endgroup
}
\makeatother
\end{filecontentshere}
\marginattach{-B}

\section{Using depth tags}
\label{ssec:tocwithdepthtags}

We want a TOC which will have a heading for each |\part| (except
the last part with the code source, which we decide not to
include), and will additionally open up \autoref{part:globalcmds}
up to paragraphs. To achieve this we added to this source various
\csb{etocdepthtag.toc} commands, and it remains now to set the
levels for each tag using \csb{etocsettagdepth} (this was used
earlier in this document, in \autoref{sec:secondexample}, within a
group hence it did not affect the other tables of contents).

However, the package line styles do not display paragraphs, and the
standard line styles of the document class give too much vertical
spacing (in this context) when displaying a Part heading in the TOC. So
we cook up our own, quickly designed line styles, in the style of
\autoref{sec:firstexample} (but with a way to put page numbers on the
right which is more like the method used by \LaTeX2e's
|\@dottedtocline|; and multi-line headings now leave empty the area
underneath the numbers contrarily to the code from
\autoref{sec:firstexample}). And after a few minutes for choosing
lengths (now that this has been done once, it can be recycled easily) we
get:

\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\etocsetnexttocdepth {all}
\begingroup 
\parindent 0pt \leftskip 0cm \rightskip .75cm \parfillskip -\rightskip
\newcommand*{\EndParWithPagenoInMargin}
    {\nobreak\hfill
     \makebox[0.75cm][r]{\mdseries\normalsize\etocpage}%
     \par}
\renewcommand*\etoctoclineleaders
    {\hbox{\normalfont\normalsize\hbox to .75ex {\hss.\hss}}}
\newcommand*{\EndParWithPagenoInMarginAndLeaders}
    {\nobreak\leaders\etoctoclineleaders\hfill
     \makebox[0.75cm][r]{\mdseries\normalsize\etocpage}%
     \par }
\etocsetstyle {part}
              {}
              {\leavevmode\leftskip 1cm\relax}
              {\bfseries\large\llap{\makebox[1cm][r]{\etocnumber\ \ }}%
               \etocname\EndParWithPagenoInMargin\smallskip}
              {}
\etocsetstyle {section}
              {}
              {\leavevmode\leftskip 1.75cm\relax}
              {\bfseries\normalsize\llap{\makebox[.75cm][l]{\etocnumber}}%
               \etocname\EndParWithPagenoInMarginAndLeaders}
              {}
\etocsetstyle {subsection}
              {}
              {\leavevmode\leftskip 2.75cm\relax }
              {\mdseries\normalsize\llap{\makebox[1cm][l]{\etocnumber}}%
               \etocname\EndParWithPagenoInMarginAndLeaders}
              {}
\etocsetstyle {subsubsection}
              {}
              {\leavevmode\leftskip 4cm\relax }
              {\mdseries\normalsize\llap{\makebox[1.25cm][l]{\etocnumber}}%
               \etocname\EndParWithPagenoInMarginAndLeaders}
              {}
\etocsetstyle {paragraph}
              {}
              {\leavevmode\leftskip 5.5cm\relax }
              {\mdseries\normalsize\llap{\makebox[1.5cm][l]{\etocnumber}}%
               \etocname\EndParWithPagenoInMarginAndLeaders}
              {}
\etocsettagdepth {preamble}   {none}
\etocsettagdepth {overview}   {part}
%\etocsettagdepth {arbitrarily}{part}% not needed explicitely, keeps value
%\etocsettagdepth {examples}   {part}
%\etocsettagdepth {surprising} {part}
%\etocsettagdepth {linestyles} {part}
\etocsettagdepth {globalcmds} {paragraph}
\etocsettagdepth {custom}     {part}
%\etocsettagdepth {tips}       {part}
%\etocsettagdepth {etocandworld}{part}
\etocsettagdepth {code}       {none}
\renewcommand\etoctoprule {\hrule height 3pt\relax }
\renewcommand\etoctoprulecolorcmd {\color{blue}}
\renewcommand\etocaftercontentshook 
   {\medskip\begingroup \color{blue}\hrule height 3pt \endgroup }
\etocruledstyle [1]{\Large\bfseries 
                    \fbox{\makebox[8cm]{A TOC using depth tags}}}
\sloppy
\tableofcontents
\endgroup
\end{filecontentsdef}

\filecontentsexec\foo

\filecontentsprint\foo
\marginattach{}

\section{Typesetting the TOC as a table (the old way)}
\label{ssec:tocastableold}

Due to, among other things, the fact that alignment cells create and close
groups, and that by default definitions of \csb{etocname}, \csb{etocnumber},
\csb{etocpage} made by \etoc are local, it was not easy to typeset a TOC as
table with \etoc, prior to release |1.08|. 

Not only \csb{etocname} etc... caused a problem, but also the basic
redefinition of \csa{contentsline} was made by \etoc only after the
first argument to \csb{etocsettocstyle} had been executed, hence if this
argument were to open a tabular, the \etoc redefinition of
\csa{contentsline} would be done in the first cell of the first row and
get lost thereafter.

Thus one had to resort to the technique explained in \autoref{tocastree}
of using the execution of \csa{tableofcontents} as a way to store data
which was then displayed later.

For the record, here is how the TOC from \autoref{sec:tocastable} was
coded in the old days.%
%
\footnote{At release |1.09f| the design of the TOC from
  \autoref{sec:tocastable} was modified; the code here reproduces
  the former looks.} 
%
We don't have here the problems with the
positioning of |\hline|'s we face with the newer method; on the other
hand we must manipulate token registers which are not familiar to most
\LaTeX{} users (macros could be used, but would be more cumbersome,
except perhaps if using the \eTeX{} \csa{unexpanded}).

The method here is the most powerful because it filters out of the
|.toc| file only the data we want (the other things are not ignored,
they are executed but hopefully do not create havoc; typically they are
language changing instructions, etc...),
and we are less susceptible to fall potential victims of various
external macros inserted in the |.toc| file by other packages.

Note: rather than |\toks| registers it would be easier here to use \eTeX{}
\csa{unexpanded} primitive. See for example \autoref{sec:mindmap}.

\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\newtoks\toctabletok
\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
  #1\expandafter\expandafter\expandafter {\expandafter\the\expandafter #1#2}}

\newcommand*\PreparePart{%
  \toks0 \expandafter{\etocthelinkednumber}%
  \toks2 \expandafter{\etocthelinkedname}%
  \toks4 \expandafter{\etocthelinkedpage}%
  \edef\toctablepiece {\noexpand\hline
                      \noexpand\strut\the\toks0 &\noexpand\bfseries\the\toks2 
                                 &\the\toks4 \noexpand\\\noexpand\hline}% 
}
\newcommand*\PrepareSection{%
  \toks0 \expandafter{\etocthelinkednumber}%
  \toks2 \expandafter{\etocthelinkedname}%
  \toks4 \expandafter{\etocthelinkedpage}%
  \edef\toctablepiece {\the\toks0 &\the\toks2 &\the\toks4 \noexpand\\}% 
}
% new version for 1.07k, 2014/03/06
\newcommand*{\PrepareSubsection}{%
  \toks0 \expandafter{\etocthelinkednumber}%
  \toks2 \expandafter{\expandafter\itshape\etocthelinkedname\strut}%
  \toks4 \expandafter{\expandafter\itshape\etocthelinkedpage}%
  \edef\toctablepiece{&\noexpand\makebox[1cm][c]{\the\toks0}%
                      \noexpand\parbox[t]{\dimexpr6cm-\tabcolsep\relax}
                                         {\noexpand\sloppy\the\toks2}%
                      &\the\toks4 \noexpand\\}%
}

\begingroup
\etocsetstyle{part}{}{}{\PreparePart \appendtotok\toctabletok\toctablepiece}{}

\etocsetstyle{section}{}{}{\PrepareSection \appendtotok\toctabletok\toctablepiece}{}

\etocsetstyle{subsection}{}{}{\PrepareSubsection\appendtotok\toctabletok\toctablepiece}{}

\etocsettocstyle
    {\toctabletok{\hypersetup{hidelinks}%
                 \begin{longtable}{|>{\bfseries}c|p{7cm}|r|}\hline
                 \multicolumn{3}{|c|}{\Large\bfseries\strut TABLE OF CONTENTS}%
                 \\\hline\hline}}
    {\global\toctabletok\expandafter{\the\toctabletok\hline\end{longtable}}}
\etocsettocdepth {subsection}
\tableofcontents
\the\toctabletok
\endgroup
\end{filecontentshere}
\marginattach{}

\clearpage
\etocdepthtag.toc {etocandworld}

\part{\etoc and the outside world}

\section{Constraints on the \texttt{.toc} file constitution}

The contents of the |.toc| file (if it already exists) are read into memory by
\etoc once, at the time of |\begin{document}|.\footnote{%
    Versions earlier than |1.07m| read the |.toc| file at the time of
    \csa{usepackage\{etoc\}}. Thanks to Denis Bitouzé who signaled a Babel
    related problem, which turned out to be caused by this.}

The |.toc| file remains available
  to other packages for read operations until the location of the first table
  of contents at which time a write stream is opened by \etoc and from that
  point the file is erased until its contents are again written to the disk by
  \LaTeX{} at the end of the compilation.

Don't use |\if<condition> stuff \tableofcontents\fi|, but:
\centeredline{|\if<condition> stuff \expandafter\tableofcontents\fi|}
Also a |\else| immediately following \csa{tableofcontents} or
\csa{localtableofcontents} requires a previous \csa{expandafter}.


\etoc can not really cohabit with packages modifying the \csa{tableofcontents}
  command: some sort of truce can be achieved if \etoc is loaded last, hence is
  the winner. 

\begin{framed}
    Do not modify the |\tableofcontents| command like this:
    \centeredline{|\let\oldtableofcontents\tableofcontents|}
    \centeredline{|\renewcommand\tableofcontents{\oldtableofcontents foo}|}
    as this will make the |\label/\ref| mechanism impossible. 

    Rather, redefine  \csb{etocaftertochook}
\centeredline{|\renewcommand\etocaftertochook{foo}|} and there
    is also \csb{etocaftercontentshook} which is executed a bit
    earlier\footnotemark{} just before the closing part of the toc display
    style (and thus still within a group.)

    Prepending is less of a problem (and anyhow there is also
    \csb{etocbeforetitlehook} available to the user).

    Under certain circumstances \etoc imposes its views on
    \csa{tableofcontents} at the time of |\begin{document}|. You may thus have
    to use \csa{AtBeginDocument} to delay your (necessarily ugly and
    non-recommendable) patches. Patching after |\begin{document}| is
    naturally possible but I feel almost a rebel to mention this to \LaTeX{} users!
\end{framed}
\footnotetext{contrarily to \csb{etocaftertochook},
      \csb{etocaftercontentshook} is not executed if the |tocdepth| did not
      allow the printing of the TOC.}

\etoc \textbf{requires} the |.toc| file to use the \csa{contentsline}
    macro. It \textbf{can not} work if there is no |.toc| file or if the
    |.toc| file does not contain the relevant data or if the |.toc| file does
    not use the \csa{contentsline} macro or if the \csa{contentsline} macro
    does not invoke the \csa{l@<divisionunit>} macros.

\section{Compatibility with document classes}

\etoc has mainly been tested with the |article| and |book| standard classes.
Some compatibility layer with the \ctanpkg{KOMA-script} and \ctanpkg{memoir} classes was added at
|1.05| of |2012/12/01|.  Such compatibilty layer regards what this
documentation calls the global display style: when \etoc gets activated
because the user employed some \csb{etocsetstyle}|{section}| (etc), i.e.\@ it
is not used purely in compatibility mode (which happens I guess for
\csb{localtableofcontents} functionality as it does not require reading the
user manual), \etoc tries in absence of usage by the user of
\csb{etocsettocstyle} to create itself a ``TOC display style'' emulating the
default behaviour of the document class.  There does not seem to be an easy
way to extract this in an automated manner dynamically, so it is basically
some manual work which the author initiated in 2012 and which got sporadically
updated since.

\subsection{Compatibility with the \ctanpkg{KOMA-script} classes}
\label{etocscrartclstyle}
\label{etocscrbookstyle}
\label{etocscrreprtstyle}

Not really tested... well, tested by this document with its dozens of \etoc
TOCs and which uses \ctanpkg{scrartcl}!  The package code contains
\begin{verbatim}
\@ifclassloaded{scrartcl}
    {\renewcommand*\etocstandarddisplaystyle{\etocscrartclstyle}}{}
\end{verbatim}
with \cs{etocscrartclstyle} trying to emulate the global display style of the
\cs{tableofcontents} within the class \ctanpkg{scrartcl}.  Thus \etoc is ready
for basic usage in compatibility mode (last updated
at |1.09f|).

\subsection{Compatibility with the \ctanpkg{memoir} class}
\label{ssec:memoir}
\label{etocmemoirtoctotocfmt}
\label{etocmemoirstyle}

Release |1.07l| has also improved the compatibility with the \ctanpkg{memoir} class: its
|appendix| level has been made known to \etoc. It is at the same level as
|chapter|, thus the chapter line style should possibly do a test for some user
defined boolean whose activation may be added to the |.toc| file at the suitable
location via |\addtocontents{toc}{..}|, if one needs to distinguish the two
kinds of divisions.

The \ctanpkg{memoir} mechanism relative to \toc versus \toc|*| is obeyed
automatically, and applies with \localtoc too.

But, attention, this means that \localtoc should preferentially be used with
the |*|.  Else the \ctanpkg{memoir} mechanism will insert a specific line in the
|.toc| file, using by default the |chapter| sectioning level.  But \etoc has
already written to the |.toc| file an instruction that the user wants a local
table of contents.  As a result, the fake |chapter| will let \etoc consider
that the \localtoc has empty contents, except if it used in a |\part| or
|\book|.

This may even cause successive document builds to never stabilize if
\csb{etocchecksemptiness} was issued in the preamble: as the local TOC is
empty, on next run the extra entry in |.toc| is absent, so the local TOC is
not empty and is typeset, but then |.toc| changes, so the rerunfilecheck
mechanism instructs to compile once more, and we end in a never stabilizing
conundrum.

Thus we see that the fact that \localtoc by default use like the global \toc a
chapter style is inconvenient. One can use the \ctanpkg{memoir} macros to modify this:
according to \ctanpkg{memoir} documentation, |\tocheadstart| and |\printtoctitle| seem
to be the most relevant. If you do that you will probably want the added line
in |.toc| file to use |{section}| not |{chapter}|. \etoc provides to this
effect \csb{etocmemoirtoctotocfmt}\marg{kind}\marg{name} whose first argument
\meta{kind} is |chapter|, |section|, |subsection|, etc... and the second
argument stands for the title and thus \csa{contentsname} is
appropriate. Hence
\begin{verbatim}
  \etocmemoirtoctotocfmt{section}{\contentsname}
\end{verbatim}
seems the natural choice in this context as an addition to the customizing the
\ctanpkg{memoir} toc related macros to achieve a section like rendering (for more
details on the latter, please refer to \ctanpkg{memoir} manual).  This is appropriate
for local TOCs in chapters.  Adapt to finer sectioning levels.

Another approach is to overrule the \etoc
default under \ctanpkg{memoir} like this
\begin{verbatim}
  \etocarticlestyle % means to use \section*{\contentsname} (and marks)
  \renewcommand{\etocaftertitlehook}{\addcontentsline{toc}{section}{\contentsname}}
\end{verbatim}
exactly as one would do with |book| class for example.  This emulates the
default under memoir that table of contents write a line to the |.toc| file representing
themselves, except that |chapter| has been replaced by |section|.  So we can
use \localtoc after a \csa{chapter}.  But if you want one after a
\csa{section}, you should modify \csb{etocaftertitlehook} to assign
|subsection| level to the \localtoc own styling.

\subsection{Compatibility with \ctanpkg{beamer}}

For the reasons mentioned already regarding the constraints on the |.toc| file
constitution, \etoc is incompatible with the
\ctanpkg{beamer} class. However, if \ctanpkg{beamer} is used in an article mode, i.e., with
the article class in conjunction with the \ctanpkg{beamerarticle} package, then \etoc
should work.

\section{Compatibility with other packages}

\subsection{Compatibility with \ctanpkg{babel}}

\begin{framed}
  One must load \etoc \emph{after} \ctanpkg{babel}. This is in order for
  \ctanpkg{babel}'s shorthands to be active at the time when \etoc loads the |.toc|
  file.
\end{framed}

\subsection{Compatibility with \ctanpkg{hyperref}}

Please inform the author in case of issues: \etoc was from the start designed
to be |100%| compatible with package \ctanpkg{hyperref}.

The macros \csb{etocname}, \csb{etocnumber}, and \csb{etocpage} contain the
\ctanpkg{hyperref} links, if present (note that the \emph{linktoc=all} option of
\ctanpkg{hyperref} tells it to put a link also in the page number corresponding to a
given toc entry). For example, the tables of contents of the present document
are all fully linked. It doesn't matter whether \etoc or \ctanpkg{hyperref} is loaded
first.

% 2015/11/12
% Pour une raison que j'ignore dans la TOC principale j'ai un problème avec
% cette sous-section.

\subsection{Com\-pat\-i\-bil\-ity with \ctanpkg{multicol}}

\etoc loads the package \ctanpkg{multicol}.

\subsection{Compatibility with \ctanpkg{tocloft}}\label{subs:tocloft}

Release |1.07k| added compatibility with package
\ctanpkg{tocloft}: steps are
taken to prevent the redefinition of |\tableofcontents| done by
\ctanpkg{tocloft} at |\begin{document}|.
%
As long as \etoc is left in compatibility mode the customization done by
\ctanpkg{tocloft} will be obeyed, for both the line styles and the TOC title.
One may still benefit from the \emph{depth tags} management by \etoc,
from its |\localtableofcontents|, from its |\label+\ref| mechanism. One
may use |\etocsetstyle| to define via \etoc the layout for one TOC and
then use rather \ctanpkg{tocloft} for another one, if |\tableofcontents| follows
\csb{etocstandardlines} and \csb{etocstandarddisplaystyle}. In this
compatibility mode |\etocsetlevel{division unit}{6}| will render
invisible the chosen division level, but exchanging levels is otherwise
not possible.

\begin{framed}
  One should load \etoc \emph{after} \ctanpkg{tocloft}. A warning is
  issued if otherwise, because if \etoc is loaded before it will realize that at
  the time of |\begin{document}| and trick \ctanpkg{tocloft} into believing
  having been loaded with the |titles| option.
\end{framed}

It is possible to modify midway in the document the macros \csa{l@section},
\csa{l@subsection} ... but the effect will be seen only in table of contents
typeset by \etoc in compatibility mode (and of course after those
customizations).  It will have no effect on true \etoc TOCs.

\subsection{Compatibility with \ctanpkg{tocvsec2}}

  \etoc used to be incompatible with package
  \ctanpkg{tocvsec2}; it now cohabits, sort
  of, as it deactivates \ctanpkg{tocvsec2}'s modification of |\tableofcontents|
  and also cancels its other |toc|-related macros, but
  reimplements partially their functionality with \csb{etocsettocdepth.toc}. By
  the way, at least two latex runs are necessary for new uses of this command in
  a document to have an effect in tables of contents.

\subsection{Compatibility with \ctanpkg{tableof}}

It is possible to use simultaneously \etoc and
\ctanpkg{tableof}. Release
|1.08| of \etoc requires at least version |1.4a| of \ctanpkg{tableof}. If
\csb{etocglobaldefs} is put in the preamble, this must be after the loading of
package \ctanpkg{tableof}. {\color{niceone}\ctanpkg{tableof}} command \csa{nexttocwithtags}
should work as expected. 

\ctanpkg{tableof} commands \csa{tableof}, \csa{tablenotof}, ... will
typeset the (a priori global) table of contents according to the document
class defaults, obeying the \etoc depth tags; as explained in the \ctanpkg{tableof}
documentation they do not typeset a TOC title. They should \emph{not} be used
in case \csb{etocglobaldefs} was issued before, except if its scope has been
terminated since then, or \csb{etoclocaldefs} has cancelled its influence.

\subsection{Compatibility with \ctanpkg{tocstyle}}

Unknown. (not tested a.t.t.o.w).


\section{\TeX nical matters}

The \csb{etocname}, \csb{etocnumber}, \csb{etocpage} commands are protected
against premature expansion. They are hyperlinks if package \ctanpkg{hyperref}
is loaded and depending on its option |linktoc| value; under the default
|linktoc=section|, only name and number are hyperlinked, not the page
number.

On the other hand \csb{etocthename}, \csb{etocthenumber}, \csb{etocthepage}
are \emph{not} protected against expansion. And neither are
\csb{etocthelinkedname}, \csb{etocthelinkednumber}, \csb{etocthelinkedpage}.
They were modified at |1.1a| and now are always hyperlinks (except for the
latter if the page number is empty), if
\ctanpkg{hyperref} is present, independently of |linktoc| status.

The commands \csb{etoclink} and \csb{etocifnumbered} are also
protected against premature expansion. Also \csb{etociffirst} and
\csb{etoctoccontentsline}.

Commands such as \csb{etocsetstyle}, \csb{etocsetlevel},
\csb{etocsettocstyle}, \csb{etocmulticolstyle},
\csb{etocruledstyle}, \csb{etocframedstyle} obey \LaTeX{}'s
groups. All TOCs are typeset inside groups.

When a \localtoc is inserted by the user in the document, a
line containing an \etoc inner command and an identification
number is added to the |.toc| file on first subsequent compilation.
The correct local table of
contents will be displayed only on the second compilation.


%%% de-\section this for matters of avoiding too cramped mindmap TOC
%%%\section{Errors and catastrophes}

  After using \csb{etocsetstyle} for one level, the remaining
  uncustomized levels use the \etoc default styles (those
  which are activated by \csb{etocdefaultlines}). One has to
  make sure that \textbf{all levels} needed for the next table of
  contents are mutually compatible: in particular the \etoc
  default line styles expect each to be started in ``vertical mode''.

  When using multiple \toc commands in a document, one should beware from
  adding typesetting instructions directly in the |.toc| file, as they will be
  executed by \etoc for \textbf{all TOCs}: even for a \localtoc it doesn't
  matter if that instruction seems to concern material outside of its scope,
  it will get executed nevertheless. If absolutely necessary to add extra
  commands to the |.toc| file, make it in such a way that they can be
  activated or deactivated easily from the document source, e.g.\@ via some
  booleans.

  As is usual with toc and labels, after each change, one has
  to run latex a certain number of times to let the produced
  document get its final appearance (at least twice).\par

\clearpage
\etocdepthtag.toc {code}
\normalmarginpar\marginparwidth72bp
\part{The code}

\localtableofcontents

% IL FAUT METTRE AVANT \section{Timestamps} SINON FOUTU
% (non plus maintenant puisque j'utilise \botmark pas \firstmark
%  dans le \rightmark)
% Que c'est pénible cette syntaxe \markboth/\markright de LaTeX !
% Pourquoi est-ce que \markright n'a pas été définie comme #1#2-> truc avec #2 ??
\makeatletter
\if@twoside 
\renewcommand *{\sectionmark }[1]{%
  \markboth
         {\unexpanded{\ifodd\value{page}(\hyperref[imp]{implementation},
                                         \hyperlink{FRONTPAGE}{user manual
                                           front page})\hfill\fi
          \hyperref[changelog]{\thesection. Change history}%
          \ifodd\value{page}\else\hfill(\hyperref[imp]{implementation},
                                        \hyperlink{FRONTPAGE}{user manual
                                          front page})\fi}}%
         {\unexpanded{\ifodd\value{page}(\hyperref[imp]{implementation},
                                         \hyperlink{FRONTPAGE}{user manual
                                           front page})\hfill\fi
          \hyperref[changelog]{\thesection. Change history}%
          \ifodd\value{page}\else\hfill(\hyperref[imp]{implementation},
                                        \hyperlink{FRONTPAGE}{user manual
                                          front page})\fi}}%
}
\else\error
% faudrait cependant que je réfléchisse à quoi faire exactement en oneside
% mais comme ceci ne peut arriver que si quelqu'un customise etoc.tex
% ce qui n'arrivera JAMAIS, je laisse tomber
\renewcommand *{\sectionmark }[1]{%
  \markright
         {\unexpanded{\ifodd\value{page}(\hyperref[imp]{implementation},
                                         \hyperlink{FRONTPAGE}{user manual
                                           front page})\hfill\fi
          \hyperref[changelog]{\thesection. Change history}%
          \ifodd\value{page}\else\hfill(\hyperref[imp]{implementation},
                                        \hyperlink{FRONTPAGE}{user manual
                                          front page})\fi}}%
}
\fi
\makeatother
\section{Timestamp}

This is the documentation as of \texttt{\etocdocdate}, printed from the
source file with the time stamp \texttt{\etocdtxtimestamp}. The package
version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.

\catcode1 13

\begingroup
\renewcommand\lowast{{\normalsize\raisebox{-.4\height}{*}}}
\small

    \section{Change history}\label{changelog}

\setlength{\columnsep}{\etoccolumnsep}

\makeatletter

% 27 avril 2014 un petit hack pour hyphénation (éventuelle) en allemand
% j'ai déjà ~ qui sera de catcode 0, cependant il faudrait aussi les accolades,
% donc finalement pour aller vite, je rends le + actif. Je modifie aussi le test
% fait par \jfverbaspace (n'ayant pas commenté mon code, j'ai dû réfléchir pour
% me rappeler à peu près ce que c'était censé faire).

\def\jfverbatim{\@beginparpenalty \predisplaypenalty 
  \parindent \z@ 
  \parfillskip \@flushglue 
  \parskip \tw@\p@ plus 1fil\relax
  \let \do \@makeother \dospecials \makestarlowast \catcode`$ \active
  \begingroup\lccode`~`$
  \lowercase{\endgroup\def~[##1]{\foreignlanguage{ngerman}{##1}}}%
  \catcode`^ \active
  \begingroup\lccode`~`^
  \lowercase{\endgroup\def~{\nopagebreak}}% ajouté 2014/04/28, oblige à un peu
                                % plus de mark-up cependant
  \catcode`\~\z@ 
  \footnotesize\normalfont\baselineskip10pt\relax
% 2022/08/30, I remove all "v"'s from version numbers.
%  \def\v{\vskip\baselineskip v}% ajouté 2015/05/09; faudra trouver mieux.
  \def\1{\vskip\baselineskip 1}% ajouté 2015/05/09; faudra trouver mieux.
% 2022/08/26, stop using \frenchspacing
  % \frenchspacing
% 2023/01/14
  \def\2##1.{\ctanpkg{##1}}%
% 2022/08/26.  I realized that rendering was broken, and finally identified
% the bad commit to be in LaTeX 2022/06/01 release.  Its \obeyspaces not only
% makes the ascii32 \active but it also redefines it!  Solution could be to
% actually use \obeyedspace in the definition of active space about 20 lines
% below but this would tie to LaTeX 2022/06/01 or later for building etoc.pdf
  \catcode`\ \active %  was \obeyspaces
  \jf@xverbatim
}

\begingroup 
\catcode `|=0 \catcode `[= 1 \catcode`]=2 
\catcode `\{=12 \catcode `\}=12 \catcode`\\=12 
|long|gdef|jf@xverbatim#1\end{jfverbatim}[#1|end[jfverbatim]]
|endgroup

\def\endjfverbatim{} 

\newdimen\jfverbadim
\makeatother

\begin{multicols}{2}
\makeatletter
\everypar{\leftskip\jfverbadim\bgroup
          \def\par{\egroup\jfverbadim\z@\@@par}%
          \def\jfverbaspace#1{\if\@sptoken\string#1\unskip\else\ \fi#1}}
%
% see 2022/08/26 above note
\begingroup\obeyspaces\def\x{\endgroup%
\def {\ifvmode\advance\jfverbadim.5em\relax\else\expandafter\jfverbaspace\fi}}\x
\makeatother
\begin{jfverbatim}
1.1c [2023/01/20]^

    Fix a brace removal bug in the construction of \etocname.  It
    remained without visible effects in documents using hyperref and
    default settings, thanks to the hyperlink wrapper, but e.g.
    \section{{\color{blue}Blue}} in a document not using hyperref,
    and not using etoc only in "compatibility mode", could cause a
    color leak in the table of contents.

    With the KOMA-script numberline toc feature, unnumbered entries in
    TOCs typeset via etoc user-defined or package provided line styles
    but using compatibility mode for the global display style were
    (knowingly) considered to be numbered with an empty number.  They
    are now considered by \etocifnumbered to be not numbered and the
    empty \etocnumber will carry no hyperlink.

    Fix a 1.1a regression in the context of KOMA-script unnumbered TOC
    entries: \etocthelinkedname could lose its hyperlink.

    Continue internal trimming of old code branches which became
    un-needed after the 1.1a refactoring.  Add relatively decent
    code comments to accompany the 1.1a-c refactoring.  Update
    warning messages to use more consistently LaTeX's templates.

~1.1b [2023/01/15]^

    Documentation fix, 1.1a forgot to mention the following change:
    \etocthelinkedname, \etocthelinkednumber, \etocthelinkedpage
    are now always hyperlinks independently of linktoc status.

~1.1a [2023/01/14]^

    This version brings no new functionality, despite the number bump.
    It implements a complete rewrite of old legacy core internals.
    Formerly, etoc waited for ~2hyperref. (if present) to have added
    hyperlinks via its patch to LaTeX's \contentsline.
    etoc examined the arguments of \l@section and other commands to extract
    hyperlinking information, if any.
    With this release etoc decides earlier according to
    ~2hyperref. linktoc status whether section names and page numbers
    should be hyperlinked, and adds links itself via \hyperlink.  etoc
    is thus now immune to the details of how ~2hyperref. patches the
    \contentsline command, which is not executed anymore.
    Overall, the code is greatly simplified.

    \etoclink now wraps its argument in an hyperlink even if
    ~2hyperref. is configured via
    linktoc=none.  Formerly no hyperlink was added then.

    Deprecation of \etocsavedsectiontocline and similarly named
    commands.  They are not needed as \l@section et al. are with this
    release left unmodified during the table of contents typesetting.

    ~LaTeX kernel from 2020/10/01 or later is required (to allow
    assuming the \contentsline entries in the TOC file always have
    four arguments).

~1.09i [2022/11/21]^

   Fix bug showing when a document uses both \etocchecksemptiness and
   \etocsetlocaltop.toc: the start and finish parts of some levels were
   executed possibly causing extra printed output.

   More hyperlinking in the implementation part of the documentation.

~1.09h [2022/11/20]^

   Documentation improvements.  In particular, attached code snippets
   are now visible via their filenames in the page margins.  Also,
   command names are doubly hyperlinked: first half links to the devoted
   part of the user manual, second half links to the implementation part.

~1.09g [2022/11/17]^

   Compatibility hotfix with recent hyperref 7.00u of 2022-11-13.
   Thanks to Denis Bitouzé for signaling the breakage to the author.

~1.09f [2022/08/30]^

   No more shipping of a German translation of the documentation,
   as it was last updated in April 2015.

   (etoc.pdf) User level commands hyperlink from their code source definitions
   to their descriptions in the documentation part.  Macros used in the code
   source hyperlink to where they first got defined there.

   Wrap the \etocpartname (from etoc's package provided toc line style)
   together with the part number in a potential common hyperlink.

   Try to sync the emulation of the global display style with KOMA-script
   v3.37 (in particular regarding the noparskipfake KOMA toc feature).

   Improve documentation of some aspects under memoir class.

   Remove the \nonumberline token, even though empty, from the meaning of
   \etocthename (KOMA-script classes).

   Add \etocimmediatedepthtag.toc to work around problems related to
   \include (see user doc).  Thanks to Norman Ramsey who reported the problem
   and proposed a work-around in July 2016.  Apologies for the somewhat longish
   delay in incorporating it...

   Also add \etocimmediatesettocdepth.toc.

   Also add \etocimmediatetoccontentsline and its starred variant.

   Also add \etocimmediatesetlocaltop.toc.

   Fix an obscure bug (see source code comments) in the
   \etocsetlocaltop.toc mechanism.

~1.09e [2021/09/23]^

   Needed (if etoc is used without hyperref) updates to
   internal macros to prepare for the upcoming LaTeX November
   2021 change to \contentsline.

   Related updates to the user macro \etoctoccontentsline.

~1.09d [2021/07/13]^

   Some minor synching with tableof 1.4c. 

   Add \etockeeporiginaltableofcontents to provide a work-around to a
   compatibility issue with listings's \lstlistoflistings, which abuses
   \tableofcontents for doing something unrelated to the actual contents.
   Thanks to Denis Bitouzé for report.

   Usage: \usepackage{etoc}\etockeeporiginal-tableofcontents, then
   however you must employ \etoctableofcontents, not \tableofcontents.

~1.09c [2020/05/15]^

   Syncs with KOMA-script deprecation of \iftocfeature.

~1.09a, 1.09b [2019/11/17]^

   Sync with memoir v3.7i which has a better location of the TOC
   hyperref anchor. The \etocaftertitlehook can now freely be
   used also with memoir class (formerly its usage in case of
   memoir class was preempted by etoc itself). For more details
   refer to the section "Compatibility with the memoir class".

~1.09 [2019/03/09]^

   New features: \etoclocaltop, \localtableofcontentswithrelativedepth. Thanks
   to Tony Roberts for feature request.

   Note to hackers: internal control sequence \Etoc@localtop is gone.

   etoc now requires e-TeX (\numexpr, \unless).

~1.08p [2018/07/04]^

   Fixed bug surfacing in case of linktoc=page option of hyperref.
   Thanks to Denis Bitouzé for report (cf.
   https://github.com/ho-tex/hyperref/issues/65,
   https://github.com/dbitouze/yathesis/issues/61).

~1.08o [2018/06/15]^

   Fixed bug showing up if an unnumbered TOC entry starts with a brace,
   and document uses hyperref. Caused by a typo in a macro name at
   previous release.


~1.08n [2018/02/23]^

   Refactoring of core macros detecting \numberline and its variants.


~1.08m [2018/02/07]^

   Fix to 1.08k's introduced incompatibility with KOMA-script
   and tocbasic's \nonumberline.


~1.08l [2017/10/23]^

   Workaround an issue with Emacs/AUCTeX wrongly reporting about
   actually non-existent LaTeX errors, which was triggered by some
   strings written (indirectly) to log file by etoc under some
   circumstances.


~1.08k [2017/09/28]^

   Adds \etocsetlocaltop.toc. See corresponding manual section for
   details.

   Adds \etocsavedparttocline, \etocsavedchaptertocline,
   \etocsavedsectiontocline, ... They can be used in the context of
   the technique explained in section "Another compatibility mode".

   Formerly, etoc redefined for the duration of the TOC the memoir
   macro \chapternumberline and its likes to have same meaning as
   \numberline (of course, not when executed in compatibility mode),
   for the sake of extraction of \etocnumber.

   New method detects presence of any \<foo>numberline macro without
   any change to originals; they can thus be used as is when applying
   the approach of "Another compatibility mode" section from manual.


~1.08j [2017/09/21]^

   Since 1.08a-2015/03/13 \etocname, \etocnumber, \etocpage
   contain, if hyperref is present and configured for using
   hyperlinks in the TOC, the link destination in already expanded
   form. This means one can use them even if the style closes a
   group (for example from a & in a tabular), if \etocglobaldefs
   was issued; also one can save their meaning for delayed usage
   (with for example \LetLtxMacro as they are robust).

   But for some legacy reason \etoclink, contrarily to
   \etocthelink, was handled differently. Now, \etoclink also
   contains the link destination in already expanded form, and can
   thus be used even if the line style issues a &, as long as
   \etocglobaldefs is issued.

   Also, bugs dating back to the early days of the package, but
   surfacing only under relatively rare conditions such as usage
   of hyperref with its option "linktoc=page" got fixed.


~1.08i [2016/09/29]^

   This fixes an issue dating back to 1.08e-2015/04/17: under
   \etocchecksemptiness regime, some circumstances (such as
   adding to an already compiled document a \localtableofcontents
   before the main \tableofcontents) created an "Undefined
   control sequence \Etoc@localtop" error. Thanks to Denis Bitouzé
   for reporting the problem.

   On this occasion, \etocdoesnotcheckemptiness
   has been added to unset the flag.

   A rather more exotic issue was fixed: the emptiness check for
   local tocs could get confused if the tocdepth counter was varying
   in some specific ways from inside the toc file.

   After adding to a document a \localtableofcontents, two LaTeX
   passes are needed for etoc to get a chance to print the
   correct local contents. Formerly, etoc issued a Warning on
   the first pass; it now also induces LaTeX into
   announcing "There were undefined references", as this is nearer
   to the end of the log file and console output.


~1.08h [2016/09/25]^

   New functioning of \etocsetnexttocdepth: the tocdepth counter is
   modified only at the time of the table of contents, not before.
   This fixes an issue which arose when \etocsetnexttocdepth was
   used multiple times with no intervening table of contents.
   Thanks to Denis Bitouzé for reporting the problem.

   The PDF documentation includes about 25 LaTeX code snippets also
   as file attachment annotations, additionally to their verbatim
   typesetting. The ordering of the documentation contents has been
   slightly re-organized.

   A previous documentation-only update on 2016/09/09 added a new
   section with the (approximate) translation into etoc lingua of the
   book class toc style, for easy customizability.


~1.08g [2015/08/29]^

   Downgraded to a mere info message the etoc-issued warning
   (relative to \settocdepth/\maxtocdepth) under class memoir.


~1.08f [2015/04/28]^

   Minor changes to the documentation. \etocsetlevel more economical.


~1.08e [2015/04/17]^

   The command \etocchecksemptiness tells etoc to not print, from
   that point on, the headings of the local tables of contents if
   they have empty contents. This is mainly for class authors who
   might want to have their \section or \chapter automatically do
   a \localtableofcontents. Could prove also useful for batch
   conversions of documents. Thanks to Paul Gaborit who asked for 
   such a feature.

   The command \etocnotocifnotoc extends this behaviour to global
   TOCs: indeed why should documents with no sectioning units take
   this as an excuse not to use package etoc ?

   The command \etocifwasempty{yes}{no} can be used for
   suitable extra action.

   A \tableofcontents\ref{foo} now expects foo to be a label to a
   _local_ TOC. The use with foo a label to a _global_ TOC is not
   supported anymore as it had no utility and made the code more
   complex.

   The syntax \localtableofcontents\ref{foo} is now accepted as a
   synonym to the earlier syntax \tableofcontents\ref{foo}.


~1.08d [2015/04/09]^

   Translation into German of the additions made to the documentation
   for the 1.08x series of releases.

   Thanks to Christine Römer!


~1.08c [2015/03/30]^

   - removed a few unneeded \long from the code.
  
   - removed use of \arabic at one location of the code, as it may get
  redefined by some language modules for babel or polyglossia.


~1.08b [2015/03/18]^

   Bug fixes: 

   - extra space token removed from `\localtableofcontents` (showed
   only for inline TOCs.)

   - \etocpartname (a macro used by the package own default line
   styles) was defined to be \partname, but this is not compatible
   at least with babel+french context. Now simply expands to Part.

   - some problems fixed in the German documentation.

   - [2015/03/28] some more problems fixed in the documentation. Added
   mention of \etocarticlestyle and \etocbookstyle.


~1.08a [2015/03/13]^

   \etocname, \etocnumber and \etocpage are now the robust
   variants of \etocthelinkedname, \etocthelinkednumber and
   \etocthelinkedpage. This should arguably have been done since
   the addition of the latter to etoc with 1.07f [2013/03/07].
   The earlier robust commands \etocname etc... contained
   the hyperlink destination only in an unexpanded form.

   The documentation has a brand new title page and a new section
   The TOC as a TikZ mind map both illustrating further uses of
   etoc to display tables of contents as trees in an automatic 
   manner.


~1.08 [2015/03/10]^

   \etocskipfirstprefix may now appear anywhere in the <start>
   part of a level style. 

   New commands \etociffirst, \etocxiffirst, \etocxifnumbered,
   \etocglobaldefs and \etoclocaldefs.

   It is now possible to issue line style specifications directly
   with & and \\ tokens, in order to typeset a TOC as a tabular
   or longtable with the opening for example in the first
   argument of \etocsettocstyle and the closing in its second
   argument.

   It is mandatory for such uses to issue \etocglobaldefs which
   tells etoc to proceed globally for certain definitions. This
   is also useful in the context of the inline environments of
   package enumitem.

   On this occasion, various old parts of the code have been
   improved.


~1.07n [2015/03/05]^

   No more use of \toks@ when etoc constructs \etocthelinkedname
   etc... Thus \toks@ can be put in the line styles in order to
   accumulate information. Only useful if it is certain nothing
   else will change \toks@ either.

   In the documentation: list of main commands now in alphabetic
   order.


~1.07m [2015/01/23]^

   Reading of .toc file is delayed to \begin{document} to account for
   possible Babel active characters used therein. Thanks to Denis
   Bitouzé who reported a Babel related problem.

   Improved global toc display emulation under KOMA-script classes.

   New command \etocbeforetitlehook. New command \etocdisplay.


~1.07l [doc of 2014/04/29]^

   Added to the documentation an example of use of \etocthelinkedname together
   with an enumitem inline itemize* environment; moved main TOC to immediately
   after the title, and license to the first pages.

   Incorporation of the translation into German done on the initiative of
   $[Christine Römer] by $[Felix Baral-Weber, Jenny Rothkrämer-Vogt, Daniel
   Büttner, Claudia Dahl, Christian Otto and Christine Römer (FSU Jena).] My
   grateful thanks to all!


~1.07l [2014/04/22]^

   Fixes a bug with the 1.07k compatibility layer with tocloft which had broken
   the 1.07k (sic) compatibility with memoir (yes, memoir class 1.07k testing
   had been done before adding the tocloft thing to the source code . . . ).
   Also, etoc when detecting tocvsec2 now checks if this is under the memoir
   class, as then nothing special needs to be done to rescue \tableofcontents,
   contrarily to the situation with the native tocvsec2. 


~1.07k [2014/03/06]^

   Compatibility with package tocloft; and improved compatibility with
   class memoir. Novel TOC example in Overview.


~1.07j [2013/12/03]^

   Some issues with the documentation formatting (now two-sided) have been
   addressed, and a novel documentation section ``Typesetting the TOC as a
   table'' has been added. Very minor code change (\Etoc@readtoc).


~1.07i [2013/10/21]^

   Changes to the \etocmulticolstyle and \etocruledstyle codes 
   to lessen the risk of a page break after the title (in the one-column case).


~1.07h [2013/10/16]^

   New commands \etocdepthtag.toc, \etocsettagdepth, \etocobeydepthtags,
   \etocignoredepthtags. 


~1.07g [2013/10/13]^

   New commands \etocsettocdepth, \etocsettocdepth.toc,
   \etocobeytoctocdepth, \etoc~-ignoretoctocdepth which
   emulate part of tocvsec2 functionality ; measures to
   make tocvsec2 partially compatible with etoc.

   New commands \etocsetnexttocdepth, \invisibletableofcontents,
   \invisiblelocaltableofcontents.

   Switched from tikz-qtree to forest for the first `toc as
   tree' example. 

   Command names are linked to their descriptions, and many
   other changes in the documentation.

   Removed printing of temporary message when the local toc
   id is not yet stabilized; indeed \localtableofcontents
   can have many uses, such as filling up some token list
   register and one may wish to not have anything typeset, 
   even in an intermediate run. 

   All of tex etoc.dtx, etex etoc.dtx, xetex etoc.dtx, latex
   etoc.dtx, pdflatex etoc.dtx are now possible, and the
   extracted file etoc.tex allows easy customization of
   compilation options for the documentation (default is via
   dvipdfmx which produces the smallest file).


~1.07f [2013/03/07]^

   New macros \etocthelinkedname, \etocthelinkednumber,
   \etocthelinkedpage, and \etocthelink.


~1.07e [2013/03/01]^

   Improvements in the package own line styles with
   regards to penalties and vertical spaces. 

   Addition to the documentation of an example of
   a tree-like table of contents (uses tikz).

   More such examples added 2013/03/03.


~1.07d [2013/02/24]^

   Minor code improvements and new documentation 
   section ``Another compatibility mode''.


~1.07b [2013/02/02]^

   Removal of the \xspace from the macros \etocname, 
   \etocnumber, \etocpage.

   Additional examples in the documentation.


~1.07 [2013/01/29]^

   New commands:

      \etocthename, \etocthenumber, \etocthe~-page, \etoclink, 

      \etoctoccontentsline, \etoctoccontentsline~lowast

      \etocnopar, \etocaftercontentshook

   Modified command: \etocmulticolstyle

   New documentation section ``Surprising uses of etoc'' which
   explains how to do  ``Lists of arbitrary things'', in
   addition to the tables of contents.


~1.06 [2012/12/07]^

   The standard macros \l@section etc... are modified only
   during the calls to \tableofcontents; they can thus be
   customized as will by the user (with the help of a
   package like tocloft) and this will be taken into account
   by etoc for the TOCs typeset in compatibility mode.


~1.05 [2012/12/01]^

   \localtableofcontents replaces \tableofcontents~lowast (for
   compatibility with the memoir class).

   Compatibility with KOMA-script and memoir document
   classes.


~1.04 [2012/11/24]^

   A (possibly local) table of contents can be labeled:

       \tableofcontents \label{toc:1}

   and reproduced elsewhere in the document (with a possibly
   completely different layout):

       \tableofcontents \ref{toc:1}


~1.02 [2012/11/18]^

   Initial version.

\end{jfverbatim}
\end{multicols}
\endgroup  % group for modified verbatim printing of the changes log

\makeatletter
    \let\check@percent\original@check@percent
\makeatother

\small

% Que c'est pénible cette syntaxe \markboth/\markright de LaTeX !
% Pourquoi est-ce que \markright n'a pas été définie comme #1#2-> truc avec #2 ??
\makeatletter
\if@twoside 
\renewcommand *{\sectionmark }[1]{%
  \markboth
         {\unexpanded{{%
% counteract some changes done by my macrocode hooks
% so we must make sure it is in a scope limiting context
% (perhaps it is already, will not check, wasted already
% too much time on this header matter) November 2022
          \hypersetup{linkcolor=RoyalBlue}%
          \ifodd\value{page}(\hyperref[changelog]{change log},
                                         \hyperlink{FRONTPAGE}{user manual
                                           front page})\hfill\fi
          \hyperref[imp]{\thesection. Implementation}%
          \ifodd\value{page}\else\hfill(\hyperref[changelog]{change log},
                                        \hyperlink{FRONTPAGE}{user manual
                                          front page})\fi
          }}%
         }
         {\unexpanded{{%
          \hypersetup{linkcolor=RoyalBlue}%
          \ifodd\value{page}(\hyperref[changelog]{change log},
                                         \hyperlink{FRONTPAGE}{user manual
                                           front page})\hfill\fi
          \hyperref[imp]{\thesection. Implementation}%
          \ifodd\value{page}\else\hfill(\hyperref[changelog]{change log},
                                        \hyperlink{FRONTPAGE}{user manual
                                          front page})\fi
           }}%
          }%
}
\else
% faudrait cependant que je réfléchisse à quoi faire exactement en oneside
% mais comme ceci ne peut arriver que si quelqu'un customise etoc.tex
% ce qui n'arrivera JAMAIS, je laisse tomber
\renewcommand *{\sectionmark }[1]{%
  \markright
         {\unexpanded{{%
          \hypersetup{linkcolor=RoyalBlue}%
          \ifodd\value{page}(\hyperref[changelog]{change log},
                                         \hyperlink{FRONTPAGE}{user manual
                                           front page})\hfill\fi
          \hyperref[imp]{\thesection. Implementation}%
          \ifodd\value{page}\else\hfill(\hyperref[changelog]{change log},
                                        \hyperlink{FRONTPAGE}{user manual
                                          front page})\fi
          }}%
         }%
}
\fi
\makeatother

\section{Implementation}\label{imp}

% ce \noindent est obsolète 2022/08/26 à cause des hooks à macrocode plus bas
% transférés depuis xint.dtx.  Il est doublement obsolète car je rajoute un
% paragraphe de texte de toute façon avant le premier macrocode.
% \indent % !!!!!!!!!!!!!!!!! Lundi 09 mars 2015 à 09:32:22
% il faut faire un paragraphe après \section sinon pas d'espacement
% vertical en sortie de blocs macrocode. Pas évident à trouver, vu que
% je customisais différentes choses qui pouvaient affecter macrocode.

% 9 mars 2015
% Pour rappel on avait dans le préambule:
% \def\MacroFont{\ttfamily\small\hyphenchar\font45 \baselineskip11pt\relax}
% ce qui donne donc le \macro@font qui sera utilisé.

% 26 septembre 2021
\catcode1 14 % pour pouvoir utiliser ^^A, car je l'avais mis à \active

\StopEventually{\normalsize
  \ifnum\NoSourceCode=1
     \texttt{\parindent 0pt\rightskip 1cm minus 1cm
     This documentation has been compiled without inclusion of the source
     code. To produce the documentation with source code included:\endgraf
     \ \ \ \ run etex on etoc.dtx to produce etoc.tex,\endgraf
     \ \ \ \ then thrice pdflatex on etoc.tex.\endgraf
}%
  \fi
\end{document}}

%%%%%%%%%%%%
% 26 août 2022, transfert depuis xint de hack de doc
%
% This worked remarkably well with almost no changes! Particularly for
% hyperlinking to the documentation part from the macro definitions! But
% also for internall cross-links in implementation part despite no usage
% there of any sectioning mark-up (so I don't need the \@sect hack, and
% related \csa, \csan, \csh, \cshn, \cshintitle, \cshnintitle macros).
% I noticed in passing that I never used any \begin{macro} mark-up here
% in the etoc.dtx. Perhaps I should and should one day look at what doc=V3
% brings...
%
% See xint.dtx for comments, as I have removed most when copying.
\makeatletter
\def\odef #1{\expandafter\def\expandafter#1\expandafter}% needed from xintkernel

%%% xint.dtx does \def\macro@font {\ttfamily }% (with a font allowing hyphenation)
%%% Our \macro@font has been defined earlier from \MacroFont in preamble and
%%% is \ttfamily\small\hyphenchar\font45 \baselineskip11pt\relax
%%% etoc.dtx: see further below for how the * is handled in \macro@finish
\renewcommand\lowast{{\iflabelmacro@allowed\xintdocMacrocodeFallbackColorCmd\fi
                      \raisebox{-.25\height}{*}}}
\AddToHook{env/macrocode/begin}{\makestarlowast}
% https://github.com/latex3/latex2e/issues/563
% (but I don't use sectioning commands in implementation part of etoc.dtx so far)
\AddToHook{env/macrocode/after}{\@nobreakfalse}
\AddToHook{env/macrocode/begin}{\partopsep0pt\relax}
\begingroup
\catcode`\|=\z@ \catcode`\[=\@ne \catcode`\]=\tw@
\catcode`\{=12 \catcode`\}=12
% Let % be active to use a color for it and gray-out
% comments left in code (there are few)
\catcode`\%=13 \catcode`\ =\active \catcode`\\=\active
|gdef|xmacro@code#1%    \end{macrocode}[#1|end[macrocode]]
|endgroup
%%% 2022/08/27: for etoc.dtx try to really use comment color in comments
%%%             this is not a complete solution, but enough for use case
\begingroup\catcode`\%=\active\catcode`\^^M 13
\gdef%{\begingroup\color{macrocodecommentcolor}^^A
                  \let\xintdocMacrocodeFallbackColorCmd\@empty^^A
       \@percentchar\odef
{\expandafter\endgroup
}}\endgroup
\begingroup\let\newcount\@gobble\@definecounter{CodelineNo}\endgroup
\def\theCodelineNo{\reset@font\scriptsize\arabic{CodelineNo}}
\def\theHCodelineNo{\the\value{section}.\the\value{CodelineNo}}
%%% not needed for etoc.dtx
%%%%%%% attention j'utilise plus bas \MakePrivateLetters pour
%%%%%%% problème de straight quotes depuis 2023/01/18 (1.1c)
%%% \def\xintMakePrivateLetters{\catcode`: 11 \catcode`? 11 \catcode`@ 11 
%%%                             \catcode`^ 11 \catcode`_ 11 }
%%% \def\xintexprMakePrivateLetters{\xintMakePrivateLetters \catcode`! 11 }
%%% \let\MakePrivateLetters\xintMakePrivateLetters
% \definecolor{etocnamecolor}{RGB}{228,57,0}
% \colorlet{verbcolor}{Maroon}
%
% \colorlet{privatecommentcolor}{cyan}
% \colorlet{macrocodecommentcolor}{gray}
% \colorlet{macrocodenewmacrocolor}{verbcolor}
% \colorlet{macrocodelinktouserdoccolor}{etocnamecolor}% and bold face
% \colorlet{macrocodelinktosectioncolor}{DarkBlue}% and bold face
% \colorlet{macrocodelinktocodelinecolor}{DarkBlue}
% \colorlet{macrocodenoncscolor}{Green}
\def\xintdocMacrocodeFallbackColorCmd{\normalcolor}
\odef\init@crossref{\init@crossref%
     \everypar{\refstepcounter{CodelineNo}%
               \llap{{\xintdocMacrocodeFallbackColorCmd\theCodelineNo}\
                      \hskip\@totalleftmargin}%
               }%
     \catcode`\%\active
}%
\def\scan@macro{%
   % we do not insert it yet
   % \special@escape@char
   \step@checksum
%   \ifscan@allowed
      \let\macro@namepart\@empty
      % we need this for reasons explained below
      \let\macro@spacepart\@empty
      \def\next{\futurelet\next\macro@switch}%
%   \else \let\next\@empty \fi
   \next
}
% unchanged:
% \def\macro@switch{\ifcat\noexpand\next a%
%      \let\next\macro@name
%      \else \let\next\short@macro  \fi
%    \next}
\def\short@macro#1{\special@escape@char#1}
% \def\macro@name#1{\edef\macro@namepart{\macro@namepart#1}%
%      \futurelet\next\more@macroname}
% \def\more@macroname{\ifcat\noexpand\next a%
%      \let\next\macro@name
%      \else \let\next\macro@finish \fi
%      \next}
\def\more@macroname{\ifcat\noexpand\next a%
     \expandafter\macro@name
     % we keep the \next for usage later and start filtering out of the way spaces
     % this is caused by necessity of handling things such as \let<space>\foo\bar
     % but also not be fooled by \let<space>#6\macro
     \else \expandafter\macro@gatherspaces \fi
     }
\def\macro@gatherspaces{%
    \ifx\next\@xobeysp
        \expandafter\macro@gatherspaces@i
    \else
        \expandafter\macro@finish
    \fi}%
\def\macro@gatherspaces@i#1{%
    \odef\macro@spacepart{\macro@spacepart#1}% #1 = active space
    \futurelet\next\macro@gatherspaces}%
\newif\iflabelmacro@allowed
\newcounter{xintMacroCnt}
%%% pour l'instant pas relevant pour etoc, pas de mark-up par \subsection etc...
\def\xintimplabelprefix{src-}
\let\xintdoclabelprefix\empty
%%% next thing is used in xint.dtx in a hack of \@sect but we don't have so
%%% far sectioning mark-up in etoc.dtx implementation part
%%% \let\xintlabelprefix\xintimplabelprefix
\catcode`_ 11 \catcode`* 11
\def\macro@finish{%
  \iflabelmacro@allowed
   \expandafter\in@\expandafter{\expandafter.\macro@namepart,}%
   {.csname,.expandafter,.noexpand,.else,%
    %.t,.w,.x,.y,.z,.XINT_x,.XINT_y,%
    %.XINT_tmpa,.XINT_tmpb,.XINT_tmpc,.XINT_tmpd,.XINT_tmpe,% _ is letter here
    %.XINT_expr_defbin_b,.XINT_expr_defbin_c,.XINT_expr_defbin_d,%
    .empty,.space,.protect,}%
   \ifin@
     {\xintdocMacrocodeFallbackColorCmd\special@escape@char\macro@namepart}%
   \else
     \ifcsname alreadydefined-\macro@namepart\endcsname
       \hyperref[etocmacro-\macro@namepart]{\special@escape@char\macro@namepart}%
     \else
       % this will make a rather large number of macro names in the string pool...
       \global\expandafter\let\csname alreadydefined-\macro@namepart\endcsname\@empty
       \label{etocmacro-\macro@namepart}%
       \stepcounter{xintMacroCnt}%
       % try to link to a labeled reference in the user documentation (xint-all.pdf)
       \ifcsname r@\xintdoclabelprefix\macro@namepart\endcsname
          {\hypersetup{linkcolor=macrocodelinktouserdoccolor}%
           \hyperref[\xintdoclabelprefix\macro@namepart]%
                    {\textbf{\special@escape@char\macro@namepart}}}%
       \else
       % try to link to a labeled section in implementation part
       %% THIS BRANCH WILL NEVER BE USED IN etoc.dtx FROM ABSENCE OF
       %% ASSOCIATED MARK-UP
       \ifcsname r@\xintimplabelprefix\macro@namepart\endcsname
          {\hypersetup{linkcolor=macrocodelinktosectioncolor}%
           \hyperref[\xintimplabelprefix\macro@namepart]%
                    {\textbf{\special@escape@char\macro@namepart}}}%
       \else
          \textcolor{macrocodenewmacrocolor}{\textbf{\special@escape@char\macro@namepart}}%
       \fi\fi
     \fi
   \fi
   \labelmacro@allowedfalse
   \expandafter\in@\expandafter{\expandafter.\macro@namepart,}{.expandafter,}%
   \ifin@
      \ifx\next\scan@macro\labelmacro@allowedtrue\fi
   \fi
  \else % end of labelmacro@allowedtrue branch
%%% etoc.dtx adds complications to handle \newcommand*
    \if0\ifx\next\scan@macro0\else\ifx\next\lowast0\else1\fi\fi
      \expandafter\in@\expandafter{\expandafter.\macro@namepart,}%
                {.def,.edef,.let,.gdef,.xdef,%.odef,.oodef,.fdef,
                 .chardef,.newif,.newtoks,.newcommand,.DeclareRobustCommand,%
                 .newread,.newwrite,}%
      \ifin@\labelmacro@allowedtrue\fi
    \fi
    \ifcsname r@etocmacro-\macro@namepart\endcsname
      \hyperref[etocmacro-\macro@namepart]{\special@escape@char\macro@namepart}%
    \else
      {\xintdocMacrocodeFallbackColorCmd\special@escape@char\macro@namepart}%
    \fi
  \fi
  % \ifnot@excluded
  %    \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}%
  %    \@tempa  
  % \fi
  \macro@spacepart
}%
\catcode`_ 8 \catcode`* 11
%%% In order mainly to colorize #1, #2, etc... we do this rather
%%% non-economical thing of colorizing all of macrocode with
%%% the "non control sequence color", hence this means all
%%% control sequences will have their own color command...
%%% This is because when doing this in June 2022 for xint, I did
%%% not want to hack more doc.sty scanning process of tokens,
%%% but perhaps I should, it would be more economical.  Kept as is
%%% when transferring to etoc.dtx 2022/08/26
{\sbox0{\color{macrocodenoncscolor}\xdef\foo{\current@color}}}
\ifpdf
   \edef\xintdoc@macrocode@pushcolor
      {\pdfcolorstack\noexpand\@pdfcolorstack push{\foo}\relax}
   \def\xintdoc@macrocode@popcolor{\pdfcolorstack\@pdfcolorstack pop\relax}
\else
\ifxetex
   \edef\xintdoc@macrocode@pushcolor{\special{color push \foo}}
   \def\xintdoc@macrocode@popcolor{\special{color pop}}
\else
\ifnum\Withdvipdfmx=1
     \edef\xintdoc@macrocode@pushcolor{\special{color push \foo}}
     \def\xintdoc@macrocode@popcolor{\special{color pop}}
\fi\fi\fi
%%% 2022/08/26 \par added for etoc.dtx
\AddToHook{env/macrocode/before}{\xintdoc@macrocode@pushcolor\par}
\AddToHook{env/macrocode/end}{\xintdoc@macrocode@popcolor}
% let's use some more quiet color for links inside the code
\AddToHook{env/macrocode/begin}{\hypersetup{linkcolor=macrocodelinktocodelinecolor}}
% let code line numbers really be fully in the margin
\MacroIndent\z@

\makeatother

% 18 janvier 2023 fix d'un problème de guillements courbes et d'inutilité de upquote,
% import de mon code de lgrmath de novembre 2022
% useless with doc.sty as \verb, verbatim and macrocode do not use \@noligs
% \usepackage{upquote}
% 
\begingroup
\catcode`\'\active\catcode`\`\active
\gdef\MakePrivateLetters{\makeatletter\def`{\textasciigrave}\def'{\textquotesingle}}
\endgroup
% https://github.com/latex3/latex2e/issues/953, for the record

% will be used in code comments
% I could re-define \csb, but perhaps better as the mark-up is not yet there
% when I define this to opt for a new name
\DeclareRobustCommand\csbc[1]{{\hypersetup{linkcolor=macrocodelinktocodelinecolor}%
    \ifcsname r@etocmacro-#1\endcsname
       \hyperref[etocmacro-#1]{\ttfamily\hyphenchar\font45 \char`\\ #1}%
    \else
       % for .toc suffixed macros
       \ifcsname r@etocmacro-\xintTrimUnbraced{-4}{#1}\endcsname
          \hyperref[etocmacro-\xintTrimUnbraced{-4}{#1}]
                   {\ttfamily\hyphenchar\font45 \char`\\ #1}%
       \else
          \textcolor{red}{\ttfamily\hyphenchar\font45 \char`\\ #1}%
       \fi
    \fi }%
}


\setcounter{secnumdepth}{3}

\paragraph{About the syntax highlighting of the code:}
Control\normalmarginpar\marginpar{\footnotesize\rmfamily\itshape\RaggedRight
  The ``syntax highlighting'' was added at release 1.09f of 2022/08/30.\par}
sequences are mostly hyperlinks.  When a user level command gets defined it
hyperlinks to the user documentation with bold face and
\textbf{\textcolor{macrocodelinktouserdoccolor}{using this colour}}.  Further
instances if they occur will use \textcolor{macrocodelinktocodelinecolor}{this
  colour} to link to their place of first definition inside the code lines.
Package macros with no user level documentation hyperlink to their first
place of definition in the code.
And such non-user level macros, at the location of
their first definitions will have their names displayed using bold face and
\textbf{\textcolor{macrocodenewmacrocolor}{this colour}} (it is not
an hyperlink then). Comments located \emph{inside} the code source (very little are
left at |1.1a|) have been configured
\textcolor{macrocodecommentcolor}{to be rendered in their own colour}, and
\textcolor{macrocodenoncscolor}{non commented-out and non-control sequences
  tokens use this colour}.  Other tokens use the fall-back normal colour.
A package macro mentioned in code comments also hyperlinks
to the location of its first definition  using
{\textcolor{macrocodelinktocodelinecolor}{this colour}}.

Known limitations:
\begin{enumerate}[nosep]
\item The location of first definition may be disappointing as it may be a
  provisory definition.
\item Macros such as \csbc{Etoc@next} are there for matters of code branching
  only, and the first encountered definition has no relevant significance.
\item Macros defined using |\csname...\endcsname| or alike constructs are not
  detected by the syntax highlighting automatization.  Apart from manual
  intervention, this appears complex to solve as moreover the macro name may be
  there indirectly as an argument such as |#1|.
%%%% This was caused by a ... 2013 oversight in my way of customizing txtt,
%%%% see in preamble near loading of txfonts... fixed 2023/01/18
%%%% \item Bold face has an increased character width, somewhat offsetting the
%%%%   codelines alignment.
\end{enumerate}

\paragraph{An apology:}
the code comments served mainly as a record for the author's benefit
of the historical evolution of the package and rarely as a description of what
the macros do.  At |1.1a| I have removed almost all code comments which had
accumulated as in a palimpsest.  As a result, very few comments actually
remain.  |1.1c| re-added comments to those parts of the code which
got refactored at and since |1.1a|, revigorating the palimpsest stratification.

\paragraph{About \etoc and the processing of \texttt{.toc} file data:}
\etoc,%
%
\normalmarginpar\marginpar{\footnotesize\rmfamily\itshape\RaggedRight
  This paragraph and the next were added very late in the history of the
  package, at 1.09h and later.\par}
%
when not left in compatibility mode, hijacks the \csa{contentsline} expansion
so as to not execute \csa{l@chapter}, \csa{l@section} etc..., but rather to
parse the date and extract from it the \emph{name}, \emph{number}, and
\emph{page number}.
%
The \LaTeX{} |.toc| data
is \emph{not structured}, but contains already typesetting mark-up.
The
\etoc maneuvers to disentangle \emph{name} and \emph{number} are somewhat
fragile as they expect the |.toc| file to contain the
\csa{contentsline} arguments to be arranged in a certain manner.
Of course \etoc can be easily broken if changes happen to how data is stored
there. Things would have been much easier for \etoc in 2012 if the
\csa{contentsline} arguments had considered the section titles (aka
\emph{name} for \etoc) and their numbers (which are not numbers in the sense
of things with which \TeX\ can compute, in general) separately, each providing
an argument to \csa{contentsline}.  But some mix is prepared, which may depend
on the document class also, and besides usually handles \csa{part} levels very
differently.  Fortunately upstream changes happen rarely.
%
\normalmarginpar\marginpar{\footnotesize\rmfamily\itshape\RaggedRight
  Prior to \texttt{1.1a}, \etoc aliased \csa{l@chapter},
  \csa{l@section}, etc... (at the time of TOC typesetting only)
  to its own \csbc{Etoc@lxyz} in order to leave time to
  \ctanpkg{hyperref} to add its mark-up.  Thus the disentangling
  of name from number
  was more complex than it is now.  With \texttt{1.1a}, \etoc
  leaves \csa{l@chapter} etc... unmodified (and unused) and
  only hijacks \csa{contentsline}.}
%

The other core part of \etoc present from day one of the package is that it
creates a tree-like structure of the sectioning levels present in the |.toc|
file.  But this is purely virtual, and handled via a notion of ``level'' and
\TeX\ conditionals.  It could be fun to implement officially such a tree
(where the children of a sectioning title are the sectioning levels at a
greater depth such as subsections versus a section).  Let us recall that
\LaTeX{} provides zero means to know from a subsection for example, what is
the title of the section containing it, or chapter, or part.  To do this one
has to create a really structured document which neither core \LaTeX{} nor the
main document classes do.  This remark was given for document body, but it
also applies to the |.toc| data.  But \etoc adds at least some kind of
follow-up to the successive encountered sectioning titles, and is thus able,
to ``on-the-fly'' add some kind of structure and follow the chaining of
levels.  Ultimately this is why the \csbc{etocsetstyle} offers \marg{start}
and \marg{finish} parts in additions to \marg{contents} (which I divided into
a \marg{prefix} and a \marg{contents}).  At some point one could imagine that
a really \emph{structured} document (in opposition to what core \LaTeX{} from
thirty years ago up to nowadays realizes) would store in the |.toc| data
directly a tree structure, where each node would have attributes name, number,
page number, completely separated from any typesetting.  Once this exists then
basically \etoc disappears.  In brief, once \etoc ideas will have permeated
the society, it will disappear as its was born only to palliate the absence of
real structure in the |.toc| file (which is sort of inherited from the absence
of real structure in a \LaTeX{} document body).

%  9 avril 2015 (1.08d) pour forcer indentation après macrocode
% par un effet particulier si avant macrocode un enumerate, inefficient,
% mais vraiment pas envie d'investiguer.
%
% l'esthétique est un peu douteuse mais je laisse ? 

% non finalement je supprime

% \makeatletter
% \def\endmacrocode{%
%                  \ifpm@module \endgroup \pm@modulefalse \fi
%                  \everypar{}%
%                  \global\@inlabelfalse
%                  \endtrivlist\@endpefalse % <<-- ajouté 
%                  \close@crossref}
% \makeatother


% This is obsolete as 1.09g of 2022/11/17 has removed this hack, also
% for colorizing reasons from 1.09n.
% November 2012
% I don't want to have to type at this location (far from the top of the
% file) explicitly the package version or version date, as it is
% inconvenient to have to remember to do this when updating the package.
% Also, I prefer not to add macros to the |.sty| file giving the package
% date, name, or version. So I extracted this from the real macrocode
% environment (leaving out the \init@crossref.)

% 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>
% |1.1a| implements a radical change to legacy core internals for compatibility
% with some (future) \ctanpkg{hyperref} changes.  In order to facilitate this
% overhaul, we require \LaTeX{} 2020/10/01 for the fourth argument to
% \cs{contentsline} lines in the |.toc| file to be always present.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\ProvidesPackage{etoc}
[2023/01/20 v1.1c Completely customisable TOCs (JFB)]
\RequirePackage{multicol}
\DeclareOption*{\PackageWarning{etoc}{Option `\CurrentOption' is unknown.}}
\ProcessOptions\relax
\def\etoc@{\etoc@}
\long\def\Etoc@gobtoetoc@ #1\etoc@{}
\newtoks\Etoc@toctoks
\def\Etoc@par{\par}
\def\etocinline{\def\Etoc@par{}}
\let\etocnopar\etocinline
\def\etocdisplay{\def\Etoc@par{\par}}
%    \end{macrocode}
% \csbc{etocglobaldefs} should be used only for special things such as TOC as a
% table; it should be put in a group to limit its scope. If used in the
% preamble, it must come \emph{after} \ctanpkg{tableof} if the latter is loaded too.
%    \begin{macrocode}
\let\Etoc@global\@empty
\def\etocglobaldefs{\let\Etoc@global\global\let\tof@global\global}
\def\etoclocaldefs {\let\Etoc@global\@empty\let\tof@global\@empty}
\newif\ifEtoc@jj  % book
\newif\ifEtoc@j   % part
\newif\ifEtoc@    % chapter
\newif\ifEtoc@i   % section
\newif\ifEtoc@ii  % subsection
\newif\ifEtoc@iii % subsubsection
\newif\ifEtoc@iv  % paragraph
\newif\ifEtoc@v   % subparagraph
\newif\ifEtoc@number
\newif\ifEtoc@hyperref
\newif\ifEtoc@parskip
\newif\ifEtoc@tocwithid
\newif\ifEtoc@standard
\newif\ifEtoc@skipprefix
\newif\ifEtoc@isfirst
\newif\ifEtoc@localtoc
\newif\ifEtoc@skipthisone
\newif\ifEtoc@stoptoc
\newif\ifEtoc@notactive
\newif\ifEtoc@mustclosegroup
\newif\ifEtoc@emptytoc
\newif\ifEtoc@checksemptiness
\def\etocchecksemptiness       {\Etoc@checksemptinesstrue }
\def\etocdoesnotcheckemptiness {\Etoc@checksemptinessfalse }
\newif\ifEtoc@notocifnotoc
\def\etocnotocifnotoc {\Etoc@checksemptinesstrue\Etoc@notocifnotoctrue }
\newcounter{etoc@tocid}
\newcounter{etoc@tocdepth}
\@ifclassloaded{memoir}{\def\Etoc@minf{-\thr@@}}{\def\Etoc@minf{-\tw@}}
\def\Etoc@@minustwo@@{-\tw@}
\let\Etoc@@minusone@@\m@ne
\let\Etoc@@zero@@    \z@
\let\Etoc@@one@@     \@ne
\let\Etoc@@two@@     \tw@
\let\Etoc@@three@@   \thr@@
\chardef\Etoc@@four@@ 4
\chardef\Etoc@@five@@ 5
\chardef\Etoc@@six@@  6
\def\Etoc@@minustwo@{minustwo}
\def\Etoc@@minusone@{minusone}
\def\Etoc@@zero@    {zero}
\def\Etoc@@one@     {one}
\def\Etoc@@two@     {two}
\def\Etoc@@three@   {three}
\def\Etoc@@four@    {four}
\def\Etoc@@five@    {five}
\expandafter\def\csname Etoc@-3@@\endcsname {-\thr@@}
\expandafter\let\csname Etoc@-2@@\endcsname \Etoc@@minustwo@@
\expandafter\let\csname Etoc@-1@@\endcsname \Etoc@@minusone@@
\expandafter\let\csname Etoc@0@@\endcsname  \Etoc@@zero@@
\expandafter\let\csname Etoc@1@@\endcsname  \Etoc@@one@@
\expandafter\let\csname Etoc@2@@\endcsname  \Etoc@@two@@
\expandafter\let\csname Etoc@3@@\endcsname  \Etoc@@three@@
\expandafter\let\csname Etoc@4@@\endcsname  \Etoc@@four@@
\expandafter\let\csname Etoc@5@@\endcsname  \Etoc@@five@@
\expandafter\let\csname Etoc@6@@\endcsname  \Etoc@@six@@
\let\Etoc@all@@   \Etoc@@five@@
\let\Etoc@none@@  \Etoc@minf
%    \end{macrocode}
% At |1.1a|, the \csa{etocsavedsectiontocline} and cousins are deprecated and
% when they will be removed, \csbc{Etoc@levelist} will be too as it now serves
% only for their definitions.
%    \begin{macrocode}
\let\Etoc@levellist\@empty
\def\Etoc@newlevel #1{\expandafter\def\expandafter\Etoc@levellist\expandafter
        {\Etoc@levellist\Etoc@levellist@elt{#1}}}
\def\etocsetlevel#1#2{%
   \@ifundefined{Etoc@#1@@}{\Etoc@newlevel{#1}}{}%
   \ifcase#2\relax
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@zero@@
      \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@zero@
   \or
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@one@@
      \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@one@
   \or
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@two@@
      \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@two@
   \or
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@three@@
      \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@three@
   \or
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@four@@
      \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@four@
   \or
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@five@@
      \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@five@
   \or
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@six@@
   \else
    \ifnum#2=\m@ne
     \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@minusone@@
     \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@minusone@
    \else
     \ifnum#2=-\tw@
      \expandafter\let \csname Etoc@#1@@\endcsname\Etoc@@minustwo@@
      \expandafter\let \csname Etoc@#1@\endcsname\Etoc@@minustwo@
     \else
      \PackageWarning{etoc}
         {Unexpected value `#2' in \string\etocsetlevel.\MessageBreak
          It must be one of -2,-1, 0, 1, 2, 3, 4, 5, or 6 and\MessageBreak
          will be set to 6: the \string\contentsline\space entries of type\MessageBreak
          `#1' will be ignored by `etoc'.\MessageBreak Reported}%
      \expandafter\let\csname Etoc@#1@@\endcsname\Etoc@@six@@
     \fi
    \fi
   \fi
}
\etocsetlevel{book}{-2}
\etocsetlevel{part}{-1}
\etocsetlevel{chapter}{0}
\etocsetlevel{section}{1}
\etocsetlevel{subsection}{2}
\etocsetlevel{subsubsection}{3}
\etocsetlevel{paragraph}{4}
\etocsetlevel{subparagraph}{5}
%    \end{macrocode}
% |1.09g| adapts to \ctanpkg{hyperref} depending on
% whether the latter is at |7.00u| or earlier.  Indeed internal changes to
% \ctanpkg{hyperref} at |7.00u| broke \etoc.  Thanks to Denis~\textsc{Bitouzé} for
% reporting the issue.
%
% |1.1a| radically simplifies matters at \etoc core, and with this in
% place there would have been no incompatibility with the \ctanpkg{hyperref}
% |7.00u| internal changes.
%    \begin{macrocode}
\AtBeginDocument{%
\@ifpackageloaded{parskip}{\Etoc@parskiptrue}{}%
\@ifpackageloaded{hyperref}{\Etoc@hyperreftrue}{}%
}
%    \end{macrocode}
% |2015/03/08| One has to be careful about the |Etoc@end@<level>| user
% defined macros which may close groups. This has always been the reason
% for the |\global|'s here and elsewhere.
%
% Attention that \csbc{Etoc@setflags} must not modify \csa{Etoc@next}!
%    \begin{macrocode}
\def\Etoc@setflags {%
    \ifcase \Etoc@level
        \global\Etoc@vfalse
        \global\Etoc@ivfalse
        \global\Etoc@iiifalse
        \global\Etoc@iifalse
        \global\Etoc@ifalse
        \global\Etoc@true
    \or
        \global\Etoc@vfalse
        \global\Etoc@ivfalse
        \global\Etoc@iiifalse
        \global\Etoc@iifalse
        \global\Etoc@itrue
    \or
        \global\Etoc@vfalse
        \global\Etoc@ivfalse
        \global\Etoc@iiifalse
        \global\Etoc@iitrue
    \or
        \global\Etoc@vfalse
        \global\Etoc@ivfalse
        \global\Etoc@iiitrue
    \or
        \global\Etoc@vfalse
        \global\Etoc@ivtrue
    \or
        \global\Etoc@vtrue
    \else
        \global\Etoc@vfalse
        \global\Etoc@ivfalse
        \global\Etoc@iiifalse
        \global\Etoc@iifalse
        \global\Etoc@ifalse
        \global\Etoc@false
        \ifnum\Etoc@level=\m@ne
            \global\Etoc@jtrue
        \else
            \global\Etoc@jfalse
            \global\Etoc@jjtrue
        \fi
    \fi
}
%    \end{macrocode}
% One has to be careful that this may close
% groups. The conditionals are all global. The \csbc{Etoc@level} has been
% |\global\let| to a |\chardef| variable. The final |\else| of the
% |\ifcase| assumes none of the \csa{Etoc@end@..} routines modify it,
% naturally.
%    \begin{macrocode}
\def\Etoc@doends {%
    \ifcase \Etoc@level
        \ifEtoc@v  \Etoc@end@five \fi
        \ifEtoc@iv \Etoc@end@four \fi
        \ifEtoc@iii\Etoc@end@three\fi
        \ifEtoc@ii \Etoc@end@two  \fi
        \ifEtoc@i  \Etoc@end@one  \fi
    \or
        \ifEtoc@v  \Etoc@end@five \fi
        \ifEtoc@iv \Etoc@end@four \fi
        \ifEtoc@iii\Etoc@end@three\fi
        \ifEtoc@ii \Etoc@end@two  \fi
    \or
        \ifEtoc@v  \Etoc@end@five \fi
        \ifEtoc@iv \Etoc@end@four \fi
        \ifEtoc@iii\Etoc@end@three\fi
    \or
        \ifEtoc@v  \Etoc@end@five \fi
        \ifEtoc@iv \Etoc@end@four \fi
    \or
        \ifEtoc@v  \Etoc@end@five \fi
    \or
    \else
        \ifEtoc@v  \Etoc@end@five \fi
        \ifEtoc@iv \Etoc@end@four \fi
        \ifEtoc@iii\Etoc@end@three\fi
        \ifEtoc@ii \Etoc@end@two  \fi
        \ifEtoc@i  \Etoc@end@one  \fi
        \ifEtoc@   \Etoc@end@zero \fi
        \ifnum \Etoc@level =-\tw@
            \ifEtoc@j \Etoc@end@minusone\fi
        \fi
    \fi
}
%    \end{macrocode}
% Calls \csbc{Etoc@setflags} which must not modify \csa{Etoc@next}.
%    \begin{macrocode}
\def\Etoc@dobegins{%
    \let\Etoc@next\@empty
    \Etoc@global\Etoc@isfirstfalse
    \ifcase\Etoc@level
        \ifEtoc@
        \else
            \def\Etoc@next{\Etoc@begin@zero}%
        \fi
    \or
        \ifEtoc@i
        \else
            \def\Etoc@next{\Etoc@begin@one}%
        \fi
    \or
        \ifEtoc@ii
        \else
            \def\Etoc@next{\Etoc@begin@two}%
        \fi
    \or
        \ifEtoc@iii
        \else
            \def\Etoc@next{\Etoc@begin@three}%
        \fi
    \or
        \ifEtoc@iv
        \else
            \def\Etoc@next{\Etoc@begin@four}%
        \fi
    \or
        \ifEtoc@v
        \else
            \def\Etoc@next{\Etoc@begin@five}%
        \fi
    \else
        \ifnum\Etoc@level=\m@ne
            \ifEtoc@j
            \else
                \def\Etoc@next{\Etoc@begin@minusone}%
            \fi
        \else
            \ifEtoc@jj
            \else
                \def\Etoc@next{\Etoc@begin@minustwo}%
            \fi
        \fi
    \fi
    \Etoc@setflags
    \Etoc@next
}
\def\etocskipfirstprefix {\global\Etoc@skipprefixtrue }
%    \end{macrocode}
% Heart of \etoc's hacks into the execution of the |.toc| file commands.
%    \begin{macrocode}
\def\Etoc@etoccontentsline #1{%
  \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname
  \Etoc@skipthisonefalse
  \ifnum\Etoc@level=\Etoc@@six@@
    \Etoc@skipthisonetrue
  \else
   \ifEtoc@localtoc
    \ifEtoc@stoptoc
      \Etoc@skipthisonetrue
    \else
     \ifEtoc@notactive\Etoc@setflags
       \Etoc@skipthisonetrue
     \else
      \unless\ifnum\Etoc@level>\etoclocaltop
        \Etoc@skipthisonetrue
        \global\Etoc@stoptoctrue
      \fi
     \fi
    \fi
   \fi
  \fi
  \let\Etoc@next\@gobblefour
  \ifEtoc@skipthisone
  \else
   \unless\ifnum\c@tocdepth<\Etoc@level
    \ifEtoc@standard
      \let\Etoc@next\Etoc@savedcontentsline
    \else
      \let\Etoc@next\Etoc@etoccontentsline@
    \fi
   \fi
  \fi
  \Etoc@next{#1}%
}
%    \end{macrocode}
% Ever since the first release of \etoc, the code has
% to be careful that the |\Etoc@end@<level>| user defined macros may
% close groups. This is the reason why some assignments have to be done
% globally (|2015/03/08|).
%
% |1.1a| of |2023/01/14| implements a radical change to legacy core internals for
% compatibility with (attow future) \ctanpkg{hyperref}.  Formerly
% \csbc{Etoc@etoccontentsline@} fetched only the first argument.
% It now also fetches all four (the fourth argument of
% \csa{contentsline} is always present since \LaTeX{}
% |2020/10/01|).  The \csbc{Etoc@lxyz} used to receive only the two
% arguments (possibly hacked by \ctanpkg{hyperref})
% of \csa{l@chapter}, \csa{l@section}, etc..., (these macros had
% been |\let| to \csbc{Etoc@lxyz}), and examined them to see if they
% were carrying hyperlinking data.  The |1.1a| and later
% version receives as third
% argument the fourth one of \csa{contentsline}, i.e.\@ the
% hyperlinking target, and
% adds the hyperlinking according to the status of
% \ctanpkg{hyperref}'s \csa{Hy@linktoc}.
%
% This is a breaking change if a user hacked \csa{contentsline} to do some
% specific pre-processing of the data, as this extra will now be ignored.  The
% kind of hack one can think of is perhaps to pre-process the section title to
% turn it into uppercase, this kind of things, but why do such things when one
% is using \etoc which precisely provides a general interface for such
% customization? Besides as the \LaTeX{} legacy set-up already mixes up in
% various ways name and number in the second argument of \csa{contentsline},
% doing such hacks in a non-breaking way was not easy, and could have broken
% \etoc easily anyhow.
%
% The major hacker was \ctanpkg{hyperref}...  Indeed in 2012 when I started
% work on \etoc, it was not clear to me how \ctanpkg{hyperref} would end up
% using the fourth argument of \csa{contentsline} and I did not want to spend
% too much time tracing hyperref code.  So I simply let \ctanpkg{hyperref} do
% its stuff, and added specific post-processing branches to unravel it.
% It looks quite dumb in retrospect (at this time the |.toc| file lines
% with \csa{contentsline} had either three or four arguments which contributed
% for the design decisions back then).
%
% All \ctanpkg{hyperref} specific branches are now gone, replaced by extra
% code added depending on the status of the \csbc{ifEtoc@hyperref} boolean.
% We also check the \csa{Hy@linktoc} \csa{chardef} status and, imitating
% \ctanpkg{hyperref}, do not hyperlink the page number argument if it turns out
% empty.  This maintains backwards-compatibility with earlier releases of
% \etoc.
%    \begin{macrocode}
\def\Etoc@etoccontentsline@ #1#2#3#4{%
    \Etoc@doends
    \Etoc@dobegins
    \Etoc@global\edef\Etoc@prefix  {\expandafter\noexpand
         \csname Etoc@prefix@\csname Etoc@#1@\endcsname\endcsname }%
    \Etoc@global\edef\Etoc@contents{\expandafter\noexpand
         \csname Etoc@contents@\csname Etoc@#1@\endcsname\endcsname }%
    \ifEtoc@skipprefix \Etoc@global\let\Etoc@prefix\@empty\fi
    \global\Etoc@skipprefixfalse
    \Etoc@lxyz{#2}{#3}{#4}%
    \Etoc@prefix\Etoc@contents
}
%    \end{macrocode}
% A \textbf{breaking change} is made at |1.1a|: \csbc{etoclink} will always
% create an hyperlink, even in case of \ctanpkg{hyperref} being (possibly
% locally) configured to obey |linktoc=none|.  Formerly, in such case,
% \csbc{etoclink} added no hyperlink because \etoc identified the hyperlink
% target from 
% the \ctanpkg{hyperref} hacked arguments of \csa{l@section} et al, rather
% than picking it from the fourth argument of \csa{contentsline}.
%
% Another \textbf{breaking change} (documented only at |1.1b|): all three
% of \csbc{etocthelinkedname}, \csbc{etocthelinkednumber}, and
% \csbc{etocthelinkedpage} are always hyperlinks (for the latter, only if
% page number is not empty to match \ctanpkg{hyperref} ways).
% Formerly they obeyed the |linktoc| status,
% somewhat counterintuitively, but this meant that \csbc{etocname} etc...
% were their robust variants, which meant one could store easily for later
% usage (see the documentation examples with ``treetoks'') their precise
% meaning.  The breaking change happened in part because I was fooled myself
% by the macro names, and refactored the code in two steps separated by months
% so in second step I forgot I had only provisory code.  And I decided finally
% to keep the breaking change.
%
% Under |linktoc=page| option, \ctanpkg{hyperref} has a ``feature'' to
% add one level of bracing to first argument of the \csa{l@section} etc
% macros.  So for \etoc |<1.1a| this meant some extra work to dig into such a
% possible brace pair to check if the entry was numbered.  At |1.1a|, the
% \ctanpkg{hyperref} modified \csa{contentsline} is not executed, hence there
% is no such complication.  But the trimming of the now unneeded branches
% was not yet done at |1.1a/b| and got completed only at |1.1c|, together
% with some renamings and refactoring.
%    \begin{macrocode}
\def\Etoc@lxyz #1#2#3{%
    \ifEtoc@hyperref
       \Etoc@global\def\etocthelink##1{\hyperlink{#3}{##1}}%
    \else
       \Etoc@global\let\etocthelink\@firstofone
    \fi
    \Etoc@global\def\etocthepage {#2}%
%    \end{macrocode}
% Prior to |1.1a| an hyperlink was incorporated into \csbc{etocthelinkedpage}
% only if \ctanpkg{hyperref} added an hyperlink to the page number, i.e.\@
% under |linktoc=page| or |linktoc=all| (and a non empty page number).  With
% |1.1a|, the hyperlink is always added (if a non empty page number).
%    \begin{macrocode}
    \ifEtoc@hyperref
       \ifx\etocthepage\@empty
         \Etoc@global\let\etocthelinkedpage\@empty
       \else
         \Etoc@global\def\etocthelinkedpage{\hyperlink {#3}{#2}}%
       \fi
    \else
       \Etoc@global\let\etocthelinkedpage\etocthepage
    \fi
%    \end{macrocode}
% Define \csbc{etocthename} but this will perhaps be adjusted later if it is found
% out that the entry was numbered.
%    \begin{macrocode}
    \Etoc@global\def\etocthename{#1}%
%    \end{macrocode}
% Now we check if the entry is numbered and disentangle the number from the
% name to define correctly \csbc{etocthename} and \csbc{etocthenumber}.
% The delimiter tokens were modified at |1.1c| for a slight optimization.
% And secondary macros have less to do since the |1.1a| initiated refactoring.
%    \begin{macrocode}
    \futurelet\Etoc@getnb@token\Etoc@@getnb #1\hspace\etoc@
%    \end{macrocode}
% Even if \csbc{etocthenumber} was let to \csa{@empty}, it may happen in
% special circumstances (related to KOMA-script, see below) that
% \csbc{etocthename} got redefined.  We will thus use its current contents to
% define appropriately \csbc{etocthelinkedname}.
%
% In presence of \ctanpkg{hyperref} we let always \csbc{etocthelinkedname} and
% \csbc{etocthelinkednumber} (for a numbered entry) carry an hyperlink.  This
% is a \textbf{breaking change} at |1.1a|: formerly if the TOC (or the
% specific entry in the |.toc| file, as it is always possibly to inject
% \csa{hypersetup}) was typeset under |linktoc=none| or |linktoc=page| status,
% then no hyperlinks were incorporated.  This is how \csbc{etocthename} and
% \csbc{etocthenumber} are configured, but \csbc{etocthelinkedname} and
% \csbc{etocthelinkednumber} will since |1.1a| always be hyperlinked in
% presence of \ctanpkg{hyperref}.
%    \begin{macrocode}
    \ifEtoc@hyperref
      \def\Etoc@tmp##1##2{\Etoc@global\def##2{\hyperlink{#3}{##1}}}%
      \expandafter\Etoc@tmp\expandafter{\etocthename}\etocthelinkedname
      \ifEtoc@number
         \expandafter\Etoc@tmp\expandafter{\etocthenumber}\etocthelinkednumber
      \else
         \Etoc@global\let\etocthelinkednumber\@empty
      \fi
    \else
      \Etoc@global\let\etocthelinkedname  \etocthename
      \Etoc@global\let\etocthelinkednumber\etocthenumber
    \fi
%    \end{macrocode}
% Defaults in absence of \ctanpkg{hyperref}.  We externalize to another
% macro the \ctanpkg{hyperref} case switch.
%    \begin{macrocode}
    \Etoc@global\expandafter\let\csname etoclink \endcsname  \etocthelink
    \Etoc@global\expandafter\let\csname etocname \endcsname  \etocthename
    \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthenumber
    \Etoc@global\expandafter\let\csname etocpage \endcsname  \etocthepage
    \ifEtoc@hyperref
      \Etoc@lxyz@linktoc
    \fi
}
%    \end{macrocode}
% In presence of \ctanpkg{hyperref}, \etoc |1.1a| imports the
% \ctanpkg{hyperref} own logic and tests \csa{Hy@linktoc} to decide if
% \emph{name}, \emph{number} and \emph{page} get hyperlinks.  This adds a
% dependency that \csa{Hy@linktoc} should exist and have the expected
% interpretation.
% \begin{framed}
% \textbf{MEMO:} \emph{Matters of tagging will have to wait for \LaTeX\ itself
% to show me what it does in \csa{l@section} etc... so that I can imitate.}
% \end{framed}
%    \begin{macrocode}
\def\Etoc@lxyz@linktoc{%
    \ifcase\Hy@linktoc
        % none: nothing to do
    \or % section (aka name for etoc): link name and number
      \Etoc@global\expandafter\let\csname etocname   \endcsname\etocthelinkedname
      \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber
    \or % page
      \Etoc@global\expandafter\let\csname etocpage   \endcsname\etocthelinkedpage
    \else % all
      \Etoc@global\expandafter\let\csname etocname   \endcsname\etocthelinkedname
      \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber
      \Etoc@global\expandafter\let\csname etocpage   \endcsname\etocthelinkedpage
    \fi
}
%    \end{macrocode}
% Now for the disentangling of the ``number'' from the ``name''.
%
% At some point we will pick up the first token and check if it is
% \csa{numberline} or like token to identify a numbered entry.
% But this step can cause brace removal so we \csa{futurelet} to
% peek ahead.
%
% Prior to |1.1a| it could be possible that the first token following
% \csbc{Etoc@@getnb} was an opening brace and nevertheless the entry was
% numbered, because of a \ctanpkg{hyperref} ``feature'' in case of
% |linktoc=page| option.  But at |1.1a|, \etoc handles directly the argument
% of \csa{contentsline} so the presence of an opening brace implies the entry
% is not numbered.  For some reason |1.1a| kept the extra code to check in
% case the next token was an opening brace whether the whole entry was braced,
% which would have been indicative in the past (but not at |1.1a|) of a
% |linktoc=page| context (\etoc prior to |1.1a| never tested the value of
% \csa{Hy@linktoc} as it did not want to be dependent on details of
% \ctanpkg{hyperref} handling of options).  This legacy, now superfluous, code
% branch is removed at |1.1c|, bringing some simplification here, in
% particular the removal of an \csa{ifEtoc@bracedname} boolean.  Also, when
% branching from here to the \csbc{Etoc@getnb@nonbr}, we won't need to check
% if the entry had a special ``Part'' syntax, which is another simplification.
%
% The |@nonbr| means ``no number'', and is not to be misinterpreted as
% ``non braced''... (this was more confusing to the author on return to
% \etoc code, when it still had branches
% handling issues described above with an extra brace pair).
%    \begin{macrocode}
\def\Etoc@@getnb {%
    \let\Etoc@next\Etoc@getnb
    \ifx\Etoc@getnb@token\@sptoken\let\Etoc@next\Etoc@getnb@nonbr\fi
    \ifx\Etoc@getnb@token\bgroup  \let\Etoc@next\Etoc@getnb@nonbr\fi
    \Etoc@next
}
%    \end{macrocode}
% |1.08n| tries to handle reasonably the \csa{nonumberline} of
% \ctanpkg{KOMA-script}.  If it expands to |\numberline{}|, \etoc will
% consider the line numbered with an empty number (afaict, the meaning of
% \csa{nonumberline} is either empty or \csa{numberline}|{}|).  This got
% modified at |1.1c| (see below).
%
% At |1.09f| we get rid of the \csa{nonumberline} from inside
% \csbc{etocthename} when it has empty meaning, so the expansion of the latter
% can safely be delayed by custom section styles (for example if the build up
% some token list to be executed later not immediately).  |1.1c| fixes a
% regression committed at |1.1a|: for a \csa{nonumberline} with empty
% meaning the \csbc{etocthelinkedname} did not end up hyperlinked.
%
% A change, almost a bug fix, but the former behavior was actually
% deliberate, at |1.1c| regarding the KOMA-script \csa{nonumberline}
% token: formerly, when it expanded to \csa{numberline}|{}| (this
% can happen only when the TOC is typeset in compatibility mode for
% the global display) then \csbc{ifEtoc@number} was set to true.
% But this is only a KOMA-script typesetting thing, and should not
% have influenced \etoc's decisions when its (user or package) own
% line styles are used: at |1.1c| it is thus decided that in such
% circumstances the \csbc{etocifnumbered} will pick the false
% branch, and the empty \csbc{etocthelinkednumber} will not be
% hyperlinked.
%
% No brace removal of the |#1| here a priori possible because we took care to
% check that \csbc{Etoc@getnb} was not followed by either a space or an
% opening brace.
%
% The \csbc{Etoc@@getit} branch for ``Parts'' used to be executed from inside
% \csbc{Etoc@lxyz}.  At |1.1c| we jump directly to it from here.
%    \begin{macrocode}
\def\Etoc@getnb #1{%
    \in@{#1}{\numberline\chapternumberline\partnumberline\booknumberline}%
    \ifin@
       \let\Etoc@next\Etoc@getnb@nmbrd
    \else
       \ifnum\Etoc@level=\m@ne
           \let\Etoc@next\Etoc@@getit
       \else
           \let\Etoc@next\Etoc@getnb@nonbr
       \fi
%    \end{macrocode}
% Remove a KOMA-script \csa{nonumberline} token if present and process the
% entry always as not numbered (see above comments).  Prior to |1.1c|, the
% code branched according to the meaning of the \csa{nonumberline} token,
% which was a bit silly.
%    \begin{macrocode}
       \in@{#1}{\nonumberline}%
       \ifin@
         \let\Etoc@next\Etoc@getnb@nonumberline
       \fi
    \fi
    \Etoc@next #1%
}
%    \end{macrocode}
% Prior to |1.1a|, \csbc{etocthelinkedname} and \csbc{etocthelinkednumber}
% (for a numberd entry) were defined to carry links only if an hyperlink was
% actually found, now they are defined in \csbc{Etoc@lxyz} to always provide
% the hyperlinking to the target title in the document.
%
% |1.1a| and |1.1b| still had here some superfluous code which was trimmed at
% |1.1c|.
%
% Also, |1.1c| fixes here a brace removal bug (which had always been there I
% guess): if the numbered heading title was braced one level of bracing was
% removed.  The bug had no effect in a document using \ctanpkg{hyperref} (and
% its default |linktoc| setting) as the \csa{hyperlink} wrapper limited the
% scope.  But in a document without hyperref it would have been seen with
% input such as |\section{{\color{blue}Stuff}}|.
%    \begin{macrocode}
\def\Etoc@getnb@nmbrd #1#2{%
    \Etoc@global\Etoc@numbertrue
    \Etoc@global\def\etocthenumber {#2}%
    \Etoc@getnb@nmbrd@getname\@empty
}%
%    \end{macrocode}
% We added an \csa{@empty} token to prevent brace removal.
%    \begin{macrocode}
\def\Etoc@getnb@nmbrd@getname #1\hspace\etoc@ {%
    \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}%
}
%    \end{macrocode}
% Not numbered entry.
%    \begin{macrocode}
\def\Etoc@getnb@nonbr #1\etoc@ {%
    \Etoc@global\Etoc@numberfalse
    \Etoc@global\let\etocthenumber \@empty
}
%    \end{macrocode}
% Special KOMA branch: |#1| starts with \csa{nonumberline} (prior to |1.1c|
% the |#1| would have already lost this token, and this branch was executed
% only in case \csa{nonumberline} had empty meaning).  We need to remove this
% token from |#1| and redefine \csbc{etocthename}.
%
% |1.1a| code still had here some complications with a ``braced name'' branch
% which was in fact never executed at |1.1a|, as the \ctanpkg{hyperref} hacks
% into the expansion of \csa{contentsline} were not executed.  These now
% unneeded complications got removed at |1.1c|.
%
% |1.1c| also fixes a regression caused by |1.1a| in this branch: the
% \csbc{etocthelinkedname} had lost its hyperlink.
%
% The \csa{nonumberline} extra token guarantees no brace stripping here.
%    \begin{macrocode}
\def\Etoc@getnb@nonumberline #1\hspace\etoc@ {%
    \Etoc@global\Etoc@numberfalse
    \Etoc@global\let\etocthenumber \@empty
    \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{\@gobble#1}%
}
%    \end{macrocode}
% This branch handles the peculiar ``Part'' syntax.  No brace stripping
% possible here when grabbing |#1|, due to previous checks that it does
% not start by a space token or an opening brace.
%
% |1.1c| handles this as a sub-branch from \csbc{Etoc@@getnb} which brings
% simplifications.  Also the code has been somewhat strengthened so as to
% avoid in later processing a brace removal issue on the name (which was a bug
% of legacy earlier code), when it turns our we are handling a numbered Part
% indeed.
%
% The whole thing is anyhow quite fragile due to \LaTeX{}'s handling by
% standard classes of |.toc| file entries for parts being even more already
% pre-formatted for typesetting than for other levels.
%    \begin{macrocode}
\def\Etoc@@getit #1\hspace#2{%
    \ifx\etoc@#2%
      \Etoc@global\Etoc@numberfalse
      \Etoc@global\let\etocthenumber \@empty
    \else
      \Etoc@global\Etoc@numbertrue
      \Etoc@global\def\etocthenumber {#1}%
      \expandafter\Etoc@getit@getname \expandafter\@empty
    \fi
}
%    \end{macrocode}
% Chain of \csa{expandafter}'s to get rid of the added \csa{@empty} token to
% avoid a brace removal.  And this is the end of the |1.1a| refactoring,
% completed at |1.1c|.
%    \begin{macrocode}
\def\Etoc@getit@getname #1\hspace\etoc@ {%
    \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}%
}
%    \end{macrocode}
% place-holder
%    \begin{macrocode}
\let\etocthename   \@empty
\let\etocthenumber \@empty
\let\etocthepage   \@empty
\let\etocthelinkedname   \@empty
\let\etocthelinkednumber \@empty
\let\etocthelinkedpage   \@empty
\let\etocthelink   \@firstofone
\DeclareRobustCommand*{\etocname}  {}
\DeclareRobustCommand*{\etocnumber}{}
\DeclareRobustCommand*{\etocpage}  {}
\DeclareRobustCommand*{\etoclink}  {\@firstofone}
\DeclareRobustCommand*{\etocifnumbered}
   {\ifEtoc@number\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\expandafter\let\expandafter\etocxifnumbered\csname etocifnumbered \endcsname
\DeclareRobustCommand*{\etociffirst}
   {\ifEtoc@isfirst\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\expandafter\let\expandafter\etocxiffirst\csname etociffirst \endcsname
\def\Etoc@readtoc {%
  \ifeof \Etoc@tf
  \else
     \read \Etoc@tf to \Etoc@buffer
     \Etoc@toctoks=\expandafter\expandafter\expandafter
       {\expandafter\the\expandafter\Etoc@toctoks\Etoc@buffer}%
     \expandafter\Etoc@readtoc
  \fi
}
%    \end{macrocode}
% |1.07m| moves the reading of the toc file At Begin Document. Needed for
% Babel activated characters.\par^^A extra \par needed to avoid empty line...
%    \begin{macrocode}
\Etoc@toctoks {}% (superfluous, but for clarity)
\AtBeginDocument{\IfFileExists{\jobname.toc}
    {{\endlinechar=\m@ne
      \makeatletter
      \newread\Etoc@tf
      \openin\Etoc@tf\@filef@und
      \Etoc@readtoc
      \global\Etoc@toctoks=\expandafter{\the\Etoc@toctoks}%
      \closein\Etoc@tf}}
    {\typeout{No file \jobname.toc.}}}
\def\Etoc@openouttoc{%
  \ifEtoc@hyperref
   \ifx\hyper@last\@undefined
    \IfFileExists{\jobname .toc}
      {\Hy@WarningNoLine
         {old toc file detected; run LaTeX again (cheers from `etoc')}%
       \global\Etoc@toctoks={}%
      }
      {}%
   \fi
  \fi
  \if@filesw
   \newwrite \tf@toc
   \immediate \openout \tf@toc \jobname .toc\relax
  \fi
  \global\let\Etoc@openouttoc\empty
}
\def\Etoc@toctoc{%
  \global\Etoc@vfalse
  \global\Etoc@ivfalse
  \global\Etoc@iiifalse
  \global\Etoc@iifalse
  \global\Etoc@ifalse
  \global\Etoc@false
  \global\Etoc@jfalse
  \global\Etoc@jjfalse
  \the\Etoc@toctoks
  \ifEtoc@notactive
  \else
   \ifEtoc@v   \Etoc@end@five\fi
   \ifEtoc@iv  \Etoc@end@four\fi
   \ifEtoc@iii \Etoc@end@three\fi
   \ifEtoc@ii  \Etoc@end@two\fi
   \ifEtoc@i   \Etoc@end@one\fi
   \ifEtoc@    \Etoc@end@zero\fi
   \ifEtoc@j   \Etoc@end@minusone\fi
   \ifEtoc@jj  \Etoc@end@minustwo\fi
  \fi
}
%    \end{macrocode}
% Memo: \csbc{etoclocaltop} has only
% meaningful meaning when the local toc has its "active" flag set. Except that
% I used a "notactive" flag to torture myself, so: has the "notactive" flag
% off.
%
% Also attention |1.09| now sets the \csa{c@tocdepth} there in relation to
% implementation of \localtocwrdp. This is needed for line styles in
% compatibility mode as the code from standard classes checks the tocdepth
% counter.
%    \begin{macrocode}
\def\etoc@@startlocaltoc#1#2{%
    \ifEtoc@localtoc
       \ifnum #1=#2\relax
          \ifEtoc@jj  \global\let\etoclocaltop\Etoc@@minustwo@@\fi
          \ifEtoc@j   \global\let\etoclocaltop\Etoc@@minusone@@\fi
          \ifEtoc@    \global\let\etoclocaltop\Etoc@@zero@@    \fi
          \ifEtoc@i   \global\let\etoclocaltop\Etoc@@one@@     \fi
          \ifEtoc@ii  \global\let\etoclocaltop\Etoc@@two@@     \fi
          \ifEtoc@iii \global\let\etoclocaltop\Etoc@@three@@   \fi
          \ifEtoc@iv  \global\let\etoclocaltop\Etoc@@four@@    \fi
          \ifEtoc@v   \global\let\etoclocaltop\Etoc@@five@@    \fi
          \global\c@tocdepth\Etoc@localtocdepth
          \global\Etoc@notactivefalse
          \global\Etoc@vfalse
          \global\Etoc@ivfalse
          \global\Etoc@iiifalse
          \global\Etoc@iifalse
          \global\Etoc@ifalse
          \global\Etoc@false
          \global\Etoc@jfalse
          \global\Etoc@jjfalse
       \fi
    \fi
}
\let\etoc@startlocaltoc\@gobble
%    \end{macrocode}
% \csbc{Etoc@tocid} is the number of the toc (possibly gotten via a |\ref|
% following a \csbc{tableofcontents}), or it is |\z@| if the emptiness test is
% from a global toc. Until the compilations stabilize, some local TOCs can get
% printed at wrong locations naturally and emptiness tests can not be trusted
% either.
%
% Note: (|1.08i 2016/09/29|) the code has to handle both local and total toc.
% Hence the flag \csbc{ifEtoc@notactive} has to be set prior to it. For a
% global toc, the \csbc{Etoc@tocid} was set to |\z@|, and the |\ifnum| in
% \csbc{etoc@startlocaltoc} did always fail, but I now prefer to simply
% nullify the \csbc{etoc@startlocaltoc}. As its default fallback is
% |\@gobble| I simply test here for the \csbc{ifEtoc@localtoc} flag. The
% \csbc{Etoc@tocid} will be undefined for a global toc but it is not tested
% anymore.
%
% Note: the mechanism for recognizing the level when a local toc is
% encountered is different from the one in \csbc{etoc@@startlocaltoc} which uses
% the level flags. Here we just record in \csbc{Etoc@level} where we last stood.
% The initialization |\global\let\Etoc@level\Etoc@minf| is thus needed in case
% the |.toc| file contains an \csbc{etoc@startlocaltoc} before any
% \csa{contentsline}.
%    \begin{macrocode}
\def\Etoc@setemptytocbool {%
    \global\Etoc@emptytoctrue
    \global\Etoc@stoptocfalse
    \global\let\Etoc@level\Etoc@minf
    \begingroup
      \ifEtoc@localtoc
        \def\etoc@startlocaltoc##1{%
          \ifnum##1=\Etoc@tocid\relax
              \global\let\etoclocaltop\Etoc@level
              \global\Etoc@notactivefalse
          \fi }%
        \let\contentsline\Etoc@testingcontentslinelocal
      \else
        \let\contentsline\Etoc@testingcontentsline
      \fi
      \Etoc@storetocdepth
%    \end{macrocode}
% |1.09i| fixes a bug arising when document has used \csbc{etocsetlocaltop.toc}.
%    \begin{macrocode}
        \let\Etoc@setlocaltop@doends@dobegins\@empty
        \the\Etoc@toctoks
      \Etoc@restoretocdepth
    \endgroup
}
\DeclareRobustCommand*\etocifwasempty
  {\ifEtoc@emptytoc\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi }
\expandafter
\let\expandafter\etocxifwasempty\csname etocifwasempty \endcsname
\def\Etoc@testingcontentslinelocal #1{%
  \ifEtoc@stoptoc
  \else
   \ifnum\csname Etoc@#1@@\endcsname=\Etoc@@six@@
   \else
    \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname
%    \end{macrocode}
% \csbc{ifEtoc@notactive} set to False by \csbc{etoc@startlocaltoc} with right id. It
% that happened, check level of hit against unit. Will decide if empty or not.
% Set \csbc{ifEtoc@stoptoc} flag afterwards in all cases. \csa{Etoc@localtop} will have been
% initialized by \csbc{etoc@@startlocaltoc} as \csbc{ifEtoc@notactive} flag can be
% false only then.
%    \begin{macrocode}
    \ifEtoc@notactive
    \else
     \ifnum\Etoc@level>\etoclocaltop
      \unless\ifnum\Etoc@level>\Etoc@localtocdepth
       \global\Etoc@emptytocfalse
       \global\Etoc@stoptoctrue
      \fi
     \else
      \global\Etoc@stoptoctrue
     \fi
    \fi
   \fi
  \fi
  \@gobblefour\relax
}
\def\Etoc@testingcontentsline #1{%
  \ifEtoc@stoptoc
  \else
   \ifnum\csname Etoc@#1@@\endcsname=\Etoc@@six@@
   \else
    \unless\ifnum\csname Etoc@#1@@\endcsname>\c@tocdepth
     \global\Etoc@emptytocfalse
     \global\Etoc@stoptoctrue
    \fi
   \fi
  \fi
  \@gobblefour\relax
}
%    \end{macrocode}
% |2015/03/16|: |1.08e| lets \csbc{localtableofcontents} do a first scan of the
% |.toc| file (as stored in \csbc{Etoc@toctoks}) to determine if the table of
% contents will in fact end up empty. In that case, nothing is typeset. The
% command \csbc{etocaftertochook} is still executed though. Other ways were
% envisioned (like delimited macros) to determine this potential emptiness, but
% in the end I opted for execution of the |.toc| file with suitable definitions
% for \csa{contentsline} and \csbc{etoc@startlocaltoc}. Notice though that if
% emptiness would result from empty line styles, this can not be detected.
% Emptiness means ``no executed \csa{contentsline}''.
%
% For this detection of emptiness, assignments (here and in
% \csbc{Etoc@testingcontentsline}) are made globally, I think this is the best
% (just in case some portions of the |.toc| file turn out to be inside some
% groups --- perhaps for some silly color assignments, etc... --- whose
% boundaries do not necessarily respect unit levels).
%
% The flag \csbc{ifEtoc@tocwithid} discriminates between a \localtoc and a
% \toc|\ref{foo}|; the latter could so far possibly refer to a local or also to
% a global table of contents but release |1.08e| has deprecated the latter use
% as it complicated the code, for something truly silly. Thus |\ref{foo}| must
% now be with |foo| a label of a local TOC. As a result \csbc{ifEtoc@tocwithid} is
% less used now.
%
% In the case of a |\ref|ed-to toc whose label was just added hence is not yet
% in the |.aux| file, \csbc{Etoc@tocid} is |0|. \etoc used to issue a warning to
% run latex again and did no printing at all. Release |1.08e| in such cases
% prints the heading (this may gain one compilation step). Emptiness test is
% not executed as it would necessarily turn out positive and can not be
% trusted anyhow. The TOC is declared non empty, which it probably is...
%
% Emptiness detection for local tables of contents (either from a
% \csbc{localtableofcontents} or from a \csbc{tableofcontents}|\ref{localtoc}|)
% can be trusted only when the |.toc| file has stabilized.The emptiness status
% of a local TOC whose Id is not yet in the |.toc| is by necessity undecided
% yet (and not to be trusted really as the numbering may have changed; only
% when compilation runs settle is the emptiness status to be trusted). The
% code declares the TOC non empty, as it will be in 95\% of use cases.
%
% Dropping support for \toc|\ref{globaltoc}| means here that when a TOC id is
% not found in the |.toc| file we can assume it definitely has to be a local
% TOC needing more compilations. The emptiness status is undecided, the code
% declares the TOC non empty.
%
% |1.08i-2016/09/29| now does \csa{Etoc@localtoctrue} right at the start (the
% earlier code could have to handle table of contents which were actually
% global, via the |\label/\ref| mechanism.) It does not rely on the |\ifnum|
% automatically false in \csbc{etoc@@startlocaltoc} due to the special values |0|
% or |\z@| for \csbc{Etoc@tocid}, but simply leaves \csbc{etoc@startlocaltoc} to its
% default |\@gobble|. The \csa{Etoc@emptytocfalse} is upfront in case some
% code using \csbc{etocifwasempty} is in user hooks. The default is to assume the
% TOC non-empty as its contents are actually still unknown. Under the
% \csa{Etoc@stoptoctrue} flag, the \csbc{Etoc@etoccontentsline} is more efficient now.
%
% The \csbc{ifEtoc@notactive} flag needs to be set before calling
% \csbc{Etoc@setemptytocbool}.
%
% I hesitated with |1.08i| to write something to aux file in order to let
% \LaTeX\ prompt the user for extra pass, after insertion of some new
% \csa{localtableofcontents}, but finally I prefer to only trick \LaTeX\ into
% telling about undefined references.
%
% The \csa{PackageWarning} approach has the advantage
% that at least in Emacs/AUCTeX the |C-cC-c| will propose |LaTeX|, not |View|.
% But perhaps some automated scripts checking |aux| file will not like the
% extra line which is then removed in next pass, and could possibly do one
% extra unneeded compilation to check |aux| file remains identical. Hence the
% second approach. (edit |2017/10/23|: good thing I documented that! I had
% completely forgotten that rationale, but I wonder if it is correct.)
%
% Also the \csa{PackageWarning} does not trigger a visible message
% near the end of the log file or console output, contrarily to a
% \centeredline{|LaTeX Warning: There were undefined references.|}
% followed by a 
% \centeredline{|LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.|}
%
% Method used here seems to work fine also with |latexmk|: it does not seem to
% induce it into making too many runs.
%    \begin{macrocode}
\def\Etoc@localtableofcontents#1{%
    \gdef\etoclocaltop{-\@m}%
    \Etoc@localtoctrue
    \global\Etoc@emptytocfalse
    \edef\Etoc@tocid{#1}%
    \ifnum\Etoc@tocid<\@ne
      \setbox0\hbox{\ref{Unknown toc ref \@secondoftwo#1. \space Rerun LaTeX}}%
%    \end{macrocode}
% Do only heading, skip all the rest.
%    \begin{macrocode}
      \global\Etoc@stoptoctrue
      \gdef\etoclocaltop{-\thr@@}%
      \Etoc@tableofcontents
      \expandafter\Etoc@gobtoetoc@
    \fi
    \global\Etoc@notactivetrue
    \ifEtoc@checksemptiness
       \Etoc@setemptytocbool
    \fi
    \ifEtoc@emptytoc
       \ifEtoc@notactive
         \setbox0\hbox{\ref{Unknown toc ID \number\Etoc@tocid. \space Rerun LaTeX}}%
%    \end{macrocode}
% Assume real one will be non-empty and print only heading for this pass.
%    \begin{macrocode}
         \global\Etoc@emptytocfalse
         \global\Etoc@stoptoctrue
         \gdef\etoclocaltop{-\thr@@}%
         \Etoc@tableofcontents
         \expandafter\expandafter\expandafter\Etoc@gobtoetoc@
       \fi
    \else
       \global\Etoc@stoptocfalse
       \global\Etoc@notactivetrue
%    \end{macrocode}
% We can end up here either if the emptiness check was done and turned
% negative (then \csbc{etoclocaltop} has the correct level for usage in first
% argument of \csbc{etocsettocstyle}), or if the emptiness check was not done.
% For the latter case \csbc{etoclocaltop} has setting |-\@m|.
%    \begin{macrocode}
       \edef\etoc@startlocaltoc##1%
           {\noexpand\etoc@@startlocaltoc{##1}{\Etoc@tocid}}%
       \Etoc@tableofcontents
    \fi
    \@gobble\etoc@
    \endgroup\ifEtoc@mustclosegroup\endgroup\fi
    \Etoc@tocdepthreset
    \etocaftertochook
%    \end{macrocode}
% |1.09| hesitates about putting this before of after the
% \csbc{etocaftertochook}. The information of the used tocdepth is lost if
% puuting it first. The usage of \csbc{etocaftertochook} may be broken if
% unexpected tokens follows.
%    \begin{macrocode}
    \let\Etoc@localtocdepth\c@tocdepth
}% \Etoc@localtableofcontents
%    \end{macrocode}
% |2013/03/07|: I discover a \csa{@namedef} trick to construct the
% \csbc{Etoc@again} space delimited macro:\\
% |    \@namedef {Etoc@again} {...stuff...}|\\
%  Original version was (copied from analogous stuff in |source2e|):\\
% |    {\def\1{\Etoc@again}\expandafter\gdef\1 {...stuff...}}|\\
% and in the end (now that I think about it) I simply use \csa{@firstofone}.\par
%    \begin{macrocode}
\def\Etoc@getrefno #1#2\etoc@ {#1}
\def\Etoc@getref #1{\@ifundefined{r@#1}{0}{\expandafter\expandafter\expandafter
          \Etoc@getrefno\csname r@#1\endcsname\relax\etoc@}}
\def\Etoc@ref#1{\Etoc@localtableofcontents{\Etoc@getref{#1}}}
\def\Etoc@label#1{\label{#1}\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents}
\@firstofone{\def\Etoc@again} {\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents}
%    \end{macrocode}
% |\ref{foo}| expects |foo| to be a label to a \emph{local} TOC.
%
% The syntax \csbc{localtableofcontents}|\ref{foo}| is supported.
%    \begin{macrocode}
\def\Etoc@dothis #1#2\etoc@ {\fi #1}
\def\Etoc@t@bleofcontents{%
    \gdef\etoclocaltop{-\@M}%
    \ifx\Etoc@nexttoken\label\Etoc@dothis{\expandafter\Etoc@label\@gobble}\fi
    \ifx\Etoc@nexttoken\@sptoken\Etoc@dothis{\Etoc@again}\fi
%    \end{macrocode}
% \csbc{Etoc@ref} will hand over directly to \csbc{Etoc@localtableofcontents}.
% Argument will be (or rather expand to) zero if the reference is non-existent
% yet.
%    \begin{macrocode}
    \ifx\Etoc@nexttoken\ref\Etoc@dothis{\expandafter\Etoc@ref\@gobble}\fi
%    \end{macrocode}
% Flag to check if we were called from a \csbc{localtableofcontents}.
%    \begin{macrocode}
    \ifEtoc@tocwithid\Etoc@dothis{\Etoc@localtableofcontents{\c@etoc@tocid}}\fi
%    \end{macrocode}
% From now on we are handling a global TOC. Earlier, I used the trick of
% setting \csbc{Etoc@tocid} to |\z@| for compatibility with expansion of
% \csbc{etoc@startlocaltoc}. But since |1.08i| \csbc{etoc@startlocaltoc} is left to be
% |\@gobble|, and \csbc{Etoc@tocid} is never tested. We don't need to set the
% \csbc{ifEtoc@notactive} flag as now \csbc{Etoc@testingcontentsline} tests first the
% \csbc{ifEtoc@localtoc} flag (was already the case of \csbc{Etoc@etoccontentsline}). I change
% a bit the style of conditionals here for clarity of code.
%    \begin{macrocode}
    \global\Etoc@emptytocfalse\ifEtoc@checksemptiness\Etoc@setemptytocbool\fi
    \ifEtoc@emptytoc
     \ifEtoc@notocifnotoc
      \expandafter\expandafter\expandafter\@gobble
     \fi
    \fi
    \Etoc@tableofcontents
    \endgroup\ifEtoc@mustclosegroup\endgroup\fi
    \Etoc@tocdepthreset
    \etocaftertochook
    \@gobble\etoc@
    }% \Etoc@t@bleofcontents
%    \end{macrocode}
% |1.08c| does not use |\arabic| in the \csa{addtocontents} since I have seen
% that in some circumstances (for some right to left languages with
% polyglossia or babel), one can not rely on |\arabic| having its default
% definition. As the number written here will be used later in an \csa{ifnum}, I
% should not have used it in the first place (done |2015/03/30|).
%    \begin{macrocode}
\def\Etoc@table@fcontents{%
    \refstepcounter{etoc@tocid}%
    \Etoc@tocwithidfalse
    \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents}
\def\Etoc@localtable@fcontents{%
    \refstepcounter{etoc@tocid}%
    \addtocontents{toc}{\string\etoc@startlocaltoc{\the\c@etoc@tocid}}%
    \Etoc@tocwithidtrue
    \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents}
\let\etocaftertitlehook    \@empty
\let\etocaftercontentshook \@empty
%    \end{macrocode}
% Attention that there could be a |\ref| following, thus we don't yet know
% whether this is a local or global table of contents.
%
% The \csbc{Etoc@tocdepthset} is for \csbc{etocsetnexttocdepth} mechanism.
%    \begin{macrocode}
\def\etoctableofcontents{%
   \Etoc@openouttoc
   \Etoc@tocdepthset
   \begingroup
%    \end{macrocode}
% This group will be closed in \csbc{Etoc@t@bleofcontents} or
% \csbc{Etoc@localtableofcontents}.
%
% Prior to its release |1.4c|, \ctanpkg{tableof} added a group pair via \csa{tof@begin}
% and \csa{tof@finish}. This was removed at |1.4c|. So no need to do anything now
% here about silencing \csa{tof@begingroup} and \csa{tof@endgroup}: they are
% inserted only in the \ctanpkg{tableof} private copy of the |.toc| file which is
% used by its own table of contents typesetting command.
%
% |1.09b| uses a |\def| in non-starred variant for allowing tricks to
% recognize later on if we are in a starred or non-starred case, whatever the
% user definition of \csbc{etocaftertitlehook} may be.
%    \begin{macrocode}
      \@ifstar
      {\let\Etoc@aftertitlehook\@empty\Etoc@table@fcontents}
      {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@table@fcontents}%
}% \etoctableofcontents
%    \end{macrocode}
% See at end of this file for the explanation of this |1.09d| added saving
% of original meaning at package loading time.
%    \begin{macrocode}
\let\etocoriginaltableofcontents\tableofcontents
\let\tableofcontents\etoctableofcontents
\newcommand*\localtableofcontents{%
   \Etoc@openouttoc
   \Etoc@tocdepthset
   \begingroup
%    \end{macrocode}
% This group closed in \csbc{Etoc@t@bleofcontents} or \csbc{Etoc@localtableofcontents}.
% Same comment relative to \ctanpkg{tableof}. No need to do anything here.
%    \begin{macrocode}
      \@ifstar
      {\let\Etoc@aftertitlehook\@empty\Etoc@localtable@fcontents}
      {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@localtable@fcontents}%
}% \localtableofcontents
%    \end{macrocode}
% |1.09| adds \localtocwrdp. The motivation is that it is impossible to set
% in a completely satisfactory way the tocdepth from the first argument of
% \csbc{etocsettocstyle} because the emptiness check does not execute that
% argument. If one does not care about emptiness check, one can of course set
% the tocdepth from the first argument of \csbc{etocsettocstyle}. One can even
% use \csbc{etocsetnexttocdepth} for that since |1.09| but anyway direct usage
% of \csbc{etocsettocdepth} (or |\setcounter{tocdepth}{...}| is easier as its
% effet when executed there is automatically limited to duration of the TOC.
%    \begin{macrocode}
\newcommand*\localtableofcontentswithrelativedepth[1]{%
   \edef\Etoc@localtocdepth
       {\numexpr\noexpand\etoclocaltop+\the\numexpr#1\relax\relax}%
   \localtableofcontents
}% \localtableofcontentswithrelativedepth
\let\Etoc@localtocdepth\c@tocdepth
%    \end{macrocode}
% The code does only expandable things after
% \csbc{Etoc@toctoc}, in order to allow opening of an alignment in the first
% argument and closing in the second.
%    \begin{macrocode}
\newcommand\etocsettocstyle[2]{%
\def\Etoc@tableofcontents
{%
    \ifnum\c@tocdepth>\Etoc@minf
    \else
     \expandafter\Etoc@gobtoetoc@
    \fi
    \Etoc@par
    \etocbeforetitlehook
    \Etoc@storetocdepth
    \let\Etoc@savedcontentsline\contentsline
    \let\contentsline\Etoc@etoccontentsline
    \ifEtoc@standard
    \else
%    \end{macrocode}
% |1.1a|'s \csbc{Etoc@lxyz} now fetches 3 not 2 arguments and the
% \csa{l@section} etc... are not |\let| to it anymore, as they used to be here
% formerly.  For backwards compatibility the \csa{etocsavedchaptertocline}
% etc... are still defined, but raise a deprecation warning.
%    \begin{macrocode}
        \def\Etoc@levellist@elt####1{%
            \expandafter\def\csname etocsaved####1tocline\endcsname
             {\PackageWarning{etoc}{%
              \expandafter\string\csname etocsaved####1tocline\endcsname\space
              has been deprecated at 1.1a.\MessageBreak
              It will be removed from `etoc' in near feature. \space Use\MessageBreak
              \expandafter\string\csname l@####1\endcsname\space directly. \space
              Reported}%
              \expandafter\let\csname etocsaved####1tocline\expandafter\endcsname
              \csname l@####1\endcsname
              \csname l@####1\endcsname
             }%
        }%
        \Etoc@levellist
    \fi
%    \end{macrocode}
% |1.09| makes \csbc{etocsetnexttocdepth} usable in |#1| (but this is not 100\%
% compatible with the emptiness check).
%
% |1.09| makes an \csbc{etoclocaltop} usable in |#1| if under checksemptiness
% regime.
%    \begin{macrocode}
    #1%
    \Etoc@tocdepthset
    \ifEtoc@parskip\parskip\z@skip\fi
    \Etoc@aftertitlehook
%    \end{macrocode}
% |1.09| has replaced former \csa{Etoc@localtop} (\emph{minus one}) by
% \csbc{etoclocaltop}. Under checksemptinesstrue regime its value is already
% known, but it will be obtained again from the toc file execution. As it is
% used only if TOC is active, resetting it here this way is decorative and
% could be removed.
%    \begin{macrocode}
    \gdef\etoclocaltop{-\thr@@}%
    \Etoc@toctoc
    \etocaftercontentshook
    #2\@nobreakfalse
    \Etoc@restoretocdepth
%    \end{macrocode}
% \csa{contentsline} was set to \csbc{Etoc@etoccontentsline} by a non-global |\let|,
% and it will recover its normal value from exiting a scope limiting group.
% But \ctanpkg{tableof} (since |1.4a|) under \csa{etocglobaldefstrue} does a global
% redefinition of \csa{contentsline}.  Its \csa{tof@finish} then does a global
% restore of \csa{contentsline}, but it will be to the \etoc set
% value. \csa{tof@finish} is active only if either the table of contents was
% typeset using \csa{tableof}, \csa{tablenotof}, \csa{tableoftaggedcontents}, or
% \csa{nextocwithtags} was used.  If not active it is either undefined (no
% package \ctanpkg{tableof}) or |\@empty|. Prior to \ctanpkg{tableof} |1.4c|, the
% \csa{tof@finish} closed a group and could be undefined as well, but not if
% \csa{etocglobaldefstrue}.
%
% If rather than |\@empty| the \csa{tof@finish} fall-back was |\relax| we could
% use here \csa{@ifundefined} to check in one go (matters of speaking because
% expansion of \csa{@ifundefined} is not in "one-go"). Maybe I should update
% \ctanpkg{tableof}, but for time being I will simply add an extra test. All this is
% probably lots of time on irrelevant issue.
%    \begin{macrocode}
    \ifx\Etoc@global\global
     \@ifundefined{tof@finish}
     {}
     {\ifx\tof@finish\@empty
      \else
       \global\let\contentsline\Etoc@savedcontentsline
      \fi
     }%
    \fi
    \@gobble\etoc@
}% end of \Etoc@tableofcontents definition by \etocsettocstyle
}
\def\etocsetstyle{\Etoc@standardfalse\etoc@setstyle}
\long\def\etoc@setstyle#1#2#3#4#5{%
     \expandafter\def
     \csname Etoc@begin@\csname Etoc@#1@\endcsname\endcsname
                     {#2\Etoc@global\Etoc@isfirsttrue}%
     \expandafter\def
     \csname Etoc@prefix@\csname Etoc@#1@\endcsname\endcsname   {#3}%
     \expandafter\def
     \csname Etoc@contents@\csname Etoc@#1@\endcsname\endcsname {#4}%
     \expandafter\def
     \csname Etoc@end@\csname Etoc@#1@\endcsname\endcsname      {#5}%
}
\def\etocfontminustwo {\normalfont \LARGE \bfseries}
\def\etocfontminusone {\normalfont \large \bfseries}
\def\etocfontzero     {\normalfont \large \bfseries}
\def\etocfontone      {\normalfont \normalsize \bfseries}
\def\etocfonttwo      {\normalfont \normalsize}
\def\etocfontthree    {\normalfont \footnotesize}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocsepminustwo  {4ex \@plus .5ex \@minus .5ex}
\def\etocsepminusone  {4ex \@plus .5ex \@minus .5ex}
\def\etocsepzero      {2.5ex \@plus .4ex \@minus .4ex}
\def\etocsepone       {1.5ex \@plus .3ex \@minus .3ex}
\def\etocseptwo       {.5ex \@plus .1ex \@minus .1ex}
\def\etocsepthree     {.25ex \@plus .05ex \@minus .05ex}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocbaselinespreadminustwo {1}
\def\etocbaselinespreadminusone {1}
\def\etocbaselinespreadzero     {1}
\def\etocbaselinespreadone      {1}
\def\etocbaselinespreadtwo      {1}
\def\etocbaselinespreadthree    {.9}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocminustwoleftmargin  {1.5em plus 0.5fil}
\def\etocminustworightmargin {1.5em plus -0.5fil}
\def\etocminusoneleftmargin  {1em}
\def\etocminusonerightmargin {1em}
\def\etoctoclineleaders
        {\hbox{\normalfont\normalsize\hb@xt@2ex {\hss.\hss}}}
\def\etocabbrevpagename {p.~}
%    \end{macrocode}
% Versions earlier than |1.08b| (and since |1.05 2012/12/01|) defined
% \csbc{etocpartname} (for use by \etoc's own line styles) to expand to
% \csa{partname}. But this didn't make sense in the context for example of
% \ctanpkg{babel} and \ctanpkg{babel-french}, because \csa{frenchpartname} does things depending on
% the current value of the counter |part|. The code in recent \ctanpkg{babel-french} (but
% not yet |v2.5a| when \csbc{etocpartname} was introduced) constructs control
% sequences \csa{ordinali}, etc... If the part counter is zero, this gives
% \csa{ordinal}. Usually this is not defined, hence no error happens (as it is
% constructed via |\csname|), but under class \ctanpkg{memoir} the bug showed up. All
% this to explain that I found out about this long lasting problem only on
% |2015/03/14|. Probably a sign that \etoc's own line styles are rarely
% used...
%    \begin{macrocode}
\def\etocpartname       {Part}
\def\etocbookname       {Book}
%    \end{macrocode}
% The macro \csbc{etocdefaultlines} was initially called \csbc{etoctoclines}. Now
% \csbc{etoctoclines} just does \csa{Etoc@standardfalse}.
%
% Version |1.09f| wraps \csbc{etocbookname}, respectively
% \csbc{etocpartname}, in the book, resp. part, line styles inside a
% (potential) hyperlink together with the number.
%    \begin{macrocode}
\def\etocdefaultlines{\Etoc@standardfalse
%% `book':
\etoc@setstyle{@minustwo}
  {\addpenalty\@M\etocskipfirstprefix}
  {\addpenalty\@secpenalty}
  {\begingroup
   \etocfontminustwo
   \addvspace{\etocsepminustwo}%
   \parindent \z@
   \leftskip  \etocminustwoleftmargin
   \rightskip \etocminustworightmargin
   \parfillskip \@flushglue
   \vbox{\etocifnumbered{\etoclink{\etocbookname\enspace\etocthenumber:\quad}}{}%
         \etocname
         \baselineskip\etocbaselinespreadminustwo\baselineskip
         \par}%
   \addpenalty\@M\addvspace{\etocsepminusone}%
   \endgroup}
  {}%
%% `part':
\etoc@setstyle{@minusone}
  {\addpenalty\@M\etocskipfirstprefix}
  {\addpenalty\@secpenalty}
  {\begingroup
   \etocfontminusone
   \addvspace{\etocsepminusone}%
   \parindent \z@
   \leftskip  \etocminusoneleftmargin
   \rightskip \etocminusonerightmargin
   \parfillskip \@flushglue
   \vbox{\etocifnumbered{\etoclink{\etocpartname\enspace\etocthenumber.\quad}}{}%
         \etocname
         \baselineskip\etocbaselinespreadminusone\baselineskip
         \par}%
   \addpenalty\@M\addvspace{\etocsepzero}%
   \endgroup}
  {}%
%% `chapter':
\etoc@setstyle{@zero}
  {\addpenalty\@M\etocskipfirstprefix}
  {\addpenalty\@itempenalty}
  {\begingroup
   \etocfontzero
   \addvspace{\etocsepzero}%
   \parindent \z@ \parfillskip \@flushglue
   \vbox{\etocifnumbered{\etocnumber.\enspace}{}\etocname
         \baselineskip\etocbaselinespreadzero\baselineskip
         \par}%
   \endgroup}
  {\addpenalty{-\@highpenalty}\addvspace{\etocsepminusone}}%
%% `section':
\etoc@setstyle{@one}
  {\addpenalty\@M\etocskipfirstprefix}
  {\addpenalty\@itempenalty}
  {\begingroup
   \etocfontone
   \addvspace{\etocsepone}%
   \parindent \z@ \parfillskip \z@
   \setbox\z@\vbox{\parfillskip\@flushglue
                   \etocname\par
                   \setbox\tw@\lastbox
                   \global\setbox\@ne\hbox{\unhbox\tw@\ }}%
   \dimen\z@=\wd\@ne
   \setbox\z@=\etoctoclineleaders
   \advance\dimen\z@\wd\z@
   \etocifnumbered
     {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage}}
     {\setbox\tw@\hbox{\etocabbrevpagename\etocpage}}%
   \advance\dimen\z@\wd\tw@
   \ifdim\dimen\z@ < \linewidth
       \vbox{\etocname~%
             \leaders\box\z@\hfil\box\tw@
             \baselineskip\etocbaselinespreadone\baselineskip
             \par}%
   \else
       \vbox{\etocname~%
             \leaders\copy\z@\hfil\break
             \hbox{}\leaders\box\z@\hfil\box\tw@
             \baselineskip\etocbaselinespreadone\baselineskip
             \par}%
   \fi
   \endgroup}
  {\addpenalty\@secpenalty\addvspace{\etocsepzero}}%
%% `subsection':
\etoc@setstyle{@two}
  {\addpenalty\@medpenalty\etocskipfirstprefix}
  {\addpenalty\@itempenalty}
  {\begingroup
   \etocfonttwo
   \addvspace{\etocseptwo}%
   \parindent \z@ \parfillskip \z@
   \setbox\z@\vbox{\parfillskip\@flushglue
                   \etocname\par\setbox\tw@\lastbox
                   \global\setbox\@ne\hbox{\unhbox\tw@}}%
   \dimen\z@=\wd\@ne
   \setbox\z@=\etoctoclineleaders
   \advance\dimen\z@\wd\z@
   \etocifnumbered
     {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage}}
     {\setbox\tw@\hbox{\etocabbrevpagename\etocpage}}%
   \advance\dimen\z@\wd\tw@
   \ifdim\dimen\z@ < \linewidth
       \vbox{\etocname~%
             \leaders\box\z@\hfil\box\tw@
             \baselineskip\etocbaselinespreadtwo\baselineskip
             \par}%
   \else
       \vbox{\etocname~%
             \leaders\copy\z@\hfil\break
             \hbox{}\leaders\box\z@\hfil\box\tw@
             \baselineskip\etocbaselinespreadtwo\baselineskip
             \par}%
   \fi
   \endgroup}
  {\addpenalty\@secpenalty\addvspace{\etocsepone}}%
%% `subsubsection':
\etoc@setstyle{@three}
  {\addpenalty\@M
   \etocfontthree
   \vspace{\etocsepthree}%
   \noindent
   \etocskipfirstprefix}
  {\allowbreak\,--\,}
  {\etocname}
  {.\hfil
    \begingroup
     \baselineskip\etocbaselinespreadthree\baselineskip
     \par
    \endgroup
   \addpenalty{-\@highpenalty}}%
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\etoc@setstyle{@four}{}{}{}{}%
\etoc@setstyle{@five}{}{}{}{}%
}
%    \end{macrocode}
% The \csbc{etocinnertopsep} default value is too big as well as \csbc{etocbelowtocskip}
% and \csbc{etocabovetocskip}, I guess, but if I am remember correctly I chose them
% to mimick the standard TOC spacings in |article| class.
%    \begin{macrocode}
\def\etocabovetocskip{3.5ex \@plus 1ex \@minus .2ex}
\def\etocbelowtocskip{3.5ex \@plus 1ex \@minus .2ex}
\def\etoccolumnsep{2em}
\def\etocmulticolsep{0ex}
\def\etocmulticolpretolerance{-1}
\def\etocmulticoltolerance{200}
\def\etocdefaultnbcol{2}
\def\etocinnertopsep{2ex}
\newcommand\etocmulticolstyle[2][\etocdefaultnbcol]{%
\etocsettocstyle
   {\let\etocoldpar\par
    \addvspace{\etocabovetocskip}%
    \ifnum #1>\@ne
          \expandafter\@firstoftwo
    \else \expandafter\@secondoftwo
    \fi
    {\multicolpretolerance\etocmulticolpretolerance
    \multicoltolerance\etocmulticoltolerance
    \setlength{\columnsep}{\etoccolumnsep}%
    \setlength{\multicolsep}{\etocmulticolsep}%
    \begin{multicols}{#1}[#2\etocoldpar\addvspace{\etocinnertopsep}]}
    {#2\ifvmode\else\begingroup\interlinepenalty\@M\parskip\z@skip
                    \@@par\endgroup
       \fi
       \nobreak\addvspace{\etocinnertopsep}%
       \pretolerance\etocmulticolpretolerance
       \tolerance\etocmulticoltolerance}%
   }%
   {\ifnum #1>\@ne
          \expandafter\@firstofone
    \else \expandafter\@gobble
    \fi
    {\end{multicols}}%
    \addvspace{\etocbelowtocskip}}%
}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocinnerbottomsep{3.5ex}
\def\etocinnerleftsep{2em}
\def\etocinnerrightsep{2em}
\def\etoctoprule{\hrule}
\def\etocleftrule{\vrule}
\def\etocrightrule{\vrule}
\def\etocbottomrule{\hrule}
\def\etoctoprulecolorcmd{\relax}
\def\etocbottomrulecolorcmd{\relax}
\def\etocleftrulecolorcmd{\relax}
\def\etocrightrulecolorcmd{\relax}
%    \end{macrocode}
% placeholder
%    \begin{macrocode}
\def\etoc@ruledheading #1{%
   \hb@xt@\linewidth{\color@begingroup
          \hss #1\hss\hskip-\linewidth
          \etoctoprulecolorcmd\leaders\etoctoprule\hss
          \phantom{#1}%
          \leaders\etoctoprule\hss\color@endgroup}%
          \nointerlineskip\nobreak\vskip\etocinnertopsep}
\newcommand*\etocruledstyle[2][\etocdefaultnbcol]{%
\etocsettocstyle
   {\addvspace{\etocabovetocskip}%
    \ifnum #1>\@ne
          \expandafter\@firstoftwo
    \else \expandafter\@secondoftwo
    \fi
       {\multicolpretolerance\etocmulticolpretolerance
        \multicoltolerance\etocmulticoltolerance
        \setlength{\columnsep}{\etoccolumnsep}%
        \setlength{\multicolsep}{\etocmulticolsep}%
        \begin{multicols}{#1}[\etoc@ruledheading{#2}]}
       {\etoc@ruledheading{#2}%
         \pretolerance\etocmulticolpretolerance
         \tolerance\etocmulticoltolerance}}
   {\ifnum #1>\@ne\expandafter\@firstofone
         \else \expandafter\@gobble
    \fi
    {\end{multicols}}%
    \addvspace{\etocbelowtocskip}}}
%    \end{macrocode}
% placeholder
%    \begin{macrocode}
\def\etocframedmphook{\relax}
\long\def\etocbkgcolorcmd{\relax}
\long\def\Etoc@relax{\relax}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\newbox\etoc@framed@titlebox
\newbox\etoc@framed@contentsbox
\newcommand*\etocframedstyle[2][\etocdefaultnbcol]{%
\etocsettocstyle{%
    \addvspace{\etocabovetocskip}%
    \sbox\z@{#2}%
    \dimen\z@\dp\z@
    \ifdim\wd\z@<\linewidth \dp\z@\z@ \else \dimen\z@\z@ \fi
    \setbox\etoc@framed@titlebox=\hb@xt@\linewidth{\color@begingroup
        \hss
        \ifx\etocbkgcolorcmd\Etoc@relax
        \else
            \sbox\tw@{\color{white}%
            \vrule\@width\wd\z@\@height\ht\z@\@depth\dimen\z@}%
            \ifdim\wd\z@<\linewidth \dp\tw@\z@\fi
            \box\tw@
            \hskip-\wd\z@
        \fi
        \copy\z@
        \hss
        \hskip-\linewidth
        \etoctoprulecolorcmd\leaders\etoctoprule\hss
        \hskip\wd\z@
        \etoctoprulecolorcmd\leaders\etoctoprule\hss\color@endgroup}%
    \setbox\z@\hbox{\etocleftrule\etocrightrule}%
    \dimen\tw@\linewidth\advance\dimen\tw@-\wd\z@
        \advance\dimen\tw@-\etocinnerleftsep
        \advance\dimen\tw@-\etocinnerrightsep
    \setbox\etoc@framed@contentsbox=\vbox\bgroup
        \hsize\dimen\tw@
        \kern\dimen\z@
        \vskip\etocinnertopsep
        \hbox\bgroup
        \begin{minipage}{\hsize}%
        \etocframedmphook
    \ifnum #1>\@ne
          \expandafter\@firstoftwo
    \else \expandafter\@secondoftwo
    \fi
        {\multicolpretolerance\etocmulticolpretolerance
        \multicoltolerance\etocmulticoltolerance
        \setlength{\columnsep}{\etoccolumnsep}%
        \setlength{\multicolsep}{\etocmulticolsep}%
        \begin{multicols}{#1}}
        {\pretolerance\etocmulticolpretolerance
         \tolerance\etocmulticoltolerance}}
    {\ifnum #1>\@ne\expandafter\@firstofone
         \else \expandafter\@gobble
     \fi
      {\end{multicols}\unskip }%
    \end{minipage}%
    \egroup
    \vskip\etocinnerbottomsep
    \egroup
    \vbox{\hsize\linewidth
        \ifx\etocbkgcolorcmd\Etoc@relax
        \else
            \kern\ht\etoc@framed@titlebox
            \kern\dp\etoc@framed@titlebox
            \hb@xt@\linewidth{\color@begingroup
            \etocleftrulecolorcmd\etocleftrule
            \etocbkgcolorcmd
            \leaders\vrule
                   \@height\ht\etoc@framed@contentsbox
                   \@depth\dp\etoc@framed@contentsbox
            \hss
            \etocrightrulecolorcmd\etocrightrule
            \color@endgroup}\nointerlineskip
            \vskip-\dp\etoc@framed@contentsbox
            \vskip-\ht\etoc@framed@contentsbox
            \vskip-\dp\etoc@framed@titlebox
            \vskip-\ht\etoc@framed@titlebox
        \fi
    \box\etoc@framed@titlebox\nointerlineskip
    \hb@xt@\linewidth{\color@begingroup
    {\etocleftrulecolorcmd\etocleftrule}%
    \hss\box\etoc@framed@contentsbox\hss
    \etocrightrulecolorcmd\etocrightrule\color@endgroup}
    \nointerlineskip
    \vskip\ht\etoc@framed@contentsbox
    \vskip\dp\etoc@framed@contentsbox
    \hb@xt@\linewidth{\color@begingroup\etocbottomrulecolorcmd
          \leaders\etocbottomrule\hss\color@endgroup}}
    \addvspace{\etocbelowtocskip}}}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\newcommand\etoc@multicoltoc[2][\etocdefaultnbcol]{%
    \etocmulticolstyle[#1]{#2}%
    \tableofcontents}
\newcommand\etoc@multicoltoci[2][\etocdefaultnbcol]{%
    \etocmulticolstyle[#1]{#2}%
    \tableofcontents*}
\newcommand\etoc@local@multicoltoc[2][\etocdefaultnbcol]{%
    \etocmulticolstyle[#1]{#2}%
    \localtableofcontents}
\newcommand\etoc@local@multicoltoci[2][\etocdefaultnbcol]{%
    \etocmulticolstyle[#1]{#2}%
    \localtableofcontents*}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\newcommand*\etoc@ruledtoc[2][\etocdefaultnbcol]{%
    \etocruledstyle[#1]{#2}%
    \tableofcontents}
\newcommand*\etoc@ruledtoci[2][\etocdefaultnbcol]{%
    \etocruledstyle[#1]{#2}%
    \tableofcontents*}
\newcommand*\etoc@local@ruledtoc[2][\etocdefaultnbcol]{%
    \etocruledstyle[#1]{#2}%
    \localtableofcontents}
\newcommand*\etoc@local@ruledtoci[2][\etocdefaultnbcol]{%
    \etocruledstyle[#1]{#2}%
    \localtableofcontents*}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\newcommand*\etoc@framedtoc[2][\etocdefaultnbcol]{%
    \etocframedstyle[#1]{#2}%
    \tableofcontents}
\newcommand*\etoc@framedtoci[2][\etocdefaultnbcol]{%
    \etocframedstyle[#1]{#2}%
    \tableofcontents*}
\newcommand*\etoc@local@framedtoc[2][\etocdefaultnbcol]{%
    \etocframedstyle[#1]{#2}%
    \localtableofcontents}
\newcommand*\etoc@local@framedtoci[2][\etocdefaultnbcol]{%
    \etocframedstyle[#1]{#2}%
    \localtableofcontents*}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocmulticol{\begingroup
    \Etoc@mustclosegrouptrue
    \@ifstar
    {\etoc@multicoltoci}
    {\etoc@multicoltoc}}
\def\etocruled{\begingroup
    \Etoc@mustclosegrouptrue
    \@ifstar
    {\etoc@ruledtoci}
    {\etoc@ruledtoc}}
\def\etocframed{\begingroup
    \Etoc@mustclosegrouptrue
    \@ifstar
    {\etoc@framedtoci}
    {\etoc@framedtoc}}
\def\etoclocalmulticol{\begingroup
    \Etoc@mustclosegrouptrue
    \@ifstar
    {\etoc@local@multicoltoci}
    {\etoc@local@multicoltoc}}
\def\etoclocalruled{\begingroup
    \Etoc@mustclosegrouptrue
    \@ifstar
    {\etoc@local@ruledtoci}
    {\etoc@local@ruledtoc}}
\def\etoclocalframed{\begingroup
    \Etoc@mustclosegrouptrue
    \@ifstar
    {\etoc@local@framedtoci}
    {\etoc@local@framedtoc}}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocarticlestyle{%
    \etocsettocstyle
    {\section *{\contentsname
                \@mkboth {\MakeUppercase \contentsname}
                         {\MakeUppercase \contentsname}}}
    {}}
\def\etocarticlestylenomarks{%
    \etocsettocstyle
    {\section *{\contentsname}}
    {}}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocbookstyle{%
    \etocsettocstyle
    {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
     \chapter *{\contentsname
                \@mkboth {\MakeUppercase \contentsname}
                         {\MakeUppercase \contentsname}}}
    {\if@restonecol \twocolumn \fi}}
\def\etocbookstylenomarks{%
    \etocsettocstyle
    {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
     \chapter *{\contentsname}}
    {\if@restonecol \twocolumn \fi}}
\let\etocreportstyle\etocbookstyle
\let\etocreportstylenomarks\etocbookstylenomarks
%    \end{macrocode}
% |v3.7i| of memoir has moved the \csa{phantomsection} to a better location,
% before typesetting the title and we follow suit at |1.09a|, and less rashly
% at |1.09b|. Formerly \etoc used \csbc{etocaftertitlehook} to mimick the
% memoir code but as its name indicate, it is supposedly executed after the
% title... and this also had the defect of making \csbc{etocaftertitlehook} not
% anymore a user command. Thus we here use some refactoring of the
% \csbc{Etoc@aftertitlehook} internal mechanism to help recognize if we are
% in the starred case or not.
%
% \csa{phantomsection} is always defined by memoir, empty if hyperref absent.
%    \begin{macrocode}
\def\etocmemoirtoctotocfmt #1#2{%
    \def\Etoc@addsuitablecontentsline{\addcontentsline {toc}{#1}{#2}}%
}
\def\etocmemoirstyle{%
    \etocsettocstyle
        {\ensureonecol \par \begingroup \phantomsection
         \ifx\Etoc@aftertitlehook\@empty
         \else
%    \end{macrocode}
% non-starred variant
%    \begin{macrocode}
           \ifmem@em@starred@listof
           \else
             \Etoc@addsuitablecontentsline
           \fi
         \fi
         \@nameuse {@tocmaketitle} %<< space token here from memoir code
         \ifx\Etoc@aftertitlehook\@empty
          \else
%    \end{macrocode}
% Execute etoc hook before the \csa{cfttocbeforelisthook} and keep distinction
% between starred and non-starred contexts for other hooks. Notice that the
% memoir class way of implementing \csbc{tableofcontents} leaves no way for code
% executed by the TOC code to know if it is executed in starred or non-starred
% context.
%    \begin{macrocode}         
          \Etoc@aftertitlehook \let \Etoc@aftertitlehook \relax
         \fi
         \parskip \cftparskip \@nameuse {cfttocbeforelisthook}}
        {\@nameuse {cfttocafterlisthook}\endgroup\restorefromonecol}}
%    \end{macrocode}
% |1.09c| (|2020/05/15|) does an update as \ctanpkg{KOMA-script} has deprecated
% \csa{iftocfeature}.  Thanks to Bilel Omrani for report.  I did not check
% if cloning of KOMA code required some further updates.
%
% Finally |1.09f| added some such updates.
%    \begin{macrocode}
\ifdefined\Iftocfeature
  \def\etoc@Iftocfeature{\Iftocfeature}%
\else
  \def\etoc@Iftocfeature{\iftocfeature}%
\fi
\def\etocscrartclstyle{%
    \etocsettocstyle
        {\let\if@dynlist\if@tocleft
         \def\@currext{toc}%
%    \end{macrocode}
% |1.09f| adds this \csa{list@fname} definition hunk although
% \csa{listoftocname} is presumably always defined.  Only to match
% closely \ctanpkg{KOMA-script} code.
%    \begin{macrocode}
         \@ifundefined{listoftocname}%
            {\def\list@fname{\listofname~toc}}%
            {\expandafter\let\expandafter\list@fname\csname listoftocname\endcsname}%
         \etoc@Iftocfeature {toc}{onecolumn}
             {\etoc@Iftocfeature {toc}{leveldown}
              {}
              {\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }}
             {}%
         \etoc@Iftocfeature {toc}{numberline}{\def \nonumberline {\numberline {}}}{}%
         \expandafter\tocbasic@listhead\expandafter {\list@fname}%
         \begingroup \expandafter \expandafter \expandafter
         \endgroup \expandafter
         \ifx
             \csname microtypesetup\endcsname \relax
         \else
             \etoc@Iftocfeature {toc}{noprotrusion}{}
                 {\microtypesetup {protrusion=false}%
                  \PackageInfo {tocbasic}%
                  {character protrusion at toc deactivated}}%
         \fi
%    \end{macrocode}
% |1.09f| adds this hunk with the noparskipfalse test to match current
% scrartcl (testing done with scrbook |2022/07/04 v3.37|).
%    \begin{macrocode}
         \etoc@Iftocfeature{toc}{noparskipfake}{}{%
               \ifvmode \@tempskipa\lastskip \vskip-\lastskip
               \addtolength{\@tempskipa}{\parskip}\vskip\@tempskipa\fi
         }%
         \setlength {\parskip }{\z@ }%
         \setlength {\parindent }{\z@ }%
         \setlength {\parfillskip }{\z@ \@plus 1fil}%
         \csname tocbasic@@before@hook\endcsname
         \csname tb@toc@before@hook\endcsname}
         {%
%    \end{macrocode}
% At |1.09f| I considered adding this \csa{BeforeClosingMainAux} hunk
% to the second argument of \csbc{etocsettocstyle}-emulation of \ctanpkg{KOMA-script}.
% But:
% \begin{itemize}
% \item there seems to be no interface to \csa{tocbasic@end@toc@file},
%
% \item
%   it defaults to issuing a \csa{par}, but we want etoc to still be able
%   to produce other TOCs, possibly inline, and they should not be
%   influenced by it and I don't want at this stage to add an interface
%   to enable/disable and have to document it,
%
% \item
%   the whole thing appears to me to be ill-conceived in so far as it
%   sort of implies the \csbc{tableofcontents} is used only once, as each
%   instance will again add this \csa{tocbasic@end@toc@file} to end of
%   toc file, which may thus end up being executed multiple times.
% \end{itemize}
% So rather than putting the thing in the |.toc| file, we will execute
% it here.  This way it will not impact other TOCs typeset via etoc
% design facilities in the document.
%    \begin{macrocode}
%          \BeforeClosingMainAux
%          {\addtocontents
%            {toc}{\string\providecommand\string\tocbasic@end@toc@file{}%
%                  \string\tocbasic@end@toc@file}%
%          }%
         \providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file
         \csname tb@toc@after@hook\endcsname
         \csname tocbasic@@after@hook\endcsname}}
\let\etocscrbookstyle\etocscrartclstyle
\let\etocscrreprtstyle\etocscrartclstyle
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\etocstandarddisplaystyle{\etocarticlestyle}
\newcommand*\etocmarkboth[1]{%
    \@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}}
\newcommand*\etocmarkbothnouc[1]{\@mkboth{#1}{#1}}
\newcommand\etoctocstyle[3][section]{\etocmulticolstyle[#2]%
    {\csname #1\endcsname *{#3}}}
\newcommand\etoctocstylewithmarks[4][section]{\etocmulticolstyle[#2]%
    {\csname #1\endcsname *{#3\etocmarkboth{#4}}}}
\newcommand\etoctocstylewithmarksnouc[4][section]{\etocmulticolstyle[#2]%
    {\csname #1\endcsname *{#3\etocmarkbothnouc{#4}}}}
%    \end{macrocode}
% placeholder for comments
%    \begin{macrocode}
\def\Etoc@redefetocstyle#1{%
    \renewcommand\etoctocstylewithmarks[4][#1]
    {\etocmulticolstyle[##2]%
          {\csname ##1\endcsname *{##3\etocmarkboth{##4}}}}
    \renewcommand\etoctocstylewithmarksnouc[4][#1]
    {\etocmulticolstyle[##2]%
          {\csname ##1\endcsname *{##3\etocmarkbothnouc{##4}}}}
    \renewcommand\etoctocstyle[3][#1]{%
     \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3}}}}
\@ifclassloaded{scrartcl}
    {\renewcommand*\etocstandarddisplaystyle{\etocscrartclstyle}}{}
\@ifclassloaded{book}
    {\renewcommand*\etocfontone{\normalfont\normalsize}
     \renewcommand*\etocstandarddisplaystyle{\etocbookstyle}
     \Etoc@redefetocstyle{chapter}}{}
\@ifclassloaded{report}
    {\renewcommand*\etocfontone{\normalfont\normalsize}
     \renewcommand*\etocstandarddisplaystyle{\etocreportstyle}
     \Etoc@redefetocstyle{chapter}}{}
\@ifclassloaded{scrbook}
    {\renewcommand*\etocfontone{\normalfont\normalsize}
     \renewcommand*\etocstandarddisplaystyle{\etocscrbookstyle}
     \Etoc@redefetocstyle{chapter}}{}
\@ifclassloaded{scrreprt}
    {\renewcommand*\etocfontone{\normalfont\normalsize}
     \renewcommand*\etocstandarddisplaystyle{\etocscrreprtstyle}
     \Etoc@redefetocstyle{chapter}}{}
\@ifclassloaded{memoir}
    {\etocsetlevel{appendix}{0}%
     \renewcommand*\etocfontone{\normalfont\normalsize}
     \etocmemoirtoctotocfmt{chapter}{\contentsname}%
     \renewcommand*\etocstandarddisplaystyle{\etocmemoirstyle}
     \Etoc@redefetocstyle{chapter}}{}
\def\etoctocloftstyle {%
    \etocsettocstyle
    {\@cfttocstart\par\begingroup
      \parindent\z@ \parskip\cftparskip \@cftmaketoctitle
      \if@cfttocbibind\@cftdobibtoc\fi }%
    {\endgroup\@cfttocfinish }%
}
\@ifclassloaded{memoir}{}
{\@ifpackageloaded{tocloft}
    {\if@cftnctoc\else
     \renewcommand*\etocstandarddisplaystyle{\etoctocloftstyle}
     \AtBeginDocument{\let\tableofcontents\etoctableofcontents}
     \fi }
    {\AtBeginDocument
      {\@ifpackageloaded{tocloft}
       {\if@cftnctoc\else
         \PackageWarningNoLine {etoc}
         {Package `tocloft' was loaded after `etoc'.\MessageBreak
          To prevent it from overwriting \protect\tableofcontents, it will\MessageBreak
          be tricked into believing to have been loaded with its\MessageBreak
          option `titles'. \space Please load `tocloft' before `etoc'}%
        \AtEndDocument{\PackageWarning{etoc}
                       {Please load `tocloft' before `etoc'!\@gobbletwo}}%
        \fi
        \@cftnctoctrue }%
       {}%
      }%
     }%
}
%    \end{macrocode}
% \LaTeX\ 2021 fall release lets \csa{contentsline} always grab four arguments,
% so with |1.09e 2021/09/23| we make sure our \csa{addtocontents} will always
% provide \csa{contentsline} with four arguments. This extra |{}| is done
% without checking LaTeX's version by laziness, as an impact on documents
% compiled with former LaTeX could be visible only with very special contexts
% that only the author himself would ever consider.
%
% Let's also add \csa{protected@file@percent} at |1.09e| although this is a
% priori of no relevance as \etoc reads the toc file with |\endlinechar=-1|
% regime.
%
% When using \csa{addcontentsline} nothing needs to be done as both things are
% handled by \LaTeX\ upstream.
%    \begin{macrocode}
\def\Etoc@addtocontents #1#2%
    {\ifEtoc@hyperref
       \addtocontents {toc}{\protect\contentsline
                {#1}{#2}%
                {\thepage }{\@currentHref }%
                \ifdefined\protected@file@percent\protected@file@percent\fi
       }%
     \else
       \addtocontents {toc}{\protect\contentsline
          {#1}{#2}{\thepage }{}%
          \ifdefined\protected@file@percent\protected@file@percent\fi
       }%
     \fi}
\def\Etoc@addcontentsline@ #1#2#3{%
    \@namedef{toclevel@#1}{#3}\addcontentsline {toc}{#1}{#2}%
}
\DeclareRobustCommand*{\etoctoccontentsline}
    {\@ifstar{\Etoc@addcontentsline@}{\Etoc@addtocontents}}
\def\Etoc@addtocontents@immediately#1#2{%
    \begingroup
       \let\Etoc@originalwrite\write
       \def\write{\immediate\Etoc@originalwrite}%
       \Etoc@addtocontents{#1}{#2}%
    \endgroup
}
\def\Etoc@addcontentsline@@immediately#1#2#3{%
    \begingroup
       \let\Etoc@originalwrite\write
       \def\write{\immediate\Etoc@originalwrite}%
       \Etoc@addcontentsline@{#1}{#2}{#3}%
    \endgoroup
}
\DeclareRobustCommand*{\etocimmediatetoccontentsline}
    {\@ifstar{\Etoc@addcontentsline@@immediately}{\Etoc@addtocontents@immediately}}
%    \end{macrocode}
% placeholder
%    \begin{macrocode}
\def\Etoc@storetocdepth   {\global\c@etoc@tocdepth\c@tocdepth }
\def\Etoc@restoretocdepth {\global\c@tocdepth\c@etoc@tocdepth }
\def\etocobeytoctocdepth {\def\etoc@settocdepth
        {\afterassignment\Etoc@@nottoodeep \global\c@tocdepth}}
\def\Etoc@@nottoodeep {\ifnum\c@tocdepth>\c@etoc@tocdepth
                          \global\c@tocdepth\c@etoc@tocdepth\fi }
\def\etocignoretoctocdepth {\let\etoc@settocdepth\@gobble }
\def\etocsettocdepth   {\futurelet\Etoc@nexttoken\Etoc@set@tocdepth }
\def\Etoc@set@tocdepth {\ifx\Etoc@nexttoken\bgroup
                            \expandafter\Etoc@set@tocdepth@
                       \else\expandafter\Etoc@set@toctocdepth
                       \fi }
\def\Etoc@set@tocdepth@ #1{\@ifundefined {Etoc@#1@@}
      {\PackageWarning{etoc}
          {Unknown sectioning unit #1, \protect\etocsettocdepth\space ignored}}
      {\global\c@tocdepth\csname Etoc@#1@@\endcsname}%
}
\def\Etoc@set@toctocdepth  #1#{\Etoc@set@toctocdepth@ }
\def\Etoc@set@toctocdepth@ #1{%
  \@ifundefined{Etoc@#1@@}%
   {\PackageWarning{etoc}
        {Unknown sectioning depth #1, \protect\etocsettocdepth.toc ignored}}%
   {\addtocontents {toc}
   {\protect\etoc@settocdepth\expandafter\protect\csname Etoc@#1@@\endcsname}}%
}
%    \end{macrocode}
% placeholder
%    \begin{macrocode}
\def\etocimmediatesettocdepth #1#{\Etoc@set@toctocdepth@immediately}
\def\Etoc@set@toctocdepth@immediately #1{%
  \@ifundefined{Etoc@#1@@}%
   {\PackageWarning{etoc}
        {Unknown sectioning depth #1, \protect\etocimmediatesettocdepth.toc ignored}}%
   {\begingroup
      \let\Etoc@originalwrite\write
      \def\write{\immediate\Etoc@originalwrite}%
      \addtocontents {toc}
      {\protect\etoc@settocdepth\expandafter\protect
       \csname Etoc@#1@@\endcsname}%
    \endgroup
   }%
}
%    \end{macrocode}
% placeholder
%    \begin{macrocode}
\def\etocdepthtag   #1#{\Etoc@depthtag }
\def\Etoc@depthtag  #1{\addtocontents {toc}{\protect\etoc@depthtag {#1}}}
%    \end{macrocode}
% |1.09f| adds \csbc{etocimmediatedepthtag.toc}.  This can serve in some
% circumstances, see user documentation.  Apologies for long delay to Norman
% Ramsey who reported problem and his fix in July... 2016!
%    \begin{macrocode}
\def\etocimmediatedepthtag   #1#{\Etoc@depthtag@immediately }
\def\Etoc@depthtag@immediately #1{%
  \begingroup
    \let\Etoc@originalwrite\write
    \def\write{\immediate\Etoc@originalwrite}%
    \addtocontents {toc}{\protect\etoc@depthtag {#1}}%
  \endgroup
}
\def\etocignoredepthtags {\let\etoc@depthtag \@gobble }
\def\etocobeydepthtags   {\let\etoc@depthtag \Etoc@depthtag@ }
\def\Etoc@depthtag@ #1{\@ifundefined{Etoc@depthof@#1}%
       {}% ignore in silence if tag has no associated depth
       {\afterassignment\Etoc@@nottoodeep
                 \global\c@tocdepth\csname Etoc@depthof@#1\endcsname}%
}
\def\etocsettagdepth #1#2{\@ifundefined{Etoc@#2@@}%
       {\PackageWarning{etoc}
         {Unknown sectioning depth #2, \protect\etocsettagdepth\space ignored}}%
       {\@namedef{Etoc@depthof@#1}{\@nameuse{Etoc@#2@@}}}%
}
%    \end{macrocode}
% We must cancel all \ctanpkg{tocvsec2} toc-related actions. But a check must be done
% for the memoir class, as its \ctanpkg{tocvsec2} emulation does not have the
% incompatible things etoc needs to revert.
%    \begin{macrocode}
\def\Etoc@tocvsec@err #1{\PackageError {etoc}
        {The command \protect#1\space is incompatible with `etoc'}
        {Use \protect\etocsettocdepth.toc as replacement}%
}%
\AtBeginDocument {%
   \@ifclassloaded{memoir}
    {\PackageInfo {etoc}
     {Regarding `memoir' class command \protect\settocdepth, consider\MessageBreak
     \protect\etocsettocdepth.toc as a drop-in replacement with more\MessageBreak
     capabilities (see `etoc' manual). \space
     Also, \protect\etocsettocdepth\MessageBreak
     and \protect\etocsetnexttocdepth\space should be used in place of\MessageBreak
     `memoir' command \protect\maxtocdepth\@gobble}%
    }%
    {\@ifpackageloaded {tocvsec2}
     {\def\maxtocdepth  #1{\Etoc@tocvsec@err \maxtocdepth   }%
      \def\settocdepth  #1{\Etoc@tocvsec@err \settocdepth   }%
      \def\resettocdepth  {\@ifstar {\Etoc@tocvsec@err \resettocdepth }%
                                    {\Etoc@tocvsec@err \resettocdepth }%
                          }%
%    \end{macrocode}
% If \etoc is added to a \LaTeX{} document using already \ctanpkg{tocvsec2}.
%    \begin{macrocode}
      \def\save@tocdepth #1#2#3{}%
      \let\reset@tocdepth\relax
      \let\remax@tocdepth\relax
      \let\tableofcontents\etoctableofcontents
      \PackageWarningNoLine {etoc}
      {Package `tocvsec2' detected and its modification of\MessageBreak
       \protect\tableofcontents\space reverted. \space Use
       \protect\etocsettocdepth.toc\MessageBreak as a replacement
       for `tocvsec2' toc-related commands}}% tocvsec2 loaded
     {}% not loaded
   }%
}%
%    \end{macrocode}
% placeholder
%    \begin{macrocode}
\def\invisibletableofcontents {\etocsetnexttocdepth {-3}\tableofcontents }%
\def\invisiblelocaltableofcontents
                         {\etocsetnexttocdepth {-3}\localtableofcontents }%
\def\etocsetnexttocdepth #1{%
    \@ifundefined{Etoc@#1@@}
     {\PackageWarning{etoc}
       {Unknown sectioning unit #1, \protect\etocsetnextocdepth\space ignored}}
     {\Etoc@setnexttocdepth{\csname Etoc@#1@@\endcsname}}%
}%
\def\Etoc@setnexttocdepth#1{%
    \def\Etoc@tocdepthset{%
        \Etoc@tocdepthreset
        \edef\Etoc@tocdepthreset {%
               \global\c@tocdepth\the\c@tocdepth\space
               \global\let\noexpand\Etoc@tocdepthreset\noexpand\@empty
         }%
        \global\c@tocdepth#1%
        \global\let\Etoc@tocdepthset\@empty
    }%
}%
\let\Etoc@tocdepthreset\@empty
\let\Etoc@tocdepthset  \@empty
\def\etocsetlocaltop #1#{\Etoc@set@localtop}%
\def\Etoc@set@localtop #1{%
  \@ifundefined{Etoc@#1@@}%
   {\PackageWarning{etoc}
        {Unknown sectioning depth #1, \protect\etocsetlocaltop.toc ignored}}%
   {\addtocontents {toc}
   {\protect\etoc@setlocaltop\expandafter\protect\csname Etoc@#1@@\endcsname}}%
}%
%    \end{macrocode}
% placeholder
%    \begin{macrocode}
\def\etocimmediatesetlocaltop #1#{\Etoc@set@localtop@immediately}%
\def\Etoc@set@localtop@immediately #1{%
  \@ifundefined{Etoc@#1@@}%
   {\PackageWarning{etoc}
        {Unknown sectioning depth #1, \protect\etocimmediatesetlocaltop.toc ignored}}%
   {\begingroup
       \let\Etoc@originalwrite\write
       \def\write{\immediate\Etoc@originalwrite}%
       \addtocontents {toc}
           {\protect\etoc@setlocaltop\expandafter\protect
                                     \csname Etoc@#1@@\endcsname}%
    \endgroup
   }%
}%
%    \end{macrocode}
% |1.09i| would like to rename this to \csa{Etoc@setlocaltop}, for
% consistency with internal macros, but too late it is already in user |.toc| files.
%    \begin{macrocode}
\def\etoc@setlocaltop #1{%
  \global\let\Etoc@level #1%
  \Etoc@skipthisonefalse
  \ifnum\Etoc@level=\Etoc@@six@@
   \Etoc@skipthisonetrue
  \else
   \ifEtoc@localtoc
    \ifEtoc@stoptoc\Etoc@skipthisonetrue
    \else
     \ifEtoc@notactive
      \Etoc@setflags
      \Etoc@skipthisonetrue
     \else
%    \end{macrocode}
% Attention, |1.09| has \csbc{etoclocaltop} which is former \csa{Etoc@localtop}
% \emph{minus one}. Hence the shape of the conditional. Memo: it makes sense
% only for code executed under "active" status of the TOC.
%    \begin{macrocode}
      \unless\ifnum\Etoc@level>\etoclocaltop
       \Etoc@skipthisonetrue
       \global\Etoc@stoptoctrue
      \fi
     \fi
    \fi
   \fi
  \fi
  \let\Etoc@next\@empty
  \ifEtoc@skipthisone
  \else
   \ifnum\c@tocdepth<\Etoc@level
   \else
    \ifEtoc@standard
    \else
     \let\Etoc@next\Etoc@setlocaltop@doends@dobegins
    \fi
   \fi
  \fi
%    \end{macrocode}
% At |1.09f| the |\global\Etoc@skipprefixfalse| is added.  This fixes a
% weird problem that an \csbc{etocskipfirstprefix} from this level (which a priori
% only serves to delimit the local contents) impacted (in the global TOC for
% example) the rendering of the first finer subsequent heading.  Not resetting
% the boolean was an oversight, and it shows in context of the package
% built-in level styles as they do use \csbc{etocskipfirstprefix}.  But this also
% stresses that the name of the macro is a bit of a misnomer, yes it serves to
% delimit local table of contents, but really it is implemented as a ghost of
% a sectioning unit which does have an impact (on the global TOC or local TOCs
% from encompassing levels), as it triggers when encountered the \marg{finish}
% portions of previous finer levels (and the \marg{finish} code of its own
% level will be executed sooner or later), and the \marg{start} code of
% subsequent finer levels (as well as its own \marg{start} code at least once,
% depending on how levels are nested).
%
% |1.09i| fixes a bad behaviour of \etoc in \csbc{etocchecksemptiness} regime
% when \csbc{etocsetlocaltop.toc} has been made use of in the document.  Indeed
% the execution of \csbc{Etoc@toctoks} for the emptiness check thus triggered
% execution of \marg{start} and \marg{finish} parts of the line styles.  So
% we abstract an \csbc{Etoc@setlocaltop@doends@dobegins} which will be made a no-op
% in emptiness-checking contexts.  Also, the code lines above have been edited
% now that \csa{Etoc@next} here is not followed by tokens within a brace pair.
%    \begin{macrocode}
  \Etoc@next
}%
\def\Etoc@setlocaltop@doends@dobegins
   {\Etoc@doends\Etoc@dobegins\global\Etoc@skipprefixfalse}%
\addtocontents {toc}{\protect\@ifundefined{etoctocstyle}%
           {\let\protect\etoc@startlocaltoc\protect\@gobble
            \let\protect\etoc@settocdepth\protect\@gobble
            \let\protect\etoc@depthtag\protect\@gobble
            \let\protect\etoc@setlocaltop\protect\@gobble}{}}%
%    \end{macrocode}
% Initializations.
%    \begin{macrocode}
\def\etocstandardlines {\Etoc@standardtrue}
\def\etoctoclines      {\Etoc@standardfalse}
\etocdefaultlines
\etocstandardlines
\etocstandarddisplaystyle
\etocobeytoctocdepth
\etocobeydepthtags
\let\etocaftertochook    \@empty
\let\etocbeforetitlehook \@empty
%    \end{macrocode}
% |listings| abuses \csa{tableofcontents} for its \csa{lstlistoflistings}. It
% doesn't seem worth to let my version of \csbc{tableofcontents} have to check for
% this special circumstance. So at |1.09d|, simply add this (and induced
% annoying updates to documentation at at least two locations):
%    \begin{macrocode}
\def\etockeeporiginaltableofcontents
   {\let\tableofcontents\etocoriginaltableofcontents}%
\endinput
%    \end{macrocode}
% \MakePercentComment
\Finale
%%
%% End of file `etoc.dtx'.
