summaryrefslogtreecommitdiff
path: root/macros/latex/contrib
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-03-03 03:05:02 +0000
committerNorbert Preining <norbert@preining.info>2023-03-03 03:05:02 +0000
commitc000ad35f0ce69cc0466ad24b0647c1e295c0259 (patch)
tree6c64b429a374b5d60b67c2f728c71acb110c775c /macros/latex/contrib
parentfe8af26a7b8f32a0cc1b761e3ffb95ed0867a845 (diff)
CTAN sync 202303030305
Diffstat (limited to 'macros/latex/contrib')
-rw-r--r--macros/latex/contrib/etoc/README.md233
-rw-r--r--macros/latex/contrib/etoc/etoc.dtx9443
-rw-r--r--macros/latex/contrib/etoc/etoc.pdfbin857380 -> 940496 bytes
-rw-r--r--macros/latex/contrib/pangram/README.md2
-rw-r--r--macros/latex/contrib/pangram/pangram.dtx97
-rw-r--r--macros/latex/contrib/pangram/pangram.ins4
-rw-r--r--macros/latex/contrib/pangram/pangram.pdfbin100389 -> 105320 bytes
-rw-r--r--macros/latex/contrib/qrbill/README.md8
-rw-r--r--macros/latex/contrib/qrbill/qrbill-qrencode.lua1351
-rw-r--r--macros/latex/contrib/qrbill/qrbill.dtx21
-rw-r--r--macros/latex/contrib/qrbill/qrbill.ins6
-rw-r--r--macros/latex/contrib/qrbill/qrbill.pdfbin86225 -> 86454 bytes
12 files changed, 6985 insertions, 4180 deletions
diff --git a/macros/latex/contrib/etoc/README.md b/macros/latex/contrib/etoc/README.md
index b452990b34..ed067af271 100644
--- a/macros/latex/contrib/etoc/README.md
+++ b/macros/latex/contrib/etoc/README.md
@@ -1,6 +1,6 @@
<!-- -->
- Source: etoc.dtx (1.1c)
+ Source: etoc.dtx (1.2)
Author: Jean-Francois Burnol
Info: Completely customisable TOCs
License: LPPL 1.3c
@@ -10,68 +10,49 @@
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.
+With `etoc` loaded, `\tableofcontents` can be used multiple times and
+an added command `\localtableofcontents` allows to typeset "local"
+tables of contents, i.e. having their scope limited to the last
+sectioning command encountered.
+
+No auxiliary file is used additionally to the standard `.toc` file.
+Release 1.2 provides experimental additions `\locallistoffigures` and
+`\locallistoftables` which also use only the `.toc` file.
+
+Such local TOCs or "Lists Of" typically need to adopt a "display
+style" (i.e. the way the title is rendered, whether it should add
+itself an entry in the `.toc` file, ...) somewhat distinct from the
+global TOC. The release 1.2 default adapts automatically the titles
+of local TOCs to their depths in the sectioning hierarchy. Should the
+need arise to customize such "display style", full control is allowed
+by package commands.
+
+Regarding how the individual "contents lines" are handled, here again
+complete control is given to the user to define from the ground-up how
+to use the *name*, *number*, and *page number* for each entry,
+according to their "levels" (i.e. part, chapter, section, subsection,
+...). As this requires some LaTeX fluency, many examples which can
+serve as starting points are attached to the PDF documentation as
+extractible files.
+
+Loading `etoc` per itself modifies nothing to "contents lines"
+rendering from the class default or changes from other packages. But
+full usage of the package allows spectacular effects such as displaying
+TOCs as trees or mind maps.
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:
+For manual installation do `etex etoc.dtx` to extract files then move
+`etoc.sty` to a place where TeX can find it.
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.
+To produce `etoc.pdf` run pdflatex on the extracted file `etoc.tex`
+sufficiently many times (`latexmk -pdf etoc` is recommended).
LICENSE
=======
@@ -97,123 +78,29 @@ 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.
+This is `1.2` of `2023/03/01`.
+
+`1.1a` up to `1.1d` were mainly about refactoring core legacy code
+dating back to the earliest versions of the package. The initial
+stimulus came from the necessity to prepare for changes to how
+hyperref and the LaTeX kernel will interact in the future.
+
+`1.2` added `\locallistoffigures` and `\locallistoftables`. One must
+pass options `lof` and `lot` to the package to activate these
+experimental features.
+
+The initial default rendering of the titles of tables of contents now
+uses the emulated document class code only for the global ones
+(`\tableofcontents`); for local ones (`localtableofcontents` and the
+new "local lists of") it uses by default a context aware title
+(such as `\subsection*` if local to a section). Thus, usage of
+`\etocsettocstyle` is now purely optional. Regarding the
+"line styles", the package has always used the unaltered rendering
+from the document class, so using the other core customization command
+`\etocsetstyle` to truly unleash the package powers has always been
+optional.
+
+Shoud they dare to go check the PDF documentations, users will
+discover that it has been completely restructured at release `1.2`, to
+the extent allowed by random permutations of topics, and that many
+commands have been added to facilitate usage of `\etocsettocstyle`.
diff --git a/macros/latex/contrib/etoc/etoc.dtx b/macros/latex/contrib/etoc/etoc.dtx
index 98ed8726ab..8dd0df588a 100644
--- a/macros/latex/contrib/etoc/etoc.dtx
+++ b/macros/latex/contrib/etoc/etoc.dtx
@@ -1,30 +1,26 @@
-% -*- 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.
+% -*- coding: utf-8; time-stamp-format: "%02d-%02m-%:y at %02H:%02M:%02S %Z" ; time-stamp-active: nil -*-
+% N.B.: this dtx file does NOT use \DocInput. It does NOT prefix the user
+% manual part with percent characters.
%<*none>
-\def\etocdtxtimestamp {Time-stamp: <20-01-2023 at 21:03:03 CET>}%
+\def\etocdtxtimestamp {Time-stamp: <01-03-2023 at 23:38:38 CET>}%
%</none>
%<*!readme>
%%
%% Package: etoc
-%% Version: 1.1c
+%% Version: 1.2
%% 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\etocpkgdate {2023/03/01}
+\def\etocdocdate {2023/03/01}
+\def\etocpkgversion {1.2}
\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.
+%% Formerly this etoc.dtx also included source for a German translation
+%% etoc-DE.pdf. But all additions since April 2015 had been only in English.
+%% Since 1.09f of 2022/08/30 etoc-DE.pdf is not produced anymore and the
+%% existing translated sections have been removed from this etoc.dtx.
% Definition of \etocLicense
% --------------------------
\begingroup
@@ -33,7 +29,7 @@
\catcode32=13\catcode`\\=12^^Brelax^^A
^^Bfirstofone{^^Bendgroup^^Bdef^^BetocLicense^^A
{% Package: etoc
-% Version: 1.1c
+% Version: 1.2
% License: LPPL 1.3c
% Copyright (C) 2012-2023 Jean-Francois Burnol <jfbu at free dot fr>
%
@@ -60,7 +56,7 @@
%<*readme>
<!-- -->
- Source: etoc.dtx (1.1c)
+ Source: etoc.dtx (1.2)
Author: Jean-Francois Burnol
Info: Completely customisable TOCs
License: LPPL 1.3c
@@ -70,68 +66,51 @@
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.
+With `etoc` loaded, `\tableofcontents` can be used multiple times and
+an added command `\localtableofcontents` allows to typeset "local"
+tables of contents, i.e. having their scope limited to the last
+sectioning command encountered.
+
+No auxiliary file is used additionally to the standard `.toc` file.
+Release 1.2 provides experimental additions `\locallistoffigures` and
+`\locallistoftables` which also use only the `.toc` file.
+
+Such local TOCs or "Lists Of" typically need to adopt a "display
+style" (i.e. the way the title is rendered, whether it should add
+itself an entry in the `.toc` file, ...) somewhat distinct from the
+global TOC. The release 1.2 default adapts automatically the titles
+of local TOCs to their depths in the sectioning hierarchy. Should the
+need arise to customize such "display style", full control is allowed
+by package commands.
+
+Regarding how the individual "contents lines" are handled, here again
+complete control is given to the user to define from the ground-up how
+to use the *name*, *number*, and *page number* for each entry,
+according to their "levels" (i.e. part, chapter, section, subsection,
+...). As this requires some LaTeX fluency, many examples which can
+serve as starting points are attached to the PDF documentation as
+extractible files.
+
+Loading `etoc` per itself modifies nothing to "contents lines"
+rendering from the class default or changes from other packages. But
+full usage of the package allows spectacular effects such as displaying
+TOCs as trees or mind maps.
+
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:
+For manual installation do `etex etoc.dtx` to extract files then move
+`etoc.sty` to a place where TeX can find it.
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.
+To produce `etoc.pdf` run pdflatex on the extracted file `etoc.tex`
+sufficiently many times (`latexmk -pdf etoc` is recommended).
+
LICENSE
=======
@@ -154,141 +133,48 @@ 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.
+This is `1.2` of `2023/03/01`.
+
+`1.1a` up to `1.1d` were mainly about refactoring core legacy code
+dating back to the earliest versions of the package. The initial
+stimulus came from the necessity to prepare for changes to how
+hyperref and the LaTeX kernel will interact in the future.
+
+`1.2` added `\locallistoffigures` and `\locallistoftables`. One must
+pass options `lof` and `lot` to the package to activate these
+experimental features.
+
+The initial default rendering of the titles of tables of contents now
+uses the emulated document class code only for the global ones
+(`\tableofcontents`); for local ones (`localtableofcontents` and the
+new "local lists of") it uses by default a context aware title
+(such as `\subsection*` if local to a section). Thus, usage of
+`\etocsettocstyle` is now purely optional. Regarding the
+"line styles", the package has always used the unaltered rendering
+from the document class, so using the other core customization command
+`\etocsetstyle` to truly unleash the package powers has always been
+optional.
+
+Shoud they dare to go check the PDF documentations, users will
+discover that it has been completely restructured at release `1.2`, to
+the extent allowed by random permutations of topics, and that many
+commands have been added to facilitate usage of `\etocsettocstyle`.
%</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.
+%% (or sufficiently many times pdflatex etoc.tex)
+%% For customizations see comments and classe options below.
+\tracinglostchars3
\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}
+\PassOptionsToClass {a4paper,fontsize=10pt,twoside}{scrartcl}
\PassOptionsToPackage {ngerman,english}{babel}
\input etoc.dtx
%%% Local Variables:
@@ -311,7 +197,7 @@ mechanism.
\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}%
+ \PassOptionsToClass {a4paper,fontsize=10pt,twoside}{scrartcl}%
\PassOptionsToPackage {ngerman,english}{babel}%
\else % latex run is on etoc.tex
\chardef\extractfiles 2 % do not extract files, only typeset
@@ -329,8 +215,8 @@ mechanism.
\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{* To produce the documentation with source code included execute^^J}%
+\Msg{* latexmk -pdf etoc.tex^^J}%
\Msg{*^^J}%
\Msg{* Happy TeXing!^^J}%
\Msg{*^^J}%
@@ -362,7 +248,7 @@ mechanism.
\ifdefined\MessageDeFin\AtEndDocument{\MessageDeFin}\fi
%-------------------------------------------------------------------------------
% START OF USER MANUAL TEX SOURCE
-\documentclass[abstract]{scrartcl}
+\documentclass{scrartcl}
\makeatletter
%%% START OF CUSTOM doc.sty LOADING (May 21, 2022 in xint.dtx)
@@ -492,6 +378,17 @@ mechanism.
%%% copied over almost verbatim to etoc.dtx on 2022/08/26.
%%% See after \StopEventually for doc.sty hacks.
+\makeatletter
+% pour maintenir les % en début de ligne dans les blocs verbatim
+ \let\original@check@percent\check@percent
+ \let\check@percent\relax
+\makeatother
+
+
+% We got sensible result with attachfile or attachfile2
+% only with pdflatex. So this is remnant of earlier
+% times when etoc.pdf was produced via latex+dvipdfmx
+
\usepackage{ifpdf}
\ifpdf\chardef\Withdvipdfmx 0 \fi
@@ -512,19 +409,20 @@ mechanism.
\makeatother
\usepackage[T1]{fontenc}
-\usepackage[utf8]{inputenc}
\usepackage[hscale=0.66,vscale=0.75]{geometry}
+
+% Some problems with headers
\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.
+\makeatletter
\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 ??
@@ -561,23 +459,13 @@ mechanism.
% 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}
+%\def\MacroFont{\ttfamily\small\hyphenchar\font45 \baselineskip11pt\relax}
+% Je supprime le small finalement 2023/02/28 mais passe en 10pt
+\def\MacroFont{\ttfamily\hyphenchar\font45\relax\setstretch{1}}
%----
@@ -635,15 +523,15 @@ mechanism.
\def\makestarlowast {\catcode`\*\active\let~\lowast}}%
\makeatother
%
-\usepackage{txfonts}
-
-
-% -start- font adjustment 2013
-
+%%%% FONT CONFIGURATION
+\usepackage{txfonts}
+% (2013) rescale the monospace font to 92% and allow hyphenation
+% (2023) fix the missing rescaling of bold series of txttt
\DeclareFontFamily{T1}{txtt}{\hyphenchar\font 45\relax}
+%\DeclareFontFamily{T1}{txtt}{\hyphenchar\font -1\relax}
\DeclareFontShape{T1}{txtt}{m}{n}{ %medium
<->s*[.96] t1xtt%
}{}
@@ -659,7 +547,7 @@ mechanism.
\DeclareFontShape{T1}{txtt}{m}{ui}{ %unslanted italic
<->ssub * txtt/m/sl%
}{}
-% ---- /added scale factor 2023
+% ---- /added here missing scale factor 2023
\DeclareFontShape{T1}{txtt}{bx}{n}{ %bold extended
<->s*[.96] t1xbtt%
}{}
@@ -670,7 +558,7 @@ mechanism.
\DeclareFontShape{T1}{txtt}{bx}{sl}{ %bold extended slanted
<->s*[.96] t1xbttsl%
}{}
-% ---- /end of 2023 change
+% ---- /end of 2023 fix
\DeclareFontShape{T1}{txtt}{bx}{it}{ %bold extended italic
<->ssub * txtt/bx/sl%
}{}
@@ -692,8 +580,8 @@ mechanism.
\DeclareFontShape{T1}{txtt}{b}{ui}{ %bold unslanted italic
<->ssub * txtt/bx/ui%
}{}
-% -end- font adjustment 2013
-% -start- font adjustment 2023
+
+% (2023) also rescale the txss sans serif (Helvetica)
\DeclareFontFamily{T1}{txss}{}
\DeclareFontShape{T1}{txss}{m}{n}{ %medium
<->s * [0.89]t1xss%
@@ -740,7 +628,16 @@ mechanism.
\DeclareFontShape{T1}{txss}{b}{ui}{ %bold unslanted italic
<->ssub * txss/bx/ui%
}{}
-% -end- font adjustment 2023
+%
+
+
+% Use the Bitter typeface for the romanfamily
+\usepackage[scale=0.87]{bitter}
+
+\AddToHook{begin/document/after}{%
+ \renewcommand{\familydefault}{\sfdefault}%
+ \rmfamily
+}
\usepackage{xspace}
% added svgnames 2022/08/26 on occasion of transfer from xint colouring scheme
@@ -754,22 +651,44 @@ mechanism.
\definecolor{JOLI}{RGB}{225,95,0}
\definecolor{BLUE}{RGB}{0,0,255}
\colorlet{niceone}{green!35!blue!75}
+\colorlet{optioncolor}{Maroon}
+
+% These 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}
\usepackage {babel} % ngerman and english options have been passed to babel
-\AtBeginDocument {
+\AtBeginDocument {%
+% this may be obsolete as I don't use scrdoc or ltxdoc classes anymore
\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]
+% switched from tikz-qtree to forest 2013/09/09
+% No problem with hyperlinks then, contrarily to tikz-qtree.
% 12 mars 2015, pour 1.08a, see http://tex.stackexchange.com/a/232584/4686
\usetikzlibrary{mindmap}
+% Vendredi 13 mars 2015 à 18:10:40
+% POUR LA TOC DE TITLE PAGE
+\usepackage{eso-pic}
+\usepackage{picture}
+\usepackage{ragged2e}
+% setspace usage added February 2023... (to accompany change of document font)
+% It must be loaded before hyperref
+\usepackage{setspace}
\usepackage{hyperref}% I had used [pdfencoding=pdfdoc] until 1.09f
\hypersetup{%
@@ -787,14 +706,145 @@ 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
+% Vendredi 16 septembre 2016
+% pour rendre accessibles les exemples
+% Fait package filecontentsdef le Samedi 17.
+\usepackage{filecontentsdef}
+
+%\ifnum\Withdvipdfmx=1
+%% Attempts to use attachfile2 for latex+dvipdfmx fail:
+%%
+%% - 2016: (I did not record which version of attachfile2 was used)
+%% (this \the\value comment presumably refers to how I was using
+%% \attachfile at that time)
+%%
+%% 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).
+%%
+%% - 2023 (January, 1.2, with 2019/11/26 v2.11):
+%%
+%% I had to comment-out the mimetype, created and modified key settings.
+%% Then latex run passed but dvipdfmx complained with a dozen of
+%% dvipdfmx:warning: Object @atfi_obj_67 used, but not defined. Replaced by null.
+%% The Adobe Reader (same as in 2016...) Attachment panel lists a dozen of
+%% Inconnu in section 39
+%% lines clearly matching the dvipdfmx warnings.
+%%
+%% The panel of Comments does display the list. From there or from the
+%% Attachment panels one can recover the snippets. The «etocsnippet» name
+%% is displayed in a strange greyed-out rendering, and one has to guess that
+%% CTRL-click gives access to the file. (not different from pdflatex route)
+%%
+%% I also tried with attachfile2.dtx from github at commit 660cea7 of May
+%% 19, 2022, and the same problem with the Attachment panel was there. Only
+%% difference I saw with attachfile2 from TL2022 was the ordering in the
+%% Attachment panel (with TL2022 attachfile2, the «Inconnu» lines were all
+%% grouped together).
+%%
+%% So I can still not go via latex+dvipdfmx in 2023. But the size reduction
+%% which is motivation for dvipdfmx was modest in this renewed testing,
+%% roughly 740Kb vs 840Kb with pdflatex.
+%%
+% \usepackage[dvipdfmx]{attachfile2}
+%% MEMO: I use \widthof in Linked list of the main package commands in
+%% a \makebox, since August 30, 2022, for 1.09f release.
+%% This requires calc, which is loaded only by attachfile among
+%% used packages; and calc is not loaded by attachfile2.
+% \usepackage{calc}
+%\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,
+% These comments and next are from November 19, 2022
+% 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{%
+ \noindent Depending on the 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
+ }%
+ \stepcounter{snippet},
+ a click (or CTRL-click) on the filename in the margin may allow to extract
+ it. Or check if an ``attachments'' or ``comments'' panel is available.
+}
+% 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{colorframed}% fix color issues with framed.sty (JFB 2022)
+\colorlet{shadecolor}{gray!10}
+\usepackage{centeredline}% custom macro now in public package
+\usepackage{xinttools}% for easier construction of the doubly hyperlinked cs names
+
+\usepackage{etoc} % (loads multicol)
+% There is clearly a bug of \singlespacing to do this \vskip\baselineskip.
+% What then if one goes from double to onehalf spacing? no such adjustment
+% in \onehalfspacing? Not coherent. And caused me a lost of half an hour
+% to first spot the problem (with "inline" TOCs first), then understand
+% that it originated into the setspace.sty commands, then waste time
+% canceling the hook locally and finally do this after going into checking
+% setspace.sty.
+\def\etocbeforetitlehook{\setstretch{1}}
+
% 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.
@@ -802,52 +852,19 @@ pdfstartview=FitH,%
\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)
+% use of \the\value rather than \arabic due to paranoia in 2023.
\newcounter{visibletoc}
\renewcommand{\etocaftertitlehook}
{\stepcounter{visibletoc}%
\phantomsection
- \etoctoccontentsline{visibletoc}{\thevisibletoc}}
+ \etoctoccontentsline{visibletoc}{\the\value{visibletoc}}}
\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
@@ -901,7 +918,8 @@ pdfstartview=FitH,%
{{\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
+ \ifnum\value{mycountii}>1 \arabic{mycountii} \else no \fi
+ 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
@@ -921,38 +939,8 @@ pdfstartview=FitH,%
\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}
-
-
+%--------
+% add-ons pour les TOC comme TikZ mind map, tree ou molécules
% hyperlinks to source code... added November 20, 2022
% works in sync with macrocode hacks explained after \StopEventually
% which were added in August 2022
@@ -961,30 +949,58 @@ pdfstartview=FitH,%
% 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.
+% Modified 2023/03/20 to devote the left two-thirds to linking to the user manual.
+\makeatletter % for \on@line
\DeclareRobustCommand\csb[1]{%
- \edef\nbmoitie{\the\numexpr\xintLength{#1}/2}%
+ \edef\nbforuser{\the\numexpr2*\xintLength{#1}/3}%
\ifcsname r@#1\endcsname
- \hyperref[#1]{\ttfamily\hyphenchar\font45 \char`\\ \xintKeepUnbraced{\nbmoitie}{#1}}%
+ \hyperref[#1]{\ttfamily\hyphenchar\font45 \char`\\ \xintKeepUnbraced{\nbforuser}{#1}}%
\ifcsname r@etocmacro-#1\endcsname
- \hyperref[etocmacro-#1]{\ttfamily\hyphenchar\font45 \xintTrim{\nbmoitie}{#1}}%
+ \hyperref[etocmacro-#1]{\ttfamily\hyphenchar\font45 \xintTrim{\nbforuser}{#1}}%
\else
% for .toc suffixed macros
\ifcsname r@etocmacro-\xintTrimUnbraced{-4}{#1}\endcsname
\hyperref[etocmacro-\xintTrimUnbraced{-4}{#1}]{\ttfamily\hyphenchar\font45
- \xintTrim{\nbmoitie}{#1}}%
+ \xintTrim{\nbforuser}{#1}}%
\else
- \hyperref[#1]{\ttfamily\hyphenchar\font45 \xintTrim{\nbmoitie}{#1}}%
+% 2023/02/27 also catch non existing destinations in source code
+ {\fboxsep-\fboxrule\color{Orchid}%
+ \fbox{\ttfamily\hyphenchar\font45 \xintTrim{\nbforuser}{#1}#1}%
+ }%
+ \ifcsname r@etocname\endcsname
+ \expanded{\noexpand\AtEndDocument
+ {\noexpand\PackageError{etoc}{Pas de référence dans
+ le code à #1\on@line}%
+ {Corriger!}
+ }%
+ }%
+ \fi
+% \hyperref[#1]{\ttfamily\hyphenchar\font45 \xintTrim{\nbforuser}{#1}}%
\fi
\fi
\else
- \textcolor{red}{\ttfamily\hyphenchar\font45 \char`\\ #1}%
+% 1.1a, updated 2023/01/22 1.2
+ {\fboxsep-\fboxrule\color{Orchid}%
+ \fbox{\ttfamily\hyphenchar\font45 \char`\\ #1}%
+ }%
+% make second run of compilation raise an error if macro name has been
+% misspelled so target (in the documentation) does not exist ; but this will
+% trigger error first time the documentation is added, one has to make
+% one compilation after adding the label and before continuing doc edits
+% 2023/01/22 1.2
+ \ifcsname r@etocname\endcsname
+ \expanded{\noexpand\AtEndDocument
+ {\noexpand\PackageError{etoc}{Pas de référence à #1\on@line}%
+ {Corriger!}
+ }%
+ }%
+ \fi
\fi
}
+\makeatother
\DeclareRobustCommand\csa [1]
{{\ttfamily\hyphenchar\font45 \char`\\ #1}}
@@ -993,26 +1009,38 @@ pdfstartview=FitH,%
\newcommand\csbhyp[1]{\texorpdfstring{\csa{#1}}{\textbackslash #1}}
-\DeclareRobustCommand\ctanpkg[1]
- {\texorpdfstring{\href{https://ctan.org/pkg/#1}{#1}}{#1}}
-
+\newcommand\etoc{%
+ \texorpdfstring{{\color{joli}\ttfamily\bfseries etoc}}{etoc}\xspace}
\newcommand\toc{\csb{tableofcontents}\xspace}
\newcommand\localtoc{\csb{localtableofcontents}\xspace}
+\newcommand\invisiblelocaltoc{\csb{invisiblelocaltableofcontents}\xspace}
\newcommand\localtocwrdp{\csb{localtableofcontentswithrelativedepth}\xspace}
\newcommand\lowast{\raisebox{-.25\height}{*}}
\newcommand\starit[1]{\csa{#1\lowast}}
\newcommand\staritb[1]{\csb{#1}\lowast}
+% 2023/01/23, mais pas la peine de s'embêter avec robust et texorpdfstring
+\newcommand\etocrelease[1]{\hyperlink{v#1}{\texttt{#1}}}
+
+\DeclareRobustCommand\ctanpkg[1]
+ {\texorpdfstring{\href{https://ctan.org/pkg/#1}{#1}}{#1}}
+
+
\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-local-list-of-ta-bles-hook
+etoc-local-list-of-fig-ures-hook
+local-list-of-fig-ures
+local-list-of-ta-bles
+%
+toc-depth
+sec-num-depth
+con-tents-line
+%
+etoc-stan-dard-lines
etoc-de-fault-lines
etoc-toc-lines
etoc-set-style
@@ -1070,9 +1098,7 @@ 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
@@ -1125,148 +1151,93 @@ 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
+%
+next-toc-with-tags
}
-\hyphenation{next-toc-with-tags}
-% removed, 2022/08/26
-% \frenchspacing
-
-\renewcommand\familydefault\sfdefault
+% no more \frenchspacing since 2022/08/26
% 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}
+% Usage of microtype added for 1.2 release; now that for some time
+% due to the business of attachfile I am tied with pdflatex.
+\ifnum\Withdvipdfmx=1
+\else
+% should I check for xetex/luatex ?
+\usepackage{microtype}
+\fi
-%\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
- }%
+\def\etocoption#1{{\color{optioncolor}\bfseries\texttt{#1}}}
-\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.
+\begin{document}
+\marginparsep 6bp
+\thispagestyle{empty}
-% 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).
+\bookmark[named=FirstPage,level=1]{Title page}
+% depth tags for title page toc
+\etocsettagdepth {preamble} {part}
+\etocsettagdepth {overview} {section}
+\etocsettagdepth {styling} {section}
+\etocsettagdepth {control} {section}
+\etocsettagdepth {examples} {section}
+\etocsettagdepth {advanced} {section}
+\etocsettagdepth {etocandworld}{part}
+\etocsettagdepth {code} {section}
-% In Acrobat the description field gives rise to some "tooltip"
-% display on hover, which displays the description field.
+% pour les TOC à la TikZ
+\newtoks\treetok
+\newtoks\parttok
+\newtoks\sectiontok
+\newtoks\subsectiontok
+\newtoks\subsubsectiontok
+\newtoks\tmptok
-\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}
+\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
+ #1\expandafter\expandafter\expandafter{\expandafter\the\expandafter #1#2}}
-\usepackage{ragged2e}
-\begin{document}%\normalmarginpar\layout %marginparwidth is 96pt
-\marginparsep 6bp
-\rmfamily
-\thispagestyle{empty}
+% 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 }%
+}
-% START ENGLISH VERSION
-\bookmark[named=FirstPage,level=1]{Title page}
-\begingroup
+% TOC MIND MAP ON TITLE PAGE
\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.
+
+% copied originally from http://tex.stackexchange.com/a/232914
+%
+
+% \newcount\tikzdeltaofcurrentgrandchild % not needed at 1.2
+
+% 1.2 causes quite a few adjustments as the parts have been modified, there
+% are now only 8 of them, and it is not same number of sections too.
+% As I don't read TikZ well, I had some trouble, but I take this opportunity
+% to clean up some complications from recent layouts which handled some
+% sections to lie on circular arcs, as exception to the general rectangular
+% rule. This was because not everything could fit, but I could find
+% satisfactorily layout this time, simply inhibiting via depth tags a few
+% sections.
+
\def\tikzmycustomgrowth {%
\pgftransformreset
\ifnum\tikztreelevel=1
- \pgftransformrotate{-65.4545+((\pgfkeysvalueof{/tikz/sibling angle})*(1+\tikznumberofcurrentchild)}%
+ \pgftransformrotate{(\pgfkeysvalueof{/tikz/sibling angle})
+ *
+ (\tikznumberofcurrentchild-2)}%
\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)}%
+ \pgfmathsetmacro\tikzoffsetofcurrentchild{%
+ (\tikzsiblingdistance)*(\tikznumberofcurrentgrandchild)
+ }%
\ifdim\tikzoffsetofcurrentchild pt<\tikzlevelheight
\pgftransformxshift{\tikzlevelwidth/2}
\pgftransformyshift{-\tikzlevelheight/2+\tikzoffsetofcurrentchild}
@@ -1288,38 +1259,17 @@ etoc-im-me-di-ate-set-local-top
\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
+ \pgftransformrotate {\pgfkeysvalueof{/tikz/sibling angle}
+ *
+ \tikznumberofcurrentgrandchild}%
\global\advance\tikznumberofcurrentgrandchild by1
\fi
}
-%version circulaire utilisée avec les versions 1.08a--1.09e du manuel.
+% % % version circulaire utilisée avec les versions 1.08a--1.09e du manuel.
% \def\tikzmycustomgrowth {%
% \pgftransformreset
% \ifnum\tikztreelevel=1
@@ -1336,18 +1286,15 @@ etoc-im-me-di-ate-set-local-top
% 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
+ \or \appendpart\treetok\parttok {Dandelion!50}% first (was teal!60 until 1.09f)
+ \or \appendpart\treetok\parttok {teal!40}% second (was yellow!80 until 1.2)
+ \else\appendpart\treetok\parttok {green!40}% third
\fi
}
{\stepcounter{partco}%
@@ -1355,11 +1302,12 @@ etoc-im-me-di-ate-set-local-top
{\noexpand\textbf{\etocifnumbered{\unexpanded\expandafter{\etocthelinkednumber}.}{}
\unexpanded\expandafter{\etocthelinkedname}}}}%
\parttok\expandafter{\treenode}}
- {% 1.09f prepends...
+ {% 1.09f used \prependpart for the last... reverted at 1.2,
+ % better to append, avoids overlaps by rays of some balls
\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
+ \or \appendpart\treetok\parttok {Dandelion!50}% first
+ \or \appendpart\treetok\parttok {teal!40}% second
+ \else\appendpart\treetok\parttok {green!40}% third
\fi
}
@@ -1367,78 +1315,74 @@ etoc-im-me-di-ate-set-local-top
{}
{}
{% define the section node
- \edef\childnode{child {node
- {\noexpand\itshape\noexpand\bfseries
+ \edef\childnode{child {node
+% The Bitter font does not have bold italic
+% Adding \baselineskip setting, and \endgraf to activate because \par causes
+% ! Paragraph ended before \tikz@collect@child@code was complete.
+% There must be some way to configure the TikZ node but I don't have
+% the time to go into its documentation.
+ {\baselineskip10pt\noexpand\itshape%\noexpand\bfseries
\unexpanded\expandafter{\etocthelinkedname}\hfil\break
- p. \unexpanded\expandafter{\etocthelinkedpage}}}
- }%
+ p. \unexpanded\expandafter{\etocthelinkedpage}\noexpand\endgraf
+ }%
+ }%
+ }%
\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
+% 1.09f used a prepend for last part so we needed to delay
+% the insertion of the root node to after the treetok had
+% been finished.
+% 1.2 uses append always so we can initialize here
+\treetok{\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;}%
- }
+ {\normalsize
+ Package version:\par \hyperref[changelog]{\etocpkgversion{} (\etocpkgdate )}\par}}%
+ }
-% 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}
+\etocsettocstyle
+ {\setcounter{partco}{0}}
+ {\global\treetok\expandafter{\the\treetok;}}
+
+\etocsetnexttocdepth{section}
% fill in the \treetok
-\etocinline\tableofcontents\label{toc:mindmaptitlepage}
+\etocinline
+\tableofcontents\label{toc:mindmaptitlepage}
+% For debugging
+% \newwrite\TOCasTree
% \immediate\openout\TOCasTree=\jobname.toctree
% \immediate\write\TOCasTree{\the\treetok}%
-
+% \immediate\closeout\TOCasTree
\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
+ % ajout pour versions depuis 1.08g
level width/.store in=\tikzlevelwidth,
- level height/.store in=\tikzlevelheight
+ level height/.store in=\tikzlevelheight,
}%
-
-\global
-\setbox\TitlePageMindmapTOC\hbox {%
-\resizebox{\dimexpr\paperwidth-1cm\relax}!{%
+\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
+ % 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,
+% trying cyan I get some surprising brutal color change
+% much more visible than with orange
+ concept color=yellow!50,% orange!60 until 1.2
% 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
+ sibling angle=360/8},% 8 parties
% 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},%
@@ -1447,12 +1391,11 @@ etoc-im-me-di-ate-set-local-top
% 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
+ sibling distance=2.12cm,% à ajuster manuellement
+ % 1.09f pour essayer certaines parties en
+ % circulaire; plus besoin pout 1.2
+ % level distance=10cm,% distance depuis le centre !
+ % sibling angle=12,% à ajuster manuellement
},
level 2 concept/.append style={text width=2cm},
]
@@ -1460,256 +1403,426 @@ etoc-im-me-di-ate-set-local-top
\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}}}
+% trigger first page
+\noindent\null\par\vskip-5cm\hbox{\hypertarget{FRONTPAGE}{}}\vskip5cm
-\clearpage
+% % for standard TOC
+% \etocstandardlines
+% \etocclasstocstyle
+% \tableofcontents
+
+% reset toc global to class default and line styles to etoc default
+\etocdefaultlines
+\etocclasstocstyle
+\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.
+% made invisible at 1.2
+\invisibletableofcontents \label{toc:main}
- In some PDF viewers side panels may provide a convenient clickable list of
- all these \textbf{attachments annotations}.
+\part*{\etoc}
+\addcontentsline{toc}{part}{\etoc (read this first)}
+
+\onehalfspacing
+
+\begin{shaded}\small
+ Since \etocrelease{1.08h} (2016/09/25), 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 \textit{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. In some PDF viewers side panels
+ may provide a convenient clickable list of all these \textit{attachments
+ annotations}.
+ % https://helpx.adobe.com/acrobat/using/comments.html
+
+ \medskip
+
+ Since \etocrelease{1.09h} (2022/11/20), the command names throughout
+ the user documentation which are displayed
+ {\textcolor{RoyalBlue}{with this colour}} are doubly hyperlinked:
+ their left parts hyperlink to the user documentation, their right
+ parts hyperlink 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 As of \etocrelease{1.2} (2023/03/01), the left
+ \emph{two-third} of the command name hyperlinks to its user documentation,
+ not only the left \emph{half}, as landing by accident in the midst
+ of the source code is not recommended for the general public, so the
+ dangerous area was made smaller.
+\end{shaded}
+
+
+\section*{Abstract}
+
+%\renewcommand\abstractname{}
+
+%\begin{abstract}
+\begingroup
+\leftskip1cm
+\rightskip1cm
+
+With \etoc loaded, \csb{tableofcontents} can be used multiple times and
+an added command \csb{localtableofcontents} allows to typeset ``local''
+tables of contents, i.e. having their scope limited to the last
+sectioning command encountered.
+
+No auxiliary file is used additionally to the standard \texttt{.toc}
+file. Release \etocrelease{1.2} provides experimental additions
+\csb{locallistoffigures} and \csb{locallistoftables} which also use
+only the \texttt{.toc} file.
+
+Such local TOCs or ``Lists Of'' typically need to adopt a ``display
+style'' (i.e. the way the title is rendered, whether it should add
+itself an entry in the \texttt{.toc} file, ...) somewhat distinct from
+the global TOC. The release \etocrelease{1.2} default adapts
+automatically the titles of local TOCs to their depths in the
+sectioning hierarchy. Should the need arise to customize such
+``display style'', full control is allowed by package commands.
+
+Regarding how the individual ``contents lines'' are handled, here again
+complete control is given to the user to define from the ground-up how
+to use the \emph{name}, \emph{number}, and \emph{page number} for each
+entry, according to their ``levels'' (i.e. part, chapter, section,
+subsection, ...). As this requires some \LaTeX{} fluency, many examples
+which can serve as starting points are attached to the PDF
+documentation as extractible files.
+
+Loading \etoc per itself modifies nothing to ``contents lines''
+rendering from the class default or changes from other packages. But
+full usage of the package allows spectacular effects such as displaying
+TOCs as trees or mind maps.
+
+%\end{abstract}
\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}
+\clearpage
-%\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
+\setstretch{1}
+
+\section*{License}
+\addcontentsline{toc}{section}{License}
\begingroup
- \etocsetlevel{subsection}{3}
- \etocsetlevel{subsubsection}{6}
- \tableofcontents \label{toc:main}
-\endgroup
+\ttfamily
+\hyphenchar\font -1
+ \parindent0pt
+ \obeyspaces\obeylines %
+\etocLicense\endgroup
-% ATTENTION Vendredi 09 septembre 2016 à 21:46:51
+\onehalfspacing
\clearpage
+\onehalfspacing
+\etocignoredepthtags
+\etocsettocdepth {subsubsection}
-% 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.
+\etocdepthtag.toc{overview}
+\part{Overview}\label{part:overview}
+
+\thispartstats
- The \toc command may be used arbitrarily many times%
+\etocdefaultlines
+\etocsettocstyle{}{}
+\localtableofcontents \label{toc:overview}
+
+\section[\csbhyp{(local)\-tableofcontents}]{The \csbhyp{tableofcontents},
+ \csbhyp{localtableofcontents} and other main package commands}
+
+\begin{description}
+\item [\csb{tableofcontents}] can be used arbitrarily many times in the
+ document,
+
+\item [\csb{localtableofcontents}] produces tables of contents which are
+ limited in scope by the nearest preceding sectioning command,%
%
-\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.}
+\footnote{After adding a \localtoc in-between existing ones, the first
+ compilation will typeset at its location a pre-existing next one; only at
+ second compilation will the contents match the location. Hence often a
+ third compilation is needed for document to stabilize. And if the ``to toc''
+ mechanism is active (see the discussion of \csb{etocsetup} option
+ \etocoption{localtoctotoc} and
+ similar options), only on second compilation is a new entry made in the
+ \texttt{.toc} file so three compilations is always a minimum. If one
+ starts compilations from a given source, and no auxiliary files, the first
+ compilation prepares the |.toc| file, the second typesets the main and local
+ TOCs, possibly changing page numbers due to added contents, and only at the
+ third compilation will things perhaps stabilize, and this third step is
+ surely needed in case of \etocoption{localtoctotoc}. \ctanpkg{latexmk} is highly
+ recommended.}
+
+
+\item [\csb{etocsettocstyle}\marg{before\_toc}\marg{after\_toc}] defines
+ (from the ground up, completely) the TOC titles, or more generally
+ everything either before or after the actual TOC contents,
+
+\item [\csb{etocsetstyle}\marg{levelname}%
+ \marg{start}\marg{prefix}\marg{contents}\marg{finish}] defines (completely,
+ from the ground up) arbitrarily the way the \csa{contentsline} entries in
+ the |.toc| file are rendered, depending on their first argument, which is a
+ `level name' such as |part|, |chapter|, |section|, |subsection|, \dots
+
+ It is possible to create new levels or re-assign the numerical level of a
+ named one via \csb{etocsetlevel}\marg{levelname}\marg{number}, thus opening
+ the way for sophisticated (ab)-uses of the data stored in the |.toc| file.
+
+\item [\csb{etocname}, \csb{etocnumber}, \csb{etocpage}] are free to use
+ arbitrarily in the \csb{etocsetstyle} \marg{prefix} and \marg{contents}
+ arguments for a given contents line level name, they stand for what will be
+ extracted by \etoc from the actual data which is stored in the |.toc| file
+ and is a bit entangled there (for the first two).
+\end{description}
+
+%% \vskip-\baselineskip\vskip0pt % sigh LaTeX spaces !
+
+Throughout this documentation ``layout'', ``display'', ``TOC style'' always are
+synonyms and refer roughly to how the TOC title is typeset. And ``line
+styles'' refer to how each individual entry in the TOC will be rendered
+according to its ``level''. Whenever ``TOC style'' is mentioned it is for the
+title related things, else the documentation will say ``line styles''.
+
+\csb{etocsetstyle} is for line styles and it requires \LaTeX{} fluency. It is
+however absolutely not required to use it: by default \etoc does not intervene
+at all into the rendering of the contents lines. For example, one can use
+packages such as \ctanpkg{tocloft} to customize these contents lines as wished.
+
+\csb{etocsettocstyle} is for styling the titles (and all things related to
+material before and after the actual TOC contents). It was originally
+conceived mainly for being used after the main document TOC (assuming it comes
+first). By default \etoc renders the main TOC as specified by the class it
+knows about. But for example in a |book|-class document, one does not want to
+use a chapter-like heading for a local TOC in a section. Hence the need for
+\csb{etocsettocstyle}. But if used in the preamble it will apply to the main
+TOC too (if it comes first in the document body), hence its usage has to be
+delayed or stored into some command, else one has to insert branches in the
+original definition to query the kind of TOC it is applied to.
+
+With \etocrelease{1.2} some utilities facilitate using
+\csb{etocsettocstyle} only once in the preamble and branch according to
+whether it is handling a main document TOC or a local one. But the macro was
+really initially conceived to be used for local TOCs once the main TOC was
+typeset (commands are provided to restore the default configuration in time
+for a main TOC at end of document). There is no command to customize the
+titles only for local TOCs from the preamble.
+
+With \etocrelease{1.2} an effort has been made to make using
+\csb{etocsettocstyle} for local TOCs purely an option: by default the package
+adopts a style for local headings which takes into account the local top
+level. This corresponds to the command \csb{etocetoclocaltocstyle}, which is emitted
+by default by the package.
+
+Furthermore \etocrelease{1.2} detects \ctanpkg{tocbibind}%
+%
+\footnote{Support for \ctanpkg{tocloft} customization of contents lines was
+ already in place for many years; the compatibility with \ctanpkg{tocbibind}
+ was added only at \etocrelease{1.2} and required to update the
+ \ctanpkg{tocloft} related code.}
+%
+and executes a compatilibity layer so that this package can be used with
+hopefully the same result as in the main document classes. Package options
+\etocoption{maintoctotoc}, \etocoption{localtoctotoc},
+\etocoption{localloftotoc} and \etocoption{locallottotoc} trigger ``to toc''
+mechanisms even without \ctanpkg{tocbibind} if desired, directly at \etoc
+level. The starred variants of the table of contents and ``list of'' commands
+will ignore the status of these options, as in the \ctanpkg{memoir} class.
+
+
+\section[\csbhyp{locallistof\-(figures\textbar\-tables)}]{The \protect\etocrelease{1.2}
+ \csbhyp{locallistoffigures} and \csbhyp{locallistoftables} commands}
+\label{locallistoffigures}
+\label{locallistoftables}
+\label{etocsetup}
+
+The major novelty with \etocrelease{1.2} is the addition of
+\csb{locallistoffigures} and \csb{locallistoftables}.
+
+Please read this:
+\begin{itemize}
+\item This is experimental code and the user interface as well as the
+ output may change.
+\item It is mandatory to load \etoc with option \etocoption{lof} for
+ \csb{locallistoffigures} and \etocoption{lot} for \csb{locallistoftables}.
+\item \etoc does not interfere whatsoever with \csa{listoffigures} and
+ \csa{listoftables}, and can not customize them in any way.
+\item \etoc still uses no additional auxiliary file, it uses only the
+ |.toc| file.
+\item This is experimental code and the user interface as well as the
+ output may change.
+\item The new command \csb{etocsetup} allows to configure at any
+ location in the preamble or in the document body the boolean options
+ \etocoption{maintoctotoc}, \etocoption{localtoctotoc},
+ \etocoption{localloftotoc}, \etocoption{locallottotoc}, and
+ \etocoption{ouroboros} which can also be issued as package options.
+ The first four default to |false|, except with the \ctanpkg{memoir}
+ class, in which case they are set to |true|, or when
+ \ctanpkg{tocbibind} is detected, in which case they are set to
+ |true| depending on the setting of the \ctanpkg{tocbibind} options.
+\item The \etocoption{ouroboros} option defaults to |true|. When set
+ to |false|, local TOCs which have been added to the |.toc| file due
+ to \etocoption{localtoctotoc} will \emph{not} list themselves (they
+ will still list entries from local TOCs at deeper levels in their
+ scope, and the ``lists of'' at their same level, and are listed in
+ the main TOC, the only thing is that they don't show themselves in
+ themselves).%
+%
+\footnote{It is complex to try to anticipate all scenarii, but in general, it
+ is expected this behavior may cause the |.toc| file to need more time to
+ stabilize when a new local TOC is added in the midst of a document having
+ already a bunch of them.}
+%
+The default is that they \emph{do} list themselves, hence the name
+\etocoption{ouroboros}. It has no impact on the main TOCs, use their
+starred variant to inhibit the self-display, but then why have issued
+\etocoption{maintoctotoc} in the first place?
+\item An effort has been made to facilitate as much as possible
+ customization by the user, i.e. via commands without |@| letter.
+ However this documentation will only list their names with very
+ brief comments at the appropriate place and the reader is expected
+ to check in the source code to understand better what they are for.
+\item This is experimental code and the user interface as well as the
+ output may change.
+\item For example, the actual figure entries or table entries use by
+ default the code from the main LOF or LOT; but one may prefer to
+ render them in a way taking into account the local ``list of''
+ scope: for example in a section, perhaps use the same style as
+ subsections. This is possible and is explained briefly later.
+\item Although the default ``\etoc'' choices for local titles should
+ be hopefully satisfactory in most cases, it is also possible to tell
+ \etoc to try to use emulation from the document class via the
+ command \csb{etocclasstocstyle}. An effort has been made to obtain
+ something which works at one level deeper than the ones under
+ \csa{part}. For example with \ctanpkg{KOMA-script}, we use the
+ option |leveldown|. However this will not really work for deeper
+ local ``lists of''.%
%
- 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.
+\footnote{And with \ctanpkg{KOMA-script} at version \texttt{3.30} or later the
+ fact that unnumbered sections reset the subsection counter will cause bad
+ problems in a \texttt{scrbook} document if a TOC, local to a \csa{subsection}
+ uses a title which is un unnumbered section!}
+%
+But for some document using local ``lists of'' only for chapters or
+for sections in classes without chapters, this \csb{etocclasstocstyle}
+may be appropriate as it may allow the user to use the class interface
+for advanced control of the marks or other details.
+\item The \etoc document class agnostic default, from
+ \csb{etocetoclocaltocstyle} which is automatically issued at package
+ loading time, is completely customizable.
+\item This is experimental code and the user interface as well as the
+ output may change.
+\item If using for example all three of \csb{localtableofcontents},
+ \csb{locallistoffigures} and \csb{locallistoftables}, in the same
+ location after a division heading, and if the ``to toc'' related
+ options either from \etoc or from \ctanpkg{tocbibind} are used, then
+ \csb{localtableofcontents} must be the first one in order to be able
+ to list the other two (and itself). It can not see the ``lists of''
+ coming before itself at the same division level.
+\item Regarding the TOC title style, \etoc knows the standard classes,
+ the \ctanpkg{KOMA-script} main classes and the \ctanpkg{memoir}
+ class. In an unknown class it will use the code from the |article|
+ class emulation. For the local TOCs and local ``lists of'' it uses
+ as with the known classes its own class-independent code from
+ \csb{etocetoclocaltocstyle}.
+\item One can tell \etoc to not replace the original
+ \csa{tableofcontents} via \csb{etockeeporiginaltableofcontents} (it
+ will still be possible to use \csb{etoctableofcontents}), but the
+ non-etoc \csa{tableofcontents} is usable only if document does not
+ use \csb{locallistoffigures} or \csb{locallistoftables} as the
+ latter two insert entries for figures, resp.\@ tables, in the main
+ |.toc| file and only \etoc's \csb{tableofcontents} knows to ignore
+ them.
+\item This is experimental code and the user interface as well as the
+ output may change.
+\end{itemize}
- Via ``depth tags'', one gets an even finer control for each table of contents
- of which sectioning units it should, or not, display.
+\section{The \csbhyp{etocsettocstyle} command}
+\label{etocsettocstyleintro}
- The formatting inherited (and possibly customized by other
- packages) from the document class will be used when in
- \emph{compatibility mode}.
+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}|. Here is an example of input:
+\begin{verbatim}
+\etocsettocstyle
+ {\section*{Local table of contents}}%
+ {}% don't do anything special after the toc contents
+\end{verbatim}
- 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}
+Once issued it will have an impact on all next usages of \localtoc (or \toc)
+until it is used again (or some related command).
-\section{Foreword}
+Generally speaking the \marg{before\_toc} part should leave \TeX{} in
+``vertical mode'': the line styles (either from the standard classes or the
+package default ones) all expect to get started in `vertical mode'.
-%\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
+For more documentation of this and related commands see first
+\autoref{sec:compatoverview} then
+\autoref{sec:tocstyle} for the more detailed pre-\etocrelease{1.2} documentation.
-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
+Only daring people will continue reading documentation as it now starts
+telling how to truly activate \etoc power.
+\section{The \csbhyp{etocsetstyle} command}
+\label{etocsetstyleintro}
-\clearpage
+A distinction must be made between the \emph{line styles}, \emph{i.e.} the way
+the name, number and page numbers (aka \etoc-provided \csb{etocname},
+\csb{etocnumber}, and \csb{etocpage}) 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} (and related commands) which has already
+been mentioned, and the former by the command \csb{etocsetstyle} with is the
+core of \etoc functionality.
-\etocsettocdepth {subsection}
+It has five mandatory arguments.
+%
+\centeredline
+{\csb{etocsetstyle}\color{blue}\marg{levelname}%
+ \marg{start}\marg{prefix}\marg{contents}\marg{finish}}
+%
+The first one is the name of the sectional unit: a priori known names are
+|book|, |part|, |chapter|, |section|, |subsection|, |subsubsection|,
+|paragraph|, and |subparagraph|. Any other name can be declared and
+assigned to a (numeric) level via the \csb{etocsetlevel} command.%
+%
+\footnote{\etoc issues automatically
+ \csb{etocsetlevel}\texttt{\string{appendix\string}\string{0\string}} (or wit
+ h |1| if the document has no \csa{chapter} command), since
+ \etocrelease{1.2}. Formerly this was done only with class
+ \ctanpkg{memoir}.}
-\etocdepthtag.toc{overview}
+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{how to use for this
+ level the \csb{etocname}, \csb{etocnumber} and \csb{etocpage} parsed data,}
+and 4) \emph{the last argument is the code to execute when a division unit of
+ higher importance than the defined level style is encountered.}
-\part{Overview}\label{part:overview}
+Notice that this means that virtually \etoc manages a kind of tree-like
+substratum which is abstracted from the `flat' structure of the |.toc| data.
-\thispartstats
+You should now read \autoref{sec:linestyles} for the detailed documentation.
-\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}.
+\section{No auxiliary file is used beyond the TOC file}
+\label{sec:compatoverview}
-\begin{framed}
+An important characteristic of \etoc is that it is allows many different TOCs
+in the same document, \emph{using only one} |.toc| \emph{file}!
+
+\begingroup
\setcounter{mycounti}{0}%
\etocinline
\etocsetlevel{part}{1}
@@ -1723,457 +1836,1601 @@ devoted to this, and some more is to be found in
\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}
+The present documentation contains \arabic{mycounti} visible tables of
+contents (and a few invisible ones) and uses only one |.toc| file!%
+%
+\footnote{and the counting itself has been achieved by a table of contents
+ which was inserted in this paragraph! See \autoref{sec:tocoftocs}.}
\endgroup
-\end{filecontentsdef}
-\filecontentsexec\foo
+However, each \localtoc or \toc command will trigger the execution of the
+\emph{full contents} from the |.toc| file. The effect of \localtoc as well as
+the enforcement of the line styles as defined via \csb{etocsetstyle} are
+achieved via suitable redefinition of the \csa{contentsline} \LaTeX{} macro.
+But everything else present in the |.toc| file will be executed, as it is not
+possible for \etoc to control in any way what is present in the |.toc|
+file beyond \csa{contentsline} entries.
-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|.
+So one should think twice before adding manually extra commands to the |.toc|
+file. See \autoref{sec:addingtotoc} for further discussion.
-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{Compatibility mode}\label{subs:compat}
+\label{etoctoclines}
+\label{etocstandardlines}
+\label{etocclasstocstyle}
+\label{etocetoclocaltocstyle}
+\label{etocusertocstyle}
+\label{etoclocallistoffigureshook}
+\label{etoclocallistoftableshook}
+
+\etoc starts in a ``compatibility mode'', which means that it does not at all
+interfere with how the commands from the |.toc| file get executed as long as
+it has not been told explicitly to do so.%
+%
+\footnote{\label{fn:compat}for the ``toc display style'', by this we mean the
+ aspects independant from the contents of the \texttt{.toc} file, \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 ``compatibility mode'' stops for matters of the ``toc display style'' as
+soon as \csb{etocsettocstyle} is made use of, and for matters of the ``toc
+line styles'' as soon as \csb{etocsetstyle} is used for \emph{any} level
+(part, chapter, section, ...). Levels not receiving explicit configurations
+will use some pre-defined defaults which are in \etoc source code.
-\section{A second example}
-\label{sec:secondexample}
+\begin{description}
+\item[\csb{etocclasstocstyle}] sets the `main toc layout' to be as without
+ |\usepackage{|\etoc\unskip|}|. Local TOCs will also obey the document class
+ style but with an attempt to use a heading one level down. This tries to
+ adapt to being in the top level below \csa{part} (i.e. in a \csa{chapter} or
+ \csa{section}) but is not adapted to deeper local TOCs.
+
+ At \etocrelease{1.2}, previously existing \csa{etocstandarddisplaystyle}
+ was made into a deprecated synonym to this (the version from earlier
+ releases made no attempt to adapt the style of the local TOCs to the level
+ where it is located).
+
+\item [\csb{etocetoclocaltocstyle}] (package default) Activates a heading
+ style for local tables of contents (and ``lists of'') which tries to adapt
+ automatically to the surrounding level. It thus by-passes the configuration
+ done by \csb{etocsettocstyle} which will then apply only to the main TOC.
+ Using again \csb{etocsettocstyle} de-activates this behavior.
+
+\item [\csb{etocusertocstyle}] means to obey the \csb{etocsettocstyle}
+ configuration as previously in place, not only for the main TOC but also for
+ local ones. If \csb{etocsettocstyle} has never been used, this means that
+ we return to the situation from \csb{etocclasstocstyle}.
+
+\item [\csb{etocstandardlines}] (package default) Sets the `content lines' to be as without
+ |\usepackage{|\etoc\unskip|}|.
+
+\item [\csb{etoctoclines}] sets the `content lines' to match the last encountered
+ \csb{etocsetstyle} specs.
+
+\item [\csb{etocdefaultlines}] sets the `content lines' to use \etoc pre-defined
+ ones. The denomination is a bit confusing as `default' here means that
+ these line styles are the ones defined by default, but not used by
+ default\dots{} perhaps \csa{etocfallbacklines} would have been a better name.
+\end{description}
-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.
+Naturally \csb{etocsettocstyle} and \csb{etocsetstyle} can be used arbitrarily
+many times in the document body (or already in the preamble but there one can
+not typeset a TOC; however one can prepare commands which will be activated
+later from inside the document body). And they obey the scope-limiting effect
+of \LaTeX{} environments.
+
+For an illustration of using \etoc in compatibility mode see
+\autoref{sec:testingcompat}. And see \autoref{sec:anothercompat} for some
+ways to let the line styles use the code from the document class but with some
+custom changes.
+
+During expansion of \csb{locallistoffigures} or
+\csb{locallistoftables}, the macros \csb{etoclocallistoffigureshook} resp.\@
+\csb{etoclocallistoftableshook} are executed right before typesetting
+the entries. (Click on ``hook'' in previous sentence for advices on their usage).
+\begin{verbatim}
+\def\etoclocallistoffigureshook{\etocstandardlines}
+\def\etoclocallistoftableshook {\etocstandardlines}
+\end{verbatim}
+Let's simply say here
+that if you redefine them to do nothing, the lines will use the style as
+appropriate for entries at numerical level one deeper than the ``local top'':
+i.e. in a section they will be typeset as if being subsections. If
+you have both \csb{locallistoffigures} and a \localtoc, this may align
+better vertically than the \LaTeX{} line style from the global ``Lists Of''.
+
+
+Note that ``hook'' is used here in a very naive meaning of some macro which is
+pre-located somewhere and that one can redefine to obtains various effects.
+
+\section{A list of the commands added at \protect\etocrelease{1.2}}
+\label{etocstoretocstyleinto}
+\label{etocstorelinestylesinto}
+\label{etocstorethislinestyleinto}
+\label{etocifislocal}
+\label{etocifislocaltoc}
+\label{etocifislocallof}
+\label{etocifislocallot}
+%%\label{etocsettocstyle}
+\label{etocifmaintoctotoc}
+\label{etociflocaltoctotoc}
+\label{etociflocalloftotoc}
+\label{etociflocallottotoc}
+\label{etocifisstarred}
+\label{etoclevel}
+\label{etocifunknownlevelTF}
+\label{etocdivisionnameatlevel}
+\label{etoclocalheadtotoc}
+\label{etocglobalheadtotoc}
+\label{etocetoclocaltocmaketitle}
+%%\label{etocetoclocaltocstyle}
+\label{localcontentsname}
+\label{locallistfigurename}
+\label{locallisttablename}
+\label{etocetoclistoffiguresmaketitle}
+\label{etocetoclistoftablesmaketitle}
+\label{etocclasslocaltocmaketitle}
+\label{etocclasslocallofmaketitle}
+\label{etocclasslocallotmaketitle}
+\label{etocclassmaintocaddtotoc}
+\label{etocclasslocaltocaddtotoc}
+\label{etocclasslocallofaddtotoc}
+\label{etocclasslocallotaddtotoc}
+
+\begin{shaded}\footnotesize
+%\setstretch{1}
+ One pre-existing command has been modified: \csa{etocstandarddisplaystyle}
+ which is now deprecated and replaced by \csb{etocetoclocaltocstyle}. The
+ former behavior was to set also local TOCs to apply the style from the main
+ TOC, which basically never works really well. As explained already one can
+ use \csb{etocclasstocstyle} to try to get for top local TOCs a suitable
+ behavior, for example in the case of \ctanpkg{KOMA-script} classes, a
+ behavior using their |leveldown| option. But this will not be satisfactory
+ for deeper local TOCs or ``lists of''.
+\end{shaded}
+
+With \csb{etocsettocstyle} one has complete decision about how the TOCs
+typeset their titles. Thus, this also means that supporting the options such
+as \etocoption{localtoctotoc} is entirely up to the provided code. There is
+no real reason for the user to go into this but \etoc does provide
+nevertheless generic utilities allowing to write very general styles,
+supporting the options if so desired. We now turn to their descriptions. The
+first few are accompanied with more details, but all hyperlink to their source
+code via the right third of their names (some are defined in batches and
+receive initial dummy definitions only to provide hyperlink targets).
-\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}
+\begin{description}
+\item [\csb{etocstoretocstyleinto}\marg{control\_sequence}] This is a command
+ with one mandatory argument which must be a control sequence such as
+ \csa{foo}. The macro \csa{foo} is then overwritten with no check if it
+ exists already. Its effect is to store inside \csa{foo} the data configured
+ by the last \csb{etocsettocstyle}. Then inserting \csa{foo} in the document
+ will restore the saved toc style.%
+%
+\footnote{It is impossible to store the style used by the
+ \csb{etocetoclocaltocstyle} for local TOCs. Only the one for main TOCs,
+ which was configured by last usage of \csb{etocsettocstyle} is saved in
+ \csa{foo}. After \csa{foo} is executed, one needs to again issue
+ \csb{etocetoclocaltocstyle} if one wants the latter to be active.}
+
+\item [\csb{etocstorelinestylesinto}\marg{control\_sequence}] Same principle
+ but now \csa{foo} will store the line styles for all levels. And inserting
+ \csa{foo} will have the same effect as re-doing all \csb{etocsetstyle} for
+ all levels.
+
+\item [\csb{etocstorethislinestyleinto}\marg{name or
+ number}\marg{control\_sequence}] Same principle but now \csa{foo} will
+ store the line style for the specified level, which can be numerical or a
+ name. And then executing \csa{foo} will have the same effect as re-doing the
+ \csb{etocsetstyle} for this level.%
+%
+\footnote{Absolutely no error check is done on the first argument. There is no
+ interface for re-assigning the style to another level, although it would not
+ be difficult to code it. But the \etoc powers about re-assigning levels are
+ things better left to unearthly entities such as the author.}
-\etocsetstyle {part}
-{\parindent 0pt
- \nobreak
- \etocskipfirstprefix}
-{\pagebreak[3]\bigskip}
-{\large\rmfamily\bfseries\scshape\centering
- \etocifnumbered{Part \etocnumber{} -- }{}\etocname\par}
-{}
+\DeleteShortVerb\|
+
+\item [\csb{etocsetup}\marg{key[=true|false],...}] was already mentioned
+ earlier. Only usable with the five boolean options. But everywhere in the
+ document after the package loading.
+\end{description}
-\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 }
+\MakeShortVerb\|
-\etocsetstyle {subsection}
-{\leftskip1cm\rightskip .75cm \parfillskip 0pt plus 1fil\relax
- \nobreak\smallskip}
-{}
-{\footnotesize\sffamily\mdseries\itshape
- \etocname{} (\etocnumber, p. \etocpage). }
-{\par\medskip}
+Those next will be more briefly described.
+\begin{itemize}
+\item \csb{etocifislocal}, \csb{etocifislocaltoc}, \csb{etocifislocallof},
+ \csb{etocifislocallot} can be used from inside the \csb{etocsettocstyle}
+ first or second argument to select either one of the \marg{True} and \marg{False}
+ branches.
+
+\item \csb{etocifmaintoctotoc}, \csb{etociflocaltoctotoc},
+ \csb{etociflocalloftotoc}, \csb{etociflocallottotoc}, are conditionals
+ matching the options and selecting one of the \marg{True} or \marg{False} branches.
+
+\item \csb{etocifisstarred}\marg{True}\marg{False} says from inside the
+ \csb{etocsettocstyle} arguments if the toc or `list of' command was in
+ starred form.
+
+ The \csb{etocetoclocaltocstyle} and \csb{etocclasstocstyle} have been configured so
+ that when a |*| follows a \toc or \localtoc or local ``lists of'', its ``to
+ toc'' behavior (if active from \ctanpkg{tocbibind} or \etoc own options) is
+ canceled. They use \csb{etocifisstarred} to this effect.
+
+\item \csb{etoclocalheadtotoc}\marg{levelname}\marg{text} is a synonym for
+ \centeredline{\csa{addcontentsline}|{toc}|\marg{@levelname}\marg{text}}
+%
+ Pay
+ attention to automatically added |@| character.%
+%
+\footnote{Without this syntax, it would not be possible to have all three of
+ \localtoc, \csb{locallistoffigures} and \csb{locallistoftables} one after
+ the other following a given document heading, due to deep internals of the
+ local TOC \etoc mechanism. Notice that these internal details are
+ susceptible to change with no advance notice and the actual implementation
+ of \csb{etoclocalheadtotoc} may change.}
-\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
+ Use this for example in the second argument of \csb{etoclocalmulticol}.%
+%
+\footnote{There is currently no analog of \csb{etoclocalmulticol} and similar
+ commands which would be related to \csb{locallistoffigures} or
+ \csb{locallistoftables} as \csb{etoclocalmulticol} is to \localtoc.}
-The code:
-\filecontentsprint\foo
-\marginattach{}
+\item \csb{etocglobalheadtotoc}\marg{levelname}\marg{text} is a synonym for
+ \centeredline{\csa{addcontentsline}|{toc}|\marg{levelname}\marg{text}}
+%
+ We
+ have so many commands we can define another useless one\dots{} for aesthetic
+ reasons of coherent names\dots{}
-\section{A Beautiful Thesis example}
+\item \csb{etoclevel}\marg{levelname} expands to a numeric quantity giving
+ the level of a given string argument. For example \csb{etoclevel}|{section}|
+ will usually produce a \TeX{} number denotation of value one. It must be
+ prefixed by something such as the \TeX{} primitive \csa{number} to give an
+ explicit digit with perhaps a minus sign, but can serve as is in \csa{ifnum}
+ tests.
-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.
+\item \csb{etocifunknownlevelTF}\marg{levelname}\marg{True}\marg{False} is a
+ conditional to test if a level is known to \etoc.
-\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}
+\item \csb{etocdivisionnameatlevel}\marg{number} is an expandable construct
+ which starts from a numerical level from |-2| to |5| and produces one of
+ |book|, |part|, ..., up to |subparagraph|.
-\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}
-{}
+\item \csb{etocetoclocaltocmaketitle} is the command used by
+ \csb{etocetoclocaltocstyle} which typesets a local ``list of'' title using
+ an un-numbered sectioning appropriate to its scope. See the source code for
+ how it looks.
-\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}
-{}
+\item \csb{etocetoclistoffiguresmaketitle} and
+ \csb{etocetoclistoftablesmaketitle} are similar, see the source code.
-\def\tmptitle{My Beautiful Thesis}
-\etocsettocstyle{\color{cyan}\parindent0pt \leftskip\tocleftmargin
- \leavevmode\leaders\hrule height 1pt\hfill\
- \huge\textit{\tmptitle}\par}{\bigskip}
+\item \csb{localcontentsname}, \csb{locallistfigurename}, \csb{locallisttablename}
+ are self-explanatory.
-\tableofcontents \ref{toc:overview}
-\endgroup
-\end{filecontentsdef}
+\item \csb{etocclasslocaltocmaketitle}, \csb{etocclasslocallofmaketitle},
+ \csb{etocclasslocallotmaketitle}, \csb{etocclassmaintocaddtotoc},
+ \csb{etocclasslocaltocaddtotoc}, \csb{etocclasslocallofaddtotoc},
+ \csb{etocclasslocallotaddtotoc}, well again see source code.
-\filecontentsexec\foo
-\filecontentsprint\foo
-\marginattach{}
+\end{itemize}
+% {\footnotesize (clearing this page as next display must be on one page
+% only)\par}
+% \clearpage
-\section{Linked list of the main package commands}
+\section{A partial list of the package commands}
+%\enlargethispage{2\baselineskip}
+%\vskip-\baselineskip\vskip0pt
-\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
+\begin{multicols}{2}\parindent0pt\relax\setstretch{1}%
+ \csb{etocbeforetitlehook}\par
\csb{etocaftertitlehook}\par
+ \csb{etocaftercontentshook}\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{etocsettocstyle}\par
+ \csb{etocclasstocstyle}\par
+ \csb{etocetoclocaltocstyle}\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{etocframed}\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{etocsetnexttocdepth}\par
+ \csb{etocdepthtag.toc}\par
+ \csb{etocsettagdepth}\par
+ \csb{etocobeydepthtags}\par
+ \csb{etocdefaultlines}\par
\csb{etocstandardlines}\par
- \csb{etocthelinkedname}\par
- \csb{etocthelinkednumber}\par
- \csb{etocthelinkedpage}\par
+ \csb{etoctoclines}\par
+ \csb{etocsetlevel}\par\columnbreak
+\flushright
+ \csb{etocsetstyle}\par
+ \csb{etocskipfirstprefix}\par
+ \csb{etocifnumbered}\par
+ \csb{etociffirst}\par
+ \csb{etoclink}\par
\csb{etocthelink}\par
+ \csb{etocname}\par
+ \csb{etocnumber}\par
+ \csb{etocpage}\par
\csb{etocthename}\par
\csb{etocthenumber}\par
\csb{etocthepage}\par
- \csb{etoctoccontentsline}\par
- \csb{etoctoclines}\par
+ \csb{etocthelinkedname}\par
+ \csb{etocthelinkednumber}\par
+ \csb{etocthelinkedpage}\par
+% \csb{etocdisplay}\par
+% \csb{etocframedstyle}\par
+% \csb{etocignoredepthtags}\par
+% \csb{etocignoretoctocdepth}\par
+% \csb{etocimmediatedepthtag.toc}\par
+% \csb{etocimmediatesettocdepth.toc}\par
+% \csb{etocimmediatetoccontentsline}\par
+% \csb{etocinline}\par
+% \csb{etoclocalframed}\par
+% \csb{etoclocalmulticol}\par
+% \csb{etoclocalruled}\par
+% \csb{etocmulticolstyle}\par
+% \csb{etocobeytoctocdepth}\par
+% \csb{etocruledstyle}\par
+% \csb{etoctoccontentsline}\par
+%\flushright
\csb{localtableofcontents}\par
\mbox{}\llap{\csb{localtableofcontentswithrelativedepth}}\par
+ \csb{locallistoffigures}\par
+ \csb{locallistoftables}\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.
+
+{\footnotesize\setstretch{1}
+The above is not an exhaustive list of all the package user commands.
+For example, it does not include most of those added at \etocrelease{1.2}
+and which were listed in the previous section.\par
+}
\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
+
+\etocdepthtag.toc {styling}
+\part{The \etoc styling commands}
+\label{part:styling}
\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:styling}\hss}}
+
+\localtableofcontents \label{toc:part:styling}
+
+The two main commands \csb{etocsettocstyle} and \csb{etocsetstyle} can be used
+anywhere in the document. Typically one will render the main global TOC in
+one style and local tables of contents in another. So the commands to style
+the local tables of contents will be executed after the main \toc (if it is
+first in document) either by direct injection in the document source, or
+encapsulated in user commands defined in the preamble.
+
+All commands obey the scope limiting effect induced by \LaTeX{} environments
+or the core \TeX |\begingroup/\endgroup| (or braces |{...}|) constructs.
+
+\section{The \csbhyp{etocsettocstyle} and related commands}
+\label{sec:tocstyle}
+
+\begingroup
+\etocsettocstyle{}{}
+\etocstandardlines
+\DeclareTOCStyleEntry[numwidth=3em,indent=0em]{tocline}{subsection}
+\DeclareTOCStyleEntry[numwidth=3.5em,indent=3em]{tocline}{subsubsection}
+\localtableofcontents \label{toc:tocstyle}
+\endgroup
+
+
+
+\subsection{The \csbhyp{etocsettocstyle} command}
+\label{etocsettocstyle}
+
+The basics are explained in \autoref{etocsettocstyleintro}. Recall that the
+syntax is
+\centeredline{\csb{etocsettocstyle}\marg{before\_toc}\marg{after\_toc}} and
+here is a typical example of use:
+\begin{verbatim}
+\etocsettocstyle
+ {\section*{Local table of contents}}%
+ {}% don't do anything special after the toc contents
+\end{verbatim}
+
+The first argument to \csb{etocsettocstyle} can also contain instructions to
+mark the page headings. Or it could check 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.
+
+
+The commands to be described next \csb{etocmulticolstyle},
+\csb{etocruledstyle}, and \csb{etocframedstyle} all call \csb{etocsettocstyle}
+as a lower-level routine, to initiate a \texttt{multi\-cols} environment in
+\marg{before\_toc} and close it in \marg{after\_toc}.
+
+\subsubsection{The \csbhyp{etocarticlestyle}, \csbhyp{etocbookstyle},
+ and others commands}
+\label{etocarticlestyle}
+\label{etocarticlestylenomarks}
+\label{etocbookstyle}
+\label{etocbookstylenomarks}
+\label{etocreportstyle}
+\label{etocreportstylenomarks}
+
+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.
+
+Here is the current list:
+\begin{itemize}[nosep]
+\item \csb{etocarticlestyle}
+\item \csb{etocarticlestylenomarks}
+\item \csb{etocreportstyle}
+\item \csb{etocreportstylenomarks}
+\item \csb{etocbookstyle}
+\item \csb{etocbookstylenomarks}
+\item \csb{etocmemoirstyle}
+\item \csb{etocscrartclstyle}
+\item \csb{etocscrreprtstyle}
+\item \csb{etocscrbookstyle}
+\end{itemize}
+The command \csb{etocclasstocstyle} will adapt to the document class.
+One can not use the \ctanpkg{KOMA-script} related commands or the
+\ctanpkg{memoir} one in standard classes.
+
+
+\subsubsection{The \csbhyp{etocinline} and \csbhyp{etocdisplay} commands}
+\label{etocinline}
+\label{etocnopar}
+\label{etocdisplay}
+
+With \csb{etocinline}, or its synonym |\etocnopar|, the \localtoc 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 \localtoc and
+variants issue a |\par| to switch to vertical mode before typesetting the TOC
+title and contents.
+
+Here is an example of an \emph{inline} table of contents, which has only
+subsections and uses the |itemize*| environment from \ctanpkg{enumitem} for
+them. The code used is
+\begin{verbatim}
+And the output is:
+\begingroup
+ \etocglobaldefs
+ \etocsetstyle {subsection}
+ {\begin{itemize*}[itemjoin={{; }}, itemjoin*={{, and }}]}
+ {}
+ {\item [{\bfseries\etocnumber.}] \etocname\ (\emph{p. \etocpage })}
+ {\end{itemize*}.}%
+ \etocsetnexttocdepth {subsection}%
+ \etocsettocstyle {a clone of a local table of contents, originally defined in
+ \autoref{sec:tocstyle}, but here rendered completely
+ differently via an inline \ctanpkg{enumitem} list: }{}%
+ \etocinline\tableofcontents \ref{toc:tocstyle}
+\endgroup
+\end{verbatim}
+
+(observe that on executing the above there is no extra space after the colon
+beyond what is intended, and the current paragraph is simply continued)
+And the output is:
+\begingroup
+ \etocglobaldefs
+ \etocsetstyle {subsection}
+ {\begin{itemize*}[itemjoin={{; }}, itemjoin*={{, and }}]}
+ {}
+ {\item [{\bfseries\etocnumber.}] \etocname\ (\emph{p. \etocpage })}
+ {\end{itemize*}.}%
+ \etocsetnexttocdepth {subsection}%
+ \etocsettocstyle {a clone of a local table of contents, originally defined in
+ \autoref{sec:tocstyle}, but here rendered completely
+ differently via an inline \ctanpkg{enumitem} list: }{}%
+ \etocinline\tableofcontents \ref{toc:tocstyle}
+\endgroup
+
+It was needed to use \csb{etocglobaldefs} because the \csa{item} command,
+as modified by \ctanpkg{enumitem} closes a group, hence the meaning
+of \csb{etocname}, \csb{etocnumber} and \csb{etocpage} would have been lost
+after it.
+
+A more impressive example of an inline table of contents (containing the full
+contents of this document, which subsections rendered as page footnotes...) is
+to be found in \autoref{sec:crazy}.
+
+\subsection{The \csbhyp{etocmulticolstyle}, \csbhyp{etocmulticol},
+ and \csbhyp{etoclocalmulticol} commands}
+\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 an example:
+\begin{verbatim}
+\etocmulticolstyle{\noindent\bfseries\Large
+ \leaders\hrule height1pt\hfill
+ \MakeUppercase{Table of Contents}}
+\localtableofcontents
+\end{verbatim}
+After \csb{etocmulticolstyle} all future \csa{tableofcontents} will use the
+specified style until modified by renewed usage of \csb{etocsettocstyle} or variants.
+
+A shortcut combining the style specification and the table of contents and not
+impacting the styles of later TOCs is:%
+%
+\centeredline{\csb{etoclocalmulticol}\oarg{number\_of\_columns}\marg{heading}}
+%
+So the above example can be also obtained using:
+\begin{verbatim}
+\etoclocalmulticol{\noindent\bfseries\Large
+ \leaders\hrule height1pt\hfill
+ \MakeUppercase{Table of Contents}}
+\end{verbatim}
+%
+It has the advantage that the TOC styling as specified applies only to this
+sole local TOC.
+
+And there is also
+\csb{etocmulticol}\oarg{number\_of\_columns}\marg{heading} for global TOC.
+
+\subsection{The \csbhyp{etoctocstyle} command}
+\label{etoctocstyle}
+
+\centeredline{\csb{etoctocstyle}\oarg{kind}\marg{number\_of\_columns}\marg{title}%
+}
+%
+is the exact equivalent of doing
+%
+\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.
+
+As explained above one still has to issue \localtoc to typeset the TOC. And
+the styling, if not enclosed in a scope-limiting group or environment, applies
+to subsequent local TOCs.
+
+\subsubsection{The \csbhyp{etoctocstylewithmarks} command}
+\label{etoctocstylewithmarks}
+\label{etoctocstylewithmarksnouc}
+
+\centeredline{\csb{etoctocstylewithmarks}\oarg{kind}%
+ \marg{number\_of\_columns}\marg{title}\marg{mark}%
+ }
+%
+is the exact equivalent of doing
+%
+\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 \csbhyp{etocruledstyle}, \csbhyp{etocruled} and
+ \csbhyp{etoclocalruled} commands}
+\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:part:styling]{the start of this part} was obtained with:
+\begin{verbatim}
+\etocruledstyle[1]{\etocfontminusone\color{green}%
+ \fboxrule1pt\fboxsep1ex
+ \framebox[\linewidth]
+ {\normalcolor\hss Contents of this part\hss}}
+\localtableofcontents
+\end{verbatim}
+
+As a shortcut to set the style with \csb{etocruledstyle} and then issue a
+\localtoc, all inside a group so that future table of contents will not be
+affected, there is:
+%
+\centeredline{\csb{etoclocalruled}\oarg{number\_of\_columns}\marg{title}}
+%
+And there is also \csb{etocruled} for the global TOC.
+
+\subsection{The \csbhyp{etocframedstyle}, \csbhyp{etocframed}, and
+ \csbhyp{etoclocalframed} commands}
+\label{etocframedstyle}
+\label{etocframed}
+\label{etoclocalframed}
+
+Same mechanism:
+%
+\centeredline{\csb{etocframedstyle}\oarg{number\_of\_columns}\marg{title}}
+%
+and the accompanying shortcut:
+%
+\centeredline{\csb{etoclocalframed}\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{etocframed} for a
+global 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{Customizing the pre-defined 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}
+
+We list the relevant macros, what they do should be legible from their
+names. Note that dimensions are stored in macros so are modifed using
+\csa{renewcommand}'s and not \csa{setlength}'s. And color related commands
+are not color definitions, they execute \csa{color}, and their effect gets canceled
+by re-defining them to do \csa{relax} or \csa{empty}.
+\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.
+
+
+\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|.
+
+
+\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.
+
+For example, the present document executed
+\begin{verbatim}
+\renewcommand{\etocbeforetitlehook}{\setstretch{1}}
+\end{verbatim}
+as it is globally using the \ctanpkg{setspace} command \csa{onehalfspacing}.
+Not using \csa{singlespacing} in the hook as it does a systematic vertical
+skip of one baseline, which is unwanted in our usage.
+
+\begin{framed}
+ In recent years, the \LaTeX{} kernel has added a general ``hook'' mechanism
+ with a user interface of the type |\AddToHook{...}{...}|.
+
+ The \etoc macros with `hook' ending their names are much simpler things
+ which are supposed to be manipulated only via \csa{renewcommand} or
+ \csa{def} direct overwrites.
+
+ In future, and to the extent the author has time for that addition, with its
+ costly documentation updates collaterals, and thoughts about backward
+ compatibility, \etoc should arguably tap into the general tools provided by
+ recent \LaTeX{} kernels.
+\end{framed}
+
+\section{The \csbhyp{etocsetstyle} and related commands}
+\label{sec:linestyles}
+\label{etocsetstyle}
+\label{etocname}
+\label{etocpage}
+
+\begingroup
\etocsettocstyle{}{}
+\DeclareTOCStyleEntry[numwidth=3.2em,indent=0em]{tocline}{subsection}
+\etocstandardlines
+\localtableofcontents \label{toc:linestyles}
+\endgroup
+
+Let us explain how \etoc was used to produce the table of contents displayed
+at the beginning of this \autoref{part:styling}. This is a local table of
+contents, and we used the command \localtoc.
+
+
+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}
+\endgroup
+% Note 2023/02/22: pour une raison que je ne vais pas chercher à comprendre
+% le etocsnippet-01 était mis du mauvais côté (dans la marge intérieure, pas
+% extérieure) lorsque ce \marginattach était avant le \endgroup
+\marginattach
+
+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.
+
+\subsection{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.
+
+
+The command \csb{etociffirst}\marg{YES CODE}\marg{NO CODE}
+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.
+
+
+\subsection{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|.
+
+
+\subsection{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}
+has the same effect but is expandable.
+
+
+\subsection{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 ``robust'', in fact it is expected they will be often
+submitted to one expansion step so that their contents can easily be recovered
+and stored perhaps for delayed usage.
+
+\subsection{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 \etocrelease{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
+\subsection[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 \etocrelease{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 \etocrelease{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 \etocrelease{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 \etocrelease{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.
+
+
+
+\subsection{The \csbhyp{etocsetlevel} command}
+\label{etocsetlevel}
+
+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{appendix}{0}% or 1 if document has no \chapter
+\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}.
+
+These level assignments can be modified at anytime. See
+\autoref{part:surprising} for various applications of this technique.
+
+
+
+\subsection{Using \texttt{enumerate} or \texttt{itemize} environments for
+ line styles}
+
+The code for the line styles of the \localtoc of this part was already
+reproduced in \autoref{sec:linestyles}. It is very simple and uses
+\texttt{enumerate} environments for sections and subsections, then an
+``inline'' paragraph style for subsubsection titles.
+
+Actually, the very first version of \etoc from 2012 was originally motivated
+by the aim to do exactly this kind of things, which necessitates to be aware
+of when for example after a series of subsections, a section line appears in
+the |.toc| file.%
+%
+\footnote{At the source code level, the legacy method dating back to the
+ origins in 2012 was replaced
+ by a completely new one at release \etocrelease{1.2}.}
+%
+Indeed, this should trigger the emission of an |\end{enumerate}|.
+
+With the \marg{start} and \marg{finish} arguments of \csb{etocsetstyle}, \etoc
+provides an easy systematic interface to accomplish this kind of task.
+
+But 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 from \ctanpkg{babel}, and some such commands do not expect
+to see their scope limited in this way by the presence of an environment
+(which will not be visible in the |.toc| file itself but enacted dynamically
+by the user-specified line styles).
+
+The built-in ``default line styles'' provided with \etoc (see
+\autoref{sec:custom}) do not make use of environments. Actually, in this
+user manual, only the \hyperref[toc:part:styling]{table of contents} at the start of this
+\autoref{part:styling}, the \autoref{toc:allsubsections} (which is a TOC!) and
+examples from \autoref{etocthelink} have their line styles expressed in terms
+of \texttt{enumerate} or \texttt{itemize} environments.
+
+\subsection{The\csbhyp{etocglobaldefs} and \csbhyp{etoclocaldefs} commands}
+\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} has been issued, the \csb{etocname},
+\csb{etocnumber} and \csb{etocpage} will be defined during execution of \toc
+and \localtoc with global scope. For normal use this is not necessary. It
+does not hurt either to activate it systematically.
+
+To return to the default, which lets \etoc only define them locally to the
+context in place where the \csa{contentsline} is encountered, execute
+\csb{etoclocaldefs}. Both \csb{etocglobaldefs} and \csb{etoclocaldefs} have
+an effect only locally to the environment or group where they are used.
+
+\section{The \etoc fall-back line styles}
+\label{sec:custom}
+
+\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 (few) subsections of this section. It carries the label |toc:c|}}}
+
+\localtableofcontents \label{toc:c}
+
+\subsection{A demo of a TOC using \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.
+
+Let us typeset the global table of contents of the present document as if it
+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
+
+\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{etocclasstocstyle} 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.
+
+\section{Summary of the main styling 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
+
+\localtoc \csa{ref}|{toc:far}| acts the same as \toc
+\csa{ref}|{toc:far}|.
+% <--- car à 1.2 cela permet d'éviter une page quasi vide...
+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.
+
+
+\clearpage
+\etocdepthtag.toc {control}
+\part{Control of contents}
+\label{part:control}
+
+\thispartstats
+
+\etocsettocstyle{}{}% maybe I should use \etocclasstocstyle here ?
+ % but then I probably need some extra KOMA stuff to
+ % counteract the setspace effet
+\begingroup
+\DeclareTOCStyleEntry[numwidth=2em,indent=0pt]{tocline}{section}
+\DeclareTOCStyleEntry[numwidth=2.5em,indent=2em]{tocline}{subsection}
+\DeclareTOCStyleEntry[numwidth=3em,indent=4.5em]{tocline}{subsubsection}
\etocstandardlines
\localtableofcontents
+\endgroup
-\section{The \csbhyp{tableofcontents}, \csbhyp{localtableofcontents} and
- \csbhyp{localtableofcontentswithrelativedepths} commands}
+\section[The \csbhyp{tableofcontents} et al. commands]{The
+ \csbhyp{tableofcontents}, \csbhyp{localtableofcontents} and
+ \csbhyp{localtableofcontentswithrelativedepths} commands}
\label{tableofcontents}
\label{etoctableofcontents}
\label{localtableofcontents}
\label{localtableofcontentswithrelativedepth}
+\label{etockeeporiginaltableofcontents}
\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}.
+ \csb{etoctableofcontents} is a synonym to \etoc's \toc. The \toc command
+ reverts to its non-\etoc definition if \csa{etockeeporiginaltableofcontents}
+ is issued after loading the package.
+%
+\footnote{%
+ 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.}
+
\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
@@ -2188,7 +3445,11 @@ subsection, etc... (see also \csb{etocsetnexttocdepth}).%
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
+\item[\localtocwrdp\marg{number}]
+%
+\mbox{}\footnote{Thanks to Tony \textsc{Roberts} for feature request.}
+%
+ 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
@@ -2201,65 +3462,67 @@ subsection, etc... (see also \csb{etocsetnexttocdepth}).%
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.}
+ the taken into account levels would have been sections and subsections.
\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}.
+\etoc allows to typeset at some location a local table of contents which is
+defined elsewhere. For this, two simple steps:
+\begin{enumerate}
+\item insert \localtoc at the distant place, and follow it by some
+ |\label{foo}|.
+\item insert \toc|\ref{foo}| (or \localtoc|\ref{foo}|, it does the same) at the
+ place where you want this distant table of contents to appear.
+\item in step \textbf{1}, if you use \invisiblelocaltoc in place of \localtoc,
+ there will be no typesetting at its place of definition.
+\end{enumerate}
+At the place of use of \toc|\ref{foo}|, the layout and looks is entirely
+configurable locally. It may be completely different from how the same
+contents are rendered elsewhere by another \toc|\ref{foo}| or by the original
+label-decorated \localtoc|\label{foo}|. The current value of the |tocdepth|
+counter is obeyed.
+
+As an example the table of contents corresponding to \autoref{part:styling}
+has been cloned here in a
+\hyperref[toc:d]{float} which appears \vpageref{toc:d}.
\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begin{figure}[ht!]
\centering
\begingroup
- \etocstandardlines
+ % this is a KOMA-script specific customization
+ \DeclareTOCStyleEntry[numwidth=2em,indent=0pt]{tocline}{section}
+ \DeclareTOCStyleEntry[numwidth=3.2em,indent=2em]{tocline}{subsection}
+ \etocstandardlines % <-- use the defaults from the document class
\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}
+ I am from \hyperref[toc:part:styling]{far away}}}}
+ \etocsetnexttocdepth{subsection}
+ \tableofcontents \label{toc:d} \ref{toc:part:styling}
\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}|.%
+We used this: \filecontentsprintviascan\foo
+\marginattach
+
+In the above example, not only did we use |\ref{toc:part:styling}| to print
+here the distant (local) table of contents which has been labeled |toc:part:styling| 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:part:styling}|.%
%
\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}.
+This original local table of contents is to be found \vpageref{toc:part:styling}.
-\section{A powerful functionality of \etoc: the
+\section[\csbhyp{etocsetlevel}]{A powerful functionality of \etoc: the
re-assignment of levels with \csbhyp{etocsetlevel}}
\label{sec:tocdepth}
@@ -2359,7 +3622,8 @@ The simplest organization is probably to have after |\begin{document}| and befor
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
+ % Since \etocrelease{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.
@@ -2392,9 +3656,9 @@ 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
+\section[The \csbhyp{etocsettocdepth.toc} command]{The
\csbhyp{etocsettocdepth.toc} and
- \csbhyp{etocimmediatesettocdepth.toc}}
+ \csbhyp{etocimmediatesettocdepth.toc} and commands}
\label{etocsettocdepth.toc}
\label{etocimmediatesettocdepth.toc}
@@ -2435,7 +3699,8 @@ 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}}
+\subsection{The \csbhyp{etocobeytoctocdepth} and
+ \csbhyp{etocignoretoctocdepth} commands}
\label{etocobeytoctocdepth}
\label{etocignoretoctocdepth}
@@ -2445,16 +3710,17 @@ So \csb{etocignoretoctocdepth} is provided to cancel the
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
+\section[The \csbhyp{etocdepthtag.toc} and \csbhyp{etocsettagdepth} commands]{The
\csbhyp{etocdepthtag.toc}, \csbhyp{etocimmediatedepthtag.toc} and
- \csbhyp{etocsettagdepth}}
+ \csbhyp{etocsettagdepth} commands}
\label{etocdepthtag.toc}
\label{etocimmediatedepthtag.toc}
\label{etocsettagdepth}
-Release |1.07h| has a command \csb{etocdepthtag.toc} which
+% Release \etocrelease{1.07h} has a
+The command \csb{etocdepthtag.toc}
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
@@ -2478,7 +3744,7 @@ 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}.
+environment. For an example, see \autoref{sec: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
@@ -2503,7 +3769,8 @@ So%
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
+% \etocrelease{1.09f} adds
+there is \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).
@@ -2535,7 +3802,7 @@ provides two separate commands and it is up to user to make the correct
choice.
-\subsection{The commands \csbhyp{etocobeydepthtags} and \csbhyp{etocignoredepthtags}}
+\subsection{The \csbhyp{etocobeydepthtags} and \csbhyp{etocignoredepthtags} commands}
\label{etocobeydepthtags}
\label{etocignoredepthtags}
@@ -2545,30 +3812,246 @@ After \csb{etocignoredepthtags}, the |.toc| depth tags are ignored (but
\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}
+\section{Adding commands to the \texorpdfstring{\texttt{.toc}}{.toc} file}
+\label{sec:addingtotoc}
-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|.
+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}|.
-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}).
+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.
-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.
+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 will see its effect
+% (since release \etocrelease{1.07g})
+cease when the end of a table of contents is reached, as \etoc executes a
+|\setcounter{tocdepth}{previous_value}| there, to reste the \texttt{tocdepth}
+counter to the value it had 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).
+
+\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 \etocrelease{1.08k}, \etoc provides the one-argument
+There is the 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.
-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.
+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.
-\section{Not displayed empty TOCs}
+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.%
+%
+
+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{The \csbhyp{etoclocaltop} command}
+\label{etoclocaltop}
+
+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 not set.
+
+
+
+\section{Checking TOCs for emptiness}
\subsection{The \csbhyp{etocchecksemptiness} command}
\label{etocchecksemptiness}
@@ -2591,7 +4074,8 @@ 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|.)
+\item there is also \csb{etocdoesnotcheckemptiness}.%
+% (since \etocrelease{1.08i}.)
\end{enumerate}
The suppression of the heading (more precisely of the toc display style
@@ -2638,138 +4122,257 @@ 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}|.
+\clearpage
+\etocdepthtag.toc {examples}
+\part{Examples}\label{part:examples}
-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.
+\thispartstats %% (pas de sous-section)
-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.
+\etocdefaultlines
+\etocsettocstyle {}{}
+\localtableofcontents
-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}.
+To understand all code snippets in detail,
+one will need to have first browsed through \autoref{sec:linestyles}
+and \autoref{sec:tocstyle}.
-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}?
+\section{A first example}
+\label{sec:firstexample}
+\label{invisiblelocaltableofcontents}
-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}}|}
+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{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}
+\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][r]{\mdseries\etocpage}}\par}
+ {}
+\etocsetstyle {subsection}
+ {}
+ {\leavevmode\leftskip .5cm\relax }
+ {\mdseries\normalsize\makebox[1cm][l]{\etocnumber}%
+ \etocname\nobreak\hfill\nobreak
+ \rlap{\makebox[1cm][r]{\etocpage}}\par}
+ {}
+\etocsetstyle {subsubsection}
+ {}
+ {\leavevmode\leftskip 1.5cm\relax }
+ {\mdseries\normalsize\makebox[1cm][l]{\etocnumber}%
+ \etocname\nobreak\hfill\nobreak
+ \rlap{\makebox[1cm][r]{\etocpage}}\par}
+ {}
+\etocruledstyle[1]{\bfseries \Large My first \etoc: TOC of
+ \autoref{part:overview} (\nameref{part:overview})}
+\tableofcontents \ref {toc:overview}
+\endgroup
+\end{filecontentsdef}
- 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).
+\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|.
-\clearpage
-\etocdepthtag.toc {examples}
-\part{Examples}\label{part:examples}
+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.
-\thispartstats %% (pas de sous-section)
+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{sec: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.
-\etocstandardlines
-\etocsettocstyle {}{\medskip}
-\localtableofcontents
+Here is how it was produced:
+
+\filecontentsprintviascan\foo
+\marginattach
+
+\section{A second example}
+\label{sec:secondexample}
+
+This second example displays only the contents from
+\autoref{sec:linestyles} and \autoref{sec:tocstyle}. This selection
+is done via the technique of \emph{depth tags}, described in
+\autoref{etocsettagdepth} and \autoref{sec:tocwithdepthtags}.
+
+\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\centering %\scshape
+ \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}
+\etocsettagdepth {styling} {subsection}
+\etocsettagdepth {control} {none}
+\etocsettagdepth {examples} {none}
+\etocsettagdepth {advanced} {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:
+\filecontentsprintviascan\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}{4cm}
+\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
+ \nobreak\hfill\kern1em\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
+
+\filecontentsprintviascan\foo
+\marginattach
-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}
+\section{Testing the compatibility mode}\label{sec:testingcompat}
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
+of \autoref{sec:tocstyle}. 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}.
+class commands.} The original is the local table of contents of
+\autoref{sec:tocstyle}, to which we allocated the label |toc:tocstyle|.
\begin{verbatim}
\begingroup % to keep in particular toc=left with local effect
\KOMAoptions{toc=left}
-\etocstandarddisplaystyle % necessary for the display to obey toc=left
+\etocclasstocstyle % necessary for the display to obey toc=left
\etocstandardlines
-\tableofcontents \ref{toc:globalcmds}
+\tableofcontents \ref{toc:tocstyle}
\endgroup
\end{verbatim}
\begingroup
\KOMAoptions{toc=left}
-\etocstandarddisplaystyle
+\etocclasstocstyle
\etocstandardlines
-\tableofcontents \ref{toc:globalcmds}
+\tableofcontents \ref{toc:tocstyle}
\endgroup
-\section{Another compatibility mode}\label{sec:anothercompat}
+\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.
+As explained in \autoref{subs:compat}, the commands \csb{etocstandardlines}
+and \csb{etocetoclocaltocstyle} tell \etoc to, essentially, act as an
+observer. And it starts in this state initially. The document class layout
+for the table of contents is then perfectly obeyed (well, hopefully). There
+is no way \emph{if remaining in this compatibility mode} to customize this
+standard layout (change fonts, margins, vertical spacings, etc...) from within
+the package.
+
+For customizing \emph{while remaining in the compatibility mode}, 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:
+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,
@@ -2778,123 +4381,138 @@ the document class defaults:
\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.
+One only needs
+to use within the arguments of \csb{etocsetstyle} the \LaTeX{} standard
+\csa{l@chapter}, \csa{l@section}, etc... re-constituting their arguments using
+\csb{etocname}, \csb{etocnumber}, \csb{etocpage} as one wishes.
+Here is an example. Include in the preamble:
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\makeatletter
-\newcommand{\MyStandardTOC}{%
+\newcommand{\MyLocalTOC}[1][section]{%
\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
+ \etocsetstyle{subsubsection}{}{}
+ {\l@subsubsection{\numberline{\etocnumber}\etocname}{\etocpage}}{}%
+ % etc... if further sectioning units are needed
+ % (i.e. not excluded by tocdepth and actually there in document)
+ % Here #1 defaults to section, meaning this is appropriate
+ % for local TOC in a chapter
+ \etocsettocstyle{\@nameuse{#1}*{Local contents}}
+ {}
+ %
+ \localtableofcontents
\endgroup}
\makeatother
\end{filecontentshere}
-\marginattach{-A}
+\marginattach
+
+Then use \csa{MyLocalTOC} in the document body. It is prepared
+for being local to a \csa{chapter}'s as it typesets the heading of the TOC
+by default as un unnumbered section.%
+%
+\footnote{Parts are handled somewhat differently according to whether
+one uses the standard or other classes; please check the source of these
+classes for what is to emulate here.}
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}
+one can replace |\etocpage| in the code above by |\textcolor{blue}{\etocpage}|.
+
+Only pay attention to using |\makeatletter/\makeatother| as we are handling
+\LaTeX{} macros with the dangerous sign |@| in their names.
+
+To give another example, one sees in \texttt{article.cls} the following
+definition:
+\begin{verbatim}
+\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\end{verbatim}
+The first argument is the level, the second the indent, and the third the
+numwidth (see the \ctanpkg{tocloft} documentation). So if we issue in a
+document using the \texttt{article} class:
+\begin{verbatim}
\makeatletter
-\newcommand*{\MyQuasiStandardTOC}[1]{%
- \begingroup
- \etocsetstyle{section}
+\etocsetstyle{subsection}
+ {]
+ {}
+ {\@dottedtocline{2}{1.5em}{2.3em}{\numberline{etocnumber}\etocname}{\etocpage}}
{}
- {\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}
+\end{verbatim}
+we then basically reconstitute the default rendering. Here is more careful
+code:
+\begin{verbatim}
+\makeatletter
+\etocsetstyle{subsection}
+ {]
+ {}
+ {\@dottedtocline{2}{1.5em}{2.3em}{\etocifnumbered{\numberline{etocnumber}}{}%
+ \etocname}{\etocpage}}
+ {}
+\makeatother
+\end{verbatim}
+Hence one can very easily without any (additional...) package modify the
+hard-coded indent |1.5em| and numwidth |2.3em|. But in general one has to do
+this in a synchronized way also for subsubsections, and for sections. The
+definition of |\l@section| in the \texttt{article} class source is a bit more
+complex.
+
+Nevertheless this technique is probably the fastest (but see the example at
+start of \autoref{sec:linestyles}) to get going with \etoc even if one is
+primarily interested only in its \localtoc, as typesetting local tables of
+contents exactly as global tables of contents is not ideal. For example for a
+local TOC in a section, it looks appropriate to modify the above into
+\begin{verbatim}
+\makeatletter
+\etocsetstyle{subsection}
+ {]
+ {}
+ {\@dottedtocline{2}{0}{2.3em}{\etocifnumbered{\numberline{etocnumber}}{}%
+ \etocname}{\etocpage}}
+ {}
+\makeatother
+\end{verbatim}
+to cancel the indentation. One will have to keep the indents and numwidths in
+sync with similar changes to other line styles, if \csa{contentsline}'s of
+various levels are to be executed.
+
+%
+%
+The number and the name of each entry are each separately an \ctanpkg{hyperref}
+links, 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}.
+
+For a more sophisticated example see \autoref{sec:anothercompatadvanced}.
+
+\begin{shaded}\footnotesize\itshape
+ \textcolor{red}{Attention Please!} The \LaTeX{} kernel is moving towards
+ adding \emph{tagging} to the PDF, in a way mostly automated and transparent
+ to user. \etoc will in due time accompany that evolution but this may mean
+ that it will use for its own the hooks that \LaTeX{} will place for example
+ in \emph{\csa{@dottedtocline}}. So, if the user explicitly also requires
+ usage of \emph{\csa{@dottedtocline}}, this \emph{may} mean that some tagging
+ code would be executed twice, possibly causing some havoc.
+
+ My remark is \emph{purely hypothetical}, as a.t.t.o.w.\@ (2023/02/22) I have
+ only started looking in the matter, and the \LaTeX{} and \ctanpkg{hyperref}
+ TOC related changes have started being visible to developers only a few days
+ ago.
+
+ It may be however, that activating tagging could mean that the simple-minded
+ recycling techniques described in this section will not work. I guess \etoc
+ will always have the possibility to let the user specify that \etoc should
+ not take care itself of the tagging (which it has to do in general, because
+ the \LaTeX{} hooks are located in places such as \emph{\csa{@dottedtocline}}
+ which \etoc does not execute, except if asked to do so as in the example
+ above), so perhaps the techniques here will still work but require some
+ \emph{\csa{etocnotagging}} or some \emph{noetoctagging} option to the
+ \localtoc or \toc commands.\par
+\end{shaded}
-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}
@@ -3035,7 +4653,8 @@ using |pt| as dimensional unit.
}
\makeatother
\end{filecontentshere}
-\marginattach{-A}
+\marginattach
+
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.)
@@ -3095,7 +4714,8 @@ TOC at end of document one will naturally have to issue again
}% end of \TOClocalstyle
\makeatother
\end{filecontentshere}
-\marginattach{-B}
+\marginattach
+
As mentioned previously, this handles non-numbered (multi-line) sectioning
units somewhat differently from what happens in the standard document classes.
@@ -3135,24 +4755,24 @@ line styles and some colors added (it has been put in a float which appears
\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
+ This is a table of contents \`a la \etoc, but for
+ the subsections and subsubsections of \autoref{sec:tocstyle}.
+ 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}
+\tableofcontents \label{toc:b} \ref{toc:tocstyle}
\end{figure}
\endgroup
\end{filecontentshere}
-\marginattach{-A}
+\marginattach
\filecontentsexec\filecontentsheremacro
-\section{Another TOC with a background color}\label{ssec:again}
+\section{Another TOC with 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
@@ -3244,20 +4864,22 @@ code is used also for \hyperref[toc:clone]{this other toc}.
{}
\etocframedstyle[1]{}
-\tableofcontents \label{toc:floating} \ref{toc:overview}
+\tableofcontents \label{toc:floating} \ref{toc:part:styling}
\vspace{-\baselineskip}
-\centeredline{|\tableofcontents \ref{toc:overview}|
+\centeredline{|\tableofcontents \ref{toc:part:styling}|
(\emph{cf.} \hyperref[toc:clone]{this other toc})}
\end{figure}
\end{filecontentshere}
-\marginattach{}
+\marginattach
\filecontentsexec\filecontentsheremacro
+The table of contents produced by this code appears on \vpageref{toc:floating}.
\section{A (crazy) inline display}
+\label{sec:crazy}
-Let us finally make some crazy inline display of the table of
-contents of this entire document. We will typeset the subsections as
+Let us construct 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).
@@ -3298,22 +4920,130 @@ many matters do not seem to be widely shared).
\filecontentsexec\foo
The code used:
-\filecontentsprint\foo
-\marginattach{}
+\filecontentsprintviascan\foo
+\marginattach
+
+\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:tocstyle}
+\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.
+
+% 1.2 doc: commenté out to avoid a new page
+% ah non finalement car cause TOC as a tree d'être sur page impaire,
+% ce qui est moins bien à cause des overlap.
+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 {surprising}
-\part{Surprising uses of \etoc}
+\etocdepthtag.toc {advanced}
+\part{Advanced examples}
\label{part:surprising}
\thispartstats %% (pas de sous-section)
-\etocstandardlines
+\etocdefaultlines
\etocsettocstyle {}{}
\localtableofcontents
\section{The TOC of TOCs}
+\label{sec:tocoftocs}
\begingroup % \endgroup just after the \tableofcontents command
\etocinline
@@ -3334,7 +5064,8 @@ displayed within this document:\footnote{The TOCs put in
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
+\tableofcontents
+\endgroup. And to obtain
it here we just wrote:\par\smallskip
{\leftskip1cm\rightskip2cm
\ttfamily\small\baselineskip11pt \noindent Here is the
@@ -3395,8 +5126,12 @@ it here we just wrote:\par\smallskip
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
+ also did%
+%
+\centeredline{\csb{etocsetstyle}\{visibletoc\}\{\csb{etocskipfirstprefix}\}%
+ \{, \}\{\string\etocname\}\{\}}
+%
+ which defines an inline display with the comma (plus space)
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.
@@ -3427,7 +5162,7 @@ Here is the numbered and linked list of all tables of contents which are
displayed within this document: \tableofcontents.
\endgroup
\end{filecontentshere}
-\marginattach{}
+\marginattach
\endgroup
After |\etocsetstyle{visibletoc}{..}{..}{..}{..}|, all future TOCs (not in
@@ -3506,7 +5241,7 @@ typeset with the following code:
\tableofcontents
\endgroup
\end{filecontentshere}
-\marginattach{}
+\marginattach
A related command \csb{etocimmediatetoccontentsline} (and its starred version)
is also provided. For discussion and the meaning of ``immediate'', refer to
@@ -3514,31 +5249,30 @@ 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?
+Using \ctanpkg{tikz} and the package \ctanpkg{forest} we shall display the
+table of contents of \autoref{part:styling} 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 \csa{toks} variable, with all the instructions to be executed
+later. \textsc{Leslie Lamport}'s book has no mention whatsoever of such token
+lists registers, 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
+to maintain the correct \ctanpkg{hyperref} hyperlinks.
+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.}
+\normalmarginpar\marginpar{\footnotesize\rmfamily\itshape\RaggedRight
+At \etocrelease{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
@@ -3557,7 +5291,7 @@ which will be given the contents of |\treetok|.
\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
% \newtoks\treetok % put this (uncommented) preferably in the preamble
% \newtoks\tmptok % (idem)
-
+\begingroup
\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
#1\expandafter\expandafter\expandafter
{\expandafter\the\expandafter #1#2}}
@@ -3587,7 +5321,7 @@ which will be given the contents of |\treetok|.
{\appendtotok\treetok{ ]}}
\etocsettocstyle
- {\treetok{[{\hyperref[part:overview]{Overview}}}}
+ {\treetok{[{\hyperref[part:styling]{The \etoc styling commands}}}}
{\global\appendtotok\treetok{ ]}}
% forest does not like @\the\treetok if \treetok is empty. On first latex
@@ -3596,31 +5330,35 @@ which will be given the contents of |\treetok|.
% TOC yet. So we must give a safe default value to \treetok
\treetok{[{run latex again}]}
-\begin{figure}[th!]\centering
+\begin{figure}[htbp!]
+\centering
\etocsetnexttocdepth{subsection}
- \tableofcontents \label{toc:forest}\ref{toc:overview}
+ \tableofcontents \label{toc:forest}\ref{toc:part:styling}
\hypersetup{hidelinks}%
\bracketset{action character=@}
+% manual adjustments to fit the printed page
+% \kern-1cm
+\noindent\kern-3cm
\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}}{},
+ before computing xy={l=6cm}}{},
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}
+\endgroup
\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{}
+appears \vpageref[above]{toc:forest}. Here is the code used for its
+production: \filecontentsprintviascan\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
@@ -3646,11 +5384,9 @@ typesetting:
\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.
+\item typesetting of the TOC as a table without benefiting from
+ \csb{etocglobaldefs} (see \autoref{ssec:tocastableold}).
+\item and the examples in the next section.
\end{itemize}
@@ -3670,79 +5406,110 @@ 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.
-
+\let\appendtotok\relax
+\let\treenode\relax
+\let\appendchildtree\relax
+\let\preparetreenode\relax
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
% \newtoks\treetok % put this (uncommented) preferably in the preamble
-% \newtoks\sectiontok
% \newtoks\subsectiontok
-\newcommand*{\treenode}{}
+% \newtoks\subsubsectiontok
+% Attention: this code has been prepared only for subsections
+% and subsubsections.
+
+\newcommand*{\treenode}{}% only to make sure our \edef's do not overwrite
+ % an existing command
+
+% expands 2nd argument (macro) and appends it to 1st argument (toks)
+\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
+ #1\expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter #1#2}}
+% appends 2nd argument contents (toks) as child of first argument (toks)
\newcommand*{\appendchildtree}[2]{% token list t1 becomes: t1 child {t2}
\edef\tmp{\the#1 child {\the#2}}%
#1\expandafter{\tmp}%
}
+% prepare the (hyperlinked) number in the "node (number)" shape
\newcommand*{\preparetreenode}{%
- \tmptok\expandafter{\etocthelinkednumber}% expanded one time (mandatory)
+ \tmptok\expandafter{\etocthelinkednumber}% expanded once (needed)
\edef\treenode{node {\the\tmptok}}%
}
-\etocsetstyle{section}
+\etocsetstyle{subsection}
{\etocskipfirstprefix}
- {\appendchildtree\treetok\sectiontok}
- {\preparetreenode \sectiontok\expandafter{\treenode}}
- {\appendchildtree\treetok\sectiontok}
+ {\appendchildtree\treetok\subsectiontok}
+ {\preparetreenode
+ \subsectiontok\expandafter{\treenode}}
+ {\appendchildtree\treetok\subsectiontok}
-\etocsetstyle{subsection}
+\etocsetstyle{subsubsection}
{\etocskipfirstprefix}
- {\appendchildtree\sectiontok\subsectiontok}
- {\preparetreenode \subsectiontok\expandafter{\treenode}}
- {\appendchildtree\sectiontok\subsectiontok}
+ {\appendchildtree\subsectiontok\subsubsectiontok}
+ {\preparetreenode
+ \subsubsectiontok\expandafter{\treenode}}
+ {\appendchildtree\subsectiontok\subsubsectiontok}
\etocsettocstyle
- {\treetok{\node {\hyperref[part:overview]{Overview}}}}
+ {\treetok{\node {\hyperref[sec:linestyles]{Line styles}}}}
{\global\appendtotok\treetok{ ;}}
-\begin{figure}[thbp!]\centering
- \etocsetnexttocdepth{subsection}
- \tableofcontents \label{toc:molecule} \ref{toc:overview}
- \hypersetup{hidelinks}%
+\centeredline{% from package centeredline (limits scope of \hypersetup)
+ \etocsetnexttocdepth{subsubsection}
+ \etocinline\tableofcontents \label{toc:molecule} \ref{toc:tocstyle}
+ \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}
+ (\tikzparentnode) --(\tikzchildnode)}]
+ \the\treetok
+ \end{tikzpicture}%
+}
\end{filecontentshere}
-\marginattach{}
+\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
+The |\tableofcontents| command is executed prior to the |tikzpicture|
+environment which will actually typeset it via insertion of the accumulated
+data in the \csa{toks} register \csa{treetok}. This
+\hyperref[toc:molecule]{TikZ TOC} is fully hyperlinked, like the previous
\hyperref[toc:forest]{Forest TOC}.
+% Mercredi 01 mars 2023 à 23:27:29
+% arrrrrrgggghhh
+% desperate attempt to avoid an annoying varioref "may loop" error.
+% at last minute, arose from a suppression of a paragraph a few
+% dozen pages earlier.
+% [76]
+
+% ! Package varioref Error: \vref or \vpageref at page boundary 65-66 (may loop).
+
+% See the varioref package documentation for explanation.
+% Type H <return> for immediate help.
+% ...
+
+% l.6114 appears \vpageref{toc:mindmap}
+
+% mais ça n'a pas suffit. Bon 10 minutes de perdues je vais déplacer la ligne.
+
+\enlargethispage{3\baselineskip}
+Another example:
+
\etocsettocstyle
- {\treetok{\node {\autoref{part:globalcmds}}}}
+ {\treetok{\node {\autoref{sec:tocstyle}}}}
{\global\appendtotok\treetok{ ;}}
-\etocsetnexttocdepth {subsection}
-\tableofcontents \ref{toc:globalcmds}
+\etocsetnexttocdepth {subsubsection}
+\tableofcontents \ref{toc:tocstyle}
-\noindent
-\parbox{4cm}{\hypersetup{hidelinks}%
+\centeredline{%
+\hypersetup{hidelinks}
\begin{tikzpicture}
[grow cyclic,
level 1/.style={level distance=2.5cm,sibling angle=60},
@@ -3751,60 +5518,35 @@ previous
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}
+ \end{tikzpicture}
+}%
+%
+The above is the fully hyperlinked table of contents of
+\autoref{sec:tocstyle}.
\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.}
+primitive \csa{unexpanded} will simplify the code.%
+%
-\let\appendchildtree\relax
+\let\partnode\relax
\let\childnode\relax
\let\appendtotok\relax
+\let\appendchildtree\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*\partnode {} % check with \newcommand we will not 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*\tmprotate {} % (idem)
+\newcommand*\tmpoption {} %
+\newcommand*\tmpstuff {} %
\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
#1\expandafter\expandafter\expandafter{\expandafter\the\expandafter #1#2}}
@@ -3831,7 +5573,7 @@ example was motivated on |2015/03/11| by
\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= teal!30}% first
\or \appendchildtree\treetok\parttok {branch color= yellow!80}% second
\else\appendchildtree\treetok\parttok {branch color= green!50}% third and next ...
\fi\fi
@@ -3873,16 +5615,14 @@ example was motivated on |2015/03/11| by
% 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}
+% use of depth tags to cut out sections for most parts, the sections
+% are too numerous to fit well with the circular growth
+\etocsettagdepth {preamble} {part}
\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 {styling} {part}
+\etocsettagdepth {control} {part}
+\etocsettagdepth {examples} {part}
+\etocsettagdepth {advanced} {part}
\etocsettagdepth {etocandworld}{part}
\etocsettagdepth {code} {section}
@@ -3893,7 +5633,8 @@ example was motivated on |2015/03/11| by
}
}%
-\begin{figure}[thp!]
+\begin{figure}[htbp!]
+\etocobeydepthtags % obey the depth tags restrictions (which is default anyhow)
\tableofcontents\label{toc:mindmap}%
\centeredline{\resizebox{.85\paperwidth}{!}%
{\begin{tikzpicture}[mindmap,
@@ -3903,25 +5644,29 @@ example was motivated on |2015/03/11| by
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 1/.append style={level distance=5cm,sibling angle=45, 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}.
+\etoc \hyperref[etocdepthtag.toc]{depth tags}.
+
+% The fully hyperlinked TOC
+% appears \vpageref{toc:mindmap}.
+
+\filecontentsprintviascan\foo
+\marginattach
+
+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
@@ -3935,30 +5680,28 @@ example), this demo will write it out to file with extension
\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:
+% With release \etocrelease{1.08} it is easier to typeset a TOC as a table.
+It is possible to open a \texttt{tabular} (or \texttt{longtable}) 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 |\\|.
+But 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 \textbf{mandatory} to issue \csb{etocglobaldefs} for \etoc's
+ definitions of \csb{etocname} et al. to have global scope, i.e. not be
+ extinguished on encountering a |&|,
\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}).
+ \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
@@ -3967,8 +5710,8 @@ conditions and a few caveats:
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.
+Here is an example of a TOC as a |longtable|. Yes this is only \emph{one} table!
+The code follows.
\begin{filecontentsdef}{etocsnippet-\snippetno.tex}{\foo}
\begingroup
@@ -4002,7 +5745,7 @@ as is possible relatively simply now with |1.08|. The code follows.
{}
{}
{\\\hline\multicolumn{3}{c}{\bfseries\vrule height6ex depth3ex width0pt
- \etocifnumbered{\etocnumber. }{}\etocname}}
+ \makebox[0pt]{\etocifnumbered{\etocnumber. }{}\etocname}}}
{}
\etocsetstyle{section}
@@ -4035,8 +5778,9 @@ as is possible relatively simply now with |1.08|. The code follows.
\filecontentsexec\foo
-\filecontentsprint\foo
-\marginattach{-A}
+\filecontentsprintviascan\foo
+\marginattach
+
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
@@ -4084,8 +5828,8 @@ contents.
{}
\etocsettocstyle
- {\hypersetup{hidelinks}\begin{tabular}{|p{4cm}|c|c|}\hline
- \multicolumn{1}{|c|}{\bfseries Section}&
+ {\hypersetup{hidelinks}\begin{tabular}{|>{\RaggedRight}p{4.5cm}|c|c|}\hline
+ \multicolumn{1}{|c|}{\bfseries Section title}&
\bfseries number&
\bfseries page}
{\\\hline\end{tabular}}
@@ -4099,8 +5843,8 @@ contents.
\filecontentsexec\foo
-\filecontentsprint\foo
-\marginattach{-B}
+\filecontentsprintviascan\foo
+\marginattach
\section{A TOC self-adjusting widths for its typesetting}
\label{sec:thirdexampleextra}
@@ -4138,13 +5882,15 @@ automatically the ``numwidths'' used for typesetting the unit numbers in the
{\setbox0\hbox{\etocthenumber\kern#2}}
{\ifdim\wd0>\TOCnumwidthG\edef\TOCnumwidthG{\the\wd0}\fi}{}%
%
- \etocsettocstyle{}
+ \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}%
+ \global\let\TOCnumwidthG\TOCnumwidthG
+ }% make the found maximal widths have global scope
\etocnopar
\csname #1tableofcontents\endcsname
\typeout{Next TOCs will use \TOCnumwidthB\space for chapter number width}%
@@ -4153,7 +5899,7 @@ automatically the ``numwidths'' used for typesetting the unit numbers in the
\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
+ \endgroup % matches \begingroup at start of definition
}%
\newcommand*\TOCcomputenumwidths [1][0.5em]{%
\TOCcompute@numwidths {}{#1}%
@@ -4163,7 +5909,8 @@ automatically the ``numwidths'' used for typesetting the unit numbers in the
}%
\makeatother
\end{filecontentshere}
-\marginattach{}
+\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
@@ -4195,1543 +5942,6 @@ Notes:
|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}
@@ -5760,7 +5970,7 @@ this technique):
\begingroup
\etocdefaultlines
-\etocstandarddisplaystyle
+\etocclasstocstyle
\etocsetlevel{book}{3}
\etocsetlevel{part}{3}
\etocsetlevel{chapter}{3}
@@ -5845,7 +6055,8 @@ But first, the code of \csa{thispartstats}:\par
\endgroup
}
\end{filecontentshere}
-\marginattach{-A}
+\marginattach
+
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}
@@ -5877,14 +6088,14 @@ stands here is for using within a section).
}
\makeatother
\end{filecontentshere}
-\marginattach{-B}
+\marginattach
\section{Using depth tags}
-\label{ssec:tocwithdepthtags}
+\label{sec: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}
+include), and will additionally open up \autoref{sec:tocstyle}
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
@@ -5947,17 +6158,14 @@ get:
{\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}
+\etocsettagdepth {preamble} {all}
+\etocsettagdepth {overview} {part}
+\etocsettagdepth {styling} {subsection}
+\etocsettagdepth {control} {subsubsection}
+\etocsettagdepth {examples} {part}
+\etocsettagdepth {advanced} {part}
+\etocsettagdepth {etocandworld}{all}
+\etocsettagdepth {code} {all}
\renewcommand\etoctoprule {\hrule height 3pt\relax }
\renewcommand\etoctoprulecolorcmd {\color{blue}}
\renewcommand\etocaftercontentshook
@@ -5965,22 +6173,126 @@ get:
\etocruledstyle [1]{\Large\bfseries
\fbox{\makebox[8cm]{A TOC using depth tags}}}
\sloppy
+\etocobeydepthtags % let's not forget to activate this (default anyhow)
\tableofcontents
\endgroup
\end{filecontentsdef}
\filecontentsexec\foo
-\filecontentsprint\foo
-\marginattach{}
+\filecontentsprintviascan\foo
+\marginattach
+
+\section{Sections styling subsections}
+\label{sec:anothercompatadvanced}
+
+Here is a subtler example where one only marginally modifies the sections
+(adding color to the number, removing the \ctanpkg{hyperref} link, changing
+the color for one specific section) but let them decide almost one by one
+of the style which will be followed by their subsections. Furthermore one
+configures some sections to decide they will not display subsections at all or
+only count how many there are!
+
+% modified for 1.2 doc to make the argument optional and update number
+% of exceptional section
+
+\begin{filecontentshere}{etocsnippet-\snippetno.tex}
+\makeatletter
+\newcommand*{\MyQuasiStandardTOC}[2][]{%
+ % #1 is an optional "\ref{somelabeltoanothertoc}"
+ % #2 is the number of some exceptional section
+ \begingroup
+ \etocsetstyle{section}
+ {}
+ {\etociffirst{% Suppress display of subsections for the first section!
+ \etocsetlevel{subsection}{6}}
+ {\etocsetlevel{subsection}{2}}%
+ \ifnum\etocthenumber=#2 % Handle especially section number #2 !
+ \etocsetstyle{subsection}
+ {\def\foo{}\par\nopagebreak\begingroup
+ \leftskip2em \rightskip\@tocrmarg
+ \parfillskip \@flushglue
+ \parindent 0pt
+ \normalfont\normalsize\rmfamily\itshape
+ \etocskipfirstprefix}
+ {\allowbreak\,--\,}
+ {\edef\foo{\the\numexpr\foo+1}\etocname\ \textup{(\etocnumber)}}
+ {.\par \upshape My AI counted circa \foo\space subsections,
+ was it right?\par\endgroup}%
+ \else
+ \ifnum\etocthenumber>#2 % Only count subsections in those sections !
+ \etocsetstyle{subsection}
+ {\def\foo{}}%
+ {\edef\foo{\the\numexpr\foo+1}}%
+ {}%
+ {\leftskip2em \emph{There are \foo\space subsections here,
+ but I will need payment to display them.}\par}%
+ \else
+ \etocsetstyle{subsection}
+ {}%
+ {}%
+ {\l@subsection{\numberline{\etocnumber}\etocname}{\etocpage}}%
+ {}%
+ \fi
+ \fi
+ }%
+ {% Display in a special color the number of the special section!
+ \l@section{\numberline{{\ifnum\etocthenumber=#2
+ \color{red}\else\color{cyan}\fi\etocthenumber}}%
+ \etociffirst{\etocname\space (SUBSECTIONS SKIPPED)}{\etocname}}
+ {\etocpage}}%
+ {}%
+ \etocclasstocstyle % will use the ambient document class
+ % special KOMA-script customization as this document uses scrartcl
+ % and we need to enlarge numwidth for some subsections
+ \DeclareTOCStyleEntry[numwidth=2em,indent=0pt]{tocline}{section}
+ \DeclareTOCStyleEntry[numwidth=2.5em,indent=2em]{tocline}{subsection}
+ \etocsetnexttocdepth {subsection}%
+ \tableofcontents #1
+ \endgroup
+}
+\makeatother
+\end{filecontentshere}
+
+\marginattach
+\filecontentsexec\filecontentsheremacro
+
+The optional argument stands for a suitable |\ref|, see \autoref{sec:labeling}.
+Here is what
+\begin{verbatim}
+\MyQuasiStandardTOC[\ref{toc:part:styling}]{11}% treat especially section 11
+\end{verbatim}
+gives:
+\MyQuasiStandardTOC[\ref{toc:part:styling}]{11}%
+
+\vskip.5\baselineskip
+
+The page heading (on the page where this TOC appears) may have been modified
+as is expected from usage of \csb{etocclasstocstyle} in the code.
+
+Sections are printed exactly as in the default, \emph{except} that a special
+section number is displayed especially and that its subsections are then
+displayed inline! And other sections may only count subsections or
+ignore them altogether!
+
+Note: for this code to work the macro \csa{thesection} \emph{must} not have
+been modified from its default which produces simply arabic digits. In other
+terms it must be usable as \TeX{} number denotation. Typically this would
+fail if we were handling subsections as their number in the |.toc| file will
+be typically something like |3.7| which does not work in a \TeX{} integer-only
+context. But it is possible to use a counter and configure the line styles to
+increment it, and use its value.
+
+
-\section{Typesetting the TOC as a table (the old way)}
+\section{The TOC as a (long) table (alternative)}
\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|.
+table with \etoc, prior to release to the addition of \csb{etocglobaldefs} at
+\etocrelease{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
@@ -5996,9 +6308,10 @@ 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.}
+\footnote{At release \etocrelease{1.09f} the design anb contents of the TOC
+ from \autoref{sec:tocastable} were modified; the code here, if executed,
+ which will not, 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
@@ -6016,6 +6329,10 @@ 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}.
+\let\appendtotok\relax
+\let\PreparePart\relax
+\let\PrepareSection\relax
+\let\PrepareSubsection\relax
\begin{filecontentshere}{etocsnippet-\snippetno.tex}
\newtoks\toctabletok
\newcommand*\appendtotok[2]{% #1=toks variable, #2=macro, expands once #2
@@ -6035,7 +6352,7 @@ Note: rather than |\toks| registers it would be easier here to use \eTeX{}
\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}%
@@ -6064,18 +6381,23 @@ Note: rather than |\toks| registers it would be easier here to use \eTeX{}
\the\toctabletok
\endgroup
\end{filecontentshere}
-\marginattach{}
+\marginattach
\clearpage
\etocdepthtag.toc {etocandworld}
+\part{\etoc and the world}
-\part{\etoc and the outside world}
+\etocsettocstyle{}{}
+\etocdefaultlines % etoc own default
+\localtableofcontents
\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
+\etoc once, at the time of |\begin{document}|.%
+%
+\footnote{%
+ Versions earlier than \etocrelease{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.}
@@ -6116,28 +6438,38 @@ Also a |\else| immediately following \csa{tableofcontents} or
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},
+\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
+ |.toc| file does
not use the \csa{contentsline} macro or if the \csa{contentsline} macro
- does not invoke the \csa{l@<divisionunit>} macros.
+ second argument mixes number and name in a manner unexpected by \etoc.%
+%
+\footnote{Prior to \etocrelease{1.1a}, \etoc required the \csa{contentsline} macro
+ expansion to invoke \csa{l@section} et al. It now does not expand
+ \csa{contentsline} hence is immune to whatever would happen during this
+ expansion, and does not use nor modify the \csa{l@section} et al.\@ 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
+\etocrelease{1.05} of |2012/12/01|.%
+%
+\footnote{That this is still in the doc on \texttt{2023/02/22} shows
+ the frequency of \etoc syncing with upstream changes... but let me reassure
+ the reader there has
+ been indeed some occasional, although admittedly rare, internal updates
+ in the more than ten years elapsed since.}
+%
+A compatibility layer is required for what this
+document designates as the ``global display style'': \etoc tries to emulate the
+default behaviour of the document class when \csb{etocsettocstyle} has not
+been used, so that it is still in ``compatibility mode''. 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.
@@ -6151,19 +6483,18 @@ 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}}{}
+ {\renewcommand*\etocclasstocstyle{\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|).
+for basic usage in compatibility mode. See further \autoref{ssec:tocbasic}.
\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
+Release \etocrelease{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
@@ -6173,50 +6504,10 @@ 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.
+With release \etocrelease{1.2} some issues which were previously described here
+when the ``to toc'' feature of \ctanpkg{memoir} was left acting on local TOCs
+have been resolved, as an after-effect of the support for
+\etocoption{localtoctotoc} etc..., see \csb{etocsetup}.
\subsection{Compatibility with \ctanpkg{beamer}}
@@ -6251,14 +6542,15 @@ 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}}
-\subsection{Com\-pat\-i\-bil\-ity with \ctanpkg{multicol}}
+\subsection{Compatibility with \ctanpkg{multicol}}
\etoc loads the package \ctanpkg{multicol}.
\subsection{Compatibility with \ctanpkg{tocloft}}\label{subs:tocloft}
-Release |1.07k| added compatibility with package
+Release \etocrelease{1.07k} added compatibility with package
\ctanpkg{tocloft}: steps are
taken to prevent the redefinition of |\tableofcontents| done by
\ctanpkg{tocloft} at |\begin{document}|.
@@ -6269,7 +6561,7 @@ 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
+\csb{etocstandardlines} and \csb{etocclasstocstyle}. In this
compatibility mode |\etocsetlevel{division unit}{6}| will render
invisible the chosen division level, but exchanging levels is otherwise
not possible.
@@ -6286,6 +6578,14 @@ It is possible to modify midway in the document the macros \csa{l@section},
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{tocbibind}}\label{subs:tocbibind}
+
+Added at \etocrelease{1.2}. See also \csb{etocsetup} for a discussion of the
+ package options which are all related to this (they will achieve the
+ \ctanpkg{tocbibind} ``to toc'' features without requiring the package).
+
+Thanks to Denis Bitouzé for feature request.
+
\subsection{Compatibility with \ctanpkg{tocvsec2}}
\etoc used to be incompatible with package
@@ -6300,7 +6600,7 @@ customizations). It will have no effect on true \etoc TOCs.
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
+\etocrelease{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.
@@ -6312,10 +6612,44 @@ 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}}
+\subsection{Compatibility with \ctanpkg{tocbasic}}
+\label{ssec:tocbasic}
-Unknown. (not tested a.t.t.o.w).
+(doc last updated for \etocrelease{1.2})
+This has only been tested to the extent of production of this PDF file (which
+does have dozens of TOCs, among them a few in compatibility mode). I
+noticed that some things required the global display style to also be set
+to compatiblity mode for some \ctanpkg{KOMA-script} user interface to produce
+the desired effect. As an example, the local table of contents of
+\autoref{sec:testingcompat} uses |\KOMAoptions{toc=left}| and
+\csb{etocstandardlines} but it had to use also \csb{etocclasstocstyle}:
+\begin{verbatim}
+\begingroup % to keep in particular toc=left with local effect
+\KOMAoptions{toc=left}
+\etocclasstocstyle % necessary for the display to obey toc=left
+\etocstandardlines
+\tableofcontents \ref{toc:tocstyle}
+\endgroup
+\end{verbatim}
+On the other hand I could use some other interface without having to activate
+the compatibility for the global display style. See \hyperref[toc:d]{the example} from
+\autoref{sec:labeling} or the one from the \autoref{part:control} which uses
+\begin{verbatim}
+\begingroup
+\etocsettocstyle{}{}
+\DeclareTOCStyleEntry[numwidth=2em,indent=0pt]{tocline}{section}
+\DeclareTOCStyleEntry[numwidth=2.5em,indent=2em]{tocline}{subsection}
+\DeclareTOCStyleEntry[numwidth=3em,indent=4.5em]{tocline}{subsubsection}
+\etocstandardlines
+\localtableofcontents
+\endgroup
+\end{verbatim}
+and demonstrates that this interface works also when not using the
+compatibility mode from \csb{etocclasstocstyle}. Of course, here the
+display style is a bit plain... but the \hyperref[toc:d]{example} of
+\autoref{sec:labeling} less so; it uses about the same TOCStyleEntry lines as
+above with some more width for the numbers of subsections.
\section{\TeX nical matters}
@@ -6328,7 +6662,7 @@ 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
+They were modified at \etocrelease{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.
@@ -6376,6 +6710,12 @@ contents will be displayed only on the second compilation.
\normalmarginpar\marginparwidth72bp
\part{The code}
+% return to single spacing
+\setstretch{1}
+
+\etocdefaultlines
+\etocsettocstyle{}{}
+
\localtableofcontents
% IL FAUT METTRE AVANT \section{Timestamps} SINON FOUTU
@@ -6418,6 +6758,7 @@ contents will be displayed only on the second compilation.
}
\fi
\makeatother
+
\section{Timestamp}
This is the documentation as of \texttt{\etocdocdate}, printed from the
@@ -6446,7 +6787,10 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
\parindent \z@
\parfillskip \@flushglue
\parskip \tw@\p@ plus 1fil\relax
- \let \do \@makeother \dospecials \makestarlowast \catcode`$ \active
+ \let \do \@makeother
+ \dospecials
+ \makestarlowast
+ \catcode`$ \active
\begingroup\lccode`~`$
\lowercase{\endgroup\def~[##1]{\foreignlanguage{ngerman}{##1}}}%
\catcode`^ \active
@@ -6455,9 +6799,12 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
% 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/30, I remove all "v"'s from version numbers.
+% 2023/01/25, creating hypertargets
+ \begingroup\lccode`~32
+ \lowercase{\endgroup
+ \def\1##1~{\vskip\baselineskip\hypertarget{v1##1}{1##1}~}}%
% 2022/08/26, stop using \frenchspacing
% \frenchspacing
% 2023/01/14
@@ -6483,6 +6830,8 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
\makeatother
\begin{multicols}{2}
+% un \raggedcolumns ne fonctionne pas vraiment pour faire de l'alignement
+% de grid à cause du \parskip
\makeatletter
\everypar{\leftskip\jfverbadim\bgroup
\def\par{\egroup\jfverbadim\z@\@@par}%
@@ -6492,8 +6841,84 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
\begingroup\obeyspaces\def\x{\endgroup%
\def {\ifvmode\advance\jfverbadim.5em\relax\else\expandafter\jfverbaspace\fi}}\x
\makeatother
+\vskip-\baselineskip
\begin{jfverbatim}
-1.1c [2023/01/20]^
+~1.2 [2023/03/01]^
+
+ \locallistoffigures and \locallistoftables.
+
+ It is for time being required to pass options `lof', resp. `lot'
+ at package loading time to activate these features. Whether or
+ not these features are enabled, etoc interferes in absolutely no
+ way with \listoffigures and \listoftables and their respective
+ auxiliary files.
+
+ Boolean options (and utility \etocsetup) `maintoctotoc',
+ `localtoctotoc', `localloftotoc', `locallottotoc', and
+ `ouroboros'. For above reasons, no `mainloftotoc' or
+ `mainlottotoc'. With `ouroboros=false` local TOCs whose heading
+ has been added to the `.toc' file due to `localtoctotoc` will show
+ deeper ones and the local `lists of' from their own level, but not
+ themselves.
+
+ Compatibility layer with `tocbibind'. Thanks to Denis Bitouzé for
+ feature request many years ago. Sorry for the delay!
+
+ New feature (and breaking change): local tables of contents
+ in the default package configuration auto-adapt their titles
+ to use the appropriate unnumbered division heading (for example
+ a \subsection* if inside a \section).
+
+ Formerly, it was intended one would use \etocsettocstyle (or
+ higher level commands), else local TOCs were rendered using the
+ same emulation of the document class as for the main TOC. One can
+ still require this document class emulation but then etoc tries at
+ least to adapt to the division unit one level below \part (i.e.
+ \chapter or \section). E.g., for KOMA-script the option
+ `leveldown' is used. But this is not appropriate for deeper
+ levels in general.
+
+ Ultimate control of toc titling can still be achieved via
+ \etocsettocstyle. Many commands have been added to ease its
+ usage. It is also possible to customize the default behavior
+ without \etocsettocstyle.
+
+ Details of the user interface and produced output from these novel
+ commands and options are susceptible to change. Use at own risk.
+
+ Bugfix: the emptiness check could fail for
+ \localtableofcontentswithrelativedepth as it ignored tocdepth changes
+ originating from inside the .toc file, contrarily to the actual
+ typesetting (and behavior with other local tocs)
+
+ Bugfix: the \tableofcontents\ref{foo} syntax caused a
+ ``Missing number'' after \vpageref{foo} from package varioref
+ in certain circumstances due to \r@foo having then acquired a
+ value with an unexpected non-numerical first chunk.
+
+ Breaking change: the \etocsavedsectiontocline et al. macros
+ which raised a deprecation warning since 1.1a now use an
+ error message.
+
+ \expanded primitive is required.
+
+~1.1d (not released, part of 1.2)^
+
+ Complete internal refactoring of the legacy core code behind
+ the concept of ``start'' and ``finish'' parts for line styles.
+
+ \etocifunknownlevelTF and \etoclevel abstract away some
+ internals and may be useful for class or package authors.
+
+ \etocsetlevel filters out forbidden keywords `all', `none' and
+ others. Its second argument can be an expression.
+
+ \etocsetstyle checks and warns appropriately if the level is
+ unknown to etoc or has a non-accepted numerical value.
+
+ Extensive refactoring of the documentation.
+
+~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
@@ -6628,7 +7053,8 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
Syncs with KOMA-script deprecation of \iftocfeature.
-~1.09a, 1.09b [2019/11/17]^
+~1.09b [2019/11/17]^~par~nobreak~vskip-~parskip~vskip-~baselineskip
+~1.09a ^
Sync with memoir v3.7i which has a better location of the TOC
hyperref anchor. The \etocaftertitlehook can now freely be
@@ -6648,9 +7074,9 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
~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).
+ 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]^
@@ -6902,7 +7328,7 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
grateful thanks to all!
-~1.07l [2014/04/22]^
+~vskip~baselineskip1.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
@@ -7125,7 +7551,13 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
% 9 mars 2015
% Pour rappel on avait dans le préambule:
% \def\MacroFont{\ttfamily\small\hyphenchar\font45 \baselineskip11pt\relax}
+% 28 février 2023
+% Mis à jour
+% \def\MacroFont{\ttfamily\hyphenchar\font45\relax\setstretch{1}}
% ce qui donne donc le \macro@font qui sera utilisé.
+% J'ai déjà fait \setstretch{1} au déput de la partie The code, donc
+% je peux le supprimer ici
+\def\macro@font{\ttfamily\hyphenchar\font45\relax}
% 26 septembre 2021
\catcode1 14 % pour pouvoir utiliser ^^A, car je l'avais mis à \active
@@ -7354,6 +7786,10 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
% let code line numbers really be fully in the margin
\MacroIndent\z@
+% 2023/02/22, 1.2 uses setspace
+% 2023/02/27, I return to single line spacing finally
+%\AddToHook{env/macrocode/before}{\vskip.5\baselineskip}
+
\makeatother
% 18 janvier 2023 fix d'un problème de guillements courbes et d'inutilité de upquote,
@@ -7370,6 +7806,7 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
% 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
+\makeatletter
\DeclareRobustCommand\csbc[1]{{\hypersetup{linkcolor=macrocodelinktocodelinecolor}%
\ifcsname r@etocmacro-#1\endcsname
\hyperref[etocmacro-#1]{\ttfamily\hyphenchar\font45 \char`\\ #1}%
@@ -7379,17 +7816,31 @@ version is \texttt{\etocpkgversion}, of \texttt{\etocpkgdate}.
\hyperref[etocmacro-\xintTrimUnbraced{-4}{#1}]
{\ttfamily\hyphenchar\font45 \char`\\ #1}%
\else
- \textcolor{red}{\ttfamily\hyphenchar\font45 \char`\\ #1}%
+% red color was not enough for me to identify misspelled macro names
+% but I should have a warning mechanism, the problem is how to
+% have it activated only at right time?
+ {\fboxsep-\fboxrule\color{Orchid}%
+ %\fbox{\textcolor{red}{\ttfamily\hyphenchar\font45 \char`\\ #1}}%
+ \fbox{\ttfamily\hyphenchar\font45 \char`\\ #1}%
+ }%
+% ah ok let's do this (2023/01/22, 1.2)
+ \ifcsname r@etocmacro-etocname\endcsname
+ \expanded{\noexpand\AtEndDocument
+ {\noexpand\PackageError{etoc}{Pas de référence à #1\on@line}%
+ {Corriger!}
+ }%
+ }%
+ \fi
\fi
\fi }%
}
-
+\makeatother
\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}
+ The ``syntax highlighting'' was added at release \etocrelease{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
@@ -7401,7 +7852,7 @@ 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
+left at \etocrelease{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.
@@ -7428,21 +7879,21 @@ Known limitations:
\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
+the macros do. At \etocrelease{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.
+remain. \etocrelease{1.1c} re-added comments to those parts of the code which
+got refactored at and since \etocrelease{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}
+ package, at \etocrelease{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
+parse the data and extract from it the \emph{name}, \emph{number}, and
\emph{page number}.
%
The \LaTeX{} |.toc| data
@@ -7458,15 +7909,15 @@ there. Things would have been much easier for \etoc in 2012 if the
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.
+differently. Fortunately upstream changes happen rarely.%
%
\normalmarginpar\marginpar{\footnotesize\rmfamily\itshape\RaggedRight
- Prior to \texttt{1.1a}, \etoc aliased \csa{l@chapter},
+ Prior to \etocrelease{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
+ was more complex than it is now. With \etocrelease{1.1a}, \etoc
leaves \csa{l@chapter} etc... unmodified (and unused) and
only hijacks \csa{contentsline}.}
%
@@ -7537,17 +7988,84 @@ of real structure in a \LaTeX{} document body).
%
%</none>
%<*package>
-% |1.1a| implements a radical change to legacy core internals for compatibility
+% \etocrelease{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)]
+[2023/03/01 v1.2 Completely customisable TOCs (JFB)]
+% \end{macrocode}
+% \etocrelease{1.2} adds experimental support (only tested with standard
+% classes and few packages) for \csbc{locallistoffigures} and
+% \csbc{locallistoftables}. Did I say this is experimental? When \LaTeX{}
+% will have added official hook to \csa{addcontentsline}, I will probably
+% revise the way \etoc hacks into it for this \emph{experimental}
+% functionality.
+%
+% As it is \textbf{experimental}, I think we can all agree I don't have
+% to spend too much space documenting it in user manual. So I shall be
+% brief when I will get to it. And I will remain brief here too.
+%
+% Now that \etoc uses package options, I will use \ctanpkg{kvoptions} as I am
+% familiar with it. I understand upstream \LaTeX{} now has support for
+% key-value input, put I simply have had no time to read the interface.
+% Besides not sure it was there for the |2020/10/01| required release.
+% \begin{macrocode}
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{prefix=Etoc@}
+\newif\ifEtoc@lof
+\DeclareVoidOption{lof}{\Etoc@loftrue
+ \PackageInfo{etoc}{Experimental support for \string\locallistoffigures.\MessageBreak
+ Barely tested, use at own risk}%
+}
+\newif\ifEtoc@lot
+\DeclareVoidOption{lot}{\Etoc@lottrue
+ \PackageInfo{etoc}{Experimental support for \string\locallistoftables.\MessageBreak
+ Barely tested, use at own risk}%
+}
+\@ifclassloaded{memoir}{
+\PackageInfo{etoc}
+ {As this is with memoir class, all `...totoc' options\MessageBreak
+ are set true by default. Reported}
+\DeclareBoolOption[true]{maintoctotoc}
+\DeclareBoolOption[true]{localtoctotoc}
+\DeclareBoolOption[true]{localloftotoc}
+\DeclareBoolOption[true]{locallottotoc}
+}{
+\DeclareBoolOption[false]{maintoctotoc}
+\DeclareBoolOption[false]{localtoctotoc}
+\DeclareBoolOption[false]{localloftotoc}
+\DeclareBoolOption[false]{locallottotoc}
+}
+\DeclareBoolOption[true]{ouroboros}
+\DeclareDefaultOption{\PackageWarning{etoc}{Option `\CurrentOption' is unknown.}}
+\ProcessKeyvalOptions*
+\DisableKeyvalOption[action=error,package=etoc]{etoc}{lof}
+\DisableKeyvalOption[action=error,package=etoc]{etoc}{lot}
+\def\etocsetup#1{\setkeys{etoc}{#1}}
+\def\etocifmaintoctotoc{\ifEtoc@maintoctotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\def\etociflocaltoctotoc{\ifEtoc@localtoctotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\def\etociflocalloftotoc{\ifEtoc@localloftotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\def\etociflocallottotoc{\ifEtoc@locallottotoc
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
\RequirePackage{multicol}
-\DeclareOption*{\PackageWarning{etoc}{Option `\CurrentOption' is unknown.}}
-\ProcessOptions\relax
\def\etoc@{\etoc@}
\long\def\Etoc@gobtoetoc@ #1\etoc@{}
\newtoks\Etoc@toctoks
@@ -7563,19 +8081,22 @@ of real structure in a \LaTeX{} document body).
\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
+% \end{macrocode}
+% Some have been renamed at \etocrelease{1.2}.
+% \begin{macrocode}
+\newif\ifEtoc@numbered
\newif\ifEtoc@hyperref
\newif\ifEtoc@parskip
\newif\ifEtoc@tocwithid
-\newif\ifEtoc@standard
+\newif\ifEtoc@standardlines
+% \end{macrocode}
+% These next three added at \etocrelease{1.2}. The latter two for handling
+% compatibility layer with \ctanpkg{tocloft}
+% and \ctanpkg{tocbibind}.\par^^A encore ce problème de ligne supp si plein!
+% \begin{macrocode}
+\newif\ifEtoc@etocstyle
+\newif\ifEtoc@classstyle
+\newif\ifEtoc@keeporiginaltoc
\newif\ifEtoc@skipprefix
\newif\ifEtoc@isfirst
\newif\ifEtoc@localtoc
@@ -7583,93 +8104,149 @@ of real structure in a \LaTeX{} document body).
\newif\ifEtoc@stoptoc
\newif\ifEtoc@notactive
\newif\ifEtoc@mustclosegroup
-\newif\ifEtoc@emptytoc
+\newif\ifEtoc@isemptytoc
\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}
+\def\Etoc@tocext{toc}
+\def\Etoc@lofext{lof}
+\def\Etoc@lotext{lot}
+\let\Etoc@currext\Etoc@tocext
+\def\etocifislocal{\ifEtoc@localtoc\expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi
+ }
+\def\etocifislocaltoc{\etocifislocal{\ifx\Etoc@currext\Etoc@tocext
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi}%
+ {\@secondoftwo}%
+ }
+\def\etocifislocallof{\etocifislocal{\ifx\Etoc@currext\Etoc@lofext
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi}%
+ {\@secondoftwo}%
+ }
+\def\etocifislocallot{\etocifislocal{\ifx\Etoc@currext\Etoc@lotext
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo\fi}%
+ {\@secondoftwo}%
+ }
+% \end{macrocode}
+% Formerly a \LaTeX{} counter |etoc@tocdepth| was declared here but at
+% \etocrelease{1.2} it has been replaced by macro storage.
+% \begin{macrocode}
\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@@
+\expandafter\def\csname Etoc@-2@@\endcsname {-\tw@}
+\expandafter\let\csname Etoc@-1@@\endcsname \m@ne
+\expandafter\let\csname Etoc@0@@\endcsname \z@
+\expandafter\let\csname Etoc@1@@\endcsname \@ne
+\expandafter\let\csname Etoc@2@@\endcsname \tw@
+\expandafter\let\csname Etoc@3@@\endcsname \thr@@
+\expandafter\chardef\csname Etoc@4@@\endcsname 4
+\expandafter\chardef\csname Etoc@5@@\endcsname 5
+\expandafter\chardef\csname Etoc@6@@\endcsname 6
+\expandafter\let\expandafter\Etoc@@six@@\csname Etoc@6@@\endcsname
+\@ifclassloaded{memoir}{\def\Etoc@minf{-\thr@@}}{\def\Etoc@minf{-\tw@}}
\let\Etoc@none@@ \Etoc@minf
+\expandafter\let\expandafter\Etoc@all@@ \csname Etoc@5@@\endcsname
+\let\Etoc@dolevels\@empty
+\def\Etoc@newlevel #1{\expandafter\def\expandafter\Etoc@dolevels\expandafter
+ {\Etoc@dolevels\Etoc@do{#1}}}
+% \end{macrocode}
+% \etocrelease{1.2} has done some refactoring here (and above), reducing
+% the number of definitions. Formerly each defined sectioning level got two
+% macros assigned to it: one holding the numerical level (as chardef or count,
+% or even tokens for |-\tw@|), the other in a textual representation such as
+% |minusone|. The latter do not get defined anymore.
+%
+% MEMO: the name space here is poor and I should definitely have used
+% something such as \csa{Etoc@level@section}, not \csa{Etoc@section@@}.
+%
+% So \etocrelease{1.2} adds here \csbc{etocifunknownlevelTF} and
+% \csbc{etoclevel} for a higher level interface, which may be used by third
+% parties such as the \ctanpkg{yathesis} class and will allow \etoc at some
+% point to modify its internal naming conventions.
+%
+% The |-\tw@| case needed for \csbc{Etoc@minf} (or for \ctanpkg{memoir}) means
+% that two expansions of \csbc{etoclevel} do not always deliver a single
+% token, it is at any rate always self-delimiting in assignments and
+% \csa{ifnum} tests. I hesitated using only explicit digit tokens by the way.
+%
+% The dummy sectioning levels ``all'' and ``none'' play a special role and
+% will be declared by \csbc{etocifunknownlevelTF} as ``known''. They should
+% not be used as first argument of \csbc{etocsetlevel}...\par^^A TO FIX WHITELINE
+% \begin{macrocode}
+\def\etocsetlevel#1#2{\expanded{\noexpand\etoc@setlevel{#1}{#2}}}%
+\def\etoc@setlevel#1#2{%
+ \edef\Etoc@tmp{\the\numexpr#2}%
+ \if1\ifnum\Etoc@tmp>\Etoc@@six@@0\fi\ifnum\Etoc@tmp<-\tw@0\fi1%
+ \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,}%
+% \end{macrocode}
+% Letter or other agnostic test. First time I ever use \csa{@car} as I never
+% paid attention to its existence and in more macro-coding intensive context
+% such as \ctanpkg{xint} I use my own.
+% \begin{macrocode}
+ \ifin@\else\if\@car#1\@nil @\in@true\fi\fi
+ \ifin@
+ \PackageWarning{etoc}
+ {Sorry, but `#1' is forbidden as level name.\MessageBreak
+ \if\@car#1\@nil @%
+ (because of the @, especially as first character)\MessageBreak\fi
+ Reported}%
+ \else
+ \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}%
+ \expandafter\let\csname Etoc@#1@@\expandafter\endcsname
+ \csname Etoc@\Etoc@tmp @@\endcsname
+% \end{macrocode}
+% This is a mechanism to allow ``to toc'' entries to not break the core
+% mechanism for local tables of contents (now also lists of) to correctly
+% know their scope, when for example we have in a row
+% \csbc{localtableofcontents}, \csbc{locallistoffigures},
+% \csbc{locallistoftables} and each has created its ``to toc'' entry:
+% main TOC will handle the |@<division>| as aliases to |<division>| and local
+% TOCs and Lists Of will ignoer them.
+% \begin{macrocode}
+ \expandafter\edef\csname Etoc@@#1@@\endcsname
+ {\expandafter\noexpand\csname Etoc@#1@@\endcsname}%
+% \end{macrocode}
+% As ``to toc'' will use some \csa{addcontentsline}, we must make
+% \ctanpkg{hyperref} happy.
+% \begin{macrocode}
+ \expandafter\edef\csname toclevel@@#1\endcsname
+ {\expandafter\noexpand\csname toclevel@#1\endcsname}%
% \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@@
+% But we don't let \csa{toclevel\string#1} to \csa{Etoc@tmp}, with some
+% hesitation. The level defined by \csbc{etocsetlevel} should only be
+% for interpretation for the contents of the |.toc| file. If for some reason
+% user wants to set all levels to six (i.e. not taken into account) except for
+% some special ones, then modifying \csa{toclevel\string#1} could prevent the
+% local TOC title to find a place in the bookmarks.
+% \begin{macrocode}
+ \fi
\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}%
+ {Argument `\detokenize{#2}' of \string\etocsetlevel\space should
+ represent\MessageBreak
+ -2, -1, 0, 1, 2, 3, 4, 5, or 6 but evaluates to \Etoc@tmp.\MessageBreak
+ The level of `#1' will be set to 6.\MessageBreak
+ Tables of contents will ignore `#1' as long\MessageBreak
+ as its level is 6.\MessageBreak
+ Reported}%
+ \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}%
\expandafter\let\csname Etoc@#1@@\endcsname\Etoc@@six@@
- \fi
- \fi
\fi
}
+% \end{macrocode}
+% Maybe let it first use \csbc{etocifunknownlevelTF} and raise in the
+% ``unknown'' branch a suitable expandable error message (and return say |-3|)?
+%
+% I may also need for internal usage a variant for only numerical |#1| which be
+% submitted to a \csa{the}\csa{numexpr}. Not so far.
+% \begin{macrocode}
+\def\etoclevel#1{\csname Etoc@#1@@\endcsname}
+\def\etocifunknownlevelTF#1{\@ifundefined{Etoc@#1@@}}
\etocsetlevel{book}{-2}
\etocsetlevel{part}{-1}
\etocsetlevel{chapter}{0}
@@ -7679,220 +8256,146 @@ of real structure in a \LaTeX{} document body).
\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.
+% Prior to \etocrelease{1.2}, only under class \ctanpkg{memoir} was
+% \csbc{etocsetlevel} used with |appendix|. It does not seem to hurt to do it
+% generally, with a check whether document class provides chapters.
+% \begin{macrocode}
+\ifdefined\c@chapter
+ \etocsetlevel{appendix}{0}
+\else
+ \etocsetlevel{appendix}{1}
+\fi
+\def\Etoc@do#1{\@namedef{l@@#1}{\csname l@#1\endcsname}}
+\Etoc@dolevels
+% \end{macrocode}
+% We do not do a formal \csbc{etocsetlevel}|{figure}{6}| and anyhow the user
+% level interface forbids |figure| and |table| as first argument.
+% \begin{macrocode}
+\let\Etoc@figure@@\Etoc@@six@@
+\let\Etoc@table@@\Etoc@@six@@
+% \end{macrocode}
+% \etocrelease{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.
+% \etocrelease{1.1a} radically simplifies matters at \etoc core, and if these
+% changes had been in place earlier there would have been no incompatibility
+% with the \ctanpkg{hyperref} |7.00u| release.
% \begin{macrocode}
\AtBeginDocument{%
\@ifpackageloaded{parskip}{\Etoc@parskiptrue}{}%
\@ifpackageloaded{hyperref}{\Etoc@hyperreftrue}{}%
}
+\def\etocskipfirstprefix {\global\Etoc@skipprefixtrue }
% \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}.
+% Start of heart of \etoc's hacks into the execution of the |.toc| file
+% commands. It goes via a redefinition of \csa{contentsline} which will
+% launch an extraction process leading to the construction of \csbc{etocname},
+% \csbc{etocnumber}, and \csbc{etocpage}, then the styles as defined by user
+% via \csbc{etocsetstyle} get executed in accordance to the levels.
+%
+% In passing \etoc is witness to the linear succession of sectioning levels
+% and executes the \marg{start} and \marg{finish} parts of each used level at
+% the right time (they are rather called ``|begin|'' and ``|end|'' in the code
+% though).
+%
+% \etocrelease{1.2} did a complete rewrite of how \etoc creates virtually
+% a nesting structure out of the flat succession of the \csa{contentsline}'s
+% for various levels. Ever since the first release this was based on using
+% boolean flags, one for each level. The flag was on if the level had been
+% seen, hence its ``begin'' macro executed, but not yet its ``end'' macro.
+% This is now replaced by a stack storage \csbc{Etoc@stackofends} which is
+% simply, e.g. |{2}{0}{-3}{}|, to mean that first a chapter (|0|) was seen
+% then a subsection (|2|). The |{-3}{}| trail is for matters of avoiding
+% brace removal in the implementation next (I could have replaced it by a
+% single token being numerically |-3|).
+%
+% When a new level is encountered and set in \csbc{Etoc@level}, it is compared
+% to the left most entry in the stack. If higher, the ``begin'' macro is
+% executed and the \csbc{Etoc@level} is pushed (as a digit with possibly a
+% minus sign) to the left of the stack to record that the ``end'' macro is now
+% on the queue for execution (sic). If equal, nothing has to be done, if
+% lower, the ``end'' macro of the left-most stored level is executed then this
+% level is removed, and one proceeds with the next one, etc... legacy code was
+% using a bunch of TeX conditionals rather, and I recall how in 2012 I was
+% unfamiliar with its strange syntax and had lots of troubles; once I got
+% something working it got frozen and basically did not change since then.
+% The \etocrelease{1.2} implementation has replaced all of this by
+% maintenance of a single ``stack'', which is more economical in terms of
+% used macros and potentially more scalable too.
+%
+% About \csbc{Etoc@level} I have hesitated using only digit and sign tokens,
+% but it is currently let to some \csa{chardef} (in exceptional
+% \ctanpkg{memoir} case of |book| level it can expand to |-\tw@|, and there is
+% also the \csa{m@ne} count). \etocrelease{1.2} thus keeps defining such
+% \csa{chardef}'s but has at least dropped auxiliary macros (see the
+% definitions prior to \csbc{etocsetlevel}) which held some alphabetical
+% denotations such as ``minusone'' or ``zero'', and the \emph{begin},
+% \emph{prefix}, \emph{content} and \emph{end} macros associated with each
+% level now use a digit (and sign perhaps) (see \csbc{etocsetstyle}). With
+% \csbc{Etoc@level} already storing directly such a digit, one would avoid a
+% \csa{number} or \csa{the}\csa{numexpr} at some places, but would have to be
+% more careful in the various \csa{ifnum}.
+%
+% This (always globally defined) \csbc{Etoc@level} must now never be set to
+% the numerical value \texttt{6}: it is legal to add to the |.toc| file dummy
+% sectioning levels associated to the numerical level \texttt{6} (such dummy
+% sectioning will be ignored but can be assigned locally a non-ignored level
+% for special effects) and if \csbc{Etoc@level} was, as prior to
+% \etocrelease{1.2}, systematically set to the numerical level of the
+% last seen \csa{contentsline}, this could cause \csbc{Etoc@@startlocaltoc} to
+% fail to correctly set the ``local top''. Indeed it now only has
+% \csbc{Etoc@level} at his disposal, the legacy boolean flags being gone.
+%
+% The \csa{Etoc@isfirsttrue} was formally incorporated as last token of the
+% ``begin'' macros as defined by \csbc{etocsetstyle}, but has been displaced
+% by \etocrelease{1.2} to the code below.
% \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\Etoc@updatestackofends#1\etoc@{\gdef\Etoc@stackofends{#1}}
+\def\Etoc@stackofends{{-3}{}}
+\def\Etoc@doendsandbegin{%
+ \expandafter\Etoc@traversestackofends\Etoc@stackofends\etoc@
}
-\def\etocskipfirstprefix {\global\Etoc@skipprefixtrue }
% \end{macrocode}
-% Heart of \etoc's hacks into the execution of the |.toc| file commands.
+% We compare the new level with those for which the \marg{start} parts of the
+% \csbc{etocsetstyle} declarations have been executed to decide if it is time
+% to execute their \marg{finish} parts. In passing we set the boolean
+% \csbc{ifEtoc@isfirst} which is needed for \csbc{etociffirst} and
+% \csbc{etocxiffirst}.
% \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
+\def\Etoc@traversestackofends#1{%
+ \ifnum#1>\Etoc@level\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
+ {\csname Etoc@end@#1\endcsname
+ \Etoc@traversestackofends
+ }%
+ {\ifnum#1<\Etoc@level
+ \csname Etoc@begin@\the\numexpr\Etoc@level\endcsname
+ \Etoc@global\Etoc@isfirsttrue
+ \edef\Etoc@tmp{{\the\numexpr\Etoc@level}}%
+ \else
+ \Etoc@global\Etoc@isfirstfalse
+ \let\Etoc@tmp\@empty
\fi
- \fi
- \Etoc@next{#1}%
+ \expandafter\Etoc@updatestackofends\Etoc@tmp{#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
+% 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|).
+%
+% \etocrelease{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 \etocrelease{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
@@ -7921,48 +8424,101 @@ of real structure in a \LaTeX{} document body).
% empty. This maintains backwards-compatibility with earlier releases of
% \etoc.
% \begin{macrocode}
+\def\Etoc@etoccontentsline #1{%
+ \let\Etoc@next\@gobblefour
+ \ifnum\csname Etoc@#1@@\endcsname=\Etoc@@six@@
+ \else
+ \Etoc@skipthisonefalse
+% \end{macrocode}
+% MEMO: the mechanism added to make
+% added toc entries from ``list of'' titles invisible to the local tocs,
+% will be with |#1| starting with an |@|. In that case \csa{Etoc@\string#1@@}
+% is not a \csa{chardef} but expands to one (or to a count or |-\tw@| perhaps,
+% or a |\numexpr...\relax|).
+% \begin{macrocode}
+ \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname
+% \end{macrocode}
+% The trick goes through a slight overhead here to filter out such special
+% level names and do not make them update what will serve as top level for
+% local tocs or listsof. Formerly this was managed by booleans, then for
+% \etocrelease{1.1d} (released as \etocrelease{1.2}) it got replaced by
+% sole usage of \csbc{Etoc@level}, and finally a specific
+% \csbc{Etoc@virtualtop} which gets its updates here.
+% \begin{macrocode}
+ \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi
+ \ifEtoc@localtoc
+ \ifEtoc@stoptoc
+ \Etoc@skipthisonetrue
+ \else
+ \ifEtoc@notactive
+ \Etoc@skipthisonetrue
+ \else
+ \unless\ifnum\Etoc@level>\etoclocaltop
+ \Etoc@skipthisonetrue
+ \global\Etoc@stoptoctrue
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifEtoc@skipthisone
+ \else
+ \unless\ifnum\Etoc@level>\c@tocdepth
+ \ifEtoc@standardlines
+ \let\Etoc@next\Etoc@savedcontentsline
+ \else
+ \let\Etoc@next\Etoc@etoccontentsline@
+ \fi
+ \fi
+ \fi
+ \fi
+ \Etoc@next{#1}%
+}
+% \end{macrocode}
+% Hesitation at \etocrelease{1.2} about having \csbc{Etoc@level} being
+% always explicit digit and perhaps negative sign. For now is a
+% \csa{chardef} or \csa{m@ne} \csa{count} (perhaps |-\tw@| also).
+% \begin{macrocode}
\def\Etoc@etoccontentsline@ #1#2#3#4{%
- \Etoc@doends
- \Etoc@dobegins
+ \Etoc@doendsandbegin
\Etoc@global\edef\Etoc@prefix {\expandafter\noexpand
- \csname Etoc@prefix@\csname Etoc@#1@\endcsname\endcsname }%
+ \csname Etoc@prefix@\the\numexpr\Etoc@level\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
+ \csname Etoc@contents@\the\numexpr\Etoc@level\endcsname }%
+ \ifEtoc@skipprefix \Etoc@global\def\Etoc@prefix{\@empty}\fi
\global\Etoc@skipprefixfalse
\Etoc@lxyz{#2}{#3}{#4}%
- \Etoc@prefix\Etoc@contents
+ \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
+% A \textbf{breaking change} is made at \etocrelease{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 \etocrelease{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 \etocrelease{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.
+% is no such complication. But the trimming of the now unneeded branches was
+% not yet done at \etocrelease{1.1a}, \etocrelease{1.1b}, and got completed
+% only at \etocrelease{1.1c}, together with some renamings and refactoring.
% \begin{macrocode}
\def\Etoc@lxyz #1#2#3{%
\ifEtoc@hyperref
@@ -7972,10 +8528,11 @@ of real structure in a \LaTeX{} document body).
\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).
+% Prior to \etocrelease{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 \etocrelease{1.1a}, the hyperlink is always added
+% (if a non empty page number).
% \begin{macrocode}
\ifEtoc@hyperref
\ifx\etocthepage\@empty
@@ -7987,15 +8544,16 @@ of real structure in a \LaTeX{} document body).
\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.
+% 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.
+% name to define correctly \csbc{etocthename} and \csbc{etocthenumber}. The
+% delimiter tokens were modified at \etocrelease{1.1c} for a slight
+% optimization. And secondary macros have less to do since the
+% \etocrelease{1.1a} initiated refactoring.
% \begin{macrocode}
\futurelet\Etoc@getnb@token\Etoc@@getnb #1\hspace\etoc@
% \end{macrocode}
@@ -8006,18 +8564,18 @@ of real structure in a \LaTeX{} document body).
%
% 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
+% is a \textbf{breaking change} at \etocrelease{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}.
+% \csbc{etocthelinkednumber} will since \etocrelease{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
+ \ifEtoc@numbered
\expandafter\Etoc@tmp\expandafter{\etocthenumber}\etocthelinkednumber
\else
\Etoc@global\let\etocthelinkednumber\@empty
@@ -8039,15 +8597,28 @@ of real structure in a \LaTeX{} document body).
\fi
}
% \end{macrocode}
-% In presence of \ctanpkg{hyperref}, \etoc |1.1a| imports the
+% In presence of \ctanpkg{hyperref}, \etoc \etocrelease{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}
+% \begin{shaded}
+% \setstretch{1}%
% \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}
+%
+% Updated 2023/02/26: this is now partly available and gave me an idea of
+% what will be needed here. As the \etoc way goes through none of the
+% \LaTeX{} hook points, I will have to add the suitable \csa{UseHook} at
+% various places, after having stored the \csa{contentsline} original
+% arguments in the same macros as the \LaTeX{} new kernel code will do.
+%
+% Some difficulties though in perspective as \etoc separates name and number
+% and has no concept akin to \csa{@dottedtocline}. Also if the user employs
+% \csbc{etocsetstyle} with \csa{l@section}, hooks may be executed twice if I
+% put them not in \csbc{etocname} but in the \marg{prefix} and \marg{content}
+% parts for each level.\par
+% \end{shaded}
% \begin{macrocode}
\def\Etoc@lxyz@linktoc{%
\ifcase\Hy@linktoc
@@ -8071,18 +8642,18 @@ of real structure in a \LaTeX{} document body).
% 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
+% Prior to \etocrelease{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
+% |linktoc=page| option. But at \etocrelease{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
+% is not numbered. For some reason \etocrelease{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
+% which would have been indicative in the past (but not at \etocrelease{1.1a}) of a
+% |linktoc=page| context (\etoc prior to \etocrelease{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
+% branch is removed at \etocrelease{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.
@@ -8099,27 +8670,27 @@ of real structure in a \LaTeX{} document body).
\Etoc@next
}
% \end{macrocode}
-% |1.08n| tries to handle reasonably the \csa{nonumberline} of
+% \etocrelease{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).
+% modified at \etocrelease{1.1c} (see below).
%
-% At |1.09f| we get rid of the \csa{nonumberline} from inside
+% At \etocrelease{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
+% some token list to be executed later not immediately). \etocrelease{1.1c} fixes a
+% regression committed at \etocrelease{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}
+% deliberate, at \etocrelease{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.
+% the global display) then \csbc{ifEtoc@numbered} 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
+% line styles are used: at \etocrelease{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.
@@ -8129,7 +8700,7 @@ of real structure in a \LaTeX{} document body).
% 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.
+% \csbc{Etoc@lxyz}. At \etocrelease{1.1c} we jump directly to it from here.
% \begin{macrocode}
\def\Etoc@getnb #1{%
\in@{#1}{\numberline\chapternumberline\partnumberline\booknumberline}%
@@ -8143,7 +8714,7 @@ of real structure in a \LaTeX{} document body).
\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
+% entry always as not numbered (see above comments). Prior to \etocrelease{1.1c}, the
% code branched according to the meaning of the \csa{nonumberline} token,
% which was a bit silly.
% \begin{macrocode}
@@ -8155,15 +8726,15 @@ of real structure in a \LaTeX{} document body).
\Etoc@next #1%
}
% \end{macrocode}
-% Prior to |1.1a|, \csbc{etocthelinkedname} and \csbc{etocthelinkednumber}
+% Prior to \etocrelease{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|.
+% \etocrelease{1.1a} and \etocrelease{1.1b} still had here some superfluous code which was trimmed at
+% \etocrelease{1.1c}.
%
-% Also, |1.1c| fixes here a brace removal bug (which had always been there I
+% Also, \etocrelease{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
@@ -8171,7 +8742,7 @@ of real structure in a \LaTeX{} document body).
% input such as |\section{{\color{blue}Stuff}}|.
% \begin{macrocode}
\def\Etoc@getnb@nmbrd #1#2{%
- \Etoc@global\Etoc@numbertrue
+ \Etoc@global\Etoc@numberedtrue
\Etoc@global\def\etocthenumber {#2}%
\Etoc@getnb@nmbrd@getname\@empty
}%
@@ -8185,27 +8756,27 @@ of real structure in a \LaTeX{} document body).
% Not numbered entry.
% \begin{macrocode}
\def\Etoc@getnb@nonbr #1\etoc@ {%
- \Etoc@global\Etoc@numberfalse
+ \Etoc@global\Etoc@numberedfalse
\Etoc@global\let\etocthenumber \@empty
}
% \end{macrocode}
-% Special KOMA branch: |#1| starts with \csa{nonumberline} (prior to |1.1c|
+% Special KOMA branch: |#1| starts with \csa{nonumberline} (prior to \etocrelease{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
+% \etocrelease{1.1a} code still had here some complications with a ``braced name'' branch
+% which was in fact never executed at \etocrelease{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|.
+% unneeded complications got removed at \etocrelease{1.1c}.
%
-% |1.1c| also fixes a regression caused by |1.1a| in this branch: the
+% \etocrelease{1.1c} also fixes a regression caused by \etocrelease{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\Etoc@numberedfalse
\Etoc@global\let\etocthenumber \@empty
\Etoc@global\expandafter\def\expandafter\etocthename\expandafter{\@gobble#1}%
}
@@ -8214,7 +8785,7 @@ of real structure in a \LaTeX{} document body).
% 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
+% \etocrelease{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
@@ -8226,18 +8797,18 @@ of real structure in a \LaTeX{} document body).
% \begin{macrocode}
\def\Etoc@@getit #1\hspace#2{%
\ifx\etoc@#2%
- \Etoc@global\Etoc@numberfalse
+ \Etoc@global\Etoc@numberedfalse
\Etoc@global\let\etocthenumber \@empty
\else
- \Etoc@global\Etoc@numbertrue
+ \Etoc@global\Etoc@numberedtrue
\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|.
+% avoid a brace removal. And this is the end of the \etocrelease{1.1a} refactoring,
+% completed at \etocrelease{1.1c}.
% \begin{macrocode}
\def\Etoc@getit@getname #1\hspace\etoc@ {%
\Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}%
@@ -8257,7 +8828,7 @@ of real structure in a \LaTeX{} document body).
\DeclareRobustCommand*{\etocpage} {}
\DeclareRobustCommand*{\etoclink} {\@firstofone}
\DeclareRobustCommand*{\etocifnumbered}
- {\ifEtoc@number\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+ {\ifEtoc@numbered\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\expandafter\let\expandafter\etocxifnumbered\csname etocifnumbered \endcsname
\DeclareRobustCommand*{\etociffirst}
{\ifEtoc@isfirst\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
@@ -8272,7 +8843,7 @@ of real structure in a \LaTeX{} document body).
\fi
}
% \end{macrocode}
-% |1.07m| moves the reading of the toc file At Begin Document. Needed for
+% \etocrelease{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)
@@ -8302,64 +8873,407 @@ of real structure in a \LaTeX{} document body).
\fi
\global\let\Etoc@openouttoc\empty
}
+% \end{macrocode}
+% The |\gdef\Etoc@stackofends{{-3}{}}| is in theory superfluous as normally
+% this stack should always have been restored on exit to its initial state,
+% but...
+%
+% It would perhaps be better to issue here \csa{Etoc@notactivetrue}, prior to
+% |\the\Etoc@toctoks| but it is up to the caller macros to do it.
+% \csbc{Etoc@minf} is a level which is lower (i.e. more encompassing than all
+% others), so numerically \texttt{-2} for standard classes and \texttt{-3} for
+% \ctanpkg{memoir} class.
+%
+% The \csbc{Etoc@doendsandbegin} will not try to execute a (non-existing)
+% ``begin'' macro for the level \texttt{-3}.
+% \begin{macrocode}
\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
+ \gdef\Etoc@stackofends{{-3}{}}%
+ \global\let\Etoc@level\Etoc@minf
+ \global\let\Etoc@virtualtop\Etoc@minf
\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
+ \gdef\Etoc@level{-\thr@@}%
+ \Etoc@doendsandbegin
\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.
+% Memo: \csbc{etoclocaltop} has only meaningful meaning when the toc is local
+% and is ``active''. Except that I used a "notactive" flag to torture myself,
+% so: has the \csbc{ifEtoc@notactive} flag set to |false|.
+%
+% The \etocrelease{1.2} removal of usage of boolean flags associated to
+% the levels has made the next definition more succinct. Their former r\^ole is
+% picked up by \csbc{Etoc@level}.
%
-% 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.
+% MEMO: the \csbc{etoclocaltableofcontentshook} has been added during development
+% \etocrelease{1.2} probably for reasons of symmetry with handling of the
+% local ``lists of'' code, but at time of release I can't remember clearly.
+% Hesitation where to put it exactly.
+%
+% \etocrelease{1.2} adds a \csbc{Etoc@@startlocaltochook} for a refactoring of
+% \csbc{localtableofcontentswithrelativedepth}. It also serves to make the
+% emptiness check with local ``lists of'', as will be seen further down.
% \begin{macrocode}
-\def\etoc@@startlocaltoc#1#2{%
+\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\let\etoclocaltop\Etoc@virtualtop
+ \Etoc@@startlocaltochook
+ \etoclocaltableofcontentshook
+% \end{macrocode}
+% The \csbc{ifEtoc@etocstyle} boolean is true when \etoc is left in its default
+% mode (no usage of \csbc{etocsettocstyle} or \csbc{etocclasstocstyle}). It
+% inhibits \csbc{Etoc@tableofcontents} from using the specified
+% \marg{before\string_toc} and \marg{after\string_toc} from usage of
+% \csbc{etocsettocstyle}. And here we can insert the code we wish to do the
+% title.
+%
+% \begin{shaded}
+% \setstretch{1}%
+% \textbf{MEMO}: for legacy reason \etoc shares a lot of code between global TOC and
+% local TOCs. But it would probably have been better to separate the two and
+% provide an \csa{etocsetlocaltocstyle} that the user can use in preamble.
+% As it stands \csbc{etocsettocstyle} if used in preamble also influences the
+% global TOC, so basically one has to use it again after it (if it comes first
+% in the document).
+% \end{shaded}
+%
+% The \csa{ifEtoc@ouroboros} mechanism when it is set to false appears rather
+% audacious.
+% \begin{macrocode}
+ \ifEtoc@etocstyle
+ \etocetoclocaltocmaketitle
+ \fi
+ \ifx\Etoc@aftertitlehook\@empty
+ \else
+ \ifEtoc@localtoctotoc
+ \ifEtoc@ouroboros
+ \else
+ \let\Etoc@tmp\contentsline
+ \def\contentsline{\let\contentsline\Etoc@tmp\@gobblefour}%
+ \fi
+ \fi
+ \fi
\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
+\let\Etoc@@startlocaltoc@toc\Etoc@@startlocaltoc
+\let\Etoc@@startlocaltochook\@empty
+\def\etocdivisionnameatlevel#1{%
+ \ifcase\numexpr#1\relax
+ \ifdefined\c@chapter chapter\else section\fi%
+ \or section%
+ \or subsection%
+ \or subsubsection%
+ \or paragraph%
+ \or subparagraph%
+ \or empty%
+ \else\ifnum\numexpr#1<\m@ne
+ book%
+ \else
+ part%
+ \fi
+ \fi
+}
+\def\etoclocalheadtotoc#1#2{\addcontentsline{toc}{@#1}{#2}}
+\def\etocglobalheadtotoc{\addcontentsline{toc}}
+% \end{macrocode}
+% I have coded this so that it can be copied pasted to a user document and
+% customized at will. The \csa{par} is in case of a local TOC in a
+% subsubsection or deeper, the heading will then be rendered as a paragraph
+% heading...\par^^A sigh with extra line if full here
+% \begin{macrocode}
+\providecommand*\UseName{\@nameuse}
+\def\etocetoclocaltocmaketitle{%
+ \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\localcontentsname}%
+ \ifnum\etoclocaltop>\tw@\mbox{}\par\fi
+ \etociflocaltoctotoc
+ {\etocifisstarred
+ {}% star variant, do not add to toc
+ {\etoclocalheadtotoc
+ {\etocdivisionnameatlevel{\etoclocaltop+1}}%
+ {\localcontentsname}%
+ }%
+ }%
+ {}%
+}%
+% \end{macrocode}
+% In dev, I used \csa{etoc} prefix for the next two, but I
+% decided to drop it for release.
+% \begin{macrocode}
+\def\localcontentsname {\contentsname}%
+\let\etoclocaltableofcontentshook\@empty
+% \end{macrocode}
+% The big thing at \etocrelease{1.2}: experimental support code for
+% \csbc{locallistoffigures} and \csbc{locallistoftables}! There were two
+% possibilities to implement the `localtoc' mechanism: either add some extra
+% things to the |.lof| and |.lot| files, or get their data duplicated in the
+% |.toc| file. I have chosen for time being the latter path, hence this goes
+% via hacking into \csa{addcontentsline} and it must be the case that the
+% document class uses it (from \csa{caption}). If some package has modified
+% the implementation of captions of figures and tables and insertes data in
+% the |.lof| or |.lot| files directly via \csa{addtocontents} for example
+% and not via \csa{addcontentsline}, then the \etoc mechanism will fail.
+% \begin{macrocode}
+\if1\ifEtoc@lof0\fi\ifEtoc@lot0\fi1%
+\else
+\AtBeginDocument{%
+ \let\Etoc@originaladdcontentsline\addcontentsline
+ \def\addcontentsline{\Etoc@hackedaddcontentsline}%
+}%
+\fi
+% \end{macrocode}
+% \csa{expanded} is by now available in all engines, I think.
+% \begin{macrocode}
+\def\Etoc@hackedaddcontentsline#1{%
+ \expanded{\noexpand\in@{.#1,}{\ifEtoc@lof.lof,\fi\ifEtoc@lot.lot,\fi}}%
+ \ifin@\expandafter\Etoc@hackedaddcontentsline@i
+ \else\expandafter\Etoc@originaladdcontentsline
+ \fi
+ {#1}%
+}
+% \end{macrocode}
+% This business of \csa{protected@file@percent} is not really needed as anyhow
+% \etoc reads the |.toc| file with no space token from end of lines.
+
+% \begin{macrocode}
+\def\Etoc@hackedaddcontentsline@i#1#2#3{%
+ \expanded{\noexpand\in@{.#1;#2,}}{.lof;figure,.lot;table,}%
+ \ifin@
+ \addtocontents {toc}{%
+ \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}%
+ \ifdefined\protected@file@percent\protected@file@percent\fi
+ }%
+ \fi
+ \Etoc@originaladdcontentsline{#1}{#2}{#3}%
+}
+% \end{macrocode}
+% We will simply let \csbc{locallistoffigures} and \csbc{locallistoftables}
+% use \csbc{localtableofcontents}. We need some dedicated variant of
+% \csbc{Etoc@@startlocaltoc}. Hesitation where to put
+% \csbc{Etoc@@startlocaltochook} which has multiple usages.
+% \begin{macrocode}
+\def\Etoc@@startlocallistof#1#2#3{%
+ \ifEtoc@localtoc
+ \ifnum #2=#3\relax
+ \global\let\etoclocaltop\Etoc@virtualtop
+ \global\Etoc@notactivefalse
+ \Etoc@@startlocaltochook
+ \csname etoclocallistof#1shook\endcsname
+ \ifEtoc@etocstyle
+ \csname etocetoclistof#1smaketitle\endcsname
+ \fi
+ \fi
+ \fi
+}
+\def\Etoc@@startlocallistof@setlevels#1{%
+% \end{macrocode}
+% |#1| is |figure| or |table|.
+%
+% \csbc{etoclocaltop} represents the level which will stop the local ``list
+% of'' contents. I hesitated whether local ``lists of'' should obey the
+% |tocdepth|, especially a varying one. Finally at last minute I opted for
+% ``Yes'', so in the end no alteration of |tocdepth| will be done here. We
+% will set the level to have value
+% \centeredline{|min(1, |\csbc{etoclocaltop}|+1)|}
+% At least |1|, because it really would not make
+% sense to show figure entries as chapter entries for a local list of figures
+% in a Part (if the user has for example set the
+% \csbc{etoclocallistoffigureshook} to do nothing, so that the line styles as
+% configured via \csbc{etocsetstyle} are not avoided). And it must be greater
+% than \csbc{etoclocaltop} else such an entry would terminate the scope of the
+% local contents.
+%
+% In the default context which has issued via
+% \csbc{etoclocallistoffigureshook} a local \csbc{etocstandardlines}, the
+% actual value of the level only has a ``all or nothing'' meaning: if it is
+% greater than |tocdepth| then the \csbc{Etoc@etoccontentsline} will not call
+% \csa{contentsline}, else it will and then the code from document class will
+% kick in. The |article| class defines \csa{l@figure} as
+% \centeredline{|\@dottedtocline {1}{1.5em}{2.3em}|}
+% And we are here in a context where necessarily |tocdepth| is at least |1|
+% (if it was |0| or less, as the level has been set to at least |1|, the entry
+% would have been filtered out earlier by \csbc{Etoc@etoccontentsline}), so
+% the line will show. And if \csbc{etoclocallistoffigureshook} was modified
+% and did not issue \csbc{etocstandardlines} and we are in this situation that
+% the |tocdepth| comparison did not inhibit the entry, then it will show too,
+% at least if the line style does not say to do nothing (notice that the \etoc
+% fall-back line styles are configured to do nothing for paragraph and
+% subparagraph entries).
+%
+% On the other hand if the |tocdepth| inhibits entries of level
+% \csbc{etoclocaltop}|+1|, then a \csbc{localtableofcontents} at this level
+% would display no contents, so why should it not also mute
+% \csbc{locallistoffigures}?
+%
+% This change to the level \csbc{Etoc@figure@@} or \csbc{Etoc@table@@} is done
+% only locally, no need to worry about collaterals after the ``List of''.
+% \begin{macrocode}
+ \ifnum\etoclocaltop<\z@
+ \expandafter\let\csname Etoc@#1@@\endcsname\@ne
+ \else
+ \expandafter\let\csname Etoc@#1@@\expandafter\endcsname
+ \csname Etoc@\the\numexpr\etoclocaltop+\@ne @@\endcsname
+ \fi
+% \end{macrocode}
+% We now make invisible all level names whose numerical level would have
+% allowed them to show in these contents. |figure| and |table| are never
+% included in the \csbc{Etoc@dolevels} no danger to cancel them out. The
+% special level names |@section| etc... which are inserted by headings of
+% local ``lists of'' or local TOCs under \etocoption{localloftotoc} and other
+% options have been made invisible by \csbc{Etoc@listofhook}, no need to do
+% anything about them here.
+% \begin{macrocode}
+ \def\Etoc@do##1{%
+ \ifnum\etoclevel{##1}>\etoclocaltop
+ \expandafter\let\csname Etoc@##1@@\endcsname\Etoc@@six@@
+ \fi}%
+ \Etoc@dolevels
+}
+% \end{macrocode}
+% Let's for time being configure the figure and table lines to be rendered as
+% in class default.
+%
+% Ah, I remember why I added \csbc{etoclocaltableofcontentshook} above. It is
+% by symmetry as I had defined those next two already.
+% \begin{macrocode}
+\def\etoclocallistoffigureshook{\etocstandardlines}
+\def\etoclocallistoftableshook {\etocstandardlines}
+% \end{macrocode}
+% Here is some info about usage of \csbc{etoclocallistoffigureshook}, for
+% those who end up here from having clicked on the name from the user
+% manual. Its default as above means to use the class default for lines in
+% \csa{listoffigures}. If you redefine it to be empty, the effect is that
+% (except of course if \csbc{etocstandardlines} has been issued globally) the
+% figure lines will adopt the style configured for level
+% \csbc{etoclocaltop}|+1| (or more precisely the minimum of that and of |1|).
+% You can definitely put into the hook some
+% \centeredline{\csbc{etocsetstyle}|{\number\etoclevel{figure}}{}{}{...}{}|}
+% where the dots represent some code with \csbc{etocnumber}, \csbc{etocname},
+% \csbc{etocpage}, itself possibly querying \csbc{etoclevel}|{figure}|, or
+% perhaps \csbc{etoclocaltop} to know the actual depth (which may the one of a
+% Part which can thus be distinguished from being in a Chapter, whereas
+% \csa{number}\csbc{etoclevel}|{figure}| will give |1| in both cases).
+%
+% There is variant which is to maintain the default \csbc{etocstandardlines}
+% in the hook and then re-define the kernel macro \csa{l@figure} to do the
+% desired thing. For example the default with |article| is for \csa{l@figure}
+% to do {|\@dottedtocline {1}{1.5em}{2.3em}|} so you can do some
+% variant where the second and third argument (numwidth and indent) are set
+% according to \csbc{etoclocaltop}.
+%
+% I hope the above explanations help, they appear too advanced for inclusion
+% in the user manual so I give them here.
+%
+% In dev, I used \csa{etoc} prefix here, but I decided to drop it for release.
+% \begin{macrocode}
+\def\locallistfigurename{\listfigurename}
+\def\locallisttablename {\listtablename}
+% \end{macrocode}
+% Same observations as for \csbc{etocetoclocaltocmaketitle}.
+% \begin{macrocode}
+\def\etocetoclistoffiguresmaketitle{%
+ \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallistfigurename}%
+ \ifnum\etoclocaltop>\tw@\mbox{}\par\fi
+ \etociflocalloftotoc
+ {\etocifisstarred
+ {}% star variant, do not add to toc
+ {\etoclocalheadtotoc
+ {\etocdivisionnameatlevel{\etoclocaltop+1}}%
+ {\locallistfigurename}%
+ }%
+ }%
+ {}%
+}%
+\def\etocetoclistoftablesmaketitle{%
+ \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallisttablename}%
+ \ifnum\etoclocaltop>\tw@\mbox{}\par\fi
+ \etociflocallottotoc
+ {\etocifisstarred
+ {}% star variant, do not add to toc
+ {\etoclocalheadtotoc
+ {\etocdivisionnameatlevel{\etoclocaltop+1}}%
+ {\locallisttablename}%
+ }%
+ }%
+ {}%
+}%
+% \end{macrocode}
+% The local lists of do support the |\label/\ref| syntax as we are careful
+% here to position \csbc{localtableofcontents} as last token.
+%
+% The reset to \csa{@empty} of the \csa{Etoc@listofreset} is not strictly
+% needed as the other things can always be done with no harm.
+% \begin{macrocode}
+\let\Etoc@listofreset\@empty
+% \end{macrocode}
+% Memo: \csa{ext@toc} defined in KOMA and memoir but not in the standard classes.
+% \begin{macrocode}
+\def\locallistoffigures{%
+ \ifEtoc@lof
+ \def\Etoc@listofreset{%
+ \let\Etoc@currext\Etoc@tocext
+ \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc
+ \let\Etoc@@startlocaltochook\@empty
+ \let\Etoc@listofreset\@empty
+% \end{macrocode}
+% The \csbc{Etoc@listofhook} is executed by \csbc{localtableofcontents}. It
+% will be used here to let local ``lists of'' ignore all the special |.toc|
+% entries whose level names start with a |@|. This is to avoid the scope
+% limiting detection of the local list of figures or tables from being
+% influenced by another list of, such as a list of tables following a list of
+% figures which has put its title inside the |.toc| due to |locallottotoc|
+% option of \etoc.
+% \begin{macrocode}
+ \let\Etoc@listofhook\@empty
+ }%
+ \let\Etoc@currext\Etoc@lofext
+ \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{figure}}%
+ \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{figure}}%
+ \def\Etoc@listofhook{%
+ \def\Etoc@do####1{%
+ \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@@six@@
+ }%
+ \Etoc@dolevels
+ }%
+ \expandafter\localtableofcontents
+ \else
+ \PackageError{etoc}{%
+ \string\locallistoffigures \on@line\space but\MessageBreak
+ package was loaded without `lof' option}%
+ {Try again with \string\usepackage[lof]{etoc}}%
+ \fi
+}
+\def\locallistoftables{%
+ \ifEtoc@lot
+ \def\Etoc@listofreset{%
+ \let\Etoc@currext\Etoc@tocext
+ \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc
+ \let\Etoc@@startlocaltochook\@empty
+ \let\Etoc@listofreset\@empty
+ \let\Etoc@listofhook\@empty
+ }%
+ \let\Etoc@currext\Etoc@lotext
+ \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{table}}%
+ \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{table}}%
+ \def\Etoc@listofhook{%
+ \def\Etoc@do####1{%
+ \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@@six@@
+ }%
+ \Etoc@dolevels
+ }%
+ \expandafter\localtableofcontents
+ \else
+ \PackageError{etoc}{%
+ \string\locallistoftable \on@line\space but\MessageBreak
+ package was loaded without `lot' option}%
+ {Try again with \string\usepackage[lot]{etoc}}%
+ \fi
+}
% \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
@@ -8367,68 +9281,87 @@ of real structure in a \LaTeX{} document body).
% 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
+% Note: (\etocrelease{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
+% The initialization such as |\global\let\Etoc@level\Etoc@minf| is needed in
+% case the |.toc| file contains an \csbc{etoc@startlocaltoc} before any
% \csa{contentsline}.
+%
+% Local list of figures and tables set especially the tocdepth and a hook is
+% added here for emptiness check to work correctly with them.
+%
+% MEMO: Should I also execute \csbc{etoclocaltableofcontentshook}?
+% Then I would need to set \csbc{etoclocallistoffigureshook} to redefine it,
+% rather than be inserted as itself.
% \begin{macrocode}
-\def\Etoc@setemptytocbool {%
- \global\Etoc@emptytoctrue
+\def\Etoc@checkifempty {%
+ \global\Etoc@isemptytoctrue
\global\Etoc@stoptocfalse
\global\let\Etoc@level\Etoc@minf
+ \global\let\Etoc@virtualtop\Etoc@minf
+ \gdef\Etoc@stackofends{{-3}{}}%
\begingroup
\ifEtoc@localtoc
\def\etoc@startlocaltoc##1{%
\ifnum##1=\Etoc@tocid\relax
- \global\let\etoclocaltop\Etoc@level
+ \global\let\etoclocaltop\Etoc@virtualtop
+ \Etoc@@startlocaltochook
\global\Etoc@notactivefalse
- \fi }%
+ \fi
+ }%
+% \end{macrocode}
+% The mechanism is to check if any \csa{contentsline} triggers execution.
+% For this we replace the \etoc replacement by another replacement.
+% \begin{macrocode}
\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}.
+% This here is a \etocrelease{1.09i} added work-around to avoid usage of
+% \csbc{etocsetlocaltop.toc} which could cause the test of emptiness of a
+% global TOC to actually execute some start and finish parts in some cases.
% \begin{macrocode}
- \let\Etoc@setlocaltop@doends@dobegins\@empty
+ \let\Etoc@setlocaltop@doendsandbegin\@empty
\the\Etoc@toctoks
\Etoc@restoretocdepth
\endgroup
}
\DeclareRobustCommand*\etocifwasempty
- {\ifEtoc@emptytoc\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi }
-\expandafter
-\let\expandafter\etocxifwasempty\csname etocifwasempty \endcsname
+ {\ifEtoc@isemptytoc\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}
+ \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi
\ifEtoc@notactive
\else
+% \end{macrocode}
+% \csbc{ifEtoc@notactive} is \csa{iffalse} in case of a local TOC once it has
+% encountered the \csbc{etoc@startlocaltoc} with matching id. So here
+% \csbc{etoclocaltop} has been set by \csbc{Etoc@@startlocaltoc} and we
+% compare to the new level encountered. If the latter is at most equal to
+% \csbc{etoclocaltop} this means the local TOC ends there and is empty, so we
+% set the \csbc{ifEtoc@stoptoc} to true, which will cause the subsequent
+% parsing to abort immediately. If it is greater we check how it compares to
+% the local required toc depth. If lower or equal we conclude the toc is not
+% empty, and toggle the flag to stop the parsing; if greater, we are still in
+% doubt and must continue.
+% \begin{macrocode}
\ifnum\Etoc@level>\etoclocaltop
- \unless\ifnum\Etoc@level>\Etoc@localtocdepth
- \global\Etoc@emptytocfalse
+ \unless\ifnum\Etoc@level>\c@tocdepth
+ \global\Etoc@isemptytocfalse
\global\Etoc@stoptoctrue
\fi
\else
@@ -8437,25 +9370,39 @@ of real structure in a \LaTeX{} document body).
\fi
\fi
\fi
- \@gobblefour\relax
+% \end{macrocode}
+% The \csa{@gobblethree} was added to the \LaTeX{} kernel for its 2020-02-02
+% PL 5 release and we require 2020-10-01 since \etocrelease{1.1a}.
+% \begin{macrocode}
+ \@gobblethree
}
+% \end{macrocode}
+% Test of emptiness of the global TOC (according to current setting of the
+% levels and a possibly evolving tocdepth).
+% \begin{macrocode}
\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@isemptytocfalse
\global\Etoc@stoptoctrue
\fi
\fi
\fi
- \@gobblefour\relax
+ \@gobblethree
}
% \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
+% |2015/03/16|: \etocrelease{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.
+%
+% Update (|2023/02/26|): the actual \etocrelease{1.08e} of |2015/04/17| had
+% \csbc{etocchecksemptiness} to tell \etoc to do the emptiness check, it is
+% not done automatically.
+%
+% 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
@@ -8471,14 +9418,14 @@ of real structure in a \LaTeX{} document body).
%
% 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
+% a global table of contents but release \etocrelease{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
+% run latex again and did no printing at all. Release \etocrelease{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...
@@ -8496,20 +9443,20 @@ of real structure in a \LaTeX{} document body).
% 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
+% \etocrelease{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|
+% 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
+% default |\@gobble|. The \csa{Etoc@isemptytocfalse} 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}.
+% \csbc{Etoc@checkifempty}.
%
-% I hesitated with |1.08i| to write something to aux file in order to let
+% I hesitated with \etocrelease{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.
@@ -8534,7 +9481,7 @@ of real structure in a \LaTeX{} document body).
\def\Etoc@localtableofcontents#1{%
\gdef\etoclocaltop{-\@m}%
\Etoc@localtoctrue
- \global\Etoc@emptytocfalse
+ \global\Etoc@isemptytocfalse
\edef\Etoc@tocid{#1}%
\ifnum\Etoc@tocid<\@ne
\setbox0\hbox{\ref{Unknown toc ref \@secondoftwo#1. \space Rerun LaTeX}}%
@@ -8548,15 +9495,15 @@ of real structure in a \LaTeX{} document body).
\fi
\global\Etoc@notactivetrue
\ifEtoc@checksemptiness
- \Etoc@setemptytocbool
+ \Etoc@checkifempty
\fi
- \ifEtoc@emptytoc
+ \ifEtoc@isemptytoc
\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@isemptytocfalse
\global\Etoc@stoptoctrue
\gdef\etoclocaltop{-\thr@@}%
\Etoc@tableofcontents
@@ -8572,20 +9519,14 @@ of real structure in a \LaTeX{} document body).
% For the latter case \csbc{etoclocaltop} has setting |-\@m|.
% \begin{macrocode}
\edef\etoc@startlocaltoc##1%
- {\noexpand\etoc@@startlocaltoc{##1}{\Etoc@tocid}}%
+ {\noexpand\Etoc@@startlocaltoc{##1}{\Etoc@tocid}}%
\Etoc@tableofcontents
\fi
\@gobble\etoc@
\endgroup\ifEtoc@mustclosegroup\endgroup\fi
\Etoc@tocdepthreset
+ \Etoc@listofreset
\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
@@ -8593,11 +9534,36 @@ of real structure in a \LaTeX{} document body).
% | \@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
+% and in the end (now that I think about it) I simply use \csa{@firstofone}.
+%
+% \etocrelease{1.2} has a removed a \csa{Etoc@getrefno} as the author now
+% knows about \csa{@car} so need to define a similar utility here!
+%
+% Much more importantly (and embarrassingly) \etocrelease{1.2} fixes a bug
+% which had been here for ever. The code in its innocence 2012 birth year
+% assumed that the first entry of \csa{r@foo}, if the latter is defined, is
+% always numerical! But this is broken by \ctanpkg{varioref} if one used for
+% example \csa{vpageref}|{foo}| before! The first brace pair will then be
+% |{??}|... causing in \etoc a ``Missing number'' error.
+%
+% About the current fixed code, there is no strong reason that
+% \csbc{Etoc@getref} should work expandably. Later
+% \csbc{Etoc@localtableofcontents} does
+% \centeredline{|\edef\Etoc@tocid{#1}\iffnum\Etoc@tocid<\@ne|} but I certainly
+% could organize things differently.
+%
+% Maybe I should investigate more on what nasty things car be in
+% first argument. Or submit it to an \csa{expanded}?
% \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@getref #1{%
+ \@ifundefined{r@#1}
+ {0}
+ {\expandafter\Etoc@getref@i\romannumeral-`0%
+ \expandafter\expandafter\expandafter
+ \@car\csname r@#1\endcsname0\@nil\@etoc
+ }%
+}
+\def\Etoc@getref@i#1#2\@etoc{\ifnum9<1\string#1 #1#2\else 0\fi}
\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}
@@ -8624,26 +9590,29 @@ of real structure in a \LaTeX{} document body).
% \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
+% \csbc{etoc@startlocaltoc}. But since \etocrelease{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
+ \global\Etoc@isemptytocfalse
+ \ifEtoc@checksemptiness\Etoc@checkifempty\fi
+ \ifEtoc@isemptytoc
\ifEtoc@notocifnotoc
\expandafter\expandafter\expandafter\@gobble
\fi
\fi
\Etoc@tableofcontents
- \endgroup\ifEtoc@mustclosegroup\endgroup\fi
+ \endgroup
+ \ifEtoc@mustclosegroup\endgroup\fi
\Etoc@tocdepthreset
+ \Etoc@listofreset
\etocaftertochook
\@gobble\etoc@
}% \Etoc@t@bleofcontents
% \end{macrocode}
-% |1.08c| does not use |\arabic| in the \csa{addtocontents} since I have seen
+% \etocrelease{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
@@ -8652,14 +9621,14 @@ of real structure in a \LaTeX{} document body).
\def\Etoc@table@fcontents{%
\refstepcounter{etoc@tocid}%
\Etoc@tocwithidfalse
- \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents}
+ \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
+ \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents
+}
% \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.
@@ -8675,12 +9644,12 @@ of real structure in a \LaTeX{} document body).
% \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
+% and \csa{tof@finish}. It 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
+% \etocrelease{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}
@@ -8688,93 +9657,167 @@ of real structure in a \LaTeX{} document body).
{\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}
+\def\etocifisstarred{\ifx\Etoc@aftertitlehook\@empty
+ \expandafter\@firstoftwo\else
+ \expandafter\@secondoftwo
+ \fi}
\let\etocoriginaltableofcontents\tableofcontents
\let\tableofcontents\etoctableofcontents
+% \end{macrocode}
+% The \csbc{Etoc@listofhook} is configured by \csbc{locallistoffigures} and
+% \csbc{locallistoftables}. The latter two use hooks rather than
+% |\begingroup...\endgroup| to manage local configuration, in part because
+% they want to support the |\label/\ref| special \etoc mechanism, so need to
+% issue \csbc{localtableofcontents} last for it to be able to pick up a
+% following |\label| or |\ref|.
+% \begin{macrocode}
+\let\Etoc@listofhook\@empty
\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}
+ \begingroup
+ \Etoc@listofhook
\@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.
+% \etocrelease{1.09} adds \localtocwrdp. Note that changes to the tocdepth
+% from inside the |.toc| file during duration of local toc will remain without
+% effect as a substitute is used which gets a frozen non-dynamical value.
+%
+% It seems \etocrelease{1.09} actually forgot a change to
+% \csbc{Etoc@etoccontentsline} and the previous sentence was false and
+% described only what happened during the emptiness check which thus could
+% give false positives or false negatives. But if I had done the needed
+% change in \csbc{Etoc@etoccontentsline} to keep the two in sync, even if
+% |tocdepth| evolves from the |.toc| file, I would have created a divergence
+% between local TOCs (not only the
+% \csbc{localtableofcontentswithrelativedepth} ones) under
+% \csbc{etocstandardlines} and those not with standard lines.
+%
+% Redoing the whole thing at \etocrelease{1.2}. I needed to insert a suitable
+% hook in \csbc{Etoc@@startlocaltoc} (and also in the version used by
+% \csbc{Etoc@checkifempty}). And I have now at my disposal
+% \csbc{Etoc@listofreset} to reset it (it will be expanded after both the
+% emptiness check and the typesetting are completed, and at same grouping
+% level as the trigger command defined here). I do not want to add tokens
+% after \csbc{localtableofcontents} to not break the |\label/\ref| thing,
+% which is one reason for this way of proceeding.
% \begin{macrocode}
\newcommand*\localtableofcontentswithrelativedepth[1]{%
- \edef\Etoc@localtocdepth
- {\numexpr\noexpand\etoclocaltop+\the\numexpr#1\relax\relax}%
+ \def\Etoc@@startlocaltochook{%
+ \global\c@tocdepth\numexpr\etoclocaltop+#1\relax
+ }%
+ \def\Etoc@listofreset{\let\Etoc@@startlocaltochook\@empty
+ \let\Etoc@listofreset\@empty}%
\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.
+% Prior to \etocrelease{1.2}, \csbc{Etoc@tableofcontents} was constructed
+% by \csbc{etocsettocstyle} as one big macro where |#1| and |#2| had been
+% inserted. It now simply stores |#1| and |#2| each in a macro and
+% \csbc{Etoc@tableofcontents} is defined once and for all. Also the boolean
+% \csbc{ifEtoc@etocstyle} is added which helps keeping the emulation of
+% the document class only for the global document TOC but use a better choice
+% for local tables of contents (especially those in deeper sub-levels),
+% which is activated via \csbc{etocetoclocaltocstyle} (near end of code).
+%
+% \csbc{etocstoretocstyleinto} added at \etocrelease{1.2}. Too lazy
+% to check if |#1| pre-exists. Well, rather, too annoying to do this check
+% as one may want to redefine |#1| without further ado.
% \begin{macrocode}
\newcommand\etocsettocstyle[2]{%
-\def\Etoc@tableofcontents
-{%
+ \Etoc@etocstylefalse
+ \Etoc@classstylefalse
+ \def\Etoc@tableofcontents@user@before{#1}%
+ \def\Etoc@tableofcontents@user@after {#2}%
+}%
+\def\etocstoretocstyleinto#1{%
+%% \@ifdefinable#1{%
+ \edef#1{\noexpand\Etoc@etocstylefalse\noexpand\Etoc@classstylefalse
+ \def\noexpand\Etoc@tableofcontents@user@before{%
+ \unexpanded\expandafter{\Etoc@tableofcontents@user@before}%
+ }%
+ \def\noexpand\Etoc@tableofcontents@user@after{%
+ \unexpanded\expandafter{\Etoc@tableofcontents@user@after}%
+ }%
+ }%
+%% }%
+}%
+% \end{macrocode}
+% The macro names added here at \etocrelease{1.2} are provisory. Next
+% release will probably do a complete renaming of various internals because
+% this is currently a complete mess with some names differing only by an |@|
+% versus a voyel, but not necessarily being at a deeper level of expansion the
+% more |@|'s they have... the deepest one being this \csbc{Etoc@tableofcontents}...
+% \begin{macrocode}
+\def\Etoc@tableofcontents {%
+ \Etoc@tableofcontents@etoc@before
+ \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi
+ \Etoc@tableofcontents@user@before
+ \Etoc@tableofcontents@contents
+ \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi
+ \Etoc@tableofcontents@user@after
+ \Etoc@tableofcontents@etoc@after
+ \@gobble\etoc@
+}
+\def\Etoc@tableofcontents@etoc@before{%
\ifnum\c@tocdepth>\Etoc@minf
\else
\expandafter\Etoc@gobtoetoc@
\fi
\Etoc@par
+ \Etoc@beforetitlehook
\etocbeforetitlehook
\Etoc@storetocdepth
\let\Etoc@savedcontentsline\contentsline
\let\contentsline\Etoc@etoccontentsline
- \ifEtoc@standard
+ \ifEtoc@standardlines
\else
% \end{macrocode}
-% |1.1a|'s \csbc{Etoc@lxyz} now fetches 3 not 2 arguments and the
+% \etocrelease{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
- }%
+% formerly.
+%
+% For backwards compatibility the \csa{etocsavedchaptertocline}
+% etc... are still defined but issue a warning since \etocrelease{1.1a}
+% and an error since \etocrelease{1.2}.
+% \begin{macrocode}
+ \def\Etoc@do##1{%
+ \expandafter\def\csname etocsaved##1tocline\endcsname
+ {\PackageError{etoc}{%
+ \expandafter\string\csname etocsaved##1tocline\endcsname\space
+ has been deprecated\MessageBreak
+ at 1.1a and is removed at 1.2.\MessageBreak
+ Use \expandafter\string\csname l@##1\endcsname\space directly.\MessageBreak
+ Reported \on@line}%
+ {I will use \expandafter\string
+ \csname l@##1\endcsname\space myself for this time.%
+ }%
+ \csname l@##1\endcsname
+ }%
}%
- \Etoc@levellist
+ \Etoc@dolevels
\fi
+}%
% \end{macrocode}
-% |1.09| makes \csbc{etocsetnexttocdepth} usable in |#1| (but this is not 100\%
-% compatible with the emptiness check).
+% \etocrelease{1.09} makes \csbc{etocsetnexttocdepth} usable in |#1| (but this
+% is not 100\% compatible with the emptiness check). It makes an
+% \csbc{etoclocaltop} usable in |#1| if under checksemptiness regime.
%
-% |1.09| makes an \csbc{etoclocaltop} usable in |#1| if under checksemptiness
-% regime.
+% (|#1| above now means \csbc{Etoc@tableofcontents@user@before} since \etocrelease{1.2})
% \begin{macrocode}
- #1%
+\def\Etoc@tableofcontents@contents{%
\Etoc@tocdepthset
\ifEtoc@parskip\parskip\z@skip\fi
\Etoc@aftertitlehook
% \end{macrocode}
-% |1.09| has replaced former \csa{Etoc@localtop} (\emph{minus one}) by
+% \etocrelease{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
@@ -8783,12 +9826,14 @@ of real structure in a \LaTeX{} document body).
\gdef\etoclocaltop{-\thr@@}%
\Etoc@toctoc
\etocaftercontentshook
- #2\@nobreakfalse
+}%
+\def\Etoc@tableofcontents@etoc@after{%
+ \@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
+% But \ctanpkg{tableof} (since |1.4a|) under \csbc{etocglobaldefs} 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
@@ -8796,7 +9841,7 @@ of real structure in a \LaTeX{} document body).
% \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}.
+% \csbc{etocglobaldefs}.
%
% 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
@@ -8813,21 +9858,78 @@ of real structure in a \LaTeX{} document body).
\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}%
+% \end{macrocode}
+% Refactored at \etocrelease{1.2} to check if the style is actually known
+% and its level is from |-1| (|-2| in memoir class) to |5| inclusive.
+% If not raise a warning.
+% \begin{macrocode}
+\def\etocsetstyle#1{\ifcsname Etoc@#1@@\endcsname
+ \expandafter\Etoc@setstyle@a
+ \else
+ \expandafter\Etoc@setstyle@error
+ \fi {#1}%
+}
+\def\Etoc@setstyle@error #1{%
+ \PackageWarning{etoc}{`#1' is unknown to etoc. \space Did you\MessageBreak
+ forget some \string\etocsetlevel{#1}{<level>}?\MessageBreak
+ Reported}%
+ \@gobblefour
+}
+\def\Etoc@setstyle@a #1{%
+ \edef\Etoc@tmp{\the\numexpr\csname Etoc@#1@@\endcsname}%
+ \if1\unless\ifnum\Etoc@tmp<\Etoc@@six@@ 0\fi\unless\ifnum\Etoc@tmp>\Etoc@minf 0\fi1%
+ \Etoc@standardlinesfalse
+ \expandafter\Etoc@setstyle@b\expandafter\Etoc@tmp
+ \else
+ \PackageWarning{etoc}{Sorry, but you can not set the style of `#1',\MessageBreak
+ as its level \Etoc@tmp\space is either \number\Etoc@minf\space
+ or 6.\MessageBreak
+ Consider using \string\etocsetlevel\space first, but note
+ that `all',\MessageBreak
+ `none', `figure' and `table' are forbidden there. \space
+ Check\MessageBreak
+ the documentation about how to proceed for customizing\MessageBreak
+ figure and table entries in \string\listoffigures/tables.\MessageBreak
+ Reported}%
+ \expandafter\@gobblefour
+ \fi
+}
+% \end{macrocode}
+% Prior to \etocrelease{1.2} the |#1| here was some alphabetical string
+% such as |minusone|. We now use digit tokens (and minus sign) in the macro
+% names. The ``begin'' macros formerly incorporated
+% \csa{Etoc@global}\csa{Etoc@isfirsttrue}. They are now located in
+% \csbc{Etoc@traversestackofends}.
+%
+% \etocrelease{1.2} adds \csbc{etocstorelinestylesinto}. And
+% \csbc{etocstorethislinestyleinto}. No error check on the level.
+% \begin{macrocode}
+\long\def\Etoc@setstyle@b#1#2#3#4#5{%
+ \expandafter\def\csname Etoc@begin@#1\endcsname {#2}%
+ \expandafter\def\csname Etoc@prefix@#1\endcsname {#3}%
+ \expandafter\def\csname Etoc@contents@#1\endcsname {#4}%
+ \expandafter\def\csname Etoc@end@#1\endcsname {#5}%
+}
+\def\Etoc@storelines@a#1{%
+ \noexpand\Etoc@setstyle@b{#1}%
+ {\expandafter\Etoc@expandonce\csname Etoc@begin@#1\endcsname}%
+ {\expandafter\Etoc@expandonce\csname Etoc@prefix@#1\endcsname}%
+ {\expandafter\Etoc@expandonce\csname Etoc@contents@#1\endcsname}%
+ {\expandafter\Etoc@expandonce\csname Etoc@end@#1\endcsname}%
+}
+\def\Etoc@expandonce#1{\unexpanded\expandafter{#1}}
+\def\etocstorelinestylesinto#1{%
+ \edef#1{\Etoc@storelines@a{-2}\Etoc@storelines@a{-1}\Etoc@storelines@a{0}%
+ \Etoc@storelines@a {1}\Etoc@storelines@a {2}\Etoc@storelines@a{3}%
+ \Etoc@storelines@a {4}\Etoc@storelines@a {5}}%
}
+\def\etocstorethislinestyleinto#1#2{%
+ \edef#2{\expandafter\Etoc@storelines@a\expandafter{\number\etoclevel{#1}}}%
+}%
+% \end{macrocode}
+% Customization macros of the package default line styles.
+% \begin{macrocode}
\def\etocfontminustwo {\normalfont \LARGE \bfseries}
\def\etocfontminusone {\normalfont \large \bfseries}
\def\etocfontzero {\normalfont \large \bfseries}
@@ -8863,7 +9965,7 @@ of real structure in a \LaTeX{} document body).
{\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
+% Versions earlier than \etocrelease{1.08b} (and since \etocrelease{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
@@ -8880,15 +9982,16 @@ of real structure in a \LaTeX{} document body).
\def\etocbookname {Book}
% \end{macrocode}
% The macro \csbc{etocdefaultlines} was initially called \csbc{etoctoclines}. Now
-% \csbc{etoctoclines} just does \csa{Etoc@standardfalse}.
+% \csbc{etoctoclines} just does \csa{Etoc@standardlinesfalse}.
%
-% Version |1.09f| wraps \csbc{etocbookname}, respectively
+% Version \etocrelease{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
+\def\etocdefaultlines{\Etoc@standardlinesfalse
%% `book':
-\etoc@setstyle{@minustwo}
+\Etoc@setstyle@b
+ {-2}%
{\addpenalty\@M\etocskipfirstprefix}
{\addpenalty\@secpenalty}
{\begingroup
@@ -8906,7 +10009,8 @@ of real structure in a \LaTeX{} document body).
\endgroup}
{}%
%% `part':
-\etoc@setstyle{@minusone}
+\Etoc@setstyle@b
+ {-1}%
{\addpenalty\@M\etocskipfirstprefix}
{\addpenalty\@secpenalty}
{\begingroup
@@ -8924,7 +10028,8 @@ of real structure in a \LaTeX{} document body).
\endgroup}
{}%
%% `chapter':
-\etoc@setstyle{@zero}
+\Etoc@setstyle@b
+ {0}%
{\addpenalty\@M\etocskipfirstprefix}
{\addpenalty\@itempenalty}
{\begingroup
@@ -8937,7 +10042,8 @@ of real structure in a \LaTeX{} document body).
\endgroup}
{\addpenalty{-\@highpenalty}\addvspace{\etocsepminusone}}%
%% `section':
-\etoc@setstyle{@one}
+\Etoc@setstyle@b
+ {1}%
{\addpenalty\@M\etocskipfirstprefix}
{\addpenalty\@itempenalty}
{\begingroup
@@ -8970,7 +10076,8 @@ of real structure in a \LaTeX{} document body).
\endgroup}
{\addpenalty\@secpenalty\addvspace{\etocsepzero}}%
%% `subsection':
-\etoc@setstyle{@two}
+\Etoc@setstyle@b
+ {2}%
{\addpenalty\@medpenalty\etocskipfirstprefix}
{\addpenalty\@itempenalty}
{\begingroup
@@ -9002,7 +10109,8 @@ of real structure in a \LaTeX{} document body).
\endgroup}
{\addpenalty\@secpenalty\addvspace{\etocsepone}}%
%% `subsubsection':
-\etoc@setstyle{@three}
+\Etoc@setstyle@b
+ {3}%
{\addpenalty\@M
\etocfontthree
\vspace{\etocsepthree}%
@@ -9019,9 +10127,9 @@ of real structure in a \LaTeX{} document body).
% \end{macrocode}
% placeholder for comments
% \begin{macrocode}
-\etoc@setstyle{@four}{}{}{}{}%
-\etoc@setstyle{@five}{}{}{}{}%
-}
+\Etoc@setstyle@b{4}{}{}{}{}%
+\Etoc@setstyle@b{5}{}{}{}{}%
+}% end of \etocdefaultlines definition
% \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
@@ -9200,7 +10308,15 @@ of real structure in a \LaTeX{} document body).
\leaders\etocbottomrule\hss\color@endgroup}}
\addvspace{\etocbelowtocskip}}}
% \end{macrocode}
-% placeholder for comments
+% For time being I will not however add the versions for ``lists of'', as
+% anyhow probably nobody apart myself ever uses these things.
+%
+% It is impossible to know what kind of division heading |#2| uses, so there
+% is not much I can do here at \etocrelease{1.2} apart from providing a
+% user interface for adding the suitable thing to the |.toc| file. And I
+% discover at time of writing (finishing the \etocrelease{1.2}
+% documentation) that I already have \csbc{etoclocalheadtotoc}. I only need to
+% add \csbc{etocglobalheadtotoc}.
% \begin{macrocode}
\newcommand\etoc@multicoltoc[2][\etocdefaultnbcol]{%
\etocmulticolstyle[#1]{#2}%
@@ -9278,134 +10394,365 @@ of real structure in a \LaTeX{} document body).
{\etoc@local@framedtoci}
{\etoc@local@framedtoc}}
% \end{macrocode}
-% placeholder for comments
+% \etocrelease{1.2} makes local TOCs in compatibility display style use
+% |\subsection*| rather than |\section*|. This is not good for local TOCs to
+% a |\part| but anyhow the default is via \csbc{etocetoclocaltocstyle} which
+% will do the right thing and the change here is irrelevant. More comments
+% below about handling \ctanpkg{memoir} and \ctanpkg{KOMA-script}.
+%
+% The macros next will be modified if under |book| or \ctanpkg{memoir} class.
+% The \ctanpkg{KOMA-script} case uses rather the |leveldown| mechanism.
+% These local TOCs things are used only under \csbc{etocclasstocstyle}.
+% With \csbc{etocetoclocaltocstyle}, they are not used.
+% \begin{macrocode}
+\def\etocmemoirtoctotocfmt #1#2{%
+ \PackageWarning{etoc}
+ {\string\etocmemoirtoctotocfmt\space is deprecated.\MessageBreak
+ Use in its place \string\etocsettoclineforclasstoc,\MessageBreak
+ and \string\etocsettoclineforclasslistof{toc} (or {lof}, {lot}).
+ I will do this now.\MessageBreak
+ Reported}%
+ \etocsettoclineforclasstoc{#1}{#2}%
+ \etocsettoclineforclasslistof{toc}{#1}{#2}%
+}
+\def\etocsettoclineforclasstoc #1#2{%
+ \def\etocclassmaintocaddtotoc{\etocglobalheadtotoc{#1}{#2}}%
+}
+\def\etocsettoclineforclasslistof #1#2#3{%
+ \@namedef{etocclasslocal#1addtotoc}{\etoclocalheadtotoc{#2}{#3}}%
+}
+\let\etocclasslocaltocaddtotoc\@empty
+\let\etocclasslocallofaddtotoc\@empty
+\let\etocclasslocallotaddtotoc\@empty
+\ifdefined\c@chapter
+ \def\etocclasslocaltocmaketitle{\section*{\localcontentsname}}
+ \def\etocclasslocallofmaketitle{\section*{\locallistfigurename}}
+ \def\etocclasslocallotmaketitle{\section*{\locallisttablename}}
+ \etocsettoclineforclasstoc {chapter}{\contentsname}
+ \etocsettoclineforclasslistof{toc}{section}{\localcontentsname}
+ \etocsettoclineforclasslistof{lof}{section}{\locallistfigurename}
+ \etocsettoclineforclasslistof{lot}{section}{\locallisttablename}
+\else
+ \def\etocclasslocaltocmaketitle{\subsection*{\localcontentsname}}%
+ \def\etocclasslocallofmaketitle{\subsection*{\locallistfigurename}}%
+ \def\etocclasslocallotmaketitle{\subsection*{\locallisttablename}}%
+ \etocsettoclineforclasstoc {section}{\contentsname}
+ \etocsettoclineforclasslistof{toc}{subsection}{\localcontentsname}
+ \etocsettoclineforclasslistof{lof}{subsection}{\locallistfigurename}
+ \etocsettoclineforclasslistof{lot}{subsection}{\locallisttablename}
+\fi
+% \end{macrocode}
+% This is moved to a macro to localize complications with conditionals.
+% \begin{macrocode}
+\def\etocclasslocalperhapsaddtotoc #1{%
+ \etocifisstarred
+ {}
+ {\csname ifEtoc@local#1totoc\endcsname
+ \csname etocclasslocal#1addtotoc\endcsname
+ \fi
+ }%
+}
+% \end{macrocode}
+% No need for a \csa{phantomsection} if the \csa{addcontentsline} is after
+% |\section*|. For the standard classes, I make no effort to adjust level
+% used for the local heading if it is local to a \csa{part}, not a
+% \csa{section}. Anyhow this code will not be used by default for
+% local TOCs due to \csbc{etocetoclocaltocstyle}.
% \begin{macrocode}
\def\etocarticlestyle{%
\etocsettocstyle
- {\section *{\contentsname
- \@mkboth {\MakeUppercase \contentsname}
- {\MakeUppercase \contentsname}}}
- {}}
+ {\ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \section *{\contentsname
+ \@mkboth {\MakeUppercase \contentsname}
+ {\MakeUppercase \contentsname}}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }
+ {}%
+}
\def\etocarticlestylenomarks{%
\etocsettocstyle
- {\section *{\contentsname}}
- {}}
+ {\ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \section *{\contentsname}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }
+ {}%
+}
% \end{macrocode}
-% placeholder for comments
+% Make definitions with |book| in the macro names or redefine them
+% for |book|? Chose the latter.
% \begin{macrocode}
\def\etocbookstyle{%
\etocsettocstyle
{\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
- \chapter *{\contentsname
- \@mkboth {\MakeUppercase \contentsname}
- {\MakeUppercase \contentsname}}}
- {\if@restonecol \twocolumn \fi}}
+ \ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \chapter *{\contentsname
+ \@mkboth {\MakeUppercase \contentsname}
+ {\MakeUppercase \contentsname}}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }%
+ {\if@restonecol \twocolumn \fi}%
+}
\def\etocbookstylenomarks{%
\etocsettocstyle
{\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
- \chapter *{\contentsname}}
- {\if@restonecol \twocolumn \fi}}
+ \ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \chapter *{\contentsname}%
+ \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}%
+ \fi
+ }%
+ {\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.
+% before typesetting the title and we follow suit at \etocrelease{1.09a}, and
+% at \etocrelease{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.
+%
+% Updates at \etocrelease{1.2} for the standard display style inherited
+% from the class to actually be usable with local table of contents.
+% Unfortunately the printing of the title rigidly hard-codes a
+% |\thispagestyle{chapter}|:
+% \begin{verbatim}
+% \@lofmaketitle ->\@nameuse {lofheadstart} {\parindent \z@ \parskip \z@ \interli
+% nepenalty \@M \@nameuse {printlofnonum}\@nameuse {printloftitle}{\listfigurenam
+% e }\@nameuse {lofmark}\thispagestyle {chapter}\@nameuse {afterloftitle} } \@aft
+% erheading
+% \end{verbatim}
+% \vskip-\baselineskip
+% Oh well I discover there is a \csa{chapterheadstart} but not
+% \csa{sectionheadstart}...
+%
+% Actually now \etoc will by default not use the class inherited style for the
+% local TOC titles, so maybe I should have not wasted time on this. From the
+% \csbc{etocsettocstyle} arguments one can know if this is for a local TOC,
+% but one can not know the level, which is inferred from the actual execution
+% of the TOC data. There is a problem though that the \ctanpkg{memoir}
+% default would be usable for a local TOC in a |\part|. Although one can
+% argue if it makes sense to display a TOC as prominently as a chapter anyway.
+% Again, the default with \etoc will anyhow not use this as
+% \csbc{etocetoclocaltocstyle} deactivates the \csbc{etocsettocstyle} for
+% local TOCs.
+%
+% MEMO: would it make sense to have an \csa{etocsetlocaltocstyle}? As
+% explained above this would however induced dramatic internal \etoc changes as one
+% would have to wait for title insertion until the time one knows the local
+% level. Which is exactly what \csbc{etocetoclocaltocstyle} via the
+% \csbc{ifEtoc@etocstyle} does.
+%
+% Update at \etocrelease{1.2} to account for \csbc{locallistoffigures} and
+% \csbc{locallistoftables}.
% \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
+% This branch executed for the non-starred variant
% \begin{macrocode}
\ifmem@em@starred@listof
\else
- \Etoc@addsuitablecontentsline
+% \end{macrocode}
+% Global case is only for \csa{tableofcontents} as \etoc does not hack into
+% \csa{listofpictures} and \csa{listoftables}.
+%
+% Local case will not be executed in default configurations (cf
+% \csbc{etocetoclocaltocstyle}).
+%
+% \csbc{etocclasslocalperhapsaddtotoc} is to avoid worries with conditionals.
+% \begin{macrocode}
+ \ifEtoc@localtoc
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \ifEtoc@maintoctotoc
+ \etocclassmaintocaddtotoc
+ \fi
+ \fi
\fi
\fi
- \@nameuse {@tocmaketitle} %<< space token here from memoir code
+ \ifEtoc@localtoc
+ % trying to mimick a section title but there is no \sectionheadstart
+ % there is no \printsectiontitle etc... Oh well I will be more
+ % radical then
+ \@namedef{@\Etoc@currext maketitle}{%
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ }%
+ \fi
+ \@nameuse {@\Etoc@currext maketitle} %<< 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.
+% between starred and non-starred contexts for other hooks (by testing if
+% \csbc{Etoc@aftertitlehook} is empty or not). 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}}
+ \parskip \cftparskip \@nameuse {cft\Etoc@currext beforelisthook}%
+ }%
+ {\@nameuse {cft\Etoc@currext afterlisthook}%
+ \endgroup\restorefromonecol
+ }%
+}
+% \end{macrocode}
+% Compatibility layer for the \ctanpkg{KOMA-script} classes:
+%
+% \etocrelease{1.09c} (|2020/05/15|) did an update as \ctanpkg{KOMA-script}
+% deprecated \csa{iftocfeature}. Thanks to Bilel Omrani for report. I
+% did not check if cloning of KOMA code required some further updates.
+% \etocrelease{1.09f} added more updates.
+%
+% At \etocrelease{1.2} this is further updated to be usable also for list
+% of figures and tables. However, this update is somewhat theoretical because
+% \etoc does not interfere at all with \csa{listoffigures} and
+% \csa{listoftables}: the update is useful only to make \etoc's
+% \csbc{locallistoffigures} and \csbc{locallistoftables} usable in display
+% style compatibility mode.
+%
+% But during development on this I became aware that \ctanpkg{KOMA-script}
+% since its |3.30| release has the feature that an unnumbered section resets
+% the counters of subsections. This creates a problem (whose description I
+% have moved to the user manual) which can be alleviated for local TOCs at the
+% highest level below global one by using KOMA's |\setuptoc{toc}{leveldown}|.
+% So I decided to do this systematically, as in the code next via a new
+% private hook, but the problem will remain for local TOCs at lower levels,
+% and there does not seem to be any way to tell KOMA to use say
+% |\subsubsection*|, barring, from what I understand from the manual, usage of
+% its \csa{deftocheading}. So in a second stage I decided that per default
+% \etoc would rather use for local TOCs, and not only for KOMA classes but all
+% classes, an adaptive heading fitted to the ``local top''. As this ``local
+% top'' can only be determined from inside the expansion of \csbc{Etoc@toctoc}
+% which contains the |.toc| file data, the boolean \csbc{ifEtoc@etocstyle}
+% was added which will make \csbc{etocsettocstyle} configuration ignored. In
+% this way, with \csbc{etocetoclocaltocstyle}, the document class emulation
+% will apply to the global TOC whereas local TOCs will use the adaptive
+% scheme. To avoid duplication other relevant info is moved to the user
+% manual.
+%
+% We put the trigger of |leveldown| for KOMA classes in
+% \csbc{Etoc@beforetitlehook}. So there will be no test with
+% \csbc{ifEtoc@localtoc} here contrarily to the case of standard classes
+% and memoir. Again, all of this normally is not relevant as by default \etoc
+% \etocrelease{1.2} will use its \csbc{etocetoclocaltocstyle} which
+% for local TOCs ignores the emulation code of the main TOC.
+% \begin{macrocode}
+\let\Etoc@beforetitlehook\@empty
+\if1\@ifclassloaded{scrartcl}0{\@ifclassloaded{scrbook}0{\@ifclassloaded{scrreprt}01}}%
+\expandafter\@gobble
+\else
% \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.
+% Surely paranoid here but I don't have time to go through KOMA documentation
+% (I am not really familiar with these classes).
%
-% Finally |1.09f| added some such updates.
+% MEMO: I do not know if \ctanpkg{KOMA-script}'s \csa{setuptoc} sets options
+% locally or globally. If globally the code below must be modifed to unset
+% the |totoc| option depending on at time of use status of the \etoc own
+% |totoc| options.
% \begin{macrocode}
+ \ifdefined\setuptoc
+ \def\Etoc@beforetitlehook{%
+ \ifEtoc@localtoc
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \setuptoc{\Etoc@currext}{leveldown}%
+ \else
+ \etocifisstarred{}{\etocifmaintoctotoc{\setuptoc{toc}{totoc}}}%
+ \fi
+ }%
+ \fi
+\expandafter\@firstofone
+\fi
+{\def\etocclasslocalperhapsaddtotoc #1{%
+ \etocifisstarred
+ {}%
+ {\csname ifEtoc@local#1totoc\endcsname
+ \setuptoc{\Etoc@currext}{totoc}%
+ \fi
+ }%
+ }%
+}
\ifdefined\Iftocfeature
\def\etoc@Iftocfeature{\Iftocfeature}%
\else
\def\etoc@Iftocfeature{\iftocfeature}%
\fi
+% \end{macrocode}
+% Peut-être en fait je devrais toujours faire |\let\if@dynlist\if@tocleft|?
+% Mais je ne l'ai pas vu dans le code de KOMA pour les LOF et LOT (globales,
+% évidemment). Mais cela m'obligerait à lire vraiment le code source de KOMA.
+% Pas le temps.
+% \begin{macrocode}
\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}
+ {\ifx\Etoc@currext\Etoc@tocext
+ \expandafter\@firstofone
+ \else
+ \expandafter\@gobble
+ \fi
+ {\let\if@dynlist\if@tocleft}%
+ \edef\@currext{\Etoc@currext}%
+ \@ifundefined{listof\@currext name}%
+ {\def\list@fname{\listofname~\@currext}}%
+ {\expandafter\let\expandafter\list@fname
+ \csname listof\@currext name\endcsname}%
+ \etoc@Iftocfeature {\@currext}{onecolumn}
+ {\etoc@Iftocfeature {\@currext}{leveldown}
{}
{\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }}
{}%
- \etoc@Iftocfeature {toc}{numberline}{\def \nonumberline {\numberline {}}}{}%
+ \etoc@Iftocfeature {\@currext}{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}{}
+ \etoc@Iftocfeature {\@currext}{noprotrusion}{}
{\microtypesetup {protrusion=false}%
\PackageInfo {tocbasic}%
- {character protrusion at toc deactivated}}%
+ {character protrusion at \@currext\space 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}{}{%
+ \etoc@Iftocfeature{\@currext}{noparskipfake}{}{%
\ifvmode \@tempskipa\lastskip \vskip-\lastskip
\addtolength{\@tempskipa}{\parskip}\vskip\@tempskipa\fi
- }%
+ }%
\setlength {\parskip }{\z@ }%
\setlength {\parindent }{\z@ }%
\setlength {\parfillskip }{\z@ \@plus 1fil}%
\csname tocbasic@@before@hook\endcsname
- \csname tb@toc@before@hook\endcsname}
- {%
+ \csname tb@\@currext @before@hook\endcsname
+ }% end of before_toc
+ {% start of after_toc
% \end{macrocode}
-% At |1.09f| I considered adding this \csa{BeforeClosingMainAux} hunk
+% (This next discussion has not been revised at \etocrelease{1.2} so let's
+% hope it is fine).
+%
+% At \etocrelease{1.09f} I considered adding this \csa{BeforeClosingMainAux} hunk
% to the second argument of \csbc{etocsettocstyle}-emulation of \ctanpkg{KOMA-script}.
% But:
% \begin{itemize}
@@ -9433,14 +10780,19 @@ of real structure in a \LaTeX{} document body).
% \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}}
+ \edef\@currext{\Etoc@currext}%
+ \csname tb@\@currext @after@hook\endcsname
+ \csname tocbasic@@after@hook\endcsname
+ }% end of after_toc
+}
\let\etocscrbookstyle\etocscrartclstyle
\let\etocscrreprtstyle\etocscrartclstyle
% \end{macrocode}
-% placeholder for comments
+% The \csbc{etocclasstocstyle} will be redefined according to document
+% class. Then, later, it will be extended with an
+% \csa{Etoc@classstyletrue}.
% \begin{macrocode}
-\def\etocstandarddisplaystyle{\etocarticlestyle}
+\def\etocclasstocstyle{\etocarticlestyle}
\newcommand*\etocmarkboth[1]{%
\@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}}
\newcommand*\etocmarkbothnouc[1]{\@mkboth{#1}{#1}}
@@ -9450,54 +10802,136 @@ of real structure in a \LaTeX{} document body).
{\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}}}}
+\def\Etoc@redefetocstylesforchapters{%
+ \renewcommand\etoctocstylewithmarks[4][chapter]{%
+ \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkboth{##4}}}%
+ }
+ \renewcommand\etoctocstylewithmarksnouc[4][chapter]{%
+ \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkbothnouc{##4}}}%
+ }
+ \renewcommand\etoctocstyle[3][chapter]{%
+ \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3}}
+ }
+}
\@ifclassloaded{scrartcl}
- {\renewcommand*\etocstandarddisplaystyle{\etocscrartclstyle}}{}
+ {\renewcommand*\etocclasstocstyle{\etocscrartclstyle}}{}
\@ifclassloaded{book}
{\renewcommand*\etocfontone{\normalfont\normalsize}
- \renewcommand*\etocstandarddisplaystyle{\etocbookstyle}
- \Etoc@redefetocstyle{chapter}}{}
+ \renewcommand*\etocclasstocstyle{\etocbookstyle}
+ \Etoc@redefetocstylesforchapters}{}
\@ifclassloaded{report}
{\renewcommand*\etocfontone{\normalfont\normalsize}
- \renewcommand*\etocstandarddisplaystyle{\etocreportstyle}
- \Etoc@redefetocstyle{chapter}}{}
+ \renewcommand*\etocclasstocstyle{\etocreportstyle}
+ \Etoc@redefetocstylesforchapters}{}
\@ifclassloaded{scrbook}
{\renewcommand*\etocfontone{\normalfont\normalsize}
- \renewcommand*\etocstandarddisplaystyle{\etocscrbookstyle}
- \Etoc@redefetocstyle{chapter}}{}
+ \renewcommand*\etocclasstocstyle{\etocscrbookstyle}
+ \Etoc@redefetocstylesforchapters}{}
\@ifclassloaded{scrreprt}
{\renewcommand*\etocfontone{\normalfont\normalsize}
- \renewcommand*\etocstandarddisplaystyle{\etocscrreprtstyle}
- \Etoc@redefetocstyle{chapter}}{}
+ \renewcommand*\etocclasstocstyle{\etocscrreprtstyle}
+ \Etoc@redefetocstylesforchapters}{}
\@ifclassloaded{memoir}
- {\etocsetlevel{appendix}{0}%
- \renewcommand*\etocfontone{\normalfont\normalsize}
- \etocmemoirtoctotocfmt{chapter}{\contentsname}%
- \renewcommand*\etocstandarddisplaystyle{\etocmemoirstyle}
- \Etoc@redefetocstyle{chapter}}{}
+ {\renewcommand*\etocfontone{\normalfont\normalsize}
+ \renewcommand*\etocclasstocstyle{\etocmemoirstyle}
+ \Etoc@redefetocstylesforchapters}{}
\def\etoctocloftstyle {%
- \etocsettocstyle
- {\@cfttocstart\par\begingroup
- \parindent\z@ \parskip\cftparskip \@cftmaketoctitle
- \if@cfttocbibind\@cftdobibtoc\fi }%
- {\endgroup\@cfttocfinish }%
+ \etocsettocstyle{%
+ \@cfttocstart
+ \par
+ \begingroup
+ \parindent\z@ \parskip\cftparskip
+% \end{macrocode}
+% I don't feel like redefining \csa{@cftmaketoctitle} etc to apply ``level
+% down''. Up to the user to use the tocloft interface after the main TOC
+% to do appropriate actions. I consider emitting a warning, but then if
+% the user has customize \csa{@cftmaketoctitle} or variant, how to know?
+% (apart from numerous ifx tests).
+% \begin{macrocode}
+ \@nameuse{@cftmake\Etoc@currext title}%
+% \end{macrocode}
+% But for adding an appropriate entry to the toc file I can intervene silently.
+% I can remove the test \csa{if@cfttocbibind} here as anyhow I have to test
+% status of \etoc `to toc' options.
+% \begin{macrocode}
+ \ifEtoc@localtoc
+ \etoctocloftlocalperhapsaddtotoc\Etoc@currext
+ \else
+ \etocifisstarred {}{\ifEtoc@maintoctotoc\@cftdobibtoc\fi}%
+ \fi
+ }%
+ {%
+ \endgroup
+ \@cfttocfinish
+ }%
+}
+\def\etoctocloftlocalperhapsaddtotoc#1{%
+ \etocifisstarred
+ {}%
+ {\csname ifEtoc@local#1totoc\endcsname
+ \ifdefined\c@chapter\def\@tocextra{@section}\else\def\@tocextra{@subsection}\fi
+ \csname @cftdobib#1\endcsname
+ \fi
+ }%
+}
+% \end{macrocode}
+% This is active only if \ctanpkg{tocbibind} boolean \csa{if@dotoctoc} is found
+% true at begin document and there was no use of \csbc{etocsettocstyle} in the
+% preamble. The part on local TOC also applies to local LOF and LOT but is
+% executed only if \csbc{etocclasstocstyle} was present in the preamble. Under
+% the default \csbc{etocetoclocaltocstyle}, only the global TOC is under
+% influence of this (assuming thus that \ctanpkg{tocbibind} was loaded without
+% its |nottoc| or |none| option).
+% \begin{macrocode}
+\def\etoctocbibindstyle {%
+ \etocsettocstyle {%
+ \toc@start
+ \ifEtoc@localtoc
+ \@nameuse{etocclasslocal\Etoc@currext maketitle}%
+ \etocclasslocalperhapsaddtotoc\Etoc@currext
+ \else
+ \etoc@tocbibind@dotoctitle
+ \fi
+ }%
+ {\toc@finish}%
}
-\@ifclassloaded{memoir}{}
-{\@ifpackageloaded{tocloft}
+\def\etoc@tocbibind@dotoctitle {%
+% \end{macrocode}
+% If \ctanpkg{tocbibind} is loaded but later between |\begin{document}| and
+% \csa{tableofcontents} the user does \csbc{etocsetup}|{maintoctotoc=afalse}|
+% we have to catch this.
+% \begin{macrocode}
+ \if@bibchapter
+ \etocifisstarred
+ {\chapter*{\contentsname}\prw@mkboth{\contentsname} % id.
+ }%
+ {\ifEtoc@maintoctotoc
+ \toc@chapter{\contentsname} %<-space from original
+ \else
+ \chapter*{\contentsname}\prw@mkboth{\contentsname} % id.
+ \fi
+ }%
+ \else
+ \etocifisstarred
+ {\@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} %<-space
+ }
+ {\ifEtoc@maintoctotoc
+ \toc@section{\@tocextra}{\contentsname} %<-space from original
+ \else
+ \@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} % id.
+ \fi
+ }%
+ \fi
+}%
+\@ifclassloaded{memoir}
+{}
+{% memoir not loaded
+ \@ifpackageloaded{tocloft}
{\if@cftnctoc\else
- \renewcommand*\etocstandarddisplaystyle{\etoctocloftstyle}
- \AtBeginDocument{\let\tableofcontents\etoctableofcontents}
+ \ifEtoc@keeporiginaltoc
+ \else
+ \let\tableofcontents\etoctableofcontents
+ \fi
\fi }
{\AtBeginDocument
{\@ifpackageloaded{tocloft}
@@ -9506,7 +10940,10 @@ of real structure in a \LaTeX{} document body).
{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'}%
+ option `titles'. \space But this will cause the `tocloft'\MessageBreak
+ customization of the titles of the main list of figures\MessageBreak
+ and list of tables to not apply either.\MessageBreak
+ You should load `tocloft' before `etoc'.}%
\AtEndDocument{\PackageWarning{etoc}
{Please load `tocloft' before `etoc'!\@gobbletwo}}%
\fi
@@ -9515,34 +10952,121 @@ of real structure in a \LaTeX{} document body).
}%
}%
}
+\@ifclassloaded{memoir}
+{}
+{% memoir not loaded
+ \AtBeginDocument{%
+ \@ifpackageloaded{tocloft}
+ {%
+ \def\etocclasstocstyle{%
+ \etoctocloftstyle
+ \Etoc@classstyletrue
+ }%
+ \ifEtoc@etocstyle
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \Etoc@etocstyletrue
+ \fi
+ \else
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \fi
+ \fi
+ }%
+ {% no tocloft
+ \@ifpackageloaded {tocbibind}
+ {\if@dotoctoc
+ \def\etocclasstocstyle{%
+ \etoctocbibindstyle
+ \Etoc@classstyletrue
+ }%
+ \ifEtoc@etocstyle
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \Etoc@etocstyletrue
+ \fi
+ \else
+ \ifEtoc@classstyle
+ \etocclasstocstyle
+ \fi
+ \fi
+% \end{macrocode}
+% Not clear if I should interpret \csa{Etoc@keeporiginaltoctrue} in this sense
+% to not modify \ctanpkg{tocbibind} overwrite of \csbc{tableofcontents}. But
+% let's obey this interpretation.
+% \begin{macrocode}
+ \ifEtoc@keeporiginaltoc
+ \else
+ \let\tableofcontents\etoctableofcontents
+ \fi
+ }%
+ {}%
+ }%
% \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.
+% Maybe I should check if the options were already set. I will simply
+% make the message more generic.
+% \begin{macrocode}
+ \@ifpackageloaded{tocbibind}
+ {% tocbibind, perhaps with tocloft
+ \if@dotoctoc
+ \ifEtoc@keeporiginaltoc
+ \else
+ \let\tableofcontents\etoctableofcontents
+ \fi
+ \etocsetup{maintoctotoc,localtoctotoc}%
+ \PackageInfo{etoc}{%
+ Setting (or re-setting) the options `maintoctotoc' and\MessageBreak
+ `localtoctotoc' to true as tocbibind was detected and\MessageBreak
+ found to be configured for `TOC to toc'.\MessageBreak
+ Reported at begin document}%
+ \fi
+ \if@dotoclof
+ \ifEtoc@lof
+ \etocsetup{localloftotoc}%
+ \PackageInfo{etoc}{%
+ Setting (or re-setting) `localloftotoc=true' as the\MessageBreak
+ package tocbibind was detected and is configured for\MessageBreak
+ `LOF to toc'. Reported at begin document}%
+ \fi
+ \fi
+ \if@dotoclot
+ \ifEtoc@lot
+ \etocsetup{locallottotoc}%
+ \PackageInfo{etoc}{%
+ Setting (or re-setting) `locallottotoc=true' as the\MessageBreak
+ package tocbibind was detected and is configured for\MessageBreak
+ `LOT to toc'. Reported at begin document}%
+ \fi
+ \fi
+ }% end of tocbibind branch
+ {}%
+ }% end of at begin document
+}% end of not with memoir branch
+% \end{macrocode}
+% \LaTeX\ 2021 fall release lets \csa{contentsline} always grab four
+% arguments, so with \etocrelease{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.
+% Let's also add \csa{protected@file@percent} at \etocrelease{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.
+%
+% \etocrelease{1.2} executes the \csbc{ifEtoc@hyperref} test inside the fourth
+% argument, rather than using one \csa{addtocontents} in each branch.
% \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@addtocontents #1#2{%
+ \addtocontents {toc}{%
+ \protect\contentsline{#1}{#2}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}%
+ \ifdefined\protected@file@percent\protected@file@percent\fi
+ }%
+}
\def\Etoc@addcontentsline@ #1#2#3{%
\@namedef{toclevel@#1}{#3}\addcontentsline {toc}{#1}{#2}%
}
@@ -9565,14 +11089,15 @@ of real structure in a \LaTeX{} document body).
\DeclareRobustCommand*{\etocimmediatetoccontentsline}
{\@ifstar{\Etoc@addcontentsline@@immediately}{\Etoc@addtocontents@immediately}}
% \end{macrocode}
-% placeholder
+% Formerly a \LaTeX{} counter |etoc@tocdepth| was used but at
+% \etocrelease{1.2} it has been replaced by macro-storage.
% \begin{macrocode}
-\def\Etoc@storetocdepth {\global\c@etoc@tocdepth\c@tocdepth }
-\def\Etoc@restoretocdepth {\global\c@tocdepth\c@etoc@tocdepth }
+\def\Etoc@storetocdepth {\xdef\Etoc@savedtocdepth{\number\c@tocdepth}}
+\def\Etoc@restoretocdepth {\global\c@tocdepth\Etoc@savedtocdepth\relax}
\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 }
+ {\afterassignment\Etoc@@nottoodeep \global\c@tocdepth}}
+\def\Etoc@@nottoodeep {\ifnum\Etoc@savedtocdepth<\c@tocdepth
+ \global\c@tocdepth\Etoc@savedtocdepth\relax\fi }
\def\etocignoretoctocdepth {\let\etoc@settocdepth\@gobble }
\def\etocsettocdepth {\futurelet\Etoc@nexttoken\Etoc@set@tocdepth }
\def\Etoc@set@tocdepth {\ifx\Etoc@nexttoken\bgroup
@@ -9615,7 +11140,7 @@ of real structure in a \LaTeX{} document body).
\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
+% \etocrelease{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}
@@ -9649,7 +11174,7 @@ of real structure in a \LaTeX{} document body).
{Use \protect\etocsettocdepth.toc as replacement}%
}%
\AtBeginDocument {%
- \@ifclassloaded{memoir}
+ \@ifclassloaded{memoir}
{\PackageInfo {etoc}
{Regarding `memoir' class command \protect\settocdepth, consider\MessageBreak
\protect\etocsettocdepth.toc as a drop-in replacement with more\MessageBreak
@@ -9658,8 +11183,8 @@ of real structure in a \LaTeX{} document body).
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 }%
+ {\@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 }%
@@ -9675,9 +11200,10 @@ of real structure in a \LaTeX{} document body).
{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
- }%
+ for `tocvsec2' toc-related commands}%
+ }% tocvsec2 loaded
+ {}% tocvsec2 not loaded
+ }%
}%
% \end{macrocode}
% placeholder
@@ -9730,27 +11256,40 @@ of real structure in a \LaTeX{} document body).
}%
}%
% \end{macrocode}
-% |1.09i| would like to rename this to \csa{Etoc@setlocaltop}, for
+% \etocrelease{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@@
+ \ifnum#1=\Etoc@@six@@
\Etoc@skipthisonetrue
\else
+ \Etoc@skipthisonefalse
+% \end{macrocode}
+% MEMO: the \csbc{Etoc@level} thus continues receiving updates from various
+% \csbc{etoc@setlocaltop} present in the |.toc| file even once the local toc
+% is already done, but this has no importance, as the code in
+% \csbc{Etoc@toctoc} after executing the code contents is not influenced by
+% this but only by the final status of \csbc{Etoc@stackofends} remains the
+% same. And this gets updated via \csbc{Etoc@setlocaltop@doendsandbegin} (see
+% below).
+%
+% I should check if not worthwile to move the \csbc{ifEtoc@stoptoc} test
+% earlier.
+%
+% There should be two notions of local top. One for a potential barrier,
+% stopping a toc, the other for setting a local top. These two should be
+% distinct. Or at least additional to this one which does both. But then I
+% would have to document. And test. And implement first.
+% \begin{macrocode}
+ \global\let\Etoc@level #1%
+ \global\let\Etoc@virtualtop #1%
\ifEtoc@localtoc
- \ifEtoc@stoptoc\Etoc@skipthisonetrue
+ \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
@@ -9762,42 +11301,48 @@ of real structure in a \LaTeX{} document body).
\let\Etoc@next\@empty
\ifEtoc@skipthisone
\else
- \ifnum\c@tocdepth<\Etoc@level
+ \ifnum\Etoc@level>\c@tocdepth
\else
- \ifEtoc@standard
+ \ifEtoc@standardlines
\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
+% So here the \csbc{etocsetlocaltop}|.toc| will cause various starts and
+% finish parts to get executed, even for the somewhat fictitious levels. But
+% this may cause collaterals, in particular we have to be careful about the
+% \csbc{ifEtoc@skipprefix} Boolean, which may be set to \csa{iftrue} in
+% the \marg{start} part of the level style and thus needs to be reset to
+% \csa{iffalse}. This is done automatically in \csbc{Etoc@etoccontentsline@}
+% but here we are not executing it so we need to add somewhere a
+% |\global\Etoc@skipprefixfalse| (else we may impact rendering of subsequent
+% level). So we put it together with \csbc{Etoc@doendsandbegin} in a wrapper.
+% This wrapper is also there to avoid a problem when the TOC is checked for
+% emptiness, as we need then to be able to tell \csbc{etoc@setlocaltop} to
+% not execute anything.
+%
+% 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}
+ \let\Etoc@next\Etoc@setlocaltop@doendsandbegin
+ \fi
+ \fi
+ \fi
\Etoc@next
}%
-\def\Etoc@setlocaltop@doends@dobegins
- {\Etoc@doends\Etoc@dobegins\global\Etoc@skipprefixfalse}%
+% \end{macrocode}
+% It is important to reset the \csbc{ifEtoc@skipprefix} boolean, as is done in
+% \csbc{Etoc@etoccontentsline@}.\par
+% \begin{macrocode}
+\def\Etoc@setlocaltop@doendsandbegin{%
+ \Etoc@doendsandbegin
+ \global\Etoc@skipprefixfalse
+}
\addtocontents {toc}{\protect\@ifundefined{etoctocstyle}%
{\let\protect\etoc@startlocaltoc\protect\@gobble
\let\protect\etoc@settocdepth\protect\@gobble
@@ -9806,23 +11351,37 @@ of real structure in a \LaTeX{} document body).
% \end{macrocode}
% Initializations.
% \begin{macrocode}
-\def\etocstandardlines {\Etoc@standardtrue}
-\def\etoctoclines {\Etoc@standardfalse}
+\def\etocstandardlines {\Etoc@standardlinestrue}
+\def\etoctoclines {\Etoc@standardlinesfalse}
\etocdefaultlines
\etocstandardlines
-\etocstandarddisplaystyle
+\def\etocstandarddisplaystyle{%
+ \PackageWarningNoLine{etoc}{%
+ \string\etocstandarddisplaystyle \on@line\MessageBreak
+ is deprecated. \space Please use \string\etocclasstocstyle}%
+}
+\expandafter\def\expandafter\etocclasstocstyle\expandafter{%
+ \etocclasstocstyle
+ \Etoc@classstyletrue
+}
+\def\etocetoclocaltocstyle{\Etoc@etocstyletrue}
+\def\etocusertocstyle{\Etoc@etocstylefalse}
+\etocclasstocstyle
+\etocetoclocaltocstyle
\etocobeytoctocdepth
\etocobeydepthtags
-\let\etocaftertochook \@empty
-\let\etocbeforetitlehook \@empty
+\let\etocbeforetitlehook \@empty
+\let\etocaftertitlehook \@empty
+\let\etocaftercontentshook \@empty
+\let\etocaftertochook \@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):
+% this special circumstance. So at \etocrelease{1.09d}, simply add this (the
+% boolean was added at \etocrelease{1.2}):
% \begin{macrocode}
\def\etockeeporiginaltableofcontents
- {\let\tableofcontents\etocoriginaltableofcontents}%
+ {\Etoc@keeporiginaltoctrue\let\tableofcontents\etocoriginaltableofcontents}%
\endinput
% \end{macrocode}
% \MakePercentComment
diff --git a/macros/latex/contrib/etoc/etoc.pdf b/macros/latex/contrib/etoc/etoc.pdf
index 8029b61f1f..667b79b3ad 100644
--- a/macros/latex/contrib/etoc/etoc.pdf
+++ b/macros/latex/contrib/etoc/etoc.pdf
Binary files differ
diff --git a/macros/latex/contrib/pangram/README.md b/macros/latex/contrib/pangram/README.md
index c68863edef..e7e2ff36a2 100644
--- a/macros/latex/contrib/pangram/README.md
+++ b/macros/latex/contrib/pangram/README.md
@@ -12,4 +12,4 @@ either version 1.3c of this license or (at your option) any later version.
------
-Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>.
+Copyright (C) 2022--2023 by Zhang Tingxuan <alphaztx@163.com>.
diff --git a/macros/latex/contrib/pangram/pangram.dtx b/macros/latex/contrib/pangram/pangram.dtx
index 8c33d97955..eadba37cef 100644
--- a/macros/latex/contrib/pangram/pangram.dtx
+++ b/macros/latex/contrib/pangram/pangram.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>
+% Copyright (C) 2022--2023 by Zhang Tingxuan <alphaztx@163.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -41,7 +41,7 @@ either version 1.3c of this license or (at your option) any later version.
------
-Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>.
+Copyright (C) 2022--2023 by Zhang Tingxuan <alphaztx@163.com>.
%</readme>
%
%<*internal>
@@ -58,7 +58,7 @@ Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>.
\preamble
- Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>
+ Copyright (C) 2022--2023 by Zhang Tingxuan <alphaztx@163.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -124,8 +124,8 @@ Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>.
%</internal>
%
%<*driver>
-\ProvidesFile{pangram.dtx}[2022/10/9 (c) Copyright 2022 by Zhang Tingxuan]
-\documentclass{ltxdoc}
+\ProvidesFile{pangram.dtx}[2023/03/01 (c) Copyright 2022--2023 by Zhang Tingxuan]
+\documentclass{l3doc}
\usepackage[letterpaper,left=5cm,right=4cm,top=4cm,bottom=4cm,
includeheadfoot]{geometry}
@@ -147,7 +147,7 @@ Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>.
\title{\leavevmode\hbox to 0pt{\hss\huge The quick brown fox jumps over the lazy dog\hss}\\
--- The \pkg{pangram} package}
\author{Zhang Tingxuan}
-\long\date{2022/10/9\quad Version 0.0b\thanks{\url{https://github.com/AlphaZTX/pangram}
+\long\date{2023/03/01\quad Version 0.0c\thanks{\url{https://github.com/AlphaZTX/pangram}
If you want to maintain this package, just contact me through GitHub issues or pull a
request.}}
@@ -199,7 +199,7 @@ request.}}
% \begin{abstract}
% Pangram is a phrase or sentence containing all letters in an alphabet,
% usually used for testing fonts. One famous pangram is ``The quick brown
-% fox jumps over the lazy dog''. This package provide a (somewhat) simple
+% fox jumps over the lazy dog''. This package provides a (somewhat) simple
% way for font designers or users to test fonts.
% \end{abstract}
%
@@ -304,17 +304,16 @@ request.}}
% \section{The source code}
% \begin{macrocode}
%<*package>
+%<@@=pangram>
\NeedsTeXFormat{LaTeX2e}[2022/06/01]
-\ProvidesPackage{pangram}[2022/10/09 Pangram, a tool for testing fonts]
+\ProvidesExplPackage{pangram}{2023/03/01}{0.0c}{a tool for testing fonts}
% \end{macrocode}
% Use a \opt{clist} to restore the sizes for \cs{pangram},
-% and an integer for its index (here we use \opt{index} instead
-% of \opt{int}).
+% and an integer for its index.
% \begin{macrocode}
-\ExplSyntaxOn
-\clist_new:N \l_pangram_sizes_clist
-\int_new:N \l_pangram_size_index
-\clist_set:Nn \l_pangram_sizes_clist
+\clist_new:N \l_@@_sizes_clist
+\int_new:N \l_@@_size_index_int
+\clist_set:Nn \l_@@_sizes_clist
{
5pt, 7pt, 8pt, 9pt, 10pt, 11pt,
12pt, 14pt, 16pt, 18pt, 20pt, 22pt,
@@ -323,56 +322,59 @@ request.}}
% \end{macrocode}
% Three pre-defined text classes (token lists) for \cs{pangram}.
% \begin{macrocode}
-\tl_const:Nn \c_pangram_text_default_tl
- { The~quick~brown~fox~jumps~over~the~lazy~dog. ~ 0123456789 }
-\tl_const:Nn \c_pangram_text_uppercase_tl
- { THE~QUICK~BROWN~FOX~JUMPS~OVER~THE~LAZY~DOG. ~ 0123456789 }
-\tl_const:Nn \c_pangram_text_glass_tl
- { I~can~eat~glass~and~it~doesn't~hurt~me. }
+\tl_const:Nn \c_@@_text_default_tl
+ { The ~ quick ~ brown ~ fox ~ jumps ~ over ~ the ~ lazy ~ dog. ~ 0123456789 }
+\tl_const:Nn \c_@@_text_uppercase_tl
+ { THE ~ QUICK ~ BROWN ~ FOX ~ JUMPS ~ OVER ~ THE ~ LAZY ~ DOG. ~ 0123456789 }
+\tl_const:Nn \c_@@_text_glass_tl
+ { I ~ can ~ eat ~ glass ~ and ~ it ~ doesn't ~ hurt ~ me. }
% \end{macrocode}
% \DescribeMacro{\NewPangramClass}
% Use way equivalent to \cs{csname}\dots\cs{endcsname} to define
% new text classes.
% \begin{macrocode}
-\NewDocumentCommand \NewPangramClass { m m }
+\NewDocumentCommand \NewPangramClass { m +m }
{
- \exp_after:wN \tl_const:Nn \cs:w c_pangram_text_#1_tl \cs_end: { #2 }
+ \tl_const:cn { c_@@_text_#1_tl } { #2 }
}
% \end{macrocode}
% Inner function for \opt{sizes} option. Here use the \pkg{xparse}'s new
% \cs{IfBlankTF} mechanism to judge if the sizes should be reset.
% \begin{macrocode}
-\NewDocumentCommand \pangram_resetsizes:n { m }
+\cs_new:Npn \@@_resetsizes:n #1
{
- \IfBlankF {#1} { \clist_set:Nn \l_pangram_sizes_clist { #1 } }
+ \tl_if_blank:nF { #1 }
+ {
+ \clist_set:Nn \l_@@_sizes_clist { #1 }
+ }
}
% \end{macrocode}
% The keys.
% \begin{macrocode}
\keys_define:nn { pangram }
{
- textclass.tl_set:N = \l_pangram_textclass_tl ,
+ textclass.tl_set:N = \l_@@_textclass_tl ,
textclass.default:n = default ,
textclass.initial:n = default ,
- sizes.code:n = \pangram_resetsizes:n { #1 } ,
- linegap.skip_set:N = \l_pangram_linegap_skip ,
+ sizes.code:n = \@@_resetsizes:n { #1 } ,
+ linegap.skip_set:N = \l_@@_linegap_skip ,
linegap.default:n = 5pt plus 3pt minus 2pt ,
linegap.initial:n = 5pt plus 3pt minus 2pt ,
- tagskip.skip_set:N = \l_pangram_tagskip_skip ,
+ tagskip.skip_set:N = \l_@@_tagskip_skip ,
tagskip.default:n = 5pt ,
tagskip.initial:n = 5pt ,
- tagfont.tl_set:N = \l_pangram_tagfont_tl ,
+ tagfont.tl_set:N = \l_@@_tagfont_tl ,
tagfont.default:n = \ttfamily \footnotesize ,
tagfont.initial:n = \ttfamily \footnotesize ,
- font.tl_set:N = \l_pangram_font_tl ,
- before.tl_set:N = \l_pangram_before_tl ,
- after.tl_set:N = \l_pangram_after_tl ,
+ font.tl_set:N = \l_@@_font_tl ,
+ before.tl_set:N = \l_@@_before_tl ,
+ after.tl_set:N = \l_@@_after_tl ,
}
% \end{macrocode}
% \DescribeMacro{\PangramSetup}
% Set up the package in preamble.
% \begin{macrocode}
-\NewDocumentCommand \PangramSetup { m }
+\NewDocumentCommand \PangramSetup { +m }
{ \keys_set:nn { pangram } { #1 } }
% \end{macrocode}
% \DescribeMacro{\pangram}
@@ -387,44 +389,43 @@ request.}}
% \end{macrocode}
% Use a loop to get all of the entries in the sizes \opt{clist}.
% \begin{macrocode}
- \int_set:Nn \l_pangram_size_index { 0 }
- \tl_use:N \l_pangram_before_tl
+ \int_set:Nn \l_@@_size_index_int { 0 }
+ \tl_use:N \l_@@_before_tl
\int_do_while:nNnn
- { \l_pangram_size_index } < { \clist_count:N \l_pangram_sizes_clist }
+ { \l_@@_size_index_int } < { \clist_count:N \l_@@_sizes_clist }
{
\mode_leave_vertical:
- \int_incr:N \l_pangram_size_index % index++;
+ \int_incr:N \l_@@_size_index_int
\hbox_to_zero:n
{
\hss
- \tl_use:N \l_pangram_tagfont_tl
- \clist_item:Nn \l_pangram_sizes_clist { \l_pangram_size_index }
- \skip_horizontal:N \l_pangram_tagskip_skip
+ \tl_use:N \l_@@_tagfont_tl
+ \clist_item:Nn \l_@@_sizes_clist { \l_@@_size_index_int }
+ \skip_horizontal:N \l_@@_tagskip_skip
}
\hbox_to_zero:n
{
- \tl_use:N \l_pangram_font_tl
+ \tl_use:N \l_@@_font_tl
\fontsize
- { \clist_item:Nn \l_pangram_sizes_clist { \l_pangram_size_index } }
+ { \clist_item:Nn \l_@@_sizes_clist { \l_@@_size_index_int } }
{ \c_zero_dim } % \z@
\selectfont
- \tl_use:c { c_pangram_text_ \tl_use:N \l_pangram_textclass_tl _tl }
+ \tl_use:c { c_@@_text_ \tl_use:N \l_@@_textclass_tl _tl }
\hss
}
\int_compare:nNnT
- { \l_pangram_size_index } = { \clist_count:N \l_pangram_sizes_clist }
- { \skip_set:Nn \l_pangram_linegap_skip {0pt} }
+ { \l_@@_size_index_int } = { \clist_count:N \l_@@_sizes_clist }
+ { \skip_set:Nn \l_@@_linegap_skip { \c_zero_dim } }
\par
- \skip_vertical:N \l_pangram_linegap_skip
+ \skip_vertical:N \l_@@_linegap_skip
}
% \end{macrocode}
% The loop ends here.
% \begin{macrocode}
- \tl_use:N \l_pangram_after_tl
+ \tl_use:N \l_@@_after_tl
\clearpage
\group_end:
}
-\ExplSyntaxOff
%</package>
% \end{macrocode}
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/pangram/pangram.ins b/macros/latex/contrib/pangram/pangram.ins
index 1c300da357..3fd124ad8a 100644
--- a/macros/latex/contrib/pangram/pangram.ins
+++ b/macros/latex/contrib/pangram/pangram.ins
@@ -6,7 +6,7 @@
%%
%% pangram.dtx (with options: `install')
%%
-%% Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>
+%% Copyright (C) 2022--2023 by Zhang Tingxuan <alphaztx@163.com>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -33,7 +33,7 @@
\preamble
- Copyright (C) 2022 by Zhang Tingxuan <alphaztx@163.com>
+ Copyright (C) 2022--2023 by Zhang Tingxuan <alphaztx@163.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
diff --git a/macros/latex/contrib/pangram/pangram.pdf b/macros/latex/contrib/pangram/pangram.pdf
index 008be5a8f8..e85cd74f26 100644
--- a/macros/latex/contrib/pangram/pangram.pdf
+++ b/macros/latex/contrib/pangram/pangram.pdf
Binary files differ
diff --git a/macros/latex/contrib/qrbill/README.md b/macros/latex/contrib/qrbill/README.md
index 03eff67b34..3888da81b2 100644
--- a/macros/latex/contrib/qrbill/README.md
+++ b/macros/latex/contrib/qrbill/README.md
@@ -1,10 +1,10 @@
# qrbill – create QR-bills based on the swiss payment standard
-Copyright (C) Marei Peischl (peiTeX) <marei@peitex.de>, 2020–2022
+Copyright (C) Marei Peischl (peiTeX) <marei@peitex.de>, 2020–2023
This work is part of a collaborative project of Marei Peischl (peiTeX) and Alex Antener (foobar LLC).
-qrbill 2022/10/20 v1.07
+qrbill 2023/02/28 v2.00
***************************************************************************
@@ -79,4 +79,6 @@ For further information on l3build and other options please have a look at the c
- add possibilities to ignore data fields if empty
- allow the usage of commas within the billing info
* v1.07 (2022-10-20)
- - fix utf8 encoding für qrmode=package \ No newline at end of file
+ - fix utf8 encoding für qrmode=package
+ * v2.00 (2023-02-28)
+ - add luaqrcode to qrbill \ No newline at end of file
diff --git a/macros/latex/contrib/qrbill/qrbill-qrencode.lua b/macros/latex/contrib/qrbill/qrbill-qrencode.lua
new file mode 100644
index 0000000000..1df9a1e2fe
--- /dev/null
+++ b/macros/latex/contrib/qrbill/qrbill-qrencode.lua
@@ -0,0 +1,1351 @@
+--- The qrcode library is licensed under the 3-clause BSD license (aka "new BSD")
+--- To get in contact with the author, mail to <gundlach@speedata.de>.
+---
+--- Please report bugs on the [github project page](http://speedata.github.io/luaqrcode/).
+-- Copyright (c) 2012-2020, Patrick Gundlach and contributors, see https://github.com/speedata/luaqrcode
+-- All rights reserved.
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+-- * Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- * Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+-- * Neither the name of SPEEDATA nor the
+-- names of its contributors may be used to endorse or promote products
+-- derived from this software without specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+-- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+-- DISCLAIMED. IN NO EVENT SHALL SPEEDATA GMBH BE LIABLE FOR ANY
+-- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+-- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+--- Overall workflow
+--- ================
+--- The steps to generate the qrcode, assuming we already have the codeword:
+---
+--- 1. Determine version, ec level and mode (=encoding) for codeword
+--- 1. Encode data
+--- 1. Arrange data and calculate error correction code
+--- 1. Generate 8 matrices with different masks and calculate the penalty
+--- 1. Return qrcode with least penalty
+---
+--- Each step is of course more or less complex and needs further description
+
+--- Helper functions
+--- ================
+---
+--- We start with some helper functions
+
+-- To calculate xor we need to do that bitwise. This helper table speeds up the num-to-bit
+-- part a bit (no pun intended)
+local cclxvi = {[0] = {0,0,0,0,0,0,0,0}, {1,0,0,0,0,0,0,0}, {0,1,0,0,0,0,0,0}, {1,1,0,0,0,0,0,0},
+{0,0,1,0,0,0,0,0}, {1,0,1,0,0,0,0,0}, {0,1,1,0,0,0,0,0}, {1,1,1,0,0,0,0,0},
+{0,0,0,1,0,0,0,0}, {1,0,0,1,0,0,0,0}, {0,1,0,1,0,0,0,0}, {1,1,0,1,0,0,0,0},
+{0,0,1,1,0,0,0,0}, {1,0,1,1,0,0,0,0}, {0,1,1,1,0,0,0,0}, {1,1,1,1,0,0,0,0},
+{0,0,0,0,1,0,0,0}, {1,0,0,0,1,0,0,0}, {0,1,0,0,1,0,0,0}, {1,1,0,0,1,0,0,0},
+{0,0,1,0,1,0,0,0}, {1,0,1,0,1,0,0,0}, {0,1,1,0,1,0,0,0}, {1,1,1,0,1,0,0,0},
+{0,0,0,1,1,0,0,0}, {1,0,0,1,1,0,0,0}, {0,1,0,1,1,0,0,0}, {1,1,0,1,1,0,0,0},
+{0,0,1,1,1,0,0,0}, {1,0,1,1,1,0,0,0}, {0,1,1,1,1,0,0,0}, {1,1,1,1,1,0,0,0},
+{0,0,0,0,0,1,0,0}, {1,0,0,0,0,1,0,0}, {0,1,0,0,0,1,0,0}, {1,1,0,0,0,1,0,0},
+{0,0,1,0,0,1,0,0}, {1,0,1,0,0,1,0,0}, {0,1,1,0,0,1,0,0}, {1,1,1,0,0,1,0,0},
+{0,0,0,1,0,1,0,0}, {1,0,0,1,0,1,0,0}, {0,1,0,1,0,1,0,0}, {1,1,0,1,0,1,0,0},
+{0,0,1,1,0,1,0,0}, {1,0,1,1,0,1,0,0}, {0,1,1,1,0,1,0,0}, {1,1,1,1,0,1,0,0},
+{0,0,0,0,1,1,0,0}, {1,0,0,0,1,1,0,0}, {0,1,0,0,1,1,0,0}, {1,1,0,0,1,1,0,0},
+{0,0,1,0,1,1,0,0}, {1,0,1,0,1,1,0,0}, {0,1,1,0,1,1,0,0}, {1,1,1,0,1,1,0,0},
+{0,0,0,1,1,1,0,0}, {1,0,0,1,1,1,0,0}, {0,1,0,1,1,1,0,0}, {1,1,0,1,1,1,0,0},
+{0,0,1,1,1,1,0,0}, {1,0,1,1,1,1,0,0}, {0,1,1,1,1,1,0,0}, {1,1,1,1,1,1,0,0},
+{0,0,0,0,0,0,1,0}, {1,0,0,0,0,0,1,0}, {0,1,0,0,0,0,1,0}, {1,1,0,0,0,0,1,0},
+{0,0,1,0,0,0,1,0}, {1,0,1,0,0,0,1,0}, {0,1,1,0,0,0,1,0}, {1,1,1,0,0,0,1,0},
+{0,0,0,1,0,0,1,0}, {1,0,0,1,0,0,1,0}, {0,1,0,1,0,0,1,0}, {1,1,0,1,0,0,1,0},
+{0,0,1,1,0,0,1,0}, {1,0,1,1,0,0,1,0}, {0,1,1,1,0,0,1,0}, {1,1,1,1,0,0,1,0},
+{0,0,0,0,1,0,1,0}, {1,0,0,0,1,0,1,0}, {0,1,0,0,1,0,1,0}, {1,1,0,0,1,0,1,0},
+{0,0,1,0,1,0,1,0}, {1,0,1,0,1,0,1,0}, {0,1,1,0,1,0,1,0}, {1,1,1,0,1,0,1,0},
+{0,0,0,1,1,0,1,0}, {1,0,0,1,1,0,1,0}, {0,1,0,1,1,0,1,0}, {1,1,0,1,1,0,1,0},
+{0,0,1,1,1,0,1,0}, {1,0,1,1,1,0,1,0}, {0,1,1,1,1,0,1,0}, {1,1,1,1,1,0,1,0},
+{0,0,0,0,0,1,1,0}, {1,0,0,0,0,1,1,0}, {0,1,0,0,0,1,1,0}, {1,1,0,0,0,1,1,0},
+{0,0,1,0,0,1,1,0}, {1,0,1,0,0,1,1,0}, {0,1,1,0,0,1,1,0}, {1,1,1,0,0,1,1,0},
+{0,0,0,1,0,1,1,0}, {1,0,0,1,0,1,1,0}, {0,1,0,1,0,1,1,0}, {1,1,0,1,0,1,1,0},
+{0,0,1,1,0,1,1,0}, {1,0,1,1,0,1,1,0}, {0,1,1,1,0,1,1,0}, {1,1,1,1,0,1,1,0},
+{0,0,0,0,1,1,1,0}, {1,0,0,0,1,1,1,0}, {0,1,0,0,1,1,1,0}, {1,1,0,0,1,1,1,0},
+{0,0,1,0,1,1,1,0}, {1,0,1,0,1,1,1,0}, {0,1,1,0,1,1,1,0}, {1,1,1,0,1,1,1,0},
+{0,0,0,1,1,1,1,0}, {1,0,0,1,1,1,1,0}, {0,1,0,1,1,1,1,0}, {1,1,0,1,1,1,1,0},
+{0,0,1,1,1,1,1,0}, {1,0,1,1,1,1,1,0}, {0,1,1,1,1,1,1,0}, {1,1,1,1,1,1,1,0},
+{0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,1}, {0,1,0,0,0,0,0,1}, {1,1,0,0,0,0,0,1},
+{0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,0,1}, {0,1,1,0,0,0,0,1}, {1,1,1,0,0,0,0,1},
+{0,0,0,1,0,0,0,1}, {1,0,0,1,0,0,0,1}, {0,1,0,1,0,0,0,1}, {1,1,0,1,0,0,0,1},
+{0,0,1,1,0,0,0,1}, {1,0,1,1,0,0,0,1}, {0,1,1,1,0,0,0,1}, {1,1,1,1,0,0,0,1},
+{0,0,0,0,1,0,0,1}, {1,0,0,0,1,0,0,1}, {0,1,0,0,1,0,0,1}, {1,1,0,0,1,0,0,1},
+{0,0,1,0,1,0,0,1}, {1,0,1,0,1,0,0,1}, {0,1,1,0,1,0,0,1}, {1,1,1,0,1,0,0,1},
+{0,0,0,1,1,0,0,1}, {1,0,0,1,1,0,0,1}, {0,1,0,1,1,0,0,1}, {1,1,0,1,1,0,0,1},
+{0,0,1,1,1,0,0,1}, {1,0,1,1,1,0,0,1}, {0,1,1,1,1,0,0,1}, {1,1,1,1,1,0,0,1},
+{0,0,0,0,0,1,0,1}, {1,0,0,0,0,1,0,1}, {0,1,0,0,0,1,0,1}, {1,1,0,0,0,1,0,1},
+{0,0,1,0,0,1,0,1}, {1,0,1,0,0,1,0,1}, {0,1,1,0,0,1,0,1}, {1,1,1,0,0,1,0,1},
+{0,0,0,1,0,1,0,1}, {1,0,0,1,0,1,0,1}, {0,1,0,1,0,1,0,1}, {1,1,0,1,0,1,0,1},
+{0,0,1,1,0,1,0,1}, {1,0,1,1,0,1,0,1}, {0,1,1,1,0,1,0,1}, {1,1,1,1,0,1,0,1},
+{0,0,0,0,1,1,0,1}, {1,0,0,0,1,1,0,1}, {0,1,0,0,1,1,0,1}, {1,1,0,0,1,1,0,1},
+{0,0,1,0,1,1,0,1}, {1,0,1,0,1,1,0,1}, {0,1,1,0,1,1,0,1}, {1,1,1,0,1,1,0,1},
+{0,0,0,1,1,1,0,1}, {1,0,0,1,1,1,0,1}, {0,1,0,1,1,1,0,1}, {1,1,0,1,1,1,0,1},
+{0,0,1,1,1,1,0,1}, {1,0,1,1,1,1,0,1}, {0,1,1,1,1,1,0,1}, {1,1,1,1,1,1,0,1},
+{0,0,0,0,0,0,1,1}, {1,0,0,0,0,0,1,1}, {0,1,0,0,0,0,1,1}, {1,1,0,0,0,0,1,1},
+{0,0,1,0,0,0,1,1}, {1,0,1,0,0,0,1,1}, {0,1,1,0,0,0,1,1}, {1,1,1,0,0,0,1,1},
+{0,0,0,1,0,0,1,1}, {1,0,0,1,0,0,1,1}, {0,1,0,1,0,0,1,1}, {1,1,0,1,0,0,1,1},
+{0,0,1,1,0,0,1,1}, {1,0,1,1,0,0,1,1}, {0,1,1,1,0,0,1,1}, {1,1,1,1,0,0,1,1},
+{0,0,0,0,1,0,1,1}, {1,0,0,0,1,0,1,1}, {0,1,0,0,1,0,1,1}, {1,1,0,0,1,0,1,1},
+{0,0,1,0,1,0,1,1}, {1,0,1,0,1,0,1,1}, {0,1,1,0,1,0,1,1}, {1,1,1,0,1,0,1,1},
+{0,0,0,1,1,0,1,1}, {1,0,0,1,1,0,1,1}, {0,1,0,1,1,0,1,1}, {1,1,0,1,1,0,1,1},
+{0,0,1,1,1,0,1,1}, {1,0,1,1,1,0,1,1}, {0,1,1,1,1,0,1,1}, {1,1,1,1,1,0,1,1},
+{0,0,0,0,0,1,1,1}, {1,0,0,0,0,1,1,1}, {0,1,0,0,0,1,1,1}, {1,1,0,0,0,1,1,1},
+{0,0,1,0,0,1,1,1}, {1,0,1,0,0,1,1,1}, {0,1,1,0,0,1,1,1}, {1,1,1,0,0,1,1,1},
+{0,0,0,1,0,1,1,1}, {1,0,0,1,0,1,1,1}, {0,1,0,1,0,1,1,1}, {1,1,0,1,0,1,1,1},
+{0,0,1,1,0,1,1,1}, {1,0,1,1,0,1,1,1}, {0,1,1,1,0,1,1,1}, {1,1,1,1,0,1,1,1},
+{0,0,0,0,1,1,1,1}, {1,0,0,0,1,1,1,1}, {0,1,0,0,1,1,1,1}, {1,1,0,0,1,1,1,1},
+{0,0,1,0,1,1,1,1}, {1,0,1,0,1,1,1,1}, {0,1,1,0,1,1,1,1}, {1,1,1,0,1,1,1,1},
+{0,0,0,1,1,1,1,1}, {1,0,0,1,1,1,1,1}, {0,1,0,1,1,1,1,1}, {1,1,0,1,1,1,1,1},
+{0,0,1,1,1,1,1,1}, {1,0,1,1,1,1,1,1}, {0,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1}}
+
+-- Return a number that is the result of interpreting the table tbl (msb first)
+local function tbl_to_number(tbl)
+ local n = #tbl
+ local rslt = 0
+ local power = 1
+ for i = 1, n do
+ rslt = rslt + tbl[i]*power
+ power = power*2
+ end
+ return rslt
+end
+
+-- Calculate bitwise xor of bytes m and n. 0 <= m,n <= 256.
+local function bit_xor(m, n)
+ local tbl_m = cclxvi[m]
+ local tbl_n = cclxvi[n]
+ local tbl = {}
+ for i = 1, 8 do
+ if(tbl_m[i] ~= tbl_n[i]) then
+ tbl[i] = 1
+ else
+ tbl[i] = 0
+ end
+ end
+ return tbl_to_number(tbl)
+end
+
+-- Return the binary representation of the number x with the width of `digits`.
+local function binary(x,digits)
+ local s=string.format("%o",x)
+ local a={["0"]="000",["1"]="001", ["2"]="010",["3"]="011",
+ ["4"]="100",["5"]="101", ["6"]="110",["7"]="111"}
+ s=string.gsub(s,"(.)",function (d) return a[d] end)
+ -- remove leading 0s
+ s = string.gsub(s,"^0*(.*)$","%1")
+ local fmtstring = string.format("%%%ds",digits)
+ local ret = string.format(fmtstring,s)
+ return string.gsub(ret," ","0")
+end
+
+-- A small helper function for add_typeinfo_to_matrix() and add_version_information()
+-- Add a 2 (black by default) / -2 (blank by default) to the matrix at position x,y
+-- depending on the bitstring (size 1!) where "0"=blank and "1"=black.
+local function fill_matrix_position(matrix,bitstring,x,y)
+ if bitstring == "1" then
+ matrix[x][y] = 2
+ else
+ matrix[x][y] = -2
+ end
+end
+
+
+--- Step 1: Determine version, ec level and mode for codeword
+--- ========================================================
+---
+--- First we need to find out the version (= size) of the QR code. This depends on
+--- the input data (the mode to be used), the requested error correction level
+--- (normally we use the maximum level that fits into the minimal size).
+
+-- Return the mode for the given string `str`.
+-- See table 2 of the spec. We only support mode 1, 2 and 4.
+-- That is: numeric, alaphnumeric and binary.
+local function get_mode( str )
+ if string.match(str,"^[0-9]+$") then
+ return 1
+ elseif string.match(str,"^[0-9A-Z $%%*./:+-]+$") then
+ return 2
+ else
+ return 4
+ end
+ assert(false,"never reached") -- luacheck: ignore
+ return nil
+end
+
+
+
+--- Capacity of QR codes
+--- --------------------
+--- The capacity is calculated as follow: \\(\text{Number of data bits} = \text{number of codewords} * 8\\).
+--- The number of data bits is now reduced by 4 (the mode indicator) and the length string,
+--- that varies between 8 and 16, depending on the version and the mode (see method `get_length()`). The
+--- remaining capacity is multiplied by the amount of data per bit string (numeric: 3, alphanumeric: 2, other: 1)
+--- and divided by the length of the bit string (numeric: 10, alphanumeric: 11, binary: 8, kanji: 13).
+--- Then the floor function is applied to the result:
+--- $$\Big\lfloor \frac{( \text{#data bits} - 4 - \text{length string}) * \text{data per bit string}}{\text{length of the bit string}} \Big\rfloor$$
+---
+--- There is one problem remaining. The length string depends on the version,
+--- and the version depends on the length string. But we take this into account when calculating the
+--- the capacity, so this is not really a problem here.
+
+-- The capacity (number of codewords) of each version (1-40) for error correction levels 1-4 (LMQH).
+-- The higher the ec level, the lower the capacity of the version. Taken from spec, tables 7-11.
+local capacity = {
+ { 19, 16, 13, 9},{ 34, 28, 22, 16},{ 55, 44, 34, 26},{ 80, 64, 48, 36},
+ { 108, 86, 62, 46},{ 136, 108, 76, 60},{ 156, 124, 88, 66},{ 194, 154, 110, 86},
+ { 232, 182, 132, 100},{ 274, 216, 154, 122},{ 324, 254, 180, 140},{ 370, 290, 206, 158},
+ { 428, 334, 244, 180},{ 461, 365, 261, 197},{ 523, 415, 295, 223},{ 589, 453, 325, 253},
+ { 647, 507, 367, 283},{ 721, 563, 397, 313},{ 795, 627, 445, 341},{ 861, 669, 485, 385},
+ { 932, 714, 512, 406},{1006, 782, 568, 442},{1094, 860, 614, 464},{1174, 914, 664, 514},
+ {1276, 1000, 718, 538},{1370, 1062, 754, 596},{1468, 1128, 808, 628},{1531, 1193, 871, 661},
+ {1631, 1267, 911, 701},{1735, 1373, 985, 745},{1843, 1455, 1033, 793},{1955, 1541, 1115, 845},
+ {2071, 1631, 1171, 901},{2191, 1725, 1231, 961},{2306, 1812, 1286, 986},{2434, 1914, 1354, 1054},
+ {2566, 1992, 1426, 1096},{2702, 2102, 1502, 1142},{2812, 2216, 1582, 1222},{2956, 2334, 1666, 1276}}
+
+
+--- Return the smallest version for this codeword. If `requested_ec_level` is supplied,
+--- then the ec level (LMQH - 1,2,3,4) must be at least the requested level.
+-- mode = 1,2,4,8
+local function get_version_eclevel(len,mode,requested_ec_level)
+ local local_mode = mode
+ if mode == 4 then
+ local_mode = 3
+ elseif mode == 8 then
+ local_mode = 4
+ end
+ assert( local_mode <= 4 )
+
+ local bits, digits, modebits, c
+ local tab = { {10,9,8,8},{12,11,16,10},{14,13,16,12} }
+ local minversion = 40
+ local maxec_level = requested_ec_level or 1
+ local min,max = 1, 4
+ if requested_ec_level and requested_ec_level >= 1 and requested_ec_level <= 4 then
+ min = requested_ec_level
+ max = requested_ec_level
+ end
+ for ec_level=min,max do
+ for version=1,#capacity do
+ bits = capacity[version][ec_level] * 8
+ bits = bits - 4 -- the mode indicator
+ if version < 10 then
+ digits = tab[1][local_mode]
+ elseif version < 27 then
+ digits = tab[2][local_mode]
+ elseif version <= 40 then
+ digits = tab[3][local_mode]
+ end
+ modebits = bits - digits
+ if local_mode == 1 then -- numeric
+ c = math.floor(modebits * 3 / 10)
+ elseif local_mode == 2 then -- alphanumeric
+ c = math.floor(modebits * 2 / 11)
+ elseif local_mode == 3 then -- binary
+ c = math.floor(modebits * 1 / 8)
+ else
+ c = math.floor(modebits * 1 / 13)
+ end
+ if c >= len then
+ if version <= minversion then
+ minversion = version
+ maxec_level = ec_level
+ end
+ break
+ end
+ end
+ end
+ return minversion, maxec_level
+end
+
+-- Return a bit string of 0s and 1s that includes the length of the code string.
+-- The modes are numeric = 1, alphanumeric = 2, binary = 4, and japanese = 8
+local function get_length(str,version,mode)
+ local i = mode
+ if mode == 4 then
+ i = 3
+ elseif mode == 8 then
+ i = 4
+ end
+ assert( i <= 4 )
+ local tab = { {10,9,8,8},{12,11,16,10},{14,13,16,12} }
+ local digits
+ if version < 10 then
+ digits = tab[1][i]
+ elseif version < 27 then
+ digits = tab[2][i]
+ elseif version <= 40 then
+ digits = tab[3][i]
+ else
+ assert(false, "get_length, version > 40 not supported")
+ end
+ local len = binary(#str,digits)
+ return len
+end
+
+--- If the `requested_ec_level` or the `mode` are provided, this will be used if possible.
+--- The mode depends on the characters used in the string `str`. It seems to be
+--- possible to split the QR code to handle multiple modes, but we don't do that.
+local function get_version_eclevel_mode_bistringlength(str,requested_ec_level,mode)
+ local local_mode
+ if mode then
+ assert(false,"not implemented")
+ -- check if the mode is OK for the string
+ local_mode = mode
+ else
+ local_mode = get_mode(str)
+ end
+ local version, ec_level
+ version, ec_level = get_version_eclevel(#str,local_mode,requested_ec_level)
+ local length_string = get_length(str,version,local_mode)
+ return version,ec_level,binary(local_mode,4),local_mode,length_string
+end
+
+--- Step 2: Encode data
+--- ===================
+
+--- There are several ways to encode the data. We currently support only numeric, alphanumeric and binary.
+--- We already chose the encoding (a.k.a. mode) in the first step, so we need to apply the mode to the
+--- codeword.
+---
+--- **Numeric**: take three digits and encode them in 10 bits
+--- **Alphanumeric**: take two characters and encode them in 11 bits
+--- **Binary**: take one octet and encode it in 8 bits
+
+local asciitbl = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 0x01-0x0f
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -- 0x10-0x1f
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, -- 0x20-0x2f
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, -- 0x30-0x3f
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -- 0x40-0x4f
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -- 0x50-0x5f
+ }
+
+-- Return a binary representation of the numeric string `str`. This must contain only digits 0-9.
+local function encode_string_numeric(str)
+ local bitstring = ""
+ local int
+ string.gsub(str,"..?.?",function(a)
+ int = tonumber(a)
+ if #a == 3 then
+ bitstring = bitstring .. binary(int,10)
+ elseif #a == 2 then
+ bitstring = bitstring .. binary(int,7)
+ else
+ bitstring = bitstring .. binary(int,4)
+ end
+ end)
+ return bitstring
+end
+
+-- Return a binary representation of the alphanumeric string `str`. This must contain only
+-- digits 0-9, uppercase letters A-Z, space and the following chars: $%*./:+-.
+local function encode_string_ascii(str)
+ local bitstring = ""
+ local int
+ local b1, b2
+ string.gsub(str,"..?",function(a)
+ if #a == 2 then
+ b1 = asciitbl[string.byte(string.sub(a,1,1))]
+ b2 = asciitbl[string.byte(string.sub(a,2,2))]
+ int = b1 * 45 + b2
+ bitstring = bitstring .. binary(int,11)
+ else
+ int = asciitbl[string.byte(a)]
+ bitstring = bitstring .. binary(int,6)
+ end
+ end)
+ return bitstring
+end
+
+-- Return a bitstring representing string str in binary mode.
+-- We don't handle UTF-8 in any special way because we assume the
+-- scanner recognizes UTF-8 and displays it correctly.
+local function encode_string_binary(str)
+ local ret = {}
+ string.gsub(str,".",function(x)
+ ret[#ret + 1] = binary(string.byte(x),8)
+ end)
+ return table.concat(ret)
+end
+
+-- Return a bitstring representing string str in the given mode.
+local function encode_data(str,mode)
+ if mode == 1 then
+ return encode_string_numeric(str)
+ elseif mode == 2 then
+ return encode_string_ascii(str)
+ elseif mode == 4 then
+ return encode_string_binary(str)
+ else
+ assert(false,"not implemented yet")
+ end
+end
+
+-- Encoding the codeword is not enough. We need to make sure that
+-- the length of the binary string is equal to the number of codewords of the version.
+local function add_pad_data(version,ec_level,data)
+ local count_to_pad, missing_digits
+ local cpty = capacity[version][ec_level] * 8
+ count_to_pad = math.min(4,cpty - #data)
+ if count_to_pad > 0 then
+ data = data .. string.rep("0",count_to_pad)
+ end
+ if math.fmod(#data,8) ~= 0 then
+ missing_digits = 8 - math.fmod(#data,8)
+ data = data .. string.rep("0",missing_digits)
+ end
+ assert(math.fmod(#data,8) == 0)
+ -- add "11101100" and "00010001" until enough data
+ while #data < cpty do
+ data = data .. "11101100"
+ if #data < cpty then
+ data = data .. "00010001"
+ end
+ end
+ return data
+end
+
+
+
+--- Step 3: Organize data and calculate error correction code
+--- =======================================================
+--- The data in the qrcode is not encoded linearly. For example code 5-H has four blocks, the first two blocks
+--- contain 11 codewords and 22 error correction codes each, the second block contain 12 codewords and 22 ec codes each.
+--- We just take the table from the spec and don't calculate the blocks ourself. The table `ecblocks` contains this info.
+---
+--- During the phase of splitting the data into codewords, we do the calculation for error correction codes. This step involves
+--- polynomial division. Find a math book from school and follow the code here :)
+
+--- ### Reed Solomon error correction
+--- Now this is the slightly ugly part of the error correction. We start with log/antilog tables
+-- https://codyplanteen.com/assets/rs/gf256_log_antilog.pdf
+local alpha_int = {
+ [0] = 1,
+ 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76,
+ 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157,
+ 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70,
+ 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95,
+ 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253,
+ 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217,
+ 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129,
+ 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133,
+ 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168,
+ 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230,
+ 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227,
+ 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130,
+ 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81,
+ 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18,
+ 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44,
+ 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142, 0, 0
+}
+
+local int_alpha = {
+ [0] = 256, -- special value
+ 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4,
+ 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5,
+ 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29,
+ 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6,
+ 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54,
+ 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30,
+ 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202,
+ 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7,
+ 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227,
+ 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55,
+ 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242,
+ 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31,
+ 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108,
+ 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203,
+ 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79,
+ 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175
+}
+
+-- We only need the polynomial generators for block sizes 7, 10, 13, 15, 16, 17, 18, 20, 22, 24, 26, 28, and 30. Version
+-- 2 of the qr codes don't need larger ones (as opposed to version 1). The table has the format x^1*ɑ^21 + x^2*a^102 ...
+local generator_polynomial = {
+ [7] = { 21, 102, 238, 149, 146, 229, 87, 0},
+ [10] = { 45, 32, 94, 64, 70, 118, 61, 46, 67, 251, 0 },
+ [13] = { 78, 140, 206, 218, 130, 104, 106, 100, 86, 100, 176, 152, 74, 0 },
+ [15] = {105, 99, 5, 124, 140, 237, 58, 58, 51, 37, 202, 91, 61, 183, 8, 0},
+ [16] = {120, 225, 194, 182, 169, 147, 191, 91, 3, 76, 161, 102, 109, 107, 104, 120, 0},
+ [17] = {136, 163, 243, 39, 150, 99, 24, 147, 214, 206, 123, 239, 43, 78, 206, 139, 43, 0},
+ [18] = {153, 96, 98, 5, 179, 252, 148, 152, 187, 79, 170, 118, 97, 184, 94, 158, 234, 215, 0},
+ [20] = {190, 188, 212, 212, 164, 156, 239, 83, 225, 221, 180, 202, 187, 26, 163, 61, 50, 79, 60, 17, 0},
+ [22] = {231, 165, 105, 160, 134, 219, 80, 98, 172, 8, 74, 200, 53, 221, 109, 14, 230, 93, 242, 247, 171, 210, 0},
+ [24] = { 21, 227, 96, 87, 232, 117, 0, 111, 218, 228, 226, 192, 152, 169, 180, 159, 126, 251, 117, 211, 48, 135, 121, 229, 0},
+ [26] = { 70, 218, 145, 153, 227, 48, 102, 13, 142, 245, 21, 161, 53, 165, 28, 111, 201, 145, 17, 118, 182, 103, 2, 158, 125, 173, 0},
+ [28] = {123, 9, 37, 242, 119, 212, 195, 42, 87, 245, 43, 21, 201, 232, 27, 205, 147, 195, 190, 110, 180, 108, 234, 224, 104, 200, 223, 168, 0},
+ [30] = {180, 192, 40, 238, 216, 251, 37, 156, 130, 224, 193, 226, 173, 42, 125, 222, 96, 239, 86, 110, 48, 50, 182, 179, 31, 216, 152, 145, 173, 41, 0}}
+
+
+-- Turn a binary string of length 8*x into a table size x of numbers.
+local function convert_bitstring_to_bytes(data)
+ local msg = {}
+ string.gsub(data,"(........)",function(x)
+ msg[#msg+1] = tonumber(x,2)
+ end)
+ return msg
+end
+
+-- Return a table that has 0's in the first entries and then the alpha
+-- representation of the generator polynominal
+local function get_generator_polynominal_adjusted(num_ec_codewords,highest_exponent)
+ local gp_alpha = {[0]=0}
+ for i=0,highest_exponent - num_ec_codewords - 1 do
+ gp_alpha[i] = 0
+ end
+ local gp = generator_polynomial[num_ec_codewords]
+ for i=1,num_ec_codewords + 1 do
+ gp_alpha[highest_exponent - num_ec_codewords + i - 1] = gp[i]
+ end
+ return gp_alpha
+end
+
+--- These converter functions use the log/antilog table above.
+--- We could have created the table programatically, but I like fixed tables.
+-- Convert polynominal in int notation to alpha notation.
+local function convert_to_alpha( tab )
+ local new_tab = {}
+ for i=0,#tab do
+ new_tab[i] = int_alpha[tab[i]]
+ end
+ return new_tab
+end
+
+-- Convert polynominal in alpha notation to int notation.
+local function convert_to_int(tab)
+ local new_tab = {}
+ for i=0,#tab do
+ new_tab[i] = alpha_int[tab[i]]
+ end
+ return new_tab
+end
+
+-- That's the heart of the error correction calculation.
+local function calculate_error_correction(data,num_ec_codewords)
+ local mp
+ if type(data)=="string" then
+ mp = convert_bitstring_to_bytes(data)
+ elseif type(data)=="table" then
+ mp = data
+ else
+ assert(false,string.format("Unknown type for data: %s",type(data)))
+ end
+ local len_message = #mp
+
+ local highest_exponent = len_message + num_ec_codewords - 1
+ local gp_alpha,tmp
+ local he
+ local gp_int, mp_alpha
+ local mp_int = {}
+ -- create message shifted to left (highest exponent)
+ for i=1,len_message do
+ mp_int[highest_exponent - i + 1] = mp[i]
+ end
+ for i=1,highest_exponent - len_message do
+ mp_int[i] = 0
+ end
+ mp_int[0] = 0
+
+ mp_alpha = convert_to_alpha(mp_int)
+
+ while highest_exponent >= num_ec_codewords do
+ gp_alpha = get_generator_polynominal_adjusted(num_ec_codewords,highest_exponent)
+
+ -- Multiply generator polynomial by first coefficient of the above polynomial
+
+ -- take the highest exponent from the message polynom (alpha) and add
+ -- it to the generator polynom
+ local exp = mp_alpha[highest_exponent]
+ for i=highest_exponent,highest_exponent - num_ec_codewords,-1 do
+ if exp ~= 256 then
+ if gp_alpha[i] + exp >= 255 then
+ gp_alpha[i] = math.fmod(gp_alpha[i] + exp,255)
+ else
+ gp_alpha[i] = gp_alpha[i] + exp
+ end
+ else
+ gp_alpha[i] = 256
+ end
+ end
+ for i=highest_exponent - num_ec_codewords - 1,0,-1 do
+ gp_alpha[i] = 256
+ end
+
+ gp_int = convert_to_int(gp_alpha)
+ mp_int = convert_to_int(mp_alpha)
+
+
+ tmp = {}
+ for i=highest_exponent,0,-1 do
+ tmp[i] = bit_xor(gp_int[i],mp_int[i])
+ end
+ -- remove leading 0's
+ he = highest_exponent
+ for i=he,0,-1 do
+ -- We need to stop if the length of the codeword is matched
+ if i < num_ec_codewords then break end
+ if tmp[i] == 0 then
+ tmp[i] = nil
+ highest_exponent = highest_exponent - 1
+ else
+ break
+ end
+ end
+ mp_int = tmp
+ mp_alpha = convert_to_alpha(mp_int)
+ end
+ local ret = {}
+
+ -- reverse data
+ for i=#mp_int,0,-1 do
+ ret[#ret + 1] = mp_int[i]
+ end
+ return ret
+end
+
+--- #### Arranging the data
+--- Now we arrange the data into smaller chunks. This table is taken from the spec.
+-- ecblocks has 40 entries, one for each version. Each version entry has 4 entries, for each LMQH
+-- ec level. Each entry has two or four fields, the odd files are the number of repetitions for the
+-- folowing block info. The first entry of the block is the total number of codewords in the block,
+-- the second entry is the number of data codewords. The third is not important.
+local ecblocks = {
+ {{ 1,{ 26, 19, 2} }, { 1,{26,16, 4}}, { 1,{26,13, 6}}, { 1, {26, 9, 8} }},
+ {{ 1,{ 44, 34, 4} }, { 1,{44,28, 8}}, { 1,{44,22,11}}, { 1, {44,16,14} }},
+ {{ 1,{ 70, 55, 7} }, { 1,{70,44,13}}, { 2,{35,17, 9}}, { 2, {35,13,11} }},
+ {{ 1,{100, 80,10} }, { 2,{50,32, 9}}, { 2,{50,24,13}}, { 4, {25, 9, 8} }},
+ {{ 1,{134,108,13} }, { 2,{67,43,12}}, { 2,{33,15, 9}, 2,{34,16, 9}}, { 2, {33,11,11}, 2,{34,12,11}}},
+ {{ 2,{ 86, 68, 9} }, { 4,{43,27, 8}}, { 4,{43,19,12}}, { 4, {43,15,14} }},
+ {{ 2,{ 98, 78,10} }, { 4,{49,31, 9}}, { 2,{32,14, 9}, 4,{33,15, 9}}, { 4, {39,13,13}, 1,{40,14,13}}},
+ {{ 2,{121, 97,12} }, { 2,{60,38,11}, 2,{61,39,11}}, { 4,{40,18,11}, 2,{41,19,11}}, { 4, {40,14,13}, 2,{41,15,13}}},
+ {{ 2,{146,116,15} }, { 3,{58,36,11}, 2,{59,37,11}}, { 4,{36,16,10}, 4,{37,17,10}}, { 4, {36,12,12}, 4,{37,13,12}}},
+ {{ 2,{ 86, 68, 9}, 2,{ 87, 69, 9}}, { 4,{69,43,13}, 1,{70,44,13}}, { 6,{43,19,12}, 2,{44,20,12}}, { 6, {43,15,14}, 2,{44,16,14}}},
+ {{ 4,{101, 81,10} }, { 1,{80,50,15}, 4,{81,51,15}}, { 4,{50,22,14}, 4,{51,23,14}}, { 3, {36,12,12}, 8,{37,13,12}}},
+ {{ 2,{116, 92,12}, 2,{117, 93,12}}, { 6,{58,36,11}, 2,{59,37,11}}, { 4,{46,20,13}, 6,{47,21,13}}, { 7, {42,14,14}, 4,{43,15,14}}},
+ {{ 4,{133,107,13} }, { 8,{59,37,11}, 1,{60,38,11}}, { 8,{44,20,12}, 4,{45,21,12}}, { 12, {33,11,11}, 4,{34,12,11}}},
+ {{ 3,{145,115,15}, 1,{146,116,15}}, { 4,{64,40,12}, 5,{65,41,12}}, { 11,{36,16,10}, 5,{37,17,10}}, { 11, {36,12,12}, 5,{37,13,12}}},
+ {{ 5,{109, 87,11}, 1,{110, 88,11}}, { 5,{65,41,12}, 5,{66,42,12}}, { 5,{54,24,15}, 7,{55,25,15}}, { 11, {36,12,12}, 7,{37,13,12}}},
+ {{ 5,{122, 98,12}, 1,{123, 99,12}}, { 7,{73,45,14}, 3,{74,46,14}}, { 15,{43,19,12}, 2,{44,20,12}}, { 3, {45,15,15}, 13,{46,16,15}}},
+ {{ 1,{135,107,14}, 5,{136,108,14}}, { 10,{74,46,14}, 1,{75,47,14}}, { 1,{50,22,14}, 15,{51,23,14}}, { 2, {42,14,14}, 17,{43,15,14}}},
+ {{ 5,{150,120,15}, 1,{151,121,15}}, { 9,{69,43,13}, 4,{70,44,13}}, { 17,{50,22,14}, 1,{51,23,14}}, { 2, {42,14,14}, 19,{43,15,14}}},
+ {{ 3,{141,113,14}, 4,{142,114,14}}, { 3,{70,44,13}, 11,{71,45,13}}, { 17,{47,21,13}, 4,{48,22,13}}, { 9, {39,13,13}, 16,{40,14,13}}},
+ {{ 3,{135,107,14}, 5,{136,108,14}}, { 3,{67,41,13}, 13,{68,42,13}}, { 15,{54,24,15}, 5,{55,25,15}}, { 15, {43,15,14}, 10,{44,16,14}}},
+ {{ 4,{144,116,14}, 4,{145,117,14}}, { 17,{68,42,13}}, { 17,{50,22,14}, 6,{51,23,14}}, { 19, {46,16,15}, 6,{47,17,15}}},
+ {{ 2,{139,111,14}, 7,{140,112,14}}, { 17,{74,46,14}}, { 7,{54,24,15}, 16,{55,25,15}}, { 34, {37,13,12} }},
+ {{ 4,{151,121,15}, 5,{152,122,15}}, { 4,{75,47,14}, 14,{76,48,14}}, { 11,{54,24,15}, 14,{55,25,15}}, { 16, {45,15,15}, 14,{46,16,15}}},
+ {{ 6,{147,117,15}, 4,{148,118,15}}, { 6,{73,45,14}, 14,{74,46,14}}, { 11,{54,24,15}, 16,{55,25,15}}, { 30, {46,16,15}, 2,{47,17,15}}},
+ {{ 8,{132,106,13}, 4,{133,107,13}}, { 8,{75,47,14}, 13,{76,48,14}}, { 7,{54,24,15}, 22,{55,25,15}}, { 22, {45,15,15}, 13,{46,16,15}}},
+ {{ 10,{142,114,14}, 2,{143,115,14}}, { 19,{74,46,14}, 4,{75,47,14}}, { 28,{50,22,14}, 6,{51,23,14}}, { 33, {46,16,15}, 4,{47,17,15}}},
+ {{ 8,{152,122,15}, 4,{153,123,15}}, { 22,{73,45,14}, 3,{74,46,14}}, { 8,{53,23,15}, 26,{54,24,15}}, { 12, {45,15,15}, 28,{46,16,15}}},
+ {{ 3,{147,117,15}, 10,{148,118,15}}, { 3,{73,45,14}, 23,{74,46,14}}, { 4,{54,24,15}, 31,{55,25,15}}, { 11, {45,15,15}, 31,{46,16,15}}},
+ {{ 7,{146,116,15}, 7,{147,117,15}}, { 21,{73,45,14}, 7,{74,46,14}}, { 1,{53,23,15}, 37,{54,24,15}}, { 19, {45,15,15}, 26,{46,16,15}}},
+ {{ 5,{145,115,15}, 10,{146,116,15}}, { 19,{75,47,14}, 10,{76,48,14}}, { 15,{54,24,15}, 25,{55,25,15}}, { 23, {45,15,15}, 25,{46,16,15}}},
+ {{ 13,{145,115,15}, 3,{146,116,15}}, { 2,{74,46,14}, 29,{75,47,14}}, { 42,{54,24,15}, 1,{55,25,15}}, { 23, {45,15,15}, 28,{46,16,15}}},
+ {{ 17,{145,115,15} }, { 10,{74,46,14}, 23,{75,47,14}}, { 10,{54,24,15}, 35,{55,25,15}}, { 19, {45,15,15}, 35,{46,16,15}}},
+ {{ 17,{145,115,15}, 1,{146,116,15}}, { 14,{74,46,14}, 21,{75,47,14}}, { 29,{54,24,15}, 19,{55,25,15}}, { 11, {45,15,15}, 46,{46,16,15}}},
+ {{ 13,{145,115,15}, 6,{146,116,15}}, { 14,{74,46,14}, 23,{75,47,14}}, { 44,{54,24,15}, 7,{55,25,15}}, { 59, {46,16,15}, 1,{47,17,15}}},
+ {{ 12,{151,121,15}, 7,{152,122,15}}, { 12,{75,47,14}, 26,{76,48,14}}, { 39,{54,24,15}, 14,{55,25,15}}, { 22, {45,15,15}, 41,{46,16,15}}},
+ {{ 6,{151,121,15}, 14,{152,122,15}}, { 6,{75,47,14}, 34,{76,48,14}}, { 46,{54,24,15}, 10,{55,25,15}}, { 2, {45,15,15}, 64,{46,16,15}}},
+ {{ 17,{152,122,15}, 4,{153,123,15}}, { 29,{74,46,14}, 14,{75,47,14}}, { 49,{54,24,15}, 10,{55,25,15}}, { 24, {45,15,15}, 46,{46,16,15}}},
+ {{ 4,{152,122,15}, 18,{153,123,15}}, { 13,{74,46,14}, 32,{75,47,14}}, { 48,{54,24,15}, 14,{55,25,15}}, { 42, {45,15,15}, 32,{46,16,15}}},
+ {{ 20,{147,117,15}, 4,{148,118,15}}, { 40,{75,47,14}, 7,{76,48,14}}, { 43,{54,24,15}, 22,{55,25,15}}, { 10, {45,15,15}, 67,{46,16,15}}},
+ {{ 19,{148,118,15}, 6,{149,119,15}}, { 18,{75,47,14}, 31,{76,48,14}}, { 34,{54,24,15}, 34,{55,25,15}}, { 20, {45,15,15}, 61,{46,16,15}}}
+}
+
+-- The bits that must be 0 if the version does fill the complete matrix.
+-- Example: for version 1, no bits need to be added after arranging the data, for version 2 we need to add 7 bits at the end.
+local remainder = {0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0}
+
+-- This is the formula for table 1 in the spec:
+-- function get_capacity_remainder( version )
+-- local len = version * 4 + 17
+-- local size = len^2
+-- local function_pattern_modules = 192 + 2 * len - 32 -- Position Adjustment pattern + timing pattern
+-- local count_alignemnt_pattern = #alignment_pattern[version]
+-- if count_alignemnt_pattern > 0 then
+-- -- add 25 for each aligment pattern
+-- function_pattern_modules = function_pattern_modules + 25 * ( count_alignemnt_pattern^2 - 3 )
+-- -- but substract the timing pattern occupied by the aligment pattern on the top and left
+-- function_pattern_modules = function_pattern_modules - ( count_alignemnt_pattern - 2) * 10
+-- end
+-- size = size - function_pattern_modules
+-- if version > 6 then
+-- size = size - 67
+-- else
+-- size = size - 31
+-- end
+-- return math.floor(size/8),math.fmod(size,8)
+-- end
+
+
+--- Example: Version 5-H has four data and four error correction blocks. The table above lists
+--- `2, {33,11,11}, 2,{34,12,11}` for entry [5][4]. This means we take two blocks with 11 codewords
+--- and two blocks with 12 codewords, and two blocks with 33 - 11 = 22 ec codes and another
+--- two blocks with 34 - 12 = 22 ec codes.
+--- Block 1: D1 D2 D3 ... D11
+--- Block 2: D12 D13 D14 ... D22
+--- Block 3: D23 D24 D25 ... D33 D34
+--- Block 4: D35 D36 D37 ... D45 D46
+--- Then we place the data like this in the matrix: D1, D12, D23, D35, D2, D13, D24, D36 ... D45, D34, D46. The same goes
+--- with error correction codes.
+
+-- The given data can be a string of 0's and 1' (with #string mod 8 == 0).
+-- Alternatively the data can be a table of codewords. The number of codewords
+-- must match the capacity of the qr code.
+local function arrange_codewords_and_calculate_ec( version,ec_level,data )
+ if type(data)=="table" then
+ local tmp = ""
+ for i=1,#data do
+ tmp = tmp .. binary(data[i],8)
+ end
+ data = tmp
+ end
+ -- If the size of the data is not enough for the codeword, we add 0's and two special bytes until finished.
+ local blocks = ecblocks[version][ec_level]
+ local size_datablock_bytes, size_ecblock_bytes
+ local datablocks = {}
+ local final_ecblocks = {}
+ local count = 1
+ local pos = 0
+ local cpty_ec_bits = 0
+ for i=1,#blocks/2 do
+ for _=1,blocks[2*i - 1] do
+ size_datablock_bytes = blocks[2*i][2]
+ size_ecblock_bytes = blocks[2*i][1] - blocks[2*i][2]
+ cpty_ec_bits = cpty_ec_bits + size_ecblock_bytes * 8
+ datablocks[#datablocks + 1] = string.sub(data, pos * 8 + 1,( pos + size_datablock_bytes)*8)
+ local tmp_tab = calculate_error_correction(datablocks[#datablocks],size_ecblock_bytes)
+ local tmp_str = ""
+ for x=1,#tmp_tab do
+ tmp_str = tmp_str .. binary(tmp_tab[x],8)
+ end
+ final_ecblocks[#final_ecblocks + 1] = tmp_str
+ pos = pos + size_datablock_bytes
+ count = count + 1
+ end
+ end
+ local arranged_data = ""
+ pos = 1
+ repeat
+ for i=1,#datablocks do
+ if pos < #datablocks[i] then
+ arranged_data = arranged_data .. string.sub(datablocks[i],pos, pos + 7)
+ end
+ end
+ pos = pos + 8
+ until #arranged_data == #data
+ -- ec
+ local arranged_ec = ""
+ pos = 1
+ repeat
+ for i=1,#final_ecblocks do
+ if pos < #final_ecblocks[i] then
+ arranged_ec = arranged_ec .. string.sub(final_ecblocks[i],pos, pos + 7)
+ end
+ end
+ pos = pos + 8
+ until #arranged_ec == cpty_ec_bits
+ return arranged_data .. arranged_ec
+end
+
+--- Step 4: Generate 8 matrices with different masks and calculate the penalty
+--- ==========================================================================
+---
+--- Prepare matrix
+--- --------------
+--- The first step is to prepare an _empty_ matrix for a given size/mask. The matrix has a
+--- few predefined areas that must be black or blank. We encode the matrix with a two
+--- dimensional field where the numbers determine which pixel is blank or not.
+---
+--- The following code is used for our matrix:
+--- 0 = not in use yet,
+--- -2 = blank by mandatory pattern,
+--- 2 = black by mandatory pattern,
+--- -1 = blank by data,
+--- 1 = black by data
+---
+---
+--- To prepare the _empty_, we add positioning, alingment and timing patters.
+
+--- ### Positioning patterns ###
+local function add_position_detection_patterns(tab_x)
+ local size = #tab_x
+ -- allocate quite zone in the matrix area
+ for i=1,8 do
+ for j=1,8 do
+ tab_x[i][j] = -2
+ tab_x[size - 8 + i][j] = -2
+ tab_x[i][size - 8 + j] = -2
+ end
+ end
+ -- draw the detection pattern (outer)
+ for i=1,7 do
+ -- top left
+ tab_x[1][i]=2
+ tab_x[7][i]=2
+ tab_x[i][1]=2
+ tab_x[i][7]=2
+
+ -- top right
+ tab_x[size][i]=2
+ tab_x[size - 6][i]=2
+ tab_x[size - i + 1][1]=2
+ tab_x[size - i + 1][7]=2
+
+ -- bottom left
+ tab_x[1][size - i + 1]=2
+ tab_x[7][size - i + 1]=2
+ tab_x[i][size - 6]=2
+ tab_x[i][size]=2
+ end
+ -- draw the detection pattern (inner)
+ for i=1,3 do
+ for j=1,3 do
+ -- top left
+ tab_x[2+j][i+2]=2
+ -- top right
+ tab_x[size - j - 1][i+2]=2
+ -- bottom left
+ tab_x[2 + j][size - i - 1]=2
+ end
+ end
+end
+
+--- ### Timing patterns ###
+-- The timing patterns (two) are the dashed lines between two adjacent positioning patterns on row/column 7.
+local function add_timing_pattern(tab_x)
+ local line,col
+ line = 7
+ col = 9
+ for i=col,#tab_x - 8 do
+ if math.fmod(i,2) == 1 then
+ tab_x[i][line] = 2
+ else
+ tab_x[i][line] = -2
+ end
+ end
+ for i=col,#tab_x - 8 do
+ if math.fmod(i,2) == 1 then
+ tab_x[line][i] = 2
+ else
+ tab_x[line][i] = -2
+ end
+ end
+end
+
+
+--- ### Alignment patterns ###
+--- The alignment patterns must be added to the matrix for versions > 1. The amount and positions depend on the versions and are
+--- given by the spec. Beware: the patterns must not be placed where we have the positioning patterns
+--- (that is: top left, top right and bottom left.)
+
+-- For each version, where should we place the alignment patterns? See table E.1 of the spec
+local alignment_pattern = {
+ {},{6,18},{6,22},{6,26},{6,30},{6,34}, -- 1-6
+ {6,22,38},{6,24,42},{6,26,46},{6,28,50},{6,30,54},{6,32,58},{6,34,62}, -- 7-13
+ {6,26,46,66},{6,26,48,70},{6,26,50,74},{6,30,54,78},{6,30,56,82},{6,30,58,86},{6,34,62,90}, -- 14-20
+ {6,28,50,72,94},{6,26,50,74,98},{6,30,54,78,102},{6,28,54,80,106},{6,32,58,84,110},{6,30,58,86,114},{6,34,62,90,118}, -- 21-27
+ {6,26,50,74,98 ,122},{6,30,54,78,102,126},{6,26,52,78,104,130},{6,30,56,82,108,134},{6,34,60,86,112,138},{6,30,58,86,114,142},{6,34,62,90,118,146}, -- 28-34
+ {6,30,54,78,102,126,150}, {6,24,50,76,102,128,154},{6,28,54,80,106,132,158},{6,32,58,84,110,136,162},{6,26,54,82,110,138,166},{6,30,58,86,114,142,170} -- 35 - 40
+}
+
+--- The alignment pattern has size 5x5 and looks like this:
+--- XXXXX
+--- X X
+--- X X X
+--- X X
+--- XXXXX
+local function add_alignment_pattern( tab_x )
+ local version = (#tab_x - 17) / 4
+ local ap = alignment_pattern[version]
+ local pos_x, pos_y
+ for x=1,#ap do
+ for y=1,#ap do
+ -- we must not put an alignment pattern on top of the positioning pattern
+ if not (x == 1 and y == 1 or x == #ap and y == 1 or x == 1 and y == #ap ) then
+ pos_x = ap[x] + 1
+ pos_y = ap[y] + 1
+ tab_x[pos_x][pos_y] = 2
+ tab_x[pos_x+1][pos_y] = -2
+ tab_x[pos_x-1][pos_y] = -2
+ tab_x[pos_x+2][pos_y] = 2
+ tab_x[pos_x-2][pos_y] = 2
+ tab_x[pos_x ][pos_y - 2] = 2
+ tab_x[pos_x+1][pos_y - 2] = 2
+ tab_x[pos_x-1][pos_y - 2] = 2
+ tab_x[pos_x+2][pos_y - 2] = 2
+ tab_x[pos_x-2][pos_y - 2] = 2
+ tab_x[pos_x ][pos_y + 2] = 2
+ tab_x[pos_x+1][pos_y + 2] = 2
+ tab_x[pos_x-1][pos_y + 2] = 2
+ tab_x[pos_x+2][pos_y + 2] = 2
+ tab_x[pos_x-2][pos_y + 2] = 2
+
+ tab_x[pos_x ][pos_y - 1] = -2
+ tab_x[pos_x+1][pos_y - 1] = -2
+ tab_x[pos_x-1][pos_y - 1] = -2
+ tab_x[pos_x+2][pos_y - 1] = 2
+ tab_x[pos_x-2][pos_y - 1] = 2
+ tab_x[pos_x ][pos_y + 1] = -2
+ tab_x[pos_x+1][pos_y + 1] = -2
+ tab_x[pos_x-1][pos_y + 1] = -2
+ tab_x[pos_x+2][pos_y + 1] = 2
+ tab_x[pos_x-2][pos_y + 1] = 2
+ end
+ end
+ end
+end
+
+--- ### Type information ###
+--- Let's not forget the type information that is in column 9 next to the left positioning patterns and on row 9 below
+--- the top positioning patterns. This type information is not fixed, it depends on the mask and the error correction.
+
+-- The first index is ec level (LMQH,1-4), the second is the mask (0-7). This bitstring of length 15 is to be used
+-- as mandatory pattern in the qrcode. Mask -1 is for debugging purpose only and is the 'noop' mask.
+local typeinfo = {
+ { [-1]= "111111111111111", [0] = "111011111000100", "111001011110011", "111110110101010", "111100010011101", "110011000101111", "110001100011000", "110110001000001", "110100101110110" },
+ { [-1]= "111111111111111", [0] = "101010000010010", "101000100100101", "101111001111100", "101101101001011", "100010111111001", "100000011001110", "100111110010111", "100101010100000" },
+ { [-1]= "111111111111111", [0] = "011010101011111", "011000001101000", "011111100110001", "011101000000110", "010010010110100", "010000110000011", "010111011011010", "010101111101101" },
+ { [-1]= "111111111111111", [0] = "001011010001001", "001001110111110", "001110011100111", "001100111010000", "000011101100010", "000001001010101", "000110100001100", "000100000111011" }
+}
+
+-- The typeinfo is a mixture of mask and ec level information and is
+-- added twice to the qr code, one horizontal, one vertical.
+local function add_typeinfo_to_matrix( matrix,ec_level,mask )
+ local ec_mask_type = typeinfo[ec_level][mask]
+
+ local bit
+ -- vertical from bottom to top
+ for i=1,7 do
+ bit = string.sub(ec_mask_type,i,i)
+ fill_matrix_position(matrix, bit, 9, #matrix - i + 1)
+ end
+ for i=8,9 do
+ bit = string.sub(ec_mask_type,i,i)
+ fill_matrix_position(matrix,bit,9,17-i)
+ end
+ for i=10,15 do
+ bit = string.sub(ec_mask_type,i,i)
+ fill_matrix_position(matrix,bit,9,16 - i)
+ end
+ -- horizontal, left to right
+ for i=1,6 do
+ bit = string.sub(ec_mask_type,i,i)
+ fill_matrix_position(matrix,bit,i,9)
+ end
+ bit = string.sub(ec_mask_type,7,7)
+ fill_matrix_position(matrix,bit,8,9)
+ for i=8,15 do
+ bit = string.sub(ec_mask_type,i,i)
+ fill_matrix_position(matrix,bit,#matrix - 15 + i,9)
+ end
+end
+
+-- Bits for version information 7-40
+-- The reversed strings from https://www.thonky.com/qr-code-tutorial/format-version-tables
+local version_information = {"001010010011111000", "001111011010000100", "100110010101100100", "110010110010010100",
+ "011011111101110100", "010001101110001100", "111000100001101100", "101100000110011100", "000101001001111100",
+ "000111101101000010", "101110100010100010", "111010000101010010", "010011001010110010", "011001011001001010",
+ "110000010110101010", "100100110001011010", "001101111110111010", "001000110111000110", "100001111000100110",
+ "110101011111010110", "011100010000110110", "010110000011001110", "111111001100101110", "101011101011011110",
+ "000010100100111110", "101010111001000001", "000011110110100001", "010111010001010001", "111110011110110001",
+ "110100001101001001", "011101000010101001", "001001100101011001", "100000101010111001", "100101100011000101" }
+
+-- Versions 7 and above need two bitfields with version information added to the code
+local function add_version_information(matrix,version)
+ if version < 7 then return end
+ local size = #matrix
+ local bitstring = version_information[version - 6]
+ local x,y, bit
+ local start_x, start_y
+ -- first top right
+ start_x = size - 10
+ start_y = 1
+ for i=1,#bitstring do
+ bit = string.sub(bitstring,i,i)
+ x = start_x + math.fmod(i - 1,3)
+ y = start_y + math.floor( (i - 1) / 3 )
+ fill_matrix_position(matrix,bit,x,y)
+ end
+
+ -- now bottom left
+ start_x = 1
+ start_y = size - 10
+ for i=1,#bitstring do
+ bit = string.sub(bitstring,i,i)
+ x = start_x + math.floor( (i - 1) / 3 )
+ y = start_y + math.fmod(i - 1,3)
+ fill_matrix_position(matrix,bit,x,y)
+ end
+end
+
+--- Now it's time to use the methods above to create a prefilled matrix for the given mask
+local function prepare_matrix_with_mask( version,ec_level, mask )
+ local size
+ local tab_x = {}
+
+ size = version * 4 + 17
+ for i=1,size do
+ tab_x[i]={}
+ for j=1,size do
+ tab_x[i][j] = 0
+ end
+ end
+ add_position_detection_patterns(tab_x)
+ add_timing_pattern(tab_x)
+ add_version_information(tab_x,version)
+
+ -- black pixel above lower left position detection pattern
+ tab_x[9][size - 7] = 2
+ add_alignment_pattern(tab_x)
+ add_typeinfo_to_matrix(tab_x,ec_level, mask)
+ return tab_x
+end
+
+--- Finally we come to the place where we need to put the calculated data (remember step 3?) into the qr code.
+--- We do this for each mask. BTW speaking of mask, this is what we find in the spec:
+--- Mask Pattern Reference Condition
+--- 000 (y + x) mod 2 = 0
+--- 001 y mod 2 = 0
+--- 010 x mod 3 = 0
+--- 011 (y + x) mod 3 = 0
+--- 100 ((y div 2) + (x div 3)) mod 2 = 0
+--- 101 (y x) mod 2 + (y x) mod 3 = 0
+--- 110 ((y x) mod 2 + (y x) mod 3) mod 2 = 0
+--- 111 ((y x) mod 3 + (y+x) mod 2) mod 2 = 0
+
+-- Return 1 (black) or -1 (blank) depending on the mask, value and position.
+-- Parameter mask is 0-7 (-1 for 'no mask'). x and y are 1-based coordinates,
+-- 1,1 = upper left. tonumber(value) must be 0 or 1.
+local function get_pixel_with_mask( mask, x,y,value )
+ x = x - 1
+ y = y - 1
+ local invert = false
+ -- test purpose only:
+ if mask == -1 then -- luacheck: ignore
+ -- ignore, no masking applied
+ elseif mask == 0 then
+ if math.fmod(x + y,2) == 0 then invert = true end
+ elseif mask == 1 then
+ if math.fmod(y,2) == 0 then invert = true end
+ elseif mask == 2 then
+ if math.fmod(x,3) == 0 then invert = true end
+ elseif mask == 3 then
+ if math.fmod(x + y,3) == 0 then invert = true end
+ elseif mask == 4 then
+ if math.fmod(math.floor(y / 2) + math.floor(x / 3),2) == 0 then invert = true end
+ elseif mask == 5 then
+ if math.fmod(x * y,2) + math.fmod(x * y,3) == 0 then invert = true end
+ elseif mask == 6 then
+ if math.fmod(math.fmod(x * y,2) + math.fmod(x * y,3),2) == 0 then invert = true end
+ elseif mask == 7 then
+ if math.fmod(math.fmod(x * y,3) + math.fmod(x + y,2),2) == 0 then invert = true end
+ else
+ assert(false,"This can't happen (mask must be <= 7)")
+ end
+ if invert then
+ -- value = 1? -> -1, value = 0? -> 1
+ return 1 - 2 * tonumber(value)
+ else
+ -- value = 1? -> 1, value = 0? -> -1
+ return -1 + 2*tonumber(value)
+ end
+end
+
+
+-- We need up to 8 positions in the matrix. Only the last few bits may be less then 8.
+-- The function returns a table of (up to) 8 entries with subtables where
+-- the x coordinate is the first and the y coordinate is the second entry.
+local function get_next_free_positions(matrix,x,y,dir,byte)
+ local ret = {}
+ local count = 1
+ local mode = "right"
+ while count <= #byte do
+ if mode == "right" and matrix[x][y] == 0 then
+ ret[#ret + 1] = {x,y}
+ mode = "left"
+ count = count + 1
+ elseif mode == "left" and matrix[x-1][y] == 0 then
+ ret[#ret + 1] = {x-1,y}
+ mode = "right"
+ count = count + 1
+ if dir == "up" then
+ y = y - 1
+ else
+ y = y + 1
+ end
+ elseif mode == "right" and matrix[x-1][y] == 0 then
+ ret[#ret + 1] = {x-1,y}
+ count = count + 1
+ if dir == "up" then
+ y = y - 1
+ else
+ y = y + 1
+ end
+ else
+ if dir == "up" then
+ y = y - 1
+ else
+ y = y + 1
+ end
+ end
+ if y < 1 or y > #matrix then
+ x = x - 2
+ -- don't overwrite the timing pattern
+ if x == 7 then x = 6 end
+ if dir == "up" then
+ dir = "down"
+ y = 1
+ else
+ dir = "up"
+ y = #matrix
+ end
+ end
+ end
+ return ret,x,y,dir
+end
+
+-- Add the data string (0's and 1's) to the matrix for the given mask.
+local function add_data_to_matrix(matrix,data,mask)
+ local size = #matrix
+ local x,y,positions
+ local _x,_y,m
+ local dir = "up"
+ local byte_number = 0
+ x,y = size,size
+ string.gsub(data,".?.?.?.?.?.?.?.?",function ( byte )
+ byte_number = byte_number + 1
+ positions,x,y,dir = get_next_free_positions(matrix,x,y,dir,byte)
+ for i=1,#byte do
+ _x = positions[i][1]
+ _y = positions[i][2]
+ m = get_pixel_with_mask(mask,_x,_y,string.sub(byte,i,i))
+ if debugging then
+ matrix[_x][_y] = m * (i + 10)
+ else
+ matrix[_x][_y] = m
+ end
+ end
+ end)
+end
+
+
+--- The total penalty of the matrix is the sum of four steps. The following steps are taken into account:
+---
+--- 1. Adjacent modules in row/column in same color
+--- 1. Block of modules in same color
+--- 1. 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column
+--- 1. Proportion of dark modules in entire symbol
+---
+--- This all is done to avoid bad patterns in the code that prevent the scanner from
+--- reading the code.
+-- Return the penalty for the given matrix
+local function calculate_penalty(matrix)
+ local penalty1, penalty2, penalty3 = 0,0,0
+ local size = #matrix
+ -- this is for penalty 4
+ local number_of_dark_cells = 0
+
+ -- 1: Adjacent modules in row/column in same color
+ -- --------------------------------------------
+ -- No. of modules = (5+i) -> 3 + i
+ local last_bit_blank -- < 0: blank, > 0: black
+ local is_blank
+ local number_of_consecutive_bits
+ -- first: vertical
+ for x=1,size do
+ number_of_consecutive_bits = 0
+ last_bit_blank = nil
+ for y = 1,size do
+ if matrix[x][y] > 0 then
+ -- small optimization: this is for penalty 4
+ number_of_dark_cells = number_of_dark_cells + 1
+ is_blank = false
+ else
+ is_blank = true
+ end
+ if last_bit_blank == is_blank then
+ number_of_consecutive_bits = number_of_consecutive_bits + 1
+ else
+ if number_of_consecutive_bits >= 5 then
+ penalty1 = penalty1 + number_of_consecutive_bits - 2
+ end
+ number_of_consecutive_bits = 1
+ end
+ last_bit_blank = is_blank
+ end
+ if number_of_consecutive_bits >= 5 then
+ penalty1 = penalty1 + number_of_consecutive_bits - 2
+ end
+ end
+ -- now horizontal
+ for y=1,size do
+ number_of_consecutive_bits = 0
+ last_bit_blank = nil
+ for x = 1,size do
+ is_blank = matrix[x][y] < 0
+ if last_bit_blank == is_blank then
+ number_of_consecutive_bits = number_of_consecutive_bits + 1
+ else
+ if number_of_consecutive_bits >= 5 then
+ penalty1 = penalty1 + number_of_consecutive_bits - 2
+ end
+ number_of_consecutive_bits = 1
+ end
+ last_bit_blank = is_blank
+ end
+ if number_of_consecutive_bits >= 5 then
+ penalty1 = penalty1 + number_of_consecutive_bits - 2
+ end
+ end
+ for x=1,size do
+ for y=1,size do
+ -- 2: Block of modules in same color
+ -- -----------------------------------
+ -- Blocksize = m × n -> 3 × (m-1) × (n-1)
+ if (y < size - 1) and ( x < size - 1) and ( (matrix[x][y] < 0 and matrix[x+1][y] < 0 and matrix[x][y+1] < 0 and matrix[x+1][y+1] < 0) or (matrix[x][y] > 0 and matrix[x+1][y] > 0 and matrix[x][y+1] > 0 and matrix[x+1][y+1] > 0) ) then
+ penalty2 = penalty2 + 3
+ end
+
+ -- 3: 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column
+ -- ------------------------------------------------------------------
+ -- Gives 40 points each
+ --
+ -- I have no idea why we need the extra 0000 on left or right side. The spec doesn't mention it,
+ -- other sources do mention it. This is heavily inspired by zxing.
+ if (y + 6 < size and
+ matrix[x][y] > 0 and
+ matrix[x][y + 1] < 0 and
+ matrix[x][y + 2] > 0 and
+ matrix[x][y + 3] > 0 and
+ matrix[x][y + 4] > 0 and
+ matrix[x][y + 5] < 0 and
+ matrix[x][y + 6] > 0 and
+ ((y + 10 < size and
+ matrix[x][y + 7] < 0 and
+ matrix[x][y + 8] < 0 and
+ matrix[x][y + 9] < 0 and
+ matrix[x][y + 10] < 0) or
+ (y - 4 >= 1 and
+ matrix[x][y - 1] < 0 and
+ matrix[x][y - 2] < 0 and
+ matrix[x][y - 3] < 0 and
+ matrix[x][y - 4] < 0))) then penalty3 = penalty3 + 40 end
+ if (x + 6 <= size and
+ matrix[x][y] > 0 and
+ matrix[x + 1][y] < 0 and
+ matrix[x + 2][y] > 0 and
+ matrix[x + 3][y] > 0 and
+ matrix[x + 4][y] > 0 and
+ matrix[x + 5][y] < 0 and
+ matrix[x + 6][y] > 0 and
+ ((x + 10 <= size and
+ matrix[x + 7][y] < 0 and
+ matrix[x + 8][y] < 0 and
+ matrix[x + 9][y] < 0 and
+ matrix[x + 10][y] < 0) or
+ (x - 4 >= 1 and
+ matrix[x - 1][y] < 0 and
+ matrix[x - 2][y] < 0 and
+ matrix[x - 3][y] < 0 and
+ matrix[x - 4][y] < 0))) then penalty3 = penalty3 + 40 end
+ end
+ end
+ -- 4: Proportion of dark modules in entire symbol
+ -- ----------------------------------------------
+ -- 50 ± (5 × k)% to 50 ± (5 × (k + 1))% -> 10 × k
+ local dark_ratio = number_of_dark_cells / ( size * size )
+ local penalty4 = math.floor(math.abs(dark_ratio * 100 - 50)) * 2
+ return penalty1 + penalty2 + penalty3 + penalty4
+end
+
+-- Create a matrix for the given parameters and calculate the penalty score.
+-- Return both (matrix and penalty)
+local function get_matrix_and_penalty(version,ec_level,data,mask)
+ local tab = prepare_matrix_with_mask(version,ec_level,mask)
+ add_data_to_matrix(tab,data,mask)
+ local penalty = calculate_penalty(tab)
+ return tab, penalty
+end
+
+-- Return the matrix with the smallest penalty. To to this
+-- we try out the matrix for all 8 masks and determine the
+-- penalty (score) each.
+local function get_matrix_with_lowest_penalty(version,ec_level,data)
+ local tab, penalty
+ local tab_min_penalty, min_penalty
+
+ -- try masks 0-7
+ tab_min_penalty, min_penalty = get_matrix_and_penalty(version,ec_level,data,0)
+ for i=1,7 do
+ tab, penalty = get_matrix_and_penalty(version,ec_level,data,i)
+ if penalty < min_penalty then
+ tab_min_penalty = tab
+ min_penalty = penalty
+ end
+ end
+ return tab_min_penalty
+end
+
+--- The main function. We connect everything together. Remember from above:
+---
+--- 1. Determine version, ec level and mode (=encoding) for codeword
+--- 1. Encode data
+--- 1. Arrange data and calculate error correction code
+--- 1. Generate 8 matrices with different masks and calculate the penalty
+--- 1. Return qrcode with least penalty
+-- If ec_level or mode is given, use the ones for generating the qrcode. (mode is not implemented yet)
+local function qrcode( str, ec_level, _mode ) -- luacheck: no unused args
+ local arranged_data, version, data_raw, mode, len_bitstring
+ version, ec_level, data_raw, mode, len_bitstring = get_version_eclevel_mode_bistringlength(str,ec_level)
+ data_raw = data_raw .. len_bitstring
+ data_raw = data_raw .. encode_data(str,mode)
+ data_raw = add_pad_data(version,ec_level,data_raw)
+ arranged_data = arrange_codewords_and_calculate_ec(version,ec_level,data_raw)
+ if math.fmod(#arranged_data,8) ~= 0 then
+ return false, string.format("Arranged data %% 8 != 0: data length = %d, mod 8 = %d",#arranged_data, math.fmod(#arranged_data,8))
+ end
+ arranged_data = arranged_data .. string.rep("0",remainder[version])
+ local tab = get_matrix_with_lowest_penalty(version,ec_level,arranged_data)
+ return true, tab
+end
+
+
+if testing then
+ return {
+ encode_string_numeric = encode_string_numeric,
+ encode_string_ascii = encode_string_ascii,
+ qrcode = qrcode,
+ binary = binary,
+ get_mode = get_mode,
+ get_length = get_length,
+ add_pad_data = add_pad_data,
+ get_generator_polynominal_adjusted = get_generator_polynominal_adjusted,
+ get_pixel_with_mask = get_pixel_with_mask,
+ get_version_eclevel_mode_bistringlength = get_version_eclevel_mode_bistringlength,
+ remainder = remainder,
+ --get_capacity_remainder = get_capacity_remainder,
+ arrange_codewords_and_calculate_ec = arrange_codewords_and_calculate_ec,
+ calculate_error_correction = calculate_error_correction,
+ convert_bitstring_to_bytes = convert_bitstring_to_bytes,
+ bit_xor = bit_xor,
+ }
+end
+
+return {
+ qrcode = qrcode
+}
diff --git a/macros/latex/contrib/qrbill/qrbill.dtx b/macros/latex/contrib/qrbill/qrbill.dtx
index 6d169404d5..c7739d81d3 100644
--- a/macros/latex/contrib/qrbill/qrbill.dtx
+++ b/macros/latex/contrib/qrbill/qrbill.dtx
@@ -2,7 +2,7 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% Copyright (C) 2020–2022 by Marei Peischl (peiTeX) <marei@peitex.de>
+% Copyright (C) 2020–2023 by Marei Peischl (peiTeX) <marei@peitex.de>
%
% This work is a collaboration of
% Marei Peischl (peiTeX) and Alex Antener (foobar LLC).
@@ -54,7 +54,7 @@
% \fi
% \iffalse
%<*driver>
-\ProvidesFile{qrbill.dtx}[2022/10/20 v1.07 \ create QR-bills based on the Swiss standard]
+\ProvidesFile{qrbill.dtx}[2023/02/28 v2.00 \ create QR-bills based on the Swiss standard]
\documentclass[english, parskip=half-]{scrartcl}
\usepackage{iftex}
\ifPDFTeX
@@ -284,8 +284,8 @@
% \changes{v1.06}{2022/10/18}{Add ignore-if-empty option}
%
% \item[qrmode (package/lua) (package)] Selects the mechanism for QRcode generation.
+% \changes{v2.00}{2023/02/28}{qrencode.lua now is part of the qrbill package}
% With Version 2.0 the package supports usage of the the luaqrcode library \cite{luaqrcode}. This can be enabled by using the \latexinline{qmode=lua} option.
-% In that case the luaqrcode libary has to be installed within the \verb+$LUAINPUTS+.
%
% \item[qrscheme (Name of a custom QRbill scheme) (swiss)]
% Loads the definitions for the QRcode and the BillingInformation. Currently only the
@@ -514,7 +514,7 @@
% \section{Implementation}
% \begin{macrocode}
\RequirePackage{expl3}
-\ProvidesExplPackage{qrbill}{2022/10/20}{1.07}{
+\ProvidesExplPackage{qrbill}{2023/02/28}{2.00}{
Template for QR-bills based on the Swiss Payment Standards
}
\RequirePackage{iftex}
@@ -866,7 +866,7 @@
\skip_vertical:n {\c_qrbill_sep_dim-\g__qrbill_rule_dim}
\skip_horizontal:n {\c_qrbill_sep_dim-\g__qrbill_rule_dim}
\begin{minipage}[c][95mm][t]{52mm}
- \vbox_to_ht:nn {7mm} {\qrbill_title_font:\qrbillreceiptname}
+ \vbox_to_ht:nn {7mm} {\qrbill_title_font:\qrbillreceiptname\vfill}
\par\nointerlineskip
\vbox_to_ht:nn {56mm}{
{\qrbill_headingR_font:\qrbillaccountname\par}
@@ -896,6 +896,7 @@
\par
}
}
+ \vfill
}
\par\nointerlineskip
\vbox_to_ht:nn {14mm}{
@@ -918,12 +919,13 @@
\par\nointerlineskip
\vbox_to_ht:nn {18mm} {
\makebox[\linewidth][r]{\qrbill_headingR_font:\qrbillacceptantname}\par
+ \vfill
}
\end{minipage}%
\skip_horizontal:n {2\c_qrbill_sep_dim}
\begin{minipage}[c][95mm][t]{138mm}
\begin{minipage}[c][85mm][t]{51mm}
- \parbox[t][7mm][t]{\linewidth}{\qrbill_title_font:\qrbillpaymentpartname}
+ \parbox[t][7mm][t]{\linewidth}{\qrbill_title_font:\qrbillpaymentpartname\vfill}
\par\nointerlineskip
\skip_vertical:n {\c_qrbill_sep_dim}
\qrcode_setup_QRcode:
@@ -950,9 +952,10 @@
\tl_if_empty:NTF \l_qrbill_data_Amount_tl {
\hfill
\raisebox{\dimexpr-\height+\ht\strutbox}[\z@]{
- \llap{\__qrbill_placeholder:nn {40mm} {15mm}
- }}
+ \llap{\__qrbill_placeholder:nn {40mm} {15mm}}
+ }
}
+ \vfill
}
\end{minipage}
\begin{minipage}[c][85mm][t]{87mm}
@@ -964,6 +967,7 @@
\qrbill_insert_address:N \g__qrbill_creditorprefix_tl
\par\vskip\baselineskip
}
+ \raggedright
\tl_if_empty:NF \l_qrbill_data_Reference_tl {
{\qrbill_headingP_font:\qrbillreferencename\par}
{\qrbill_valueP_font:
@@ -1017,6 +1021,7 @@
{\rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}}
{\rule{\g__qrbill_rule_dim}{\c_zero_dim}}
}
+ \vfill
}
}
\endgroup
diff --git a/macros/latex/contrib/qrbill/qrbill.ins b/macros/latex/contrib/qrbill/qrbill.ins
index 00a8697623..1fe8b6669e 100644
--- a/macros/latex/contrib/qrbill/qrbill.ins
+++ b/macros/latex/contrib/qrbill/qrbill.ins
@@ -2,17 +2,17 @@
\preamble
-Copyright (C) 2020–2022 by Marei Peischl (peiTeX) <marei@peitex.de>
+Copyright (C) 2020–2023 by Marei Peischl (peiTeX) <marei@peitex.de>
This work is a collaboration of
Marei Peischl (peiTeX) and Alex Antener (foobar LLC).
This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
+conditions of the LaTeX Project Public License, either version 1.3c
of this license or (at your option) any later version.
The latest version of this license is in
http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of LaTeX
+and version 1.3c or later is part of all distributions of LaTeX
version 2005/12/01 or later.
This work has the LPPL maintenance status `maintained'.
diff --git a/macros/latex/contrib/qrbill/qrbill.pdf b/macros/latex/contrib/qrbill/qrbill.pdf
index 3684e2c948..1125e6cddc 100644
--- a/macros/latex/contrib/qrbill/qrbill.pdf
+++ b/macros/latex/contrib/qrbill/qrbill.pdf
Binary files differ