texlive[68279] Master/texmf-dist: latex-lab-dev (14sep23)
commits+karl at tug.org
commits+karl at tug.org
Thu Sep 14 22:25:57 CEST 2023
Revision: 68279
http://tug.org/svn/texlive?view=revision&revision=68279
Author: karl
Date: 2023-09-14 22:25:56 +0200 (Thu, 14 Sep 2023)
Log Message:
-----------
latex-lab-dev (14sep23)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/README.md
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-code.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-code.tex
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-doc.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-doc.tex
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/changes.txt
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/documentmetadata-support-code.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/documentmetadata-support-doc.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-amsmath.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-bib.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-firstaid.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-float.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-footnotes.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-graphic.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-mathpkg.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-mathtools.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-minipage.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-new-or-1.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-new-or-2.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-sec.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-testphase.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-text.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc-kernel-changes.pdf
trunk/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-bib.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/bib-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/documentmetadata-support.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/firstaid-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/float-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/graphic-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footmisc.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footnotes.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-kernel-changes.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-bib.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-firstaid.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-float.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-graphic.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-math.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-minipage.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-1.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-2.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-sec.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-text.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-toc.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/math-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/minipage-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-1-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-I-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-II-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-III-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/text-latex-lab-testphase.ltx
Added Paths:
-----------
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-math.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-namespace.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc.pdf
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-math.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-ns-latex-lab.def
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-latex-lab-testphase.ltx
Removed Paths:
-------------
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block-tagging.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-mathtagging.pdf
trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc-tagging-functions.pdf
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block-tagging.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtagging.dtx
trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-tagging-functions.dtx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-tagging-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-mathtagging.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block-tagging.sty
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-tagging-latex-lab-testphase.ltx
trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-tagging-latex-lab-testphase.ltx
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/README.md 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/README.md 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,6 +1,6 @@
# LaTeX laboratory
-Release 2023-11-01 pre-release 0
+Release 2023-11-01 pre-release 1
## Overview
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-code.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-code.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-code.tex 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-code.tex 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,4 +1,4 @@
% this will typeset documentation + code
\AtBeginDocument{\AlsoImplementation}
-\input{latex-lab-block-tagging.dtx}
+\input{latex-lab-block.dtx}
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-doc.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-doc.tex 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/blocks-doc.tex 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,4 +1,4 @@
% this will typeset documentation + code
\AtBeginDocument{\OnlyDescription}
-\input{latex-lab-block-tagging.dtx}
+\input{latex-lab-block.dtx}
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/changes.txt
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/changes.txt 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/changes.txt 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,14 +1,50 @@
+2023-09-04 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
+ * latex-lab-math.dtx: fix below display skip, tagging issue #11
+ * latex-lab-math.dtx: allow to use it without tagging.
+ * latex-lab-math.dtx: avoid tagging as math if fakemath is detected, tagging issue #5.
+
+2023-09-04 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
+ * label-lab-new-or-1.dtx latex-lab-new-or-2.dtx
+ fix position of kernel hook in \@makecol (tagpdf issue #58)
+
+2023-09-04 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
+ * documentmetadata-support.dtx: add debug key to load tagpdf-debug.
+ * new latex-lab-namespace.dtx with role mappings
+
+2023-09-01 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * latex-lab-block.dtx:
+ end environment \par handling needs to be specified for all display blocks
+ because the standalone receipt should not influence inner environments
+ and vice versa (bug reported in tagging-project/9)
+
+2023-07-21 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
+ * rename latex-lab-toc-tagging.dtx to latex-lab-toc.dtx
+ * clean up versions and package declarations
+ * remove firstaid for ltugboat, this is now handled by the class
+ * do not load glyphtounicode with dvilualatex
+
+2023-07-19 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
+ * really rename sec-tagging to sec
+ * really rename toc-tagging to toc
+ * rename block-tagging to block
+ * rename mathtagging to math
+ * document testphase key sec, toc, math, graphic, block
+
+2023-06-21 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
+ * latex-lab-sec.dtx: redefine \part only if it defined (letter.cls ...)
+ * latex-lab-block-tagging: add definition for verse
+
2023-06-07 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
- * latex-lab-block-tagging.dtx corrected tagging of caption
- * new latex-lab-firstaid.dtx with adaptions to external packages
- * latex-lab-float.dtx: declare variable
- * latex-lab-toc-hyperref-changes: use hooks with arguments
- * latex-lab-toc-kernel-changes: use hooks with arguments
- * latex-lab-sec.dtx: provide \pdfgentounicode with lualatex
-
+ * latex-lab-block-tagging.dtx corrected tagging of caption
+ * new latex-lab-firstaid.dtx with adaptions to external packages
+ * latex-lab-float.dtx: declare variable
+ * latex-lab-toc-hyperref-changes: use hooks with arguments
+ * latex-lab-toc-kernel-changes: use hooks with arguments
+ * latex-lab-sec.dtx: provide \pdfgentounicode with lualatex
+
2023-05-20 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
- * renamed latex-lab-sec-tagging -> latex-lab-sec for consistency
-
+ * renamed latex-lab-sec-tagging -> latex-lab-sec for consistency
2023-05-19 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
* new latex-lab-bib.dtx:
@@ -18,10 +54,10 @@
2023-05-18 Ulrike Fischer <Ulrike.Fischer at latex-project.org>
* new latex-lab-floats.dtx:
tagging support for float environments
- * new latex-lab-graphic.dtx
- tagging support for includegraphics and picture environment
- * new latex-lab-minipage.dtx
- tagging support for minipage and parbox
+ * new latex-lab-graphic.dtx
+ tagging support for includegraphics and picture environment
+ * new latex-lab-minipage.dtx
+ tagging support for minipage and parbox
2023-05-16 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/documentmetadata-support-code.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/documentmetadata-support-doc.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-amsmath.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-bib.pdf
===================================================================
(Binary files differ)
Deleted: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block-tagging.pdf
===================================================================
(Binary files differ)
Added: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block.pdf
===================================================================
(Binary files differ)
Index: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block.pdf 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block.pdf 2023-09-14 20:25:56 UTC (rev 68279)
Property changes on: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-block.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-firstaid.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-float.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-footnotes.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-graphic.pdf
===================================================================
(Binary files differ)
Added: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-math.pdf
===================================================================
(Binary files differ)
Index: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-math.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-math.pdf 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-math.pdf 2023-09-14 20:25:56 UTC (rev 68279)
Property changes on: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-math.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-mathpkg.pdf
===================================================================
(Binary files differ)
Deleted: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-mathtagging.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-mathtools.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-minipage.pdf
===================================================================
(Binary files differ)
Added: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-namespace.pdf
===================================================================
(Binary files differ)
Index: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-namespace.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-namespace.pdf 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-namespace.pdf 2023-09-14 20:25:56 UTC (rev 68279)
Property changes on: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-namespace.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-new-or-1.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-new-or-2.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-sec.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-testphase.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-text.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc-kernel-changes.pdf
===================================================================
(Binary files differ)
Deleted: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc-tagging-functions.pdf
===================================================================
(Binary files differ)
Added: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc.pdf
===================================================================
(Binary files differ)
Index: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc.pdf 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc.pdf 2023-09-14 20:25:56 UTC (rev 68279)
Property changes on: trunk/Master/texmf-dist/doc/latex-dev/latex-lab/latex-lab-toc.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/documentmetadata-support.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -18,8 +18,8 @@
% for those people who are interested or want to report an issue.
%
% \begin{macrocode}
-\def\documentmetadatasupportversion{1.0d}
-\def\documentmetadatasupportdate{2023-06-07}
+\def\documentmetadatasupportversion{1.0f}
+\def\documentmetadatasupportdate{2023-09-01}
% \end{macrocode}
%
%
@@ -139,7 +139,7 @@
% |pdfstandard| can be used more than once to set overlapping standards, e.g:\\
% |pdfstandard=A-2b,pdfstandard=X-4,pdfstandard=UA-1|
%
-% If XMP-metadata are added (see the following key \texttt{xmp}
+% If XMP-metadata are added (see the following key \texttt{xmp})
% the needed conformance marker for the standards are set.
%
% More information can be found in the documentation
@@ -151,9 +151,13 @@
% \item[\texttt{colorprofiles}] This allows to load icc-colorprofiles. Details
% are described in the documentation of \pkg{l3pdfmeta}.
%
-% \item[\texttt{testphase}] This key is used to load testphase code. The values it accepts
-% and their effect will change over time, when testphase packages are added or
-% removed or when the code is moved into the kernel.
+% \item[\texttt{testphase}] This key is used to load testphase code.
+% The |testphase| key can only be used in the first \cs{DocumentMetadata}.
+% The values it accepts and their effect will change over time, when testphase packages are added or
+% removed or when the code is moved into the kernel. The key accepts a list of values
+% and it can be used more than once.
+%
+% The \texttt{phase} key bundle testphase modules. They also all activate tagging.
% \begin{description}
% \item[\texttt{phase-I}]
% This value loads code implementing the first phase of the project~\cite{blueprint}, i.e., it
@@ -172,7 +176,13 @@
% table of contents and similar lists, graphics, minipages and floats.
% As it redefines many internals it is currently restricted to the use of
% standard classes (article, report, and book)
-% and it supports only a limited number of add-on packages.
+% and it supports only a limited number of add-on packages.
+% \end{description}
+%
+% The various testphase modules can also be loaded individually (and least in theory,
+% there can be hidden dependencies). If loaded like this, the tagpdf package is not
+% loaded and tagging is not activated! The list of modules will change over time.
+% \begin{description}
% \item[\texttt{new-or-1}] This patches a few commands related
% to the output routine. The patches are needed for the tagging
% of paragraphs, for the tagging of header and footer and
@@ -183,8 +193,32 @@
% \item[\texttt{new-or}] This loads more changes to the output routine required for the
% tagging. It is not compatible with every class! The code is also loaded by the
% \texttt{phase-II} value.
+% \item[\texttt{sec}] This adapts commands related to sectioning to make them tagging aware.
+% The \texttt{sec} module is loaded by \texttt{phase-III}.
+% \item[\texttt{toc}] This adapts commands related to the table of contents and
+% similar list to make them tagging aware. The \texttt{toc} module is loaded by \texttt{phase-III}.
+% \item[\texttt{graphic}] This enables tagging support for
+% the \cs{includegraphics} command and the \texttt{picture} environment.
+% This code is also loaded by the \texttt{phase-III} key.
+% \item[\texttt{block}] This reimplements lists and blocks environments and
+% add tagging support.
+% This code is also loaded by the \texttt{phase-III} key.
+% \item[\texttt{minipage}] This adds tagging support to \texttt{minipage}
+% and \cs{parbox}.
+% This code is also loaded by the \texttt{phase-III} key.
+% \item[\texttt{float}] This adds tagging support to floats.
+% This code is also loaded by the \texttt{phase-III} key.
+% \item[\texttt{bib}] This adds tagging support to citations and bibliographies.
+% This code is also loaded by the \texttt{phase-III} key.
+% \item[\texttt{text}] This module adds tagging support to the \LaTeX{} logo and
+% to the \cs{emph} command.
+% This code is also loaded by the \texttt{phase-III} key.
+% \item[\texttt{math}] This adapts math for tagging. This is only a prototype.
+% The module is currently not loaded by any \texttt{phase} key.
+% \item[\texttt{firstaid}] This contains small adjustments to external packages.
+% The module is currently not loaded by any \texttt{phase} key.
% \end{description}
-% The |testphase| key can only be used in the first \cs{DocumentMetadata}.
+%
%
% \item[\texttt{debug}] This key activates some debug options. It takes a list of key-values
% as value. Currently the following keys are known:
@@ -200,7 +234,10 @@
% \item[\texttt{xmp-export}] This will export the XMP-metadata to a file \verb+\jobname.xmpi+.
% with \texttt{debug=\{xmp-export=filename\}} the file name can be changed.
% More information can be found in the documentation of \pkg{l3pdfmeta} of the \pkg{pdfmanagement-testphase}
-% bundle.
+% bundle.
+% \item[\texttt{tagpdf}] This loads the package tagpdf-debug which enhances
+% various commands from tagpdf with additional debugging options. This can slow down
+% the compilation!
% \end{description}
% \end{description}
%
@@ -426,6 +463,16 @@
\tagpdfsetup{log=#1}
}
}
+ ,debug / tagpdf .code:n =
+ {
+ \AddToHook
+ {
+ package/tagpdf/after
+ }
+ {
+ \RequirePackage{tagpdf-debug}
+ }
+ }
,debug / uncompress .code:n =
{
\pdf_uncompress:
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-bib.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-bib.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-bib.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -16,6 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabbibdate{2023-07-20}
+\def\ltlabbibversion{0.81a}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -31,7 +33,7 @@
% Changes and additions to the kernel related to tagging and links in citations and
% bibliography entries}
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{Version 0.81 2023-06-07}
+% \date{v\ltlabbibversion\ \ltlabbibdate}
%
% \maketitle
%
@@ -129,12 +131,12 @@
%<@@=tag>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesExplPackage {latex-lab-testphase-bib} {2023-05-18} {0.8}
+\ProvidesExplPackage {latex-lab-testphase-bib} {\ltlabbibdate} {\ltlabbibversion}
{Code related to the tagging of bibliography and cite command}
% \end{macrocode}
% We need at least the block tagging code.
% \begin{macrocode}
-\RequirePackage{latex-lab-testphase-block-tagging}
+\RequirePackage{latex-lab-testphase-block}
% \end{macrocode}
%
% At first we suppress the patches from hyperref. This will only work with the next
@@ -398,7 +400,8 @@
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{bib-latex-lab-testphase.ltx}
- [2023-05-18 v0.8 code related to the tagging of bib and citations]
+ [\ltlabbibdate\space v\ltlabbibversion\space
+ latex-lab wrapper bib]
\RequirePackage{latex-lab-testphase-bib}
Deleted: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block-tagging.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block-tagging.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block-tagging.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,4055 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: latex-lab-block-tagging.dtx (C) Copyright 2021-2023 LaTeX Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% https://www.latex-project.org/lppl.txt
-%
-%
-%<*driver>
-\documentclass{l3doc}
-\usepackage{amstext}
-\EnableCrossrefs
-\CodelineIndex
-
-\usepackage{todonotes}
-
-\begin{document}
- \DocInput{latex-lab-block-tagging.dtx}
-\end{document}
-%</driver>
-%
-% \fi
-%
-
-\def\ltblocksversion{v0.8d}
-\def\ltblocksdate{2023/06/07}
-
-%
-% \title{Prototype reimplementation of \LaTeXe{}'s block environments using templates}
-% \author{\LaTeX{} Project\thanks{Initial reimplementation of lists done by Bruno
-% Le Floch, generalized second version with tagging support by Frank Mittelbach.}}
-% \date{\ltblocksversion\ \ltblocksdate}
-%
-% \maketitle
-%
-%
-% \newcommand{\xt}[1]{\textsl{\textsf{#1}}}
-% \newcommand{\TODO}[1]{\textbf{[TODO:} #1\textbf{]}}
-% \newcommand{\docclass}{document class \marginpar{\raggedright document class
-% customizations}}
-%
-% \providecommand\hook[1]{\texttt{#1}}
-% \providecommand\struct[1]{\texttt{<#1>}}
-%
-% \NewDocElement[envlike, idxtype=objecttype, idxgroup=object types,
-% printtype=\textit{objecttype}] {ObjectType}{objecttype}
-%
-% \NewDocElement[envlike, idxtype=template, idxgroup=templates,
-% printtype=\textit{templ.}] {Template}{template}
-%
-% \NewDocElement[envlike, idxtype=instance, idxgroup=instances,
-% printtype=\textit{inst.}] {Instance}{instance}
-%
-%
-% \newcommand\valuefrom[1]{\textrm{value from }\texttt{#1}}
-% \newcommand\key[1]{\texttt{#1}}
-%
-%
-% \NewDocumentCommand\fmi{sO{}m}
-% {\IfBooleanTF{#1}{\todo[inline,#2]{#3}}^^A
-% {\todo[#2]{#3}}}
-%
-% \NewDocumentCommand\ufi{sO{}m}
-% {\IfBooleanTF{#1}{\todo[inline,#2]{UFi:#3}}^^A
-% {\todo[#2]{UFi:#3}}}
-% \makeatletter
-% \renewenvironment{TemplateInterfaceDescription}[1]
-% {
-% \subsubsection{The~object~type~`#1'}
-% \begingroup
-% \@beginparpenalty\@M
-% \description
-% \def\TemplateArgument##1##2{\item[Arg:~##1]##2\par}
-% \def\TemplateSemantics
-% {
-% \enddescription\endgroup
-% \subsubsection*{Semantics:}
-% }
-% }
-% {
-% \par\bigskip
-% }
-% \renewenvironment{TemplateDescription}[2]
-% {\subsubsection{The \texttt{#1} template `#2'}^^A
-% \paragraph*{Attributes:}^^A
-% \begingroup
-% \@beginparpenalty\@M
-% \description
-% \def\TemplateKey##1##2##3##4{^^A
-% \item[\texttt{##1}~(\textit{\mdseries##2})]##3^^A
-% \ifx\TemplateKey##4\TemplateKey\else
-% \hfill\penalty500\hbox{}\hfill Default:~\texttt{##4}^^A
-% \nobreak\hskip-\parfillskip\hskip0pt\relax
-% \fi
-% \par
-% }^^A
-% \def\TemplateSemantics{^^A
-% \enddescription\endgroup
-% \paragraph*{Semantics~\&~Comments:}^^A
-% }^^A
-% }
-% { \par \bigskip }
-% \makeatother
-%
-%
-% \begin{abstract}
-% \end{abstract}
-%
-%
-% \tableofcontents
-% \medskip
-%
-%
-% \begin{documentation}
-%
-%
-%
-% \section{Introduction}
-%
-% The list implementation in \LaTeXe{} serves a dual purpose: it
-% implements real lists such as \env{itemize} or \env{enumerate},
-% but it is also used as the basis for vertical blocks, i.e., to specify
-% the vertical spacing and paragraph handling after such block, e.g.,
-% in environments like \env{center}, \env{quote}, \env{verbatim}, or in
-% the theorem environments. They are all implemented as
-% \enquote{trivial} lists with a single (hidden) item.
-%
-% While this was convenient to get a consistent layout using a single
-% implementation it is not adequate if it comes to interpreting the
-% structure of a document, because environments based on \env{trivlist}
-% should not advertise themselves as being a \enquote{list} --- after all,
-% from a semantic point of view they aren't lists.
-%
-% The approach taking here is therefore to offer separate object
-% types: \xt{block} (horizontally or vertically oriented data that
-% needs some handling at the start and the end), \xt{para} (that deals
-% with different paragraph layouts), \xt{list} (that handles list
-% related parameters, and \xt{item} (for item layouts and handling), to address
-% the independent aspects and also offer the object type \xt{blockenv}
-% that ties them together as necessary.
-%
-% For example, a \env{quote} environment would make use of a (display)
-% \xt{block} and some \xt{para} handling while an standard
-% \env{enumerate} would make use of a display \xt{block}, a \xt{list},
-% and an \xt{item} and \xt{para} instance.
-% An inline list (like \env{enumerate*} from the \pkg{enumitem}
-% package) would be using the same \xt{list} instance but a different
-% (horizontally oriented) \xt{block}.
-%
-%
-% \section{Object types and templates for blocks and lists}
-%
-% \subsection{Object types}
-%
-% \begin{TemplateInterfaceDescription}{block}
-% \TemplateArgument{1}{key/value list to alter the default block parameters}
-% \TemplateSemantics
-% Handle the layout aspects of a block of data. In case of a
-% \enquote{display} block (i.e., vertically oriented) the spacing
-% and page breaking as well as the handling if the block starts a
-% paragraph or ends one, that is, if text is immediately following
-% the block without being separated by an empty line, then this
-% text is considered to be in the same paragraph as the block.
-%
-% In case of a horizontally oriented block it covers any special
-% handling at the start and end of the block, e.g, extra spacing,
-% prohibitying or encuraging line breaks, and so forth.
-% \end{TemplateInterfaceDescription}
-%
-% \begin{TemplateInterfaceDescription}{para}
-% \TemplateArgument{1}{key/value list to alter the default item parameters}
-% \TemplateSemantics
-% Sets up paragraph-specific parameters for H\&J, e.g., to
-% implement justification variations, the behavior of \verb=\\=
-% etc. The instances are used in higher-level templates, e.g., in a
-% \xt{block}.
-% \end{TemplateInterfaceDescription}
-%
-% \begin{TemplateInterfaceDescription}{list}
-% \TemplateArgument{1}{key/value list to alter the default item parameters}
-% \TemplateSemantics
-% Handle the aspects related to list design, e.g., the use and
-% formatting of counters, etc.
-%
-% Note that this does not cover block-related aspects, i.e., a list
-% instance could be used both for a display list or for an inline line.
-% \end{TemplateInterfaceDescription}
-%
-% \begin{TemplateInterfaceDescription}{item}
-% \TemplateArgument{1}{key/value list to alter the default item parameters}
-% \TemplateSemantics
-% A sub-type used as part of \xt{list} to easily cover alternative layout
-% for list items.
-% \end{TemplateInterfaceDescription}
-%
-%
-% \begin{TemplateInterfaceDescription}{blockenv}
-% \TemplateArgument{1}{key/value list to alter the default item parameters}
-% \TemplateSemantics
-% This object type is used to implement document-level
-% environments. It defines a \xt{block} instance to handle the
-% layout at the \enquote{edge} of the environment data, possibly
-% some paragraph setup through a \xt{para} instance, potentially an
-% \enquote{inner} instance for more complicated environments (such
-% as lists), and possibly some additional setup code for certain
-% environments.
-%
-% It also defines how the \xt{blockenv} behaves with respect to
-% nesting, e.g., does it change when nested and if so how many
-% levels of nesting are supported, etc.
-%
-% Finally, the object type defines how it appears in a tagged PDF
-% document, what tag names are used, how they are rolemapped and
-% whether it adds additional attributes, etc.
-% \end{TemplateInterfaceDescription}
-%
-%
-%
-% \subsection{Templates}
-%
-%
-% \begin{TemplateDescription}{blockenv}{display}
-%
-% \TemplateKey{env-name}{tokenlist}
-% {Name of the environment used only in tracing}{}
-% \TemplateKey{tag-name}{tokenlist}
-% {Name of the tag in the PDF. If not explicitly given
-% the name is defined by the \key{tagging-recipe}}{}
-% \TemplateKey{tag-class}{tokenlist}
-% {An explicit tag class attribute}{}
-% \TemplateKey{tagging-recipe}{tokenlist}
-% {Defines the way tagging is done. Currently the values
-% \texttt{basic}, \texttt{standard}, and \texttt{list}
-% are supported}{standard}
-% \TemplateKey{level-increase}{boolean}{Does this \xt{blockenv}
-% increase the block level if it is nested in an outer block?}{true}
-% \TemplateKey{setup-code}{tokenlist}
-% {Initial setup code. This is
-% executed after legacy defaults (from \cs{@listi},
-% \cs{@listii}, etc.) are used but before the block instance is called}{}
-% \TemplateKey{block-instance}{tokenlist}{Part of the name of the
-% \xt{block} instance that is called. The full name has
-% a \texttt{-}\meta{level} appended}{displayblock}
-% \TemplateKey{para-instance}{tokenlist}{}{}
-% \TemplateKey{inner-level-counter}{tokenlist}{Name of an existing (!) counter
-% that is incremented and used to determine final name
-% of the \key{inner-instance} or empty if always the
-% same inner instance should be used}{}
-% \TemplateKey{max-inner-levels}{tokenlist}{Maximum number of nested
-% environments of this kind. Only relevant if there is a
-% \key{inner-level-counter} specified}{4}
-% \TemplateKey{inner-instance-type}{tokenlist}{Opject type of the
-% inner instance}{list}
-% \TemplateKey{inner-instance}{tokenlist}{Name of the inner instance
-% (if any).}{}
-% \TemplateKey{para-flattened}{boolean}{\emph{describe}}{false}
-% \TemplateKey{final-code}{tokenlist}{Final setup code}{\cs{ignorespaces}}
-%
-% \TemplateSemantics
-%
-% This \xt{blockenv} template supports the legacy list setting that
-% are found in many document classes in the macros \cs{@listi},
-% \cs{@listii}, up to \cs{@listvi}. It also uses the counter
-% \cs{@listdepth} to track nesting of block, again mainly to
-% support legacy setups (internally it gives it a more appropriate
-% name but it remains accessible through the \LaTeXe{} name).
-%
-%
-% It first checks that nothing is too deeply nested.
-% If the level should increase then the increments the
-% \cs{@listdepth} counter and
-% calls the corresponding \cs{@list...} macro to update the legacy
-% defaults. If \key{level-increase} is set to false this is bypassed.
-%
-% It then sets up the
-% tagging via the \key{tagging-recipe} setting and executes any
-% code in \key{setup-code}.
-%
-% Afterwards it calls the appropriate \xt{block} instance based on
-% \key{block-instance} and current level, e.g.,
-% \texttt{displayblock-1}. Then it sets up paragraph parameters if
-% a \key{para-instance} was specified (otherwise they stay as
-% they are).
-%
-% If a \key{inner-instance} was specified this is called next,
-% or more precisely: if no \key{inner-level-counter} was
-% specified the instance \key{inner-instance} is
-% called.
-%
-% Otherwise, the \key{inner-level-counter} is incremented and the
-% instance with the name
-% \key{inner-instance}\texttt{-}\key{inner-level-counter} is
-% called.
-%
-% Finally, the \key{final-code} is executed (by default
-% \cs{ignorespaces}).
-%
-%
-% \end{TemplateDescription}
-%
-% The maximum number of \xt{blockenv}s that can be nested into each
-% other is is restricted by the \LaTeX{} counter
-% \texttt{maxblocklevels} with a default value of \texttt{6}. If this
-% value is increased then it is necessary to provide additional
-% instances, e.g., \texttt{displayblock-7}, etc. Decreasing is, of
-% course, always possible, then some of the instances defined are not
-% used and instead the user gets an error that there is too much
-% nesting going on.
-%
-% If the key \key{level-increase} is set to \texttt{false} then such
-% an environment doesn't alter the nesting level and therefore you can
-% nest those environments as often as you like (a typical example
-% would be \env{flushleft} anywhere in the nesting hierarchy, that
-% would have no effect on hitting the boundary).
-%
-%
-% \begin{TemplateDescription}{block}{display}
-%
-% \TemplateKey{heading}{tokenlist}{\emph{not really used yet}}{}
-% \TemplateKey{beginsep}{skip}{}{\cs{topsep}}
-% \TemplateKey{begin-par-skip}{skip}{}{\cs{partopsep}}
-% \TemplateKey{par-skip}{skip}{}{\cs{parsep}}
-% \TemplateKey{end-skip}{skip}{}{\valuefrom{beginsep}}
-% \TemplateKey{end-par-skip}{skip}{}{\valuefrom{begin-par-skip}}
-% \TemplateKey{beginpenalty}{integer}{}{\cs{@beginparpenalty}}
-% \TemplateKey{endpenalty}{integer}{}{\cs{@endparpenalty}}
-% \TemplateKey{leftmargin}{length}{}{\cs{leftmargin}}
-% \TemplateKey{rightmargin}{length}{}{\cs{rightmargin}}
-% \TemplateKey{parindent}{length}{}{\cs{listparindent}}
-%
-% \TemplateSemantics
-%
-% The idea of a \key{heading} key needs some further
-% thoughts. Maybe instead the object type should accept a second
-% argument and receive input for such a headding from the document
-% level instead.
-%
-% The names of the keys need further thoughts and some
-% decision. Right now it is a mixture of those with hyphens and
-% those that match legacy register names (the way \pkg{enumitem}
-% did its keys).
-%
-% Also \key{parindent} conflicts with \key{indent-width}!
-%
-% \end{TemplateDescription}
-%
-%
-% \begin{TemplateDescription}{para}{std}
-%
-% \TemplateKey{indent-width}{length}{}{\cs{parindent}}
-% \TemplateKey{start-skip}{skip}{}{0pt}
-% \TemplateKey{left-skip}{skip}{}{0pt}
-% \TemplateKey{right-skip}{skip}{}{0pt}
-% \TemplateKey{end-skip}{skip}{}{\cs{@flushglue}}
-% \TemplateKey{fixed-word-spaces}{boolean}{}{false}
-% \TemplateKey{final-hyphen-demerits}{integer}{}{5000}
-% \TemplateKey{cr-cmd}{tokenlist}{}{\cs{@normalcr}}
-% \TemplateKey{para-class}{tokenlist}{}{justify}
-%
-% \TemplateSemantics
-%
-%
-% \end{TemplateDescription}
-%
-%
-%
-% \begin{TemplateDescription}{list}{std}
-%
-% \TemplateKey{counter}{tokenlist}
-% {Counter name to be used in a numbered list or empty,
-% if the list is unnumbered}{}
-% \TemplateKey{item-label}{tokenlist}
-% {Label \enquote{string} for a fixed label or as
-% generated from the current \key{counter} value}{}
-% \TemplateKey{start}{integer}
-% {Start value for the counter if the list is numbered,
-% otherwise irrelevant}{1}
-% \TemplateKey{resume}{boolean}
-% {Should a numbered list be resumed from the last instance?}{false}
-% \TemplateKey{item-instance}{instance}
-% {Instance of type \texttt{item} to be used to format
-% the label string}{basic}
-% \TemplateKey{item-skip}{skip}{The space in front of an item in the
-% list.\fmi{May need to be on a different template level}}{\cs{itemsep}}
-% \TemplateKey{item-indent}{length}{Horizontal displacement of the item.}{0pt}
-% \TemplateKey{item-penalty}{integer}
-% {Penalty for breaking before an
-% item (except the first)}{\cs{@itempenalty}}
-% \TemplateKey{label-width}{length}
-% {Width reserved for the formatted item label}{\cs{labelwidth}}
-% \TemplateKey{label-sep}{length}
-% {Horizontal separation between label and following text}{\cs{labelsep}}
-% \TemplateKey{legacy-support}{boolean}
-% {Is formatting the label via \cs{makelabel} supported?}{false}
-%
-% \TemplateSemantics
-%
-%
-% \end{TemplateDescription}
-%
-%
-% \begin{TemplateDescription}{item}{std}
-%
-% \TemplateKey{counter-label}{function{1}}{\emph{unused}}{\cs{arabic}\{\#1\}}
-% \TemplateKey{counter-ref}{function{1}}{\emph{unused}}{\valuefrom{counter-label}}
-% \TemplateKey{label-ref}{function{1}}{\emph{unused}}{\#1}
-% \TemplateKey{label-autoref}{function{1}}{\emph{unused}}{item~\#1}
-% \TemplateKey{label-format}{function{1}}
-% {Formatting of the label, questionable the way it is used}{\#1}
-% \TemplateKey{label-strut}{boolean}{Add a \cs{strut} to the label?}{false}
-% \TemplateKey{label-align}{choice}
-% {Supported values \texttt{left},\texttt{center},
-% \texttt{right}, and \texttt{parleft}. \emph{Only partly implemented}}{right}
-% \TemplateKey{label-boxed}{boolean}
-% {Should the label be boxed?}{true}
-% \TemplateKey{next-line}{boolean}{}{false}
-% \TemplateKey{text-font}{tokenlist}{\emph{unused}}{}
-% \TemplateKey{compatibility}{boolean}{}{true}
-%
-% \TemplateSemantics
-%
-% This template is only rudimentary implemented at the moment. It
-% probably needs other keys and the existing ones need a proper
-% implementation.
-%
-% \end{TemplateDescription}
-%
-%
-% \section{Tagging support}
-%
-% \subsection{Paragraph tags}
-%
-% Paragraphs in \LaTeX{} can be nested, e.g., you can have a paragraph
-% containing a display quote, which in turn consists of more than one
-% (sub)paragraph, followed by some more text which all belongs to the
-% same outer paragraph.
-%
-% In the PDF model and in the HTML model that is not supported --- a
-% limitation that conflicts with real live, given that such
-% constructs are quite normal in spoken and written language.
-%
-% The approach we take to resolve this is to model such \enquote{big}
-% paragraphs with a structure named \struct{text-unit} and use \struct{text} (rollmapped to \struct{P})
-% only for (portions of) the actual paragraph text in a way that the
-% \struct{text}s are not nested. As a result we have for a simple
-% paragraph the structures
-% \begin{tabbing}
-% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
-% \> \struct{text-unit}\\
-% \>\> \struct{text}\\
-% \>\>\> The paragraph text \ldots\\
-% \>\> \struct{/text}\\
-% \> \struct{/text-unit}
-% \end{tabbing}
-% The \struct{text-unit} structure is rollmapped to \struct{Part} or possibly to
-% \struct{Div} so we get a valid PDF, but processors who care can identify
-% the complete paragraphs by looking for \struct{text-unit} tags.
-%
-% In the case of an element, such as a display quote or a display list
-% inside the paragraph, we then have
-% \begin{tabbing}
-% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
-% \> \struct{text-unit}\\
-% \>\> \struct{text}\\
-% \>\>\> The paragraph text before the display element \ldots\\
-% \>\> \struct{/text}\\
-% \>\> \struct{display element structure}\\
-% \>\>\> Content of the display structure possiblly involving inner \struct{text-unit} tags\\
-% \>\> \struct{/display element structure}\\
-% \>\> \struct{text}\\
-% \>\>\> \ldots{} continuing the outer paragraph text\\
-% \>\> \struct{/text}\\
-% \> \struct{/text-unit}
-% \end{tabbing}
-% In other words such a display block is always embedded in a
-% \struct{text-unit} structure, possibly preceded by a \struct{text}\ldots\struct{/text} block
-% and possibly followed by one, though both such blocks are optional.
-%
-% Thus an \env{itemize} environment that has some introductory text
-% but no text immediately following the list
-% would be tagged as follows:
-% \begin{tabbing}
-% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
-% \> \struct{text-unit}\\
-% \>\> \struct{text}\\
-% \>\>\> The intro text for the \env{itemize} environment \ldots\\
-% \>\> \struct{/text}\\
-% \>\> \struct{itemize}\\
-% \>\>\> \struct{LI}\\
-% \>\>\>\> \struct{Lbl} label \struct{/Lbl}\\
-% \>\>\>\> \struct{LBody}\\
-% \>\>\>\>\> The text of the first item involving \struct{text-unit} as necessary \ldots\\
-% \>\>\>\> \struct{/LBody}\\
-% \>\>\> \struct{/LI}\\
-% \>\>\> \struct{LI}\\
-% \>\>\>\> The second item \ldots{}\\
-% \>\>\> \struct{/LI}\\
-% \>\>\> \ldots{} further items \ldots\\
-% \>\> \struct{/itemize}\\
-% \> \struct{/text-unit}
-% \end{tabbing}
-% The \struct{itemize} is rollmapped to \struct{L}.
-%
-% For some display blocks, such as centered text, we use a simpler
-% strategy. Such blocks still ensure that they are inside a \struct{text-unit}
-% structure but their body uses simple \struct{text} blocks and not
-% \struct{text-unit}\struct{text} inside, e.g., the input
-% \begin{verbatim}
-% This is a paragraph with some
-% \begin{center}
-% centered lines
-%
-% with a paragraph break between them
-% \end{center}
-% followed by some more text.
-% \end{verbatim}
-% will be tagged as follows:
-% \begin{tabbing}
-% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
-% \> \struct{text-unit}\\
-% \>\> \struct{text}\\
-% \>\>\> This is a paragraph with some\\
-% \>\> \struct{/text}\\
-% \>\> \struct{text /O /Layout /TextAlign/Center}\\
-% \>\>\> centered lines\\
-% \>\> \struct{/text}\\
-% \>\> \struct{text /O /Layout /TextAlign/Center}\\
-% \>\>\> with a paragraph break between them\\
-% \>\> \struct{/text}\\
-% \>\> \struct{text}\\
-% \>\>\> followed by some more text.\\
-% \> \struct{/text-unit}
-% \end{tabbing}
-%
-%
-% \subsection{Tagging recipes}
-%
-% There are a number of different tagging recipes that implement
-% different tagging approaches. They are selected through the
-% \key{tagging-recipe} of the \xt{blockenv} template. Currently the
-% following values are implemented:
-% \begin{description}
-% \item[\texttt{basic}]
-% This recipe does the following:
-% \begin{itemize}
-% \item
-% Ensure that the \xt{blockenv} is inside a \struct{text-unit}
-% structure, if necessary, start one.
-% \item
-% If inside a \struct{text-unit}\struct{text}, then close the \struct{/text} but
-% leave the \struct{text-unit} open.
-%
-% \item
-% Text inside the body of the environment starts with
-% \struct{text-unit}\struct{text} if \key{para-flattened} is set to \texttt{false},
-% otherwise just with \struct{text}.
-%
-% \item
-% At the end of the environment close \struct{/text} and possibly an
-% inner \struct{/text-unit} if open.
-%
-% \item
-% Then look if the environment is followed by an empty line
-% (\cs{par}). If so, close the outer \struct{/text-unit} and start any
-% following text with \struct{text-unit}\struct{text}. Otherwise,
-% don't and following text restarts with a just a \struct{text} (and no
-% paragraph indentation)
-% \end{itemize}
-%
-%
-% \item[\texttt{standard}]
-% This recipe is like the \texttt{basic} one as far as handling
-% \struct{text-unit} and \struct{text} is concerned. In addition
-% \begin{itemize}
-% \item
-% it starts an inner tagging structure (i.e., which is therefore a
-% child of the outer \struct{text-unit}).
-% \item
-% By default this structure is a \struct{Figure} unless overwritten
-% by the key \key{tag-name}. If that key is used, a suitable
-% rollmap needs to be provided for the name given.
-% \item
-% At the end of the environment that inner structure is closed
-% again so that we are back on the \struct{text-unit} level from the outside.
-% \item
-% Then the lookahead for an empty line is done as described previously.
-% \end{itemize}
-%
-%
-%
-% \item[\texttt{list}]
-% This recipe is like the \texttt{standard} one except that
-% \begin{itemize}
-% \item
-% the inner structure is a list (\struct{L}).
-% \item
-% Furthermore everything is set up so that we have list items
-% (\struct{LI}) with suitable substructures (\struct{Lbl} for the item
-% labels and \struct{LBody} for the item bodies).
-% \item
-% If the key \key{tag-name} is specified, this is used as the tag
-% name for the whole list instead of \struct{L}. Of course, it
-% should then have a suitable rollmap.
-% \item
-% If the key \key{tag-class} is specified then this is used as the
-% class attribute. Again, this requires a suitable setup on the outside.
-% \item
-% At the end of the environment the \struct{/LBody}, \struct{/LI}, and
-% \struct{/L} (or the tag name used) are closed.
-% \item
-% Then the lookahead for an empty line is done as described previously.
-% \end{itemize}
-%
-%
-% \end{description}
-%
-%
-%
-%
-%
-%
-% \end{documentation}
-%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
-%
-%
-%
-% \begin{implementation}
-%
-% \section{The Implementation}
-%
-%
-% \begin{macrocode}
-%<*package>
-%<@@=block>
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\ProvidesPackage {latex-lab-testphase-block-tagging}
- [\ltblocksdate\space \ltblocksversion\space
- blockenv implementation]
-% \end{macrocode}
-%
-% We make use of templates:
-% \begin{macrocode}
-\RequirePackage{xtemplate}
-% \end{macrocode}
-% Generell kernel changes, also loaded by the sec and toc code.
-% \begin{macrocode}
-\RequirePackage{latex-lab-kernel-changes}
-% \end{macrocode}
-% \begin{macrocode}
-\ExplSyntaxOn
-% \end{macrocode}
-%
-% \ufi{this variable(s) must be declared:}
-% \begin{macrocode}
-\tl_new:N \l_@@_item_align_tl
-\tl_new:N\l_@@_legacy_env_params_tl
-% \end{macrocode}
-
-% \subsection{Handling \cs{par} after the end of the list}
-%
-% An empty line (or a \cs{par}) after a list has semantic meaning as
-% it defines whether then following text is logically within the same
-% paragraph as the list (no empty line) or whether it starts a new
-% paragraph and the paragraph containing the list ends at the end of
-% the list (empty line after the list).
-% This is handled by \LaTeX{} using a legacy flag called
-% \texttt{@endpe} and set of commands inside the
-% generic \cs{end} (calling \cs{@doendpe}) and as part of the list
-% environments identifying themselves as \enquote{paragraph ending
-% environments} (by setting this flag).
-%
-% For the reimplementation of the list environments including support
-% of tagging we need to augment that mechanism slightly and add some
-% kernel hook(s) to add the tagging code if needed.
-%
-%
-%
-%
-% \begin{macro}{\@doendpe}
-% The original \LaTeXe{} command is augmented to allow for tagging.
-% \begin{macrocode}
-\def\@doendpe{\@endpetrue
- \def\par
- {
- \@restorepar
- \clubpenalty\@clubpenalty
-% \end{macrocode}
-% At this point we add the tagging code that closes an open
-% \struct{text-unit}, \struct{text} tag combination,
-% if necessary:
-% \begin{macrocode}
- \__kernel_displayblock_doendpe:
-% \end{macrocode}
-%
-% The standard \cs{par} command (\cs{par_end:}) acts on
-% \texttt{@endpe} and attempts to close a still open \texttt{text-unit}
-% and this would be wrong if it was already closed above. So we
-% have to reset the switch to false first.
-% \begin{macrocode}
- \@endpefalse
- \everypar{}
- \par
- }
- \everypar{{\setbox\z@\lastbox}
- \everypar{}
- \@endpefalse
- }
-}
-% \end{macrocode}
-%
-% By default we don't do any tagging:
-% \begin{macrocode}
-\cs_new_eq:NN \__kernel_displayblock_doendpe: \prg_do_nothing:
-% \end{macrocode}
-% The flag itself should be set globally not locally.\fmi{verify
-% that this claim is actually correct!}
-% \begin{macrocode}
-\def\@endpetrue {\global\let\if at endpe\iftrue}
-\def\@endpefalse{\global\let\if at endpe\iffalse}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \subsection{Object and template interfaces}
-%
-%
-% \begin{objecttype}{blockenv, block, para, list, item}
-% All object types expect a single
-% key--value argument used to tweak template parameters specific to a
-% given use in the document. This section is devoted to template
-% interfaces, and the template code is covered later.
-% \begin{macrocode}
-\DeclareObjectType{blockenv}{1}
-\DeclareObjectType{block}{1}
-\DeclareObjectType{para}{1}
-\DeclareObjectType{list}{1}
-\DeclareObjectType{item}{1}
-% \end{macrocode}
-% \end{objecttype}
-%
-%
-%
-% \begin{template}{blockenv display}
-%
-% \begin{macrocode}
-\DeclareTemplateInterface{blockenv}{display}{1}
-{
- env-name : tokenlist ,
- tag-name : tokenlist ,
- tag-class : tokenlist ,
- tagging-recipe : tokenlist = standard,
- level-increase : boolean = true ,
- setup-code : tokenlist ,
- block-instance : tokenlist = displayblock ,
- para-instance : tokenlist ,
- inner-level-counter : tokenlist,
- max-inner-levels : tokenlist = 4,
- inner-instance-type : tokenlist = list ,
- inner-instance : tokenlist ,
- para-flattened : boolean = false ,
- final-code : tokenlist = \ignorespaces ,
-}
-% \end{macrocode}
-% \end{template}
-%
-%
-% \begin{template}{block display}
-%
-% \begin{macrocode}
-\DeclareTemplateInterface{block}{display}{1}
-{
- heading : tokenlist = , %??
- beginsep : skip = \topsep ,
- begin-par-skip : skip = \partopsep ,
- par-skip : skip = \parsep ,
- end-skip : skip = \KeyValue{beginsep} , % conflict with name below
- end-par-skip : skip = \KeyValue{begin-par-skip} ,
- beginpenalty : integer = \UseName{@beginparpenalty} ,
- endpenalty : integer = \UseName{@endparpenalty} ,
- leftmargin : length = \leftmargin ,
- rightmargin : length = \rightmargin ,
- parindent : length = \listparindent ,
-% font : tokenlist % maybe add? (or more general for fonts and color)
-}
-% \end{macrocode}
-% \end{template}
-%
-%
-% \begin{template}{para std}
-%
-% \begin{macrocode}
-\DeclareTemplateInterface{para}{std}{1}
-{
- indent-width : length = \parindent ,
- start-skip : skip = 0pt ,
- left-skip : skip = 0pt ,
- right-skip : skip = 0pt ,
- end-skip : skip = \@flushglue ,
- fixed-word-spaces : boolean = false ,
- final-hyphen-demerits : integer = 5000 ,
- cr-cmd : tokenlist = \@normalcr ,
- para-class : tokenlist = justify ,
-}
-% \end{macrocode}
-% \end{template}
-%
-%
-% \begin{template}{list std}
-%
-% \begin{macrocode}
-\DeclareTemplateInterface{list}{std}{1} % optional
-{
- counter : tokenlist = ,
- item-label : tokenlist = ,
- start : integer = 1 ,
- resume : boolean = false ,
- item-instance : instance{item} = basic ,
- item-skip : skip = \itemsep ,
- item-penalty : integer = \UseName{@itempenalty} ,
- item-indent : length = 0pt , % was \itemindent
- label-width : length = \labelwidth ,
- label-sep : length = \labelsep ,
- legacy-support : boolean = false ,
-}
-% \end{macrocode}
-% \end{template}
-%
-%
-% \begin{template}{item std}
-%
-% \begin{macrocode}
-\DeclareTemplateInterface{item}{std}{1}
- {
- counter-label : function{1} = \arabic{#1} ,
- counter-ref : function{1} = \KeyValue{counter-label} ,
- label-ref : function{1} = #1 ,
- label-autoref : function{1} = item~#1 ,
- label-format : function{1} = #1 ,
- label-strut : boolean = false ,
- label-align : choice {left,center,right,parleft} = right ,
- label-boxed : boolean = true ,
- next-line : boolean = false ,
- text-font : tokenlist ,
- compatibility : boolean = true ,
- }
-% \end{macrocode}
-% \end{template}
-%
-%
-%
-%
-%
-%
-% \subsection{Useful helper commands}
-%
-% This section collects \pkg{expl3} commands that will be useful.
-%
-% \begin{macro}{\@@_skip_set_to_last:N,\@@_skip_remove_last:}
-% Set a skiip register to the value of an immediately preceding
-% skip or zero if there was none
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_skip_set_to_last:N #1 {
- \skip_set:Nn #1 { \tex_lastskip:D }
-}
-% \end{macrocode}
-% Remove a skip previous skip if it is directly in front (not
-% allowed in unrestricted vertical mode).
-% \begin{macrocode}
-\cs_new_eq:NN \@@_skip_remove_last: \tex_unskip:D
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tl_if_novalue:nTF}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \tl_if_novalue:nTF { o }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\tag_if_active:T}
-% If tagging support is not loaded then we shouldn't try to execute
-% any tagging related commands. Eventually this can go once the
-% basic support is available in the kernel.
-% \fmi{can vanish one day}
-% \begin{macrocode}
-\cs_if_exist:NF \tag_if_active:T
- { \cs_new_eq:NN \tag_if_active:T \use_none:n }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Debugging}
-%
-%
-% \begin{variable}{\g_@@_debug_bool}
-%
-% \begin{macrocode}
-\bool_new:N \g_@@_debug_bool
-% \end{macrocode}
-% \end{variable}
-%
-%
-% \begin{macro}{\@@_debug:n,\@@_debug_typeout:n}
-%
-% \begin{macrocode}
-\cs_new_eq:NN \@@_debug:n \use_none:n
-\cs_new_eq:NN \@@_debug_typeout:n \use_none:n
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\block_debug_on:,\block_debug_off:,
-% \@@_debug_gset:}
-% \begin{macrocode}
-\cs_new_protected:Npn \block_debug_on:
- {
- \bool_gset_true:N \g_@@_debug_bool
- \@@_debug_gset:
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \block_debug_off:
- {
- \bool_gset_false:N \g_@@_debug_bool
- \@@_debug_gset:
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_debug_gset:
- {
- \cs_gset_protected:Npx \@@_debug:n ##1
- { \bool_if:NT \g_@@_debug_bool {##1} }
- \cs_gset_protected:Npx \@@_debug_typeout:n ##1
- { \bool_if:NT \g_@@_debug_bool { \typeout{==>~ ##1} } }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\DebugBlocksOn,\DebugBlocksOff}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \DebugBlocksOn { \block_debug_on: }
-\cs_new_protected:Npn \DebugBlocksOff { \block_debug_off: }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DebugBlocksOff
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \subsection{Implementation of the document-level block environments}
-%
-% Most such environments are pretty simple: they take an option
-% argument and call a \texttt{blockenv} instance to do the work. At
-% the end of environment we call \cs{endblockenv} to finish.
-%
-%
-% \subsubsection{Displayblock environments}
-%
-%
-% There are two basic block environment which are similar to
-% \LaTeXe{}'s \env{trivlist} except that there aren't degenerated
-% lists and thus have no hidden \cs{item} inside.
-%
-%
-% \begin{environment}{displayblock}
-%
-% \begin{macrocode}
-\NewDocumentEnvironment{displayblock}{ !O{} }
- { \UseInstance{blockenv}{displayblock} {#1} }
- { \endblockenv }
-% \end{macrocode}
-% \end{environment}
-%
-%
-%
-%
-% \begin{environment}{displayblockflattened}
-%
-% \begin{macrocode}
-\NewDocumentEnvironment{displayblockflattened}{ !O{} }
- { \UseInstance{blockenv}{displayblockflattened} {#1} }
- { \endblockenv }
-% \end{macrocode}
-% \end{environment}
-%
-%
-%
-%
-%
-%
-%
-%
-% \begin{environment}{center,flushleft,flushright}
-%
-% \begin{macrocode}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{center} { !O{} }
- { \UseInstance{blockenv}{center}{#1} }
- { \endblockenv }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \RenewDocumentEnvironment{flushright} { !O{} }
- { \UseInstance{blockenv}{flushright}{#1} }
- { \endblockenv }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \RenewDocumentEnvironment{flushleft} { !O{} }
- { \UseInstance{blockenv}{flushleft}{#1} }
- { \endblockenv }
-}
-% \end{macrocode}
-%
-%
-% \end{environment}
-%
-%
-%
-%
-% \subsubsection{Display quote environments}
-%
-%
-% \begin{environment}{quote,quotation}
-%
-% \begin{macrocode}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{quote}{ !O{} }
- { \UseInstance{blockenv}{quote} {#1} }
- { \endblockenv }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \RenewDocumentEnvironment{quotation}{ !O{} }
- { \UseInstance{blockenv}{quotation} {#1} }
- { \endblockenv }
-}
-% \end{macrocode}
-% \end{environment}
-%
-%
-%
-%
-%
-%
-% \subsubsection{Verbatim environments}
-%
-%
-% \begin{environment}{verbatim,verbatim*}
-%
-% \begin{macrocode}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{verbatim}{ !O{} }
- { \UseInstance{blockenv}{verbatim} {#1}
-% \end{macrocode}
-% This is the part of the code where \env{verbatim}
-% and\env{verbatim*} differ.
-% \begin{macrocode}
- \@setupverbinvisiblespace\frenchspacing\@vobeyspaces
- \@xverbatim
- }
- { \endblockenv }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \RenewDocumentEnvironment{verbatim*}{ !O{} }
- { \UseInstance{blockenv}{verbatim} {#1}
- \@setupverbvisiblespace\frenchspacing\@vobeyspaces
- \@sxverbatim
- }
- { \endblockenv }
-}
-% \end{macrocode}
-% \end{environment}
-%
-%
-%
-% \paragraph{Helper commands for verbatim}
-%
-%
-% \begin{macro}{\legacyverbatimsetup}
-%
-% This code resembles the \LaTeXe{} verbatim implementation with a
-% slight twist: in \LaTeXe{} each code line was a paragraph using
-% \cs{leftskip}=\cs{@totalleftmargin}. This was possible because
-% the whole environment was implemented as a trivlist. As this is
-% no longer the case setting \cs{leftskip} would alter the layout
-% of a surrounding list. So instead we need to make sure that the
-% paragraph end is executed in a group so that any parshape setup
-% is preserved.
-% \begin{macrocode}
-%<@@=>
-\def\legacyverbatimsetup{%
- \language\l at nohyphenation
- \@tempswafalse
- \def\par{%
- \if at tempswa
- \leavevmode \null {\@@par}\penalty\interlinepenalty
- \else
- \@tempswatrue
- \ifhmode{\@@par}\penalty\interlinepenalty\fi
- \fi}%
- \let\do\@makeother \dospecials
- \obeylines \verbatim at font \@noligs
- \everypar \expandafter{\the\everypar \unpenalty}%
-% \end{macrocode}
-%
-% \begin{macrocode}
- \tl_set:Nn \l__tag_para_main_tag_tl {codeline}
- \tagtool{paratag=Code}% oder faster: \tl_set:Nn\l__tag_para_tag_tl{Code}
-}
-%<@@=block>
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@setupverbinvisiblespace}
-% In the \pdfTeX{} engine we need to use \cs{pdffakespace} chars
-% for the invisible spaces.
-% \begin{macrocode}
-\newcommand\@setupverbinvisiblespace{}
-\tag_if_active:T {
- \bool_if:NF\g__tag_mode_lua_bool
- {
- \renewcommand\@setupverbinvisiblespace{\def\@xobeysp{\nobreakspace\pdffakespace}}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \subsubsection{Standard list environments}
-%
-%
-% \begin{environment}{itemize,enumerate,description}
-%
-% For the standard lists everything is managed by the blockenv instance.
-% \begin{macrocode}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{itemize}{!O{}}
- { \UseInstance{blockenv}{itemize} {#1} }
- { \endblockenv }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \RenewDocumentEnvironment{enumerate}{!O{}}
- { \UseInstance{blockenv}{enumerate} {#1} }
- { \endblockenv }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \RenewDocumentEnvironment{description}{!O{}}
- { \UseInstance{blockenv}{description} {#1} }
- { \endblockenv }
-}
-% \end{macrocode}
-% \end{environment}
-%
-%
-%
-%
-%
-%
-% \begin{environment}{list}
-%
-% The legacy 2e list environment is more complicated as we have to get the
-% extra arguments accounted for.
-% \begin{macrocode}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{list}{O{} m m }
- {
-% \end{macrocode}
-% We do this by storing them away and then call the list
-% instance. Inside this instance the \texttt{setup-code} key
-% contains \cs{legacylistsetupcode}, which makes use of the stored values.
-% \begin{macrocode}
- \tl_set:Nn \@itemlabel {#2}
- \tl_set:Nn \l_@@_legacy_env_params_tl {#3}
-% \end{macrocode}
-%
-% \begin{macrocode}
- \UseInstance{blockenv}{list} {#1}
- }
- { \endblockenv }
-}
-% \end{macrocode}
-%
-% Again something that should probably elsewhere: the rolemapping.
-% \begin{macrocode}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=list,role=L}}
-}
-% \end{macrocode}
-% \end{environment}
-%
-%
-%
-% \begin{variable}{\l_@@_env_params_tl}
-% Declare the variable for the parameter argument; \cs{@itemlabel}
-% is already declared in \LaTeXe{}.
-% \begin{macrocode}
-\tl_new:N \l_@@_env_params_tl
-% \end{macrocode}
-% \end{variable}
-%
-%
-% \begin{macro}{\legacylistsetupcode}
-%
-% And here is the extra code for use in the list instance setup
-% inside the key \texttt{setup-code}.
-% \begin{macrocode}
-\cs_new:Npn \legacylistsetupcode {
-% \end{macrocode}
-% Reset values to defaults:
-% \begin{macrocode}
- \dim_zero:N \listparindent
- \dim_zero:N \rightmargin
- \dim_zero:N \itemindent
-% \end{macrocode}
-%
-% By default a \env{list} environment is not numbered:
-% \begin{macrocode}
- \tl_set:Nn \@listctr {}
- \legacy_if_set_false:n { @nmbrlist } % needed if lists are nested
-% \end{macrocode}
-% By default there is a simple definition for \cs{makelabel}. It can be
-% overwritten in the second mandatory argument to the list
-% environment (stored in \cs{l_@@_legacy_env_params_tl}) and
-% is used if the instance sets the compatibility key to true.
-% \begin{macrocode}
- \let\makelabel\@mklab % TODO: customize
-% \end{macrocode}
-% Now we use the argument with parameter settings to update some or
-% all of the above defaults:
-% \begin{macrocode}
- \l_@@_legacy_env_params_tl
-% \end{macrocode}
-% As we don't know much about this list we can only make a guess about
-% the nature of the list and the setting of the tag name (default
-% \texttt{list} rolemapped to \texttt{L}) and any tag attributes
-% may have to be overwritten in the optional key/value argument. But we do have some hints to play with.
-% \begin{macrocode}
- \legacy_if:nTF { @nmbrlist }
- { \tl_set:Nn \l__tag_L_attr_class_tl {enumerate} } % numbered list
- { \tl_if_empty:NTF \@itemlabel
- { \tl_set:Nn \l__tag_L_attr_class_tl {list} } % no label
- { \tl_set:Nn \l__tag_L_attr_class_tl {itemize} } % unnumbered, unordered
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \begin{environment}{trivlist}
-%
-% \begin{macrocode}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{trivlist}{ !O{} }
- { \list[#1]{}
- {
- \dim_zero:N \leftmargin
- \dim_zero:N \labelwidth
- \cs_set_eq:NN \makelabel \use:n
- }
- }
- { \endblockenv }
-}
-% \end{macrocode}
-% \end{environment}
-%
-%
-% \subsubsection{Theorem-like environments}
-%
-% Theorem-like environments are defined in \LaTeX{} with the help of
-% \cs{newtheorem} declarations. Internally they used a list with a
-% single item. Using lists was convenient back then, but in a tagged
-% document you end up with a strange structure. We therefore alter the
-% mechanism.
-%
-%
-% \begin{macro}{\newtheorem}
-% This is a slightly streamlined version of \cs{newtheorem}, but it
-% still uses a lot of the 2e code for now. Eventually this will change.
-% \begin{macrocode}
-\RenewDocumentCommand \newtheorem { m O{#1} m o }
-{
- \expandafter\@ifdefinable\csname #1\endcsname
- {
- \str_if_eq:nnTF{#1}{#2}
- {
- \@definecounter {#2}
- \IfNoValueTF {#4}
- { % @ynthm
- \tl_gset:cx { the #2 }
- {
- \@thmcounter{#2}
- }
- }
- { % @xnthm
- \@newctr{#1}[#4]
- \tl_gset:cx { the #2 }
- {
- \expandafter\noexpand\csname the#4\endcsname
- \@thmcountersep
- \@thmcounter{#2}
- }
- }
- }
- { % @othm
- \@ifundefined{c@#2}
- { \@nocounterr{#2} }
- {
- \tl_gset:cn { the #1 }
- { \UseName { the #2 } }
- }
- }
- \global\@namedef{#1} { \@thm{#2}{#3} }
- \global\@namedef{end#1}{ \@endtheorem }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@begintheorem,\@opargbegintheorem}
-%
-% The \cs{@thm} command expands to either \cs{@beginthorem} or
-% \cs{@opargbegintheorem}. For the moment we stick with this as it
-% will help with the transion. But instead of using a
-% \env{trivlist} we use a blockenv and some tagging for the title
-% (as a Caption).
-% We do not want potential tagging from \cs{textbf} here,
-% so we use \cs{bfseries} to set the font.
-% \begin{macrocode}
-\def\@begintheorem#1#2{
- \UseInstance{blockenv}{theorem}{}
- \tagpdfparaOff
- \mode_leave_vertical:
- \tag_struct_begin:n{tag=Caption}
- \group_begin:
- \bfseries
- \tag_mc_begin:n {}
- #1\
- \tag_mc_end:
- \tag_struct_begin:n{tag=Lbl}
- \tag_mc_begin:n {}
- #2
- \tag_mc_end:
- \tag_struct_end:
- \group_end:
- \tag_struct_end:
- \tagpdfparaOn
-% \end{macrocode}
-%
-% \begin{macrocode}
- \@@_start_para_structure_unconditionally:n { \PARALABEL }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \itshape
- \hskip\labelsep
- \ignorespaces
-}
-\def\@opargbegintheorem#1#2#3{
- \UseInstance{blockenv}{theorem}{}
- \tagpdfparaOff
- \mode_leave_vertical:
- \tag_struct_begin:n{tag=Caption}
- \group_begin:
- \bfseries
- \tag_mc_begin:n {}
- #1\
- \tag_mc_end:
- \tag_struct_begin:n{tag=Lbl}
- \tag_mc_begin:n {}
- #2
- \tag_mc_end:
- \tag_struct_end:
- \tag_mc_begin:n {}
- \ (#3)
- \tag_mc_end:
- \group_end:
- \tag_struct_end:
- \tagpdfparaOn
-% \end{macrocode}
-%
-% \begin{macrocode}
- \@@_start_para_structure_unconditionally:n { \PARALABEL }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \itshape
- \hskip\labelsep
- \ignorespaces
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\@endtheorem{\endblockenv}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-%
-% \subsection{Implementation of templates}
-%
-%
-% \subsubsection{Implementation of blockenv templates \ldots}
-%
-%
-%
-% \begin{macro}{\g_block_nesting_depth_int}
-% \LaTeXe{} already has a counter to record the nesting depth of
-% blocks, but we want our own name because it isn't really tied to
-% \enquote{lists} any more. However, \cs{@listdepth} is really part
-% of the legacy interface (for example \env{minipage} alters it to
-% point to a different counter) so that we are stuck with using at
-% least indirectly for now and the following line makes this look
-% like an L3 integer variable but internally expands to \cs{@listdepth}:
-% \begin{macrocode}
-\cs_new:Npn \g_block_nesting_depth_int { \@listdepth } % a fake int
- % for now
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{template}{blockenv display}
-%
-% \begin{macrocode}
-\DeclareTemplateCode{blockenv}{display}{1}
-{
- env-name = \l_@@_env_name_tl ,
- tag-name = \l_@@_tag_name_tl ,
- tag-class = \l_@@_tag_class_tl ,
- tagging-recipe = \l_@@_tagging_recipe_tl ,
- level-increase = \l_@@_level_incr_bool ,
- setup-code = \l_@@_setup_code_tl ,
- block-instance = \l_@@_block_instance_tl ,
- para-instance = \l_@@_para_instance_tl ,
- inner-level-counter = \l_@@_inner_level_counter_tl ,
- max-inner-levels = \l_@@_max_inner_levels_tl ,
- inner-instance-type = \l_@@_inner_instance_type_tl ,
- inner-instance = \l_@@_inner_instance_tl ,
- para-flattened = \l__tag_para_flattened_bool ,
- final-code = \l_@@_final_code_tl ,
-}
-{
- \@@_debug_typeout:n{\l_@@_env_name_tl -env-start}
-%
- \tl_if_empty:nF {#1} { \SetTemplateKeys{blockenv}{display}{#1} }
-%
-% \end{macrocode}
-% We need to know later if we haved nested blockenvs inside
-% a flattened environment. Whenever we start a new blockenv we
-% increment \cs{\l_@@_flattened_level_int} if it is already
-% different from zero. If it is zero we increment it if flattening
-% is requested.
-% Thus a value of \texttt{0} means no flattening requested so far
-% and \texttt{1} means this is the first blockenv requesting
-% flattening. In either case we have to make sure that the blockenv
-% is surrounded by a \texttt{text-unit} tag, while for any value above
-% \texttt{1} we have to omit the \texttt{text-unit}.
- % \begin{macrocode}
- \int_compare:nNnTF \l_@@_flattened_level_int > 0
- {
- \int_incr:N \l_@@_flattened_level_int
- }
- {
- \bool_if:NT \l__tag_para_flattened_bool
- {
- \int_incr:N \l_@@_flattened_level_int
- }
- }
-%
- \tl_if_empty:NF \l_@@_inner_level_counter_tl
- {
- \int_compare:nNnTF \l_@@_inner_level_counter_tl >
- { \l_@@_max_inner_levels_tl - 1 }
- { \@toodeep }
- { \int_incr:N \l_@@_inner_level_counter_tl } % not clean "o"?
- }
-% \end{macrocode}
-% Legacy defaults are only roped in if the list level changes. For
-% display blocks that remain on the same level the current values
-% are kept.
-% \begin{macrocode}
- \bool_if:NT \l_@@_level_incr_bool
- {
- \int_compare:nNnTF \g_block_nesting_depth_int >
- { \c at maxblocklevels - 1 }
- { \@toodeep }
- {
- \int_gincr:N \g_block_nesting_depth_int
-% \end{macrocode}
-% If there are no legacy defaults for that level then the next line
-% does nothing, i.e., the current values (from the last level
-% become the defaults for the next.
-% \begin{macrocode}
- \use:c { @list \int_to_roman:n { \g_block_nesting_depth_int } }
- }
- }
-% \end{macrocode}
-% If we are doing tagging we load one of the available recipes for
-% tagging, which alters various kernel hooks to add appropriate
-% tagging structures.
-% \begin{macrocode}
- \tag_if_active:T { \use:c { @@_recipe_ \l_@@_tagging_recipe_tl : } }
-% \end{macrocode}
-% Then run the setup code if any is given in the instance.
-% \begin{macrocode}
- \l_@@_setup_code_tl
-% \end{macrocode}
-% Next call a block instance at the appropriate level passing it
-% any key/value list provided in the optional argument (keys that
-% are not recognized are ignored---currently with an
-% error).
-% \begin{macrocode}
- \@@_debug_typeout:n{use~ instance:~
- \l_@@_block_instance_tl - \int_use:N \g_block_nesting_depth_int }
- \UseInstance{block}
- { \l_@@_block_instance_tl - \int_use:N
- \g_block_nesting_depth_int }
- {#1}
-% \end{macrocode}
-% After the block instance call the para and then inner (list)
-% instance if either or both are
-% specified (which may not be the case).
-% \begin{macrocode}
- \tl_if_empty:NF \l_@@_para_instance_tl
- {
- \@@_debug_typeout:n{use~ para~ instance:~ \l_@@_para_instance_tl }
-% \end{macrocode}
-% For now we don't offer to alter instance parameters here so we
-% pass an empty argument.
-% \begin{macrocode}
- \UseInstance{para}{ \l_@@_para_instance_tl } {}
- }
-% \end{macrocode}
-% In the inner instance may have its own levels or none depending
-% on which the instance name differs. Again we pass it the optional
-% key/value list.
-% \begin{macrocode}
- \tl_if_empty:NF \l_@@_inner_instance_tl
- {
- \@@_debug_typeout:n{use~ instance:~ \l_@@_inner_instance_tl
- \tl_if_empty:NF \l_@@_inner_level_counter_tl
- { - \int_use:N \l_@@_inner_level_counter_tl }}
- \UseInstance{ \l_@@_inner_instance_type_tl }
- { \l_@@_inner_instance_tl
- \tl_if_empty:NF \l_@@_inner_level_counter_tl
- { - \int_use:N \l_@@_inner_level_counter_tl } % not clean
- % use "o"?
- }
- {#1}
- }
-% \end{macrocode}
-% We finish off with \cs{l_@@_final_code_tl} which defaults to
-% \cs{ignorespaces} so that spaces between \verb=\begin{...}= and
-% the start of the text are ignored.
-% \begin{macrocode}
- \l_@@_final_code_tl
-}
-% \end{macrocode}
-% \end{template}
-%
-%
-% \begin{macro}{\l_@@_flattened_level_int}
-% Count the levels of nested blockenvs starting with the first that
-% is \enquote{flattened}.
-% \begin{macrocode}
-\int_new:N \l_@@_flattened_level_int
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\c at maxblocklevels}
-% A counter to increase or decrease the number of supported
-% level. If increased, one needs to suply additional level instances.
-% \begin{macrocode}
-\newcounter{maxblocklevels}
-\setcounter{maxblocklevels}{6}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\endblockenv}
-% The code executed when a blockenv ends is 99\% the same for all
-% blockenvs (at least up to now). Small differences exist, though. They
-% are accounted for first in the conditionals.
-%
-% We make this a public command so that new block environments can
-% be set up without the need to resort to L3 layer
-% programming.\fmi{name is bad}
-% \begin{macrocode}
-\cs_new:Npn \endblockenv {
- \@@_debug_typeout:n{blockenv~ common~ ending \on at line}
-% \end{macrocode}
-% If this block was incrementing the level we have to decrement it
-% now again:
-% \begin{macrocode}
- \bool_if:NT \l_@@_level_incr_bool
- { \int_gdecr:N \g_block_nesting_depth_int }
-% \end{macrocode}
-% If this block was a list and there are still \cs{item} labels to
-% be placed we move to horizontal mode to get them typeset.
-% \begin{macrocode}
- \legacy_if:nT { @inlabel }
- {
- \mode_leave_vertical:
- \legacy_if_gset_false:n { @inlabel }
- }
-% \end{macrocode}
-% In a pure ``displayblock'' scenario \texttt{@newlist} will be
-% always false and the code bypassed, but we may have an outer list
-% followed immediately by a displayblock (with the \cs{item} missing)
-% \begin{macrocode}
- \legacy_if:nT { @newlist }
- {
- \@noitemerr
- \legacy_if_gset_false:n { @newlist }
- }
- \mode_if_horizontal:TF
- { \@@_skip_remove_last: \@@_skip_remove_last: \par }
- { \@inmatherr{\end{\@currenvir}} }
-% \end{macrocode}
-% Once we are back in vertical mode we can add the appropriate
-% closing tagging structure(s), if we are doing tagging.
-% \begin{macrocode}
- \__kernel_displayblock_end:
-% \end{macrocode}
-% What to do in terms of vertical spacing in different situations
-% is still somewhat open to debate, right now this is more or less
-% implementing what \LaTeXe{} list environment have been
-% doing.\fmi{some redesign/extensions here?}
-% \begin{macrocode}
-% \@@_debug_typeout:n{@noparlist =
-% \legacy_if:nTF { @noparlist }{true}{false}}
- \legacy_if:nF { @noparlist }
- {
- \@@_skip_set_to_last:N \l_tmpa_skip
- \dim_compare:nNnT \l_tmpa_skip > \c_zero_dim
- {
- \skip_vertical:n { - \l_tmpa_skip }
- \skip_vertical:n { \l_tmpa_skip + \parskip - \@outerparskip }
- }
- \addpenalty \@endparpenalty
- \addvspace \l_@@_topsepadd_skip
-% \end{macrocode}
-% \LaTeXe{} triggered the paragraph handling after a list at this
-% point here, i.e., only if the list didn't start a paragraph. One
-% can make a case for that, but it can be somewhat surprising to
-% the user and there is a good argument that even such a list could
-% be followed expanatory text that is part of the same paragraph
-% and doesn't start a new one.\fmi{decide which logic we want to
-% use! If the old logic is used we need to close the text-unit
-% ourselves in the true branch}
-% \begin{macrocode}
-% \legacy_if_gset_true:n { @endpe }
- }
-% \end{macrocode}
-% So this is for now always done. Probably \cs{l_@@_topsepadd_skip} above
-% should be added only if the paragraph ends here and not if it
-% continues, so this need some further cleanup.\fmi{decide}
- % \begin{macrocode}
- \bool_if:NTF \l_@@_standalone_bool
-% \end{macrocode}
-% It is possible that \texttt{@endpe} is true because a
-% displayblock has just ended before we end the standalone
-% displayblock and in that casevthere is no outer
-% \struct{text-unit} so we have to explicitly set \texttt{@endpe}
-% back to false to prevent it from closing a structure later that
-% isn't there.
-% \begin{macrocode}
- { \legacy_if_gset_false:n { @endpe } }
- { \legacy_if_gset_true:n { @endpe } }
-}
-% \end{macrocode}
-%
-% \end{macro}
-%
-%
-% \begin{macro}{\__kernel_displayblock_end:}
-% The kernel hook for tagging at the end of the block.
-% \begin{macrocode}
-\cs_new:Npn \__kernel_displayblock_end: {
- \@@_debug_typeout:n{\detokenize{__kernel_displayblock_end:}}
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\l_@@_standalone_bool}
-%
-% \begin{macrocode}
-\bool_new:N \l_@@_standalone_bool
-\bool_set_false:N \l_@@_standalone_bool
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-% \subsubsection{Implementation of para templates \ldots}
-%
-% \begin{template}{para std}
-%
-% \begin{macrocode}
-\DeclareTemplateCode{para}{std}{1}
-{
- indent-width = \parindent ,
- start-skip = \l__par_start_skip , % name??
- left-skip = \leftskip ,
- right-skip = \rightskip ,
- end-skip = \parfillskip ,
- fixed-word-spaces = \l__par_fixed_word_spaces_bool , % name??
- final-hyphen-demerits = \finalhyphendemerits ,
- cr-cmd = \\ ,
- para-class = \l_tag_para_attr_class_tl ,
-}
-{
- \tl_if_empty:nF {#1} { \SetTemplateKeys{para}{std}{#1} }
- \skip_set:Nn \@rightskip \rightskip
-}
-% \end{macrocode}
-% \end{template}
-%
-%
-%
-%
-%
-% \subsubsection{Implementation of block templates \ldots}
-%
-%
-%
-%
-%
-% \begin{template}{block display}
-%
-% \begin{macrocode}
-\DeclareTemplateCode{block}{display}{1}
-{
- heading = \l_@@_heading_tl ,
- beginsep = \topsep ,
- begin-par-skip = \partopsep ,
- par-skip = \parsep ,
- end-skip = \l_@@_botsep_skip ,
- end-par-skip = \l_@@_parbotsep_skip ,
- beginpenalty = \@beginparpenalty ,
- endpenalty = \@endparpenalty ,
- rightmargin = \rightmargin ,
- leftmargin = \leftmargin ,
- parindent = \listparindent ,
-}
-{
- \tl_if_empty:nF {#1} { \SetTemplateKeys{block}{display}{#1} }
-% \end{macrocode}
-% \fmi{generalize heading usage (or drop?)}
-% \begin{macrocode}
- \tl_if_blank:oF \l_@@_heading_tl
- { \mode_leave_vertical: \textbf{\l_@@_heading_tl} } % TODO customize
-% \end{macrocode}
-% The code largely follows the logic of \LaTeXe{}'s \env{trivlist}
-% implementation as far as it applicable for the \enquote{display
-% block} but coded using the L3 programming layer. However, we keep
-% all the legacy variables (e.g., \texttt{@noskipsec}) if there is
-% some chance that they are set in classes or packages.
-% \begin{macrocode}
- \legacy_if:nT { @noskipsec } { \mode_leave_vertical: }
- \skip_set:Nn \l_@@_topsepadd_skip { \topsep }
- \mode_if_vertical:TF
- {
- \skip_add:Nn \l_@@_topsepadd_skip { \partopsep }
-% \end{macrocode}
-% At this point it is safe to add tagging structure(s) so we have
-% a kernel-owned hook here for tagging. This is used to possibly
-% start a paragraph structure (to surround the block, for example,
-% in case of lists) and possibly do some other preparation for
-% tagging the block.
-% \begin{macrocode}
- \__kernel_displayblock_beginpar_vmode:
- }
- {
-% \end{macrocode}
-% If we are in horizontal mode then the displayblock has to return
-% to vertical mode now (after removing any immediately preceding
-% skip or kern. But before we actually issue the\cs{par} we execute
-% a kernel hook in which we can add tagging code. This hook is
-% \enquote{weird} because by default it does nothing, but if
-% tagging is wanted it takes an argument and grabs the following
-% \cs{par} in order to put tagging code before and after the \cs{par}.
-% \begin{macrocode}
- \@@_skip_remove_last: \@@_skip_remove_last:
- \__kernel_displayblock_beginpar_hmode:w \par
- }
-% \end{macrocode}
-% Now we are back to legacy list implementation \ldots
-% \begin{macrocode}
- \legacy_if:nTF { @inlabel }
- {
- \legacy_if_set_true:n { @noparitem }
- \legacy_if_set_true:n { @noparlist }
- }
- {
- \legacy_if:nT { @newlist } { \@noitemerr }
- \legacy_if_set_false:n { @noparlist }
- \skip_set_eq:NN \l_@@_effective_top_skip \l_@@_topsepadd_skip
- }
- \skip_add:Nn \l_@@_effective_top_skip { \parskip }
-% \end{macrocode}
-% Next lines set some paragraph defaults, this may get overwritten
-% if there is a \key{para-instance} specified on the \xt{blockenv}.
-% \begin{macrocode}
- \skip_zero:N \leftskip
- \skip_set_eq:NN \rightskip \@rightskip
- \skip_set_eq:NN \parfillskip \@flushglue
-% \end{macrocode}
-% The next lines establish a parshape which is retained across
-% paragraphs be executing \cs{para_end:} within a group and thus
-% reestablishing the parshape for the next paragraph again. In case
-% a list got started \cs{par} is ignored until we have seen an
-% \cs{item} (or we have executed \cs{par} one thousand times.
-% \begin{macrocode}
- \int_zero:N \par at deathcycles
- \@setpar
- {
- \legacy_if:nTF { @newlist }
- {
- \int_incr:N \par at deathcycles
- \int_compare:nNnTF \par at deathcycles > { 1000 }
- { \@noitemerr
- { \para_end: }
- }
- }
- {
- { \para_end: }
- }
- }
- \skip_set_eq:NN \@outerparskip \parskip
- \skip_set_eq:NN \parskip \parsep
- \dim_set_eq:NN \parindent \listparindent
- \dim_add:Nn \linewidth { - \rightmargin - \leftmargin }
- \dim_add:Nn \@totalleftmargin { \leftmargin }
- \tex_parshape:D 1 ~ \@totalleftmargin \linewidth
-% \end{macrocode}
-% This is the point where we are ready to add the tagging structure
-% for the block, e.g., an \verb=<L>=, a \verb=<Figure>= or some
-% other structure.
-% \begin{macrocode}
- \__kernel_displayblock_begin:
-% \end{macrocode}
-% Finally, we have to output the vertical separation and penalty at
-% the start of the block and make corrections for a change in
-% \cs{parskip} and some other housekeeping, unless this block is inside a list and the list
-% \cs{item} has not yet placed. In that case the vertical
-% space and penalty us suppressed. This
-% is controled through the legacy switches \texttt{@noparitem},
-% \texttt{minipage}, and \texttt{@nobreak}.
-% \begin{macrocode}
- \legacy_if:nTF { @noparitem }
- {
- \legacy_if_set_false:n { @noparitem }
- \hbox_gset:Nn \g_@@_labels_box
- {
- \skip_horizontal:n { - \leftmargin }
- \hbox_unpack_drop:N \g_@@_labels_box
- \skip_horizontal:n { \leftmargin }
- }
-% \end{macrocode}
-% \fmi{document 2e logic used here}
-% \begin{macrocode}
- \legacy_if:nF { @minipage } % Why this chunk of code?
- {
- \@@_skip_set_to_last:N \l_@@_tmpa_skip
- \skip_vertical:n { - \l_@@_tmpa_skip }
- \skip_vertical:n { \l_@@_tmpa_skip + \@outerparskip - \parskip }
- }
- }
- {
- \legacy_if:nTF { @nobreak }
- { \addvspace{\skip_eval:n{\@outerparskip-\parskip}} }
- {
- \addpenalty \@beginparpenalty
- \addvspace \l_@@_effective_top_skip
- \addvspace{-\parskip}
- }
- }
-}
-% \end{macrocode}
-%
-%
-% Extra keys to support enumitem conventions:
-% \begin{macrocode}
-\keys_define:nn { template/block/display }
-{
- ,topsep .skip_set:N = \topsep
- ,partopsep .skip_set:N = \partopsep
- ,listparindent .skip_set:N = \listparindent
-}
-% \end{macrocode}
-% \end{template}
-%
-%
-%
-% \begin{macro}{\__kernel_displayblock_begin:,
-% \__kernel_displayblock_beginpar_hmode:w,
-% \__kernel_displayblock_beginpar_vmode:}
-% The internal kernel hooks for tagging.
-% \begin{macrocode}
-\cs_new:Npn \__kernel_displayblock_begin: {
- \@@_debug_typeout:n{\detokenize{__kernel_displayblock_begin:}}
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Npn \__kernel_displayblock_beginpar_hmode:w {
- \@@_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_hmode:w}}
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new:Npn \__kernel_displayblock_beginpar_vmode: {
- \@@_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_vmode:}}
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \subsubsection{Implementation of list templates \ldots}
-%
-%
-%
-% \begin{macro}{\@itemlabel,\@listctr}
-% Both \cs{@itemlabel} and \cs{@listctr} from the \LaTeXe{} list
-% implementation are used (or set) by various packages. We
-% therefore use them too, so that these packages have a fighting
-% chance to work with the new tagging-aware implementation for
-% \env{list}.
-% \begin{macrocode}
-\tl_new:N \@itemlabel % should have a top-level definition
-\tl_new:N \@listctr % should have a top-level definition
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-% \begin{template}{list std}
-%
-% This template implements numbered and unnumbered lists and can
-% be combined with display blocks or with inline blocks.
-% \begin{macrocode}
-\DeclareTemplateCode{list}{std}{1}
-{
- counter = \l_@@_counter_tl,
- item-label = \l_@@_item_label_tl,
- start = \l_@@_counter_start_int ,
- resume = \l_@@_resume_bool ,
- item-instance = \@@_item_instance:n ,
- item-skip = \itemsep ,
-% item-par-skip = \parsep ,
- item-penalty = \@itempenalty ,
- item-indent = \itemindent ,
- label-width = \labelwidth ,
- label-sep = \labelsep ,
- legacy-support = \l_@@_legacy_support_bool , % FMi questionable
-}
-{
- \@@_debug_typeout:n{template:list:std}
-%
- \tl_if_empty:nF {#1} { \SetTemplateKeys{list}{std}{#1} }
-% \end{macrocode}
-% Has this list a counter name defined in the instance?
-% \begin{macrocode}
- \tl_if_empty:NTF \l_@@_counter_tl
- {
-% \end{macrocode}
-% If not we check if \cs{@listctr} has a non-empty value to be used
-% for the list counter.
-%
-% We better test for blank not empty in case somebody had defined
-% \cs{@listctr} using \cs{renewcommand} or \cs{cs_set:Npn}.
-% \begin{macrocode}
- \tl_if_blank:oF \@listctr
- {
-% \end{macrocode}
-% In that case \texttt{@nmbrlist} should have been set too, for
-% example, through \cs{usecounter}, so we do not set it
-% explicitly. However, we check if we should resume a previous list.
-% \begin{macrocode}
- \bool_if:NF \l_@@_resume_bool
- {
- \int_gset:cn{ c@ \@listctr }
- { \l_@@_counter_start_int - 1 }
- }
- }
-% \end{macrocode}
-% If \cs{@listctr} is not set then we have definitely an unnumbered list.
-% \begin{macrocode}
- { \@nmbrlistfalse }
- }
-% \end{macrocode}
-% If a counter is set in the list instance we use that
-% one. This should be the name of a \LaTeX{} counter that is
-% already allocated externally---no runtime check is made for this:
-% if it is not declared one will get \enquote{no such counter}
-% error when the list is used.
-% \begin{macrocode}
- {
- \@nmbrlisttrue
- \tl_set_eq:NN \@listctr \l_@@_counter_tl
- \bool_if:NF \l_@@_resume_bool
- {
- \int_gset:cn{ c@ \@listctr }
- { \l_@@_counter_start_int - 1 }
- }
- }
-% \end{macrocode}
-% Does the current instance has an item label representation? This
-% would be possible whether or not we have a numbered list. If yes,
-% then we use this for \cs{@itemlabel}, otherwise we expect that
-% \cs{@itemlabel} is provided from the outside, e.g., as part of
-% the \env{list} environment argument.
-% \begin{macrocode}
- \tl_if_empty:NF \l_@@_item_label_tl
- {
- \tl_set_eq:NN \@itemlabel \l_@@_item_label_tl
- }
-% \end{macrocode}
-% finally, we signal that we are at the start of a new list (which
-% effects how the first \cs{item} is handled and how \cs{par}
-% commands are interpreted.
-% \begin{macrocode}
- \legacy_if_gset_true:n { @newlist }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \@@_debug_typeout:n{template:list:std~end}
-}
-% \end{macrocode}
-%
-%
-% Extra keys to support enumitem conventions:
-% \begin{macrocode}
-\keys_define:nn { template/list/std }
-{
- ,nosep .code:n =
- \dim_zero:N \itemsep
- \dim_zero:N \parsep
- \dim_zero:N \topsep
- \dim_zero:N \l_@@_botsep_skip
- \dim_zero:N \l_@@_parbotsep_skip
- ,midsep .skip_set:N = \topsep
-}
-% \end{macrocode}
-%
-% \end{template}
-%
-%
-% \subsubsection{Implementation of \cs{item} template(s)}
-%
-%
-%
-% \begin{template}{item std}
-% The item template has one hidden key \texttt{label} which is not available on the
-% template for setting because it is only used to receive any
-% optional data passed to the \cs{item} command. We therefore
-% declare it with \cs{keys_define:nn} and ensure that the optional
-% argument data to \cs{item} (if it is not a key/value list
-% already) is passed to this \texttt{label} key.
-% \begin{macrocode}
-\keys_define:nn { template/item/std }
- { label .tl_set:N = \l_@@_label_given_tl }
-% \end{macrocode}
-%
-% \fmi{alignment is mostly wrong (test short medium and multiline
-% labels)}
-% \begin{macrocode}
-\DeclareTemplateCode{item}{std}{1}
- {
- counter-label = \@@_counter_label:n ,
- counter-ref = \@@_counter_ref:n ,
-% \end{macrocode}
-% \fmi{next set of key not yet used}
-% \begin{macrocode}
- label-ref = \@@_label_ref:n ,
- label-autoref = \@@_label_autoref:n ,
- label-format = \@@_label_format:n ,
- label-strut = \l_@@_label_strut_bool ,
- label-boxed = \l_@@_label_boxed_bool ,
- next-line = \l_@@_next_line_bool ,
- text-font = \l_@@_text_font_tl ,
- compatibility = \l_@@_item_compatibility_bool ,
-% \end{macrocode}
-% This probably needs a different implementation (and needs completing)\fmi{complete}
-% \begin{macrocode}
- label-align = {
- left = \tl_set:Nn \l_@@_item_align_tl { \relax \hss } ,
- center = \tl_set:Nn \l_@@_item_align_tl { \hss \hss } ,
- right = \tl_set:Nn \l_@@_item_align_tl { \hss \relax } ,
- parleft = \NOT_IMPLEMENTED ,
- } ,
- }
-% \end{macrocode}
-% Then typeset the label at its natural width by applying
-% \cs{@@_make_label_box:n} to the label given or to a label constructed
-% from the counter. If it is boxed and reasonably short, add padding to
-% make it at least of size \tn{labelwidth}, then add another layer of
-% box. This way, when we unpack it in \cs{g_@@_labels_box} it correctly
-% remains boxed in those cases. Afterwards, in the \texttt{nextline}
-% case add \tn{newline} if the label did not fit in the allotted space.
-% \begin{macrocode}
- {
- \@@_debug_typeout:n{template:item:std}
-% \end{macrocode}
-%
-% First deal with the key--value input, which in particular may
-% provide a value for the label (the usual optional argument of
-% \cs{item}). For this we set \cs{l_@@_label_given_tl} to
-% \cs{c_novalue_tl} so that we can identify if an optional argument
-% was given.
-% \begin{macrocode}
- \tl_set_eq:NN \l_@@_label_given_tl \c_novalue_tl
- \tl_if_empty:nF{#1}{ \SetTemplateKeys{item}{std}{#1} }
-% \end{macrocode}
-% If no optional argument was given then \cs{l_@@_label_given_tl}
-% is still equal to \cs{c_novalue_tl} and so we can distinuish
-% that from \verb=\item[]=.
-%
-% \begin{macrocode}
- \tl_if_novalue:oTF \l_@@_label_given_tl
- {
-% \end{macrocode}
-% The rest of the code for this template needs work and is both
-% incomplete and partly wrong.\fmi{fix}
-% \begin{macrocode}
- \tl_if_blank:oF \@listctr { \@kernel at refstepcounter \@listctr }
- \bool_if:NTF \l_@@_item_compatibility_bool % not sure that conditional
- % makes sense
- { \@@_make_label_box:n { \MakeLinkTarget[\@listctr]{}\@itemlabel } } % TODO ?
- { \@@_make_label_box:n { \MakeLinkTarget[\@listctr]{}\@@_counter_label:n { \@listctr } } }
- }
- {
- \@@_debug_typeout:n{item~ with~ optional}
- \@@_make_label_box:n { \l_@@_label_given_tl } }
- \bool_if:nT
- {
- \l_@@_label_boxed_bool
- && \dim_compare_p:n { \box_wd:N \l_@@_one_label_box <= \linewidth } % TODO: is \linewidth correct?
- }
- {
- \dim_compare:nNnT
- { \box_wd:N \l_@@_one_label_box } < \labelwidth
- {
- \hbox_set_to_wd:Nnn \l_@@_one_label_box { \labelwidth }
- {
- \exp_after:wN \use_i:nn \l_@@_item_align_tl
-% \end{macrocode}
-% FMi: \LaTeXe{} keeps the label boxed inside (not unboxed). This
-% means that the content stays rigid and does not vary based on
-% glue setting in the line with the label.
-% There are cases where we do want the unboxed version (I think
-% enumitem offers that in some cases too) but it should probably
-% not the default.
-% \begin{macrocode}
-% \hbox_unpack_drop:N \l_@@_one_label_box %TODO: customize?
- \box_use_drop:N \l_@@_one_label_box
-% \end{macrocode}
-%
-% \begin{macrocode}
- \exp_after:wN \use_ii:nn \l_@@_item_align_tl
- }
- }
- \hbox_set:Nn \l_@@_one_label_box
- { \box_use_drop:N \l_@@_one_label_box }
- }
- \dim_compare:nNnTF { \box_wd:N \l_@@_one_label_box } > \labelwidth
- { \bool_set_true:N \l_@@_long_label_bool }
- { \bool_set_false:N \l_@@_long_label_bool }
- \hbox_gset:Nn \g_@@_labels_box
- {
- \hbox_unpack_drop:N \g_@@_labels_box
- \skip_horizontal:n { \itemindent - \labelsep - \labelwidth }
- \hbox_unpack_drop:N \l_@@_one_label_box
- \skip_horizontal:n { \labelsep }
- \bool_if:NT \l_@@_next_line_bool
- { \bool_if:NT \l_@@_long_label_bool { \nobreak \hfil \break } }
- % version of \newline inside an hbox that will be unpacked
- }
- % \skip_set_eq:NN \parsep \l_@@_item_parsep_skip TODO??? FMi
- % what's that?
- \dim_set_eq:NN \parindent \listparindent
-% \end{macrocode}
-% Placing the list label(s) is done when the paragraph for the
-% \cs{item} is started, which executes \cs{@@_item_everypar:}
-% inside \hook{para/begin}. By default this command does nothing, now we
-% change it to attach the pending label or labels.
-% \begin{macrocode}
- \cs_set_eq:NN \@@_item_everypar: \@@_item_everypar_std:
- }
-% \end{macrocode}
-% \end{template}
-%
-%
-%
-%
-% \begin{variable}{\l_@@_one_label_box, \g_@@_labels_box}
-% Each label is typeset in \cs{l_@@_one_label_box} to be measured.
-% Once this is ready, it is put (boxed or unboxed) in
-% \cs{g_@@_labels_box}, together with any pending labels (for the case
-% where a list begins just after \tn{item}). This is an analogue of
-% \LaTeXe{}'s \tn{@labels}, but it is always unboxed before use, to
-% support both boxed and unboxed labels.
-% \begin{macrocode}
-\box_new:N \l_@@_one_label_box
-\box_new:N \g_@@_labels_box
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_long_label_bool}
-% Track whether the \cs{l_@@_one_label_box} is larger than
-% \tn{labelwidth}.
-% \begin{macrocode}
-\bool_new:N \l_@@_long_label_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_make_label_box:n, \@@_label_format:x}
-% Make one label, wrapped in \cs{@@_label_format:n}, with an
-% appropriate \tn{strut} and possibly \tn{makelabel} in compatibility
-% mode (used for the \env{list} environment).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_make_label_box:n #1
- {
- \hbox_set:Nn \l_@@_one_label_box
- {
-% \end{macrocode}
-% If we do tagging then the contents of this box may need to be
-% wrapped into a structure, e.g., \verb=<Lbl>=.
-% \begin{macrocode}
- \__kernel_list_label_begin:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \@@_label_format:n
- {
- \bool_if:NT \l_@@_label_strut_bool { \strut }
- \bool_if:NTF \l_@@_legacy_support_bool
- \makelabel
- \use:n
- {#1}
- }
-% \end{macrocode}
-% And what gets opened also needs closing:
-% \begin{macrocode}
- \__kernel_list_label_end:
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\__kernel_list_label_begin:,
-% \__kernel_list_label_end:}
-% If we aren't doing tagging the kernel hooks do nothing.
-% \begin{macrocode}
-\cs_new_eq:NN \__kernel_list_label_begin: \prg_do_nothing:
-\cs_new_eq:NN \__kernel_list_label_end: \prg_do_nothing:
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@@_item_everypar:, \@@_item_everypar_std:}
-% The \cs{@@_item_everypar:} command is executed as part of \hook{para/begin}
-% but most of the time does nothing, i.e., it has the following
-% default definition.
-% \begin{macrocode}
-\cs_new_eq:NN \@@_item_everypar: \prg_do_nothing:
-% \end{macrocode}
-%
-% \begin{macrocode}
-\AddToHook{para/begin}[lists]{\@@_item_everypar:}
-% \end{macrocode}
-%
-% Note that we have to make sure that the above code is executed
-% after the hook chunk from \texttt{tagpdf} because the latter uses
-% \texttt{@inlabel} to make a decision.
-%
-% By the end of the day both should probably move into the kernel
-% hook instead!
-% \begin{macrocode}
-\DeclareHookRule{para/begin}{lists}{after}{tagpdf}
-% \end{macrocode}
-%
-%
-% What follows is the version that resets various legacy booleans and puts
-% the label box in the right place and finally resets itself to do
-% nothing next time. \cs{@@_item_everypar:} is set to this by the
-% item template so that the next paragraph start runs the code below.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_item_everypar_std: {
- \@@_debug_typeout:n{item~ everypar \on at line }
- \legacy_if_set_false:n { @minipage }
- \legacy_if_gset_false:n { @newlist }
- \legacy_if:nT { @inlabel }
- {
- \legacy_if_gset_false:n { @inlabel }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \box_if_empty:NT \g_para_indent_box { \kern - \itemindent }
- \para_omit_indent:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \box_use_drop:N \g_@@_labels_box
-% \end{macrocode}
-% After the labels are placed we start a paragraph structure (if
-% appropriate). This is handled in the following kernel hook:
-% \begin{macrocode}
- \__kernel_list_label_after:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \penalty \c_zero_int
- }
- \legacy_if:nTF { @nobreak }
- {
- \legacy_if_gset_false:n { @nobreak }
- \int_set:Nn \clubpenalty { 10000 }
- }
- {
- \int_set_eq:NN \clubpenalty \@clubpenalty
-% \end{macrocode}
-% Once the label(s) are typeset and we are past any special
-% \texttt{@nobreak} handling we reset \cs{@@_item_everypar:} to do
-% nothing.
-% \begin{macrocode}
- \cs_set_eq:NN \@@_item_everypar: \prg_do_nothing:
- }
-}
-% \end{macrocode}
-%
-% \end{macro}
-%
-%
-% \begin{macro}{\__kernel_list_label_after:}
-%
-% \begin{macrocode}
-\cs_new_eq:NN \__kernel_list_label_after: \prg_do_nothing:
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\l_@@_tmpa_skip}
-% \begin{macrocode}
-\skip_new:N \l_@@_tmpa_skip
-% \end{macrocode}
-% \end{variable}
-%
-%
-%
-%
-%
-%
-%
-% \begin{variable}{\l_@@_topsepadd_skip, \l_@@_effective_top_skip}
-% Variables equivalent to \LaTeXe{}'s \tn{@topsepadd} and \tn{@topsep}.
-% Roughly equal to a mixture of \texttt{topsep}, \texttt{partopsep},
-% and various \texttt{parskip} at different nesting levels in lists.
-% The code is really elaborate when \texttt{@inlabel} is true.
-% \begin{macrocode}
-\skip_new:N \l_@@_topsepadd_skip
-\skip_new:N \l_@@_effective_top_skip
-% \end{macrocode}
-% \end{variable}
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \begin{macro}{\item}
-% Here we already have all the building blocks. Complain in math
-% mode. Distingusih between first item (do necessary tagging) and
-% later items \cs{@@_inter_item:} to
-% cleanly close what's before, then call \cs{@@_item_instance:n} (which
-% calls \cs{UseInstance}\{item\}\marg{instance}) to prepare the
-% upcoming item: it will be actually inserted only once some later
-% material triggers \tn{everypar}.
-% \begin{macrocode}
-\AddToHook{begindocument/before}{
- \RenewDocumentCommand{\item}{ ={label}o }
- {
- \@inmatherr \item
-% \end{macrocode}
-% TODO: Test for being outside of a list needs updating!
-% \begin{macrocode}
- \tl_if_empty:oTF \@@_item_instance:n %%FMi?
- { \msg_error:nnn { @@ } { item-in-nonlist } { \item[{#1}] } }
- {
- \legacy_if:nTF { @newlist }
- { \__kernel_list_item_begin: }
- { \@@_inter_item: }
-% \end{macrocode}
-% To avoid unnecessary key/val processing we make a quick check if
-% there was an optional argument.
-% \begin{macrocode}
- \tl_if_novalue:nTF {#1} % avoids reparsing label={}
- { \@@_item_instance:n { } }
- { \@@_item_instance:n {#1} }
-% \end{macrocode}
-% Set the legacy switch that signals that we have a pending item label:
-% \begin{macrocode}
- \legacy_if_gset_true:n { @inlabel }
- \ignorespaces
- }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_inter_item:}
-% Between items. If the previous item had no content then we need to
-% trigger \tn{everypar}. Otherwise we simply close the previous item
-% with \tn{par} after removing some horizontal space. Between items,
-% there is a penalty and some space.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_inter_item: {
- \legacy_if:nT { @inlabel }
- { \indent \par } % case of \item\item
-% \end{macrocode}
-% \cs{par} may have a strange definition and may not get us back to
-% vertical mode in one go, so we better do not treat the next line
-% as an else case to the above conditional (for now).
-% \begin{macrocode}
- \mode_if_horizontal:T { \@@_skip_remove_last:
- \@@_skip_remove_last: \par }
-% \end{macrocode}
-% End any LI-tag, then start the next LI-tag (if doing tagging):
-% \begin{macrocode}
- \__kernel_list_item_end:
- \__kernel_list_item_begin:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \addpenalty \@itempenalty
- \addvspace \itemsep
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\__kernel_list_item_begin:,
-% \__kernel_list_item_end:}
-%
-% \begin{macrocode}
-\cs_new_eq:NN \__kernel_list_item_begin: \prg_do_nothing:
-\cs_new_eq:NN \__kernel_list_item_end: \prg_do_nothing:
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Tagging recipes}
-%
-% \begin{macro}{\@@_recipe_basic:}
-% The \texttt{basic} recipe simply ensures that the block is inside
-% a \texttt{text-unit} structure and if necessary starts one. When the
-% block ends and is followed by a blank line the \texttt{text-unit}
-% structure is closed too, otherwise it remains open and further
-% text starts with just a \struct{text} structure.
-%
-% There is otherwise no inner structure so
-% \cs{__kernel_displayblock_begin:} and
-% \cs{__kernel_displayblock_end:} do nothing---blockenvs with inner
-% structure use the \texttt{standard} or \texttt{list} recipe instead.
-% \begin{macrocode}
-\cs_new:Npn \@@_recipe_basic: {
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \@@_beginpar_hmode:N
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \@@_beginpar_vmode:
- \let \__kernel_displayblock_begin: \prg_do_nothing:
- \let \__kernel_displayblock_end: \prg_do_nothing:
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_recipe_standalone:}
-%
-% The \texttt{standalone} recipe produces a block that ensures that
-% a previous \texttt{text-unit} ends and that after the block a new
-% \texttt{text-unit} starts.
-% \begin{macrocode}
-\cs_new:Npn \@@_recipe_standalone: {
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \prg_do_nothing:
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \prg_do_nothing:
- \cs_set_eq:NN \__kernel_displayblock_begin: \@@_inner_begin:
- \cs_set_eq:NN \__kernel_displayblock_end: \@@_inner_end:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \bool_set_true:N \l_@@_standalone_bool
-% \end{macrocode}
-%
-% \begin{macrocode}
- \tl_if_empty:NTF \l_@@_tag_name_tl
- { \tl_set:Nn \l_@@_tag_inner_tag_tl {Sect} }
- { \tl_set_eq:NN \l_@@_tag_inner_tag_tl \l_@@_tag_name_tl }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_recipe_standard:}
-% The \texttt{standard} recipe does the following:
-% \begin{itemize}
-% \item surround the block with a \texttt{text-unit}-structure if not already in a
-% a \texttt{text-unit}. In the latter case end the
-% MC and the \struct{text} but leave the \texttt{text-unit} open.
-%
-% If we are producing flattened paragraphs, just close any
-% \struct{text} but do not open a \texttt{text-unit}.
-%
-% \item Then open an new (inner) structure (by default
-% \texttt{Figure} but typically the one specified on the instance).
-% \item At the end of the block close the the inner structure
-% (\texttt{Figure} or explicit one)
-% but leave the \texttt{text-unit} open to be either continued or closed due to a
-% following \cs{par}.
-% \end{itemize}
-% \begin{macrocode}
-\cs_new:Npn \@@_recipe_standard:
-{
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \@@_beginpar_hmode:N
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \@@_beginpar_vmode:
- \cs_set_eq:NN \__kernel_displayblock_begin: \@@_inner_begin:
- \cs_set_eq:NN \__kernel_displayblock_end: \@@_inner_end:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \tl_if_empty:NTF \l_@@_tag_name_tl
- { \tl_set:Nn \l_@@_tag_inner_tag_tl {Figure} }
- { \tl_set_eq:NN \l_@@_tag_inner_tag_tl \l_@@_tag_name_tl }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\l_@@_tag_inner_tag_tl}
-% \begin{macrocode}
-\tl_new:N \l_@@_tag_inner_tag_tl
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@@_recipe_list:}
-% The \texttt{list} recipe does the following.
-% \begin{itemize}
-% \item It opens a \struct{text-unit}-structure or keeps the current one open (only
-% closing the MC).
-% \item It then starts a new structure rollmapped to L-structure
-% and arranges for handling list items, e.g., Li, Lbl and LBody
-% structures.
-% \item At the end it closes open list structures as needed but
-% keeps the \struct{text-unit}-structure open to continue the paragraph after the
-% list, if necessary.
-% \end{itemize}
-% \begin{macrocode}
-\cs_new:Npn \@@_recipe_list:
-{
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \@@_beginpar_hmode:N
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \@@_beginpar_vmode:
- \cs_set_eq:NN \__kernel_displayblock_begin: \@@_list_begin:
- \cs_set_eq:NN \__kernel_displayblock_end: \@@_list_end:
-% \end{macrocode}
-% The next two lines could be done globally, because they are only
-% called if we do have \cs{item}s, i.e., if we are in a list. It is
-% therefore also not necessary to reset them in other recipes
-% (right now---this may change if we get more templates (like
-% inline lists)).
-% \begin{macrocode}
- \cs_set_eq:NN \__kernel_list_item_begin: \@@_list_item_begin:
- \cs_set_eq:NN \__kernel_list_item_end: \@@_list_item_end:
-% \end{macrocode}
-% Handle the tag name and attribute classess using the key values
-% from the current list instance.
-% \begin{macrocode}
- \tl_if_empty:NTF \l_@@_tag_name_tl
- { \tl_set:Nn \l__tag_L_tag_tl {L} }
- { \tl_set_eq:NN \l__tag_L_tag_tl \l_@@_tag_name_tl }
- \tl_if_empty:NTF \l_@@_tag_class_tl
- { \tl_set:Nn \l__tag_L_attr_class_tl {} }
- { \tl_set_eq:NN \l__tag_L_attr_class_tl \l_@@_tag_class_tl }
-}
-% \end{macrocode}
-% \end{macro}
-
-
-
-% \subsection{Blockenv instances}
-%
-%
-% \subsubsection{Basic instances}
-%
-% \begin{instance}{blockenv displayblock}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{displayblock}{display}
-{
- env-name = displayblock,
- tag-name = ,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- inner-instance = ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \begin{instance}{blockenv displayblockflattened}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{displayblockflattened}{display}
-{
- env-name = displayblockflattened,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- inner-instance = ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \begin{instance}{blockenv center}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{center}{display}
-{
- env-name = center,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- para-instance = center ,
- inner-instance = ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \begin{instance}{blockenv flushleft}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{flushleft}{display}
-{
- env-name = flushleft,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- para-instance = raggedright ,
- inner-instance = ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \begin{instance}{blockenv flushright}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{flushright}{display}
-{
- env-name = flushleft,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- para-instance = raggedleft ,
- inner-instance = ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \subsubsection{Blockquote instances}
-%
-% \begin{instance}{blockenv quotation}
-%
-% \begin{macrocode}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=quote,role=BlockQuote}}
- \tagpdfsetup{add-new-tag={tag=quotation,role=BlockQuote}}
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{quotation}{display}
-{
- env-name = quotation,
- tag-name = quotation,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = true,
- setup-code = ,
- block-instance = quotationblock ,
- inner-instance = ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \begin{instance}{blockenv quote}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{quote}{display}
-{
- env-name = quote,
- tag-name = quote,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = true,
- setup-code = ,
- block-instance = quoteblock ,
- inner-instance = ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-% An alternative setup for quotations, using the displayblock instance and
-% just overwrite a bit in the setup code.\fmi{I guess the setup
-% code is still executed too early, have to check.}
-% This would be less flexible but would ensure visual consistency,
-% because the displayblock settings are used throughout.
-% \begin{macrocode}
-% \DeclareInstance{blockenv}{quotation}{display}
-% {
-% env-name = quotation,
-% tag-name = ,
-% tag-class = ,
-% tagging-recipe = blockquote,
-% inner-level-counter = ,
-% level-increase = true,
-% setup-code = \setlength\rightmargin{\leftmargin}
-% \setlength\parsep{1.5em} ,
-% block-instance = displayblock ,
-% inner-instance = ,
-% }
-% \end{macrocode}
-%
-% \begin{macrocode}
-% \DeclareInstance{blockenv}{quote}{display}
-% {
-% env-name = quote,
-% tag-name = ,
-% tag-class = ,
-% tagging-recipe = blockquote,
-% inner-level-counter = ,
-% level-increase = true,
-% setup-code = \setlength\rightmargin{\leftmargin} ,
-% block-instance = displayblock ,
-% inner-instance = ,
-% }
-% \end{macrocode}
-%
-
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{theorem}{display}
-{
- env-name = theorem-like,
- tag-name = theorem-like,
- tag-class = ,
- tagging-recipe = standalone,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
-% inner-instance-type = innerblock ,
-% inner-instance = theorem,
-}
-% \end{macrocode}
-%
-% We use \struct{theorem-like} as the structure name and rollmap it
-% to a \struct{Sect} because that can hold a \struct{Caption}.
-% \begin{macrocode}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=theorem-like,role=Sect}}
-}
-% \end{macrocode}
-%
-%
-%
-%
-% \subsubsection{Verbatim instances}
-%
-% \begin{instance}{blockenv verbatim}
-%
-% \begin{macrocode}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=verbatim,role=P}}
- \tagpdfsetup{add-new-tag={tag=codeline,role=Sub}}
-% \end{macrocode}
-% Possible alternative for PDF 1.7:
-% \begin{macrocode}
-% \tagpdfsetup{add-new-tag={tag=verbatim,role=Div}}
-% \tagpdfsetup{add-new-tag={tag=codeline,role=P}}
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{verbatim}{display}
-{
- env-name = verbatim,
- tag-name = verbatim,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = verbatimblock ,
- inner-instance = ,
- final-code = \legacyverbatimsetup ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \subsubsection{Standard list instances}
-%
-% \begin{instance}{blockenv itemize}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{itemize}{display}
-{
- env-name = itemize,
- tag-name = itemize,
- tag-class = itemize,
- tagging-recipe = list,
- inner-level-counter = \@itemdepth,
- level-increase = true,
- max-inner-levels = 4,
- setup-code = ,
- block-instance = list ,
- inner-instance = itemize ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \begin{instance}{blockenv enumerate}
-%
-% \begin{macrocode}
-\DeclareInstance{blockenv}{enumerate}{display}
-{
- env-name = enumerate,
- tag-name = enumerate,
- tag-class = enumerate,
- tagging-recipe = list,
- level-increase = true,
- setup-code = ,
- block-instance = list ,
- inner-level-counter = \@enumdepth,
- max-inner-levels = 4,
- inner-instance = enum ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \begin{instance}{blockenv description}
-%
-% \begin{macrocode}
-
-\DeclareInstance{blockenv}{description}{display}
-{
- env-name = description,
- tag-name = description,
- tag-class = description,
- tagging-recipe = list,
- inner-level-counter = ,
- level-increase = true,
- setup-code = ,
- block-instance = list ,
- inner-instance = description ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \begin{instance}{blockenv list}
-% The general (legacy) \env{list} environment does some of its
-% setup in the \texttt{setup-code} key.
-% \begin{macrocode}
-\DeclareInstance{blockenv}{list}{display}
-{
- env-name = list,
- tag-name = list,
- tag-class = ,
- tagging-recipe = list,
- level-increase = true,
- setup-code = \legacylistsetupcode ,
- block-instance = list ,
- inner-level-counter = ,
- inner-instance = legacy ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-%
-% \subsection{Block instances}
-%
-% \subsubsection{Displayblock instances}
-%
-% We provide 6 nesting levels (as in \LaTeXe{}). If you want to
-% provide more you need to change the \texttt{maxblocklevels}
-% counter, offer further \texttt{displayblock-xx} instances but
-% also define further (legacy) \cs{list\meta{romannumeral}} commands
-% for the defaults. If not, then the settings from the previous
-% level are reused automatically---which may or may not be good enough).
-% \begin{macrocode}
-\setcounter{maxblocklevels}{6}
-% \end{macrocode}
-%
-% \begin{instance}{block displayblock-0,
-% block displayblock-1,
-% block displayblock-2,
-% block displayblock-3,
-% block displayblock-4,
-% block displayblock-5,
-% block displayblock-6 }
-%
-% Here we need level zero as well in case a flattened displayblock
-% (like the center env) it is used on top-level.
-% \begin{macrocode}
-\DeclareInstance{block}{displayblock-0}{display}
- {
- leftmargin = 0pt ,
- parindent = 0pt ,
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstanceCopy{block}{displayblock-1}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-2}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-3}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-4}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-5}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-6}{displayblock-0}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \subsubsection{Verbatim instances}
-%
-% Verbatim instances have there own levels so that one can specify
-% specific indentations or vertical separations between line.
-%
-% \begin{instance}{block verbatimblock-0,
-% block verbatimblock-1,
-% block verbatimblock-2,
-% block verbatimblock-3,
-% block verbatimblock-4,
-% block verbatimblock-5,
-% block verbatimblock-6 }
-%
-% \begin{macrocode}
-\DeclareInstance{block}{verbatimblock-0}{display}
- {
- leftmargin = 0pt ,
- parindent = 0pt ,
- par-skip = 0pt ,
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstanceCopy{block}{verbatimblock-1}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-2}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-3}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-4}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-5}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-6}{verbatimblock-0}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-%
-% \subsubsection{Quote/quotationblock instances}
-%
-% Quote and quotation are not flattened, i.e., they change levels,
-% thus they start with level 1 not 0.
-%
-% \begin{instance}{block quoteblock-1,
-% block quoteblock-2,
-% block quoteblock-3,
-% block quoteblock-4,
-% block quoteblock-5,
-% block quoteblock-6 }
-% Default layout is to indent equaly from both side.
-% \begin{macrocode}
-\DeclareInstance{block}{quoteblock-1}{display}
- { rightmargin = \KeyValue{leftmargin} }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstanceCopy{block}{quoteblock-2}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-3}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-4}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-5}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-6}{quoteblock-1}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \begin{instance}{block quotationblock-1,
-% block quotationblock-2,
-% block quotationblock-3,
-% block quotationblock-4,
-% block quotationblock-5,
-% block quotationblock-6 }
-% Quotation additionally changes the parindent.
-% \begin{macrocode}
-\DeclareInstance{block}{quotationblock-1}{display}
- { parindent = 1.5em , rightmargin = \KeyValue{leftmargin} }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstanceCopy{block}{quotationblock-2}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-3}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-4}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-5}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-6}{quotationblock-1}
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \subsubsection{Block instances for the standard lists}
-%
-% \begin{instance}{block list-1,
-% block list-2,
-% block list-3,
-% block list-4,
-% block list-5,
-% block list-6 }
-% The block instances for the various list environments use the
-% same underlying instance (well by default) and nothing nothing
-% needs to be set up specifically (because that is already done in
-% the legacy \cs{list\meta{romannumeral}} unless a
-% different layout is wanted.
-% \begin{macrocode}
-\DeclareInstance{block}{list-1}{display}{
-% heading = ,
-% beginsep = \topsep ,
-% begin-par-skip = \partopsep ,
-% par-skip = \parsep ,
-% end-skip = \KeyValue{beginsep} ,
-% end-par-skip = \KeyValue{begin-par-skip} ,
-% beginpenalty = \UseName{@beginparpenalty} ,
-% endpenalty = \UseName{@endparpenalty} ,
-% leftmargin = \leftmargin ,
-% rightmargin = \rightmargin ,
-% parindent = \listparindent ,
-}
-\DeclareInstance{block}{list-2}{display}{}
-\DeclareInstance{block}{list-3}{display}{}
-\DeclareInstance{block}{list-4}{display}{}
-\DeclareInstance{block}{list-5}{display}{}
-\DeclareInstance{block}{list-6}{display}{}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \subsection{List instances for the standard lists}
-%
-% For all list instances we have to say what kind of label we want
-% (\texttt{label-instance}) and how it should beformatted.
-%
-% \begin{instance}{list itemize-1,
-% list itemize-2,
-% list itemize-3,
-% list itemize-4}
-% For \env{itemize} environments this is all we need to do and we
-% refer back to the external definitions rather than defining the
-% \texttt{item-label} code in the instance to ensure that old
-% documents still work.
-%
-% \begin{macrocode}
-\DeclareInstance{list}{itemize-1}{std}{ item-label = \labelitemi }
-\DeclareInstance{list}{itemize-2}{std}{ item-label = \labelitemii }
-\DeclareInstance{list}{itemize-3}{std}{ item-label = \labelitemiii }
-\DeclareInstance{list}{itemize-4}{std}{ item-label = \labelitemiv }
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \begin{instance}{list enumerate-1,
-% list enumerate-2,
-% list enumerate-3,
-% list enumerate-4}
-% \env{enumerate} environments are similar, except that we also
-% have to say which counter to use on every level.
-% \begin{macrocode}
-\DeclareInstance{list}{enum-1}{std}
- { item-label = \labelenumi , counter = enumi }
-\DeclareInstance{list}{enum-2}{std}
- { item-label = \labelenumii , counter = enumii }
-\DeclareInstance{list}{enum-3}{std}
- { item-label = \labelenumiii , counter = enumiii }
-\DeclareInstance{list}{enum-4}{std}
- { item-label = \labelenumiv , counter = enumiv }
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \begin{instance}{list legacy}
-% For the legacy \env{list} environment there is only one instance
-% which is reused on all levels. This is done this way one because
-% the legacy \env{list} environment sets all its
-% parameters through its arguments. So this instances shouldn't
-% really be touched. It sets the \texttt{legacy-support} key to
-% true, which means that the list code uses \cs{makelabel} for
-% formatting the label
-% \begin{macrocode}
-\DeclareInstance{list}{legacy}{std} {
- item-instance = basic ,
- legacy-support = true ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \begin{instance}{list description}
-% The \env{description} lists also use only a single list instance
-% with only one key not using the default:
-% \begin{macrocode}
-\DeclareInstance{list}{description}{std} { item-instance = description }
-% \end{macrocode}
-% \end{instance}
-%
-%
-% \subsection{Item instances}
-%
-%
-% \begin{instance}{item basic, item description}
-% There two item instances set up: \texttt{description} for use
-% with the \env{description} environment and \texttt{basic} for use
-% with all other lists (up to now).
-% \begin{macrocode}
-\DeclareInstance{item}{basic}{std}
- {
- label-align = right ,
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstance{item}{description}{std}
- {
- label-format = \normalfont\bfseries #1 ,
- }
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-% \subsection{Para instances}
-%
-% \begin{macrocode}
-\tag_if_active:T
-{
- \tagpdfsetup
- {
- newattribute = {justify} {/O /Layout /TextAlign/Justify},
- newattribute = {center} {/O /Layout /TextAlign/Center},
- newattribute = {raggedright}{/O /Layout /TextAlign/Start},
- newattribute = {raggedleft} {/O /Layout /TextAlign/End},
- }
-}
-% \end{macrocode}
-%
-% \begin{instance}{para center}
-% \begin{macrocode}
-\DeclareInstance{para}{center}{std}
-{
- indent-width = 0pt ,
- start-skip = 0pt ,
- left-skip = \@flushglue ,
- right-skip = \@flushglue ,
- end-skip = \z at skip ,
- final-hyphen-demerits = 0 ,
- cr-cmd = \@centercr ,
- para-class = center ,
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstance{para}{raggedright}{std}
-{
- indent-width = 0pt ,
- start-skip = 0pt ,
- left-skip = \z at skip ,
- right-skip = \@flushglue ,
- end-skip = \z at skip ,
- final-hyphen-demerits = 0 ,
- cr-cmd = \@centercr ,
- para-class = raggedright ,
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstance{para}{raggedleft}{std}
-{
- indent-width = 0pt ,
- start-skip = 0pt ,
- left-skip = \@flushglue ,
- right-skip = \z at skip ,
- end-skip = \z at skip ,
- final-hyphen-demerits = 0 ,
- cr-cmd = \@centercr ,
- para-class = raggedleft ,
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareInstance{para}{justify}{std}
-{
-% indent-width = 0pt ,
- start-skip = 0pt ,
- left-skip = \z at skip ,
- right-skip = \z at skip ,
- end-skip = \@flushglue ,
- final-hyphen-demerits = 5000 ,
- cr-cmd = \@normalcr ,
- para-class = justify ,
-}
-% \end{macrocode}
-% \end{instance}
-%
-%
-%
-%
-% \begin{macrocode}
-\DeclareRobustCommand\centering {\UseInstance{para}{center}{}}
-\DeclareRobustCommand\raggedleft {\UseInstance{para}{raggedleft}{}}
-\DeclareRobustCommand\raggedright{\UseInstance{para}{raggedright}{}}
-\DeclareRobustCommand\justifying {\UseInstance{para}{justify}{}}
-
-\justifying
-% \end{macrocode}
-%
-%
-%
-%
-%
-% \subsection{Tagging support}
-%
-% In this section we provide code to the various kernel hooks to support
-% the tagging of the different displayblock environments.
-%
-%
-%
-% All of the following definitions should only be made if tagging
-% is active!
-% \begin{macrocode}
-\tag_if_active:T {
-% \end{macrocode}
-%
-% \begin{macro}{\@@_beginpar_vmode:}
-% When a block starts out in vertical mode, i.e., is not yet part of
-% a paragraph, we have to start a paragraph
-% structure. However, this is not the case if we are already
-% flattening paragraphs, thus in this case we do nothing.
-% We also do nothing if \texttt{@endpe} is currently true, because
-% that means we are right now just after the end of a
-% \texttt{blockenv} and in the process of looking if we have to end
-% the current \texttt{text-unit}, i.e., it is already open.
-% \begin{macrocode}
- \cs_set:Npn \@@_beginpar_vmode: {
- \@@_debug_typeout:n
- { @endpe = \legacy_if:nTF { @endpe }{true}{false}
- \on at line }
- \legacy_if:nTF { @endpe }
- {
- \legacy_if_gset_false:n { @endpe }
- }
-% \end{macrocode}
-% We test for \texttt{<2} because the first flattened environment
-% has to surround itself with a \texttt{text-unit}. Only any inner ones
-% then have to avoid adding another \texttt{text-unit}.
-% \begin{macrocode}
- {
- \int_compare:nNnT \l_@@_flattened_level_int < 2
- {
- \int_gincr:N \g__tag_para_main_begin_int
- \tagstructbegin{tag=\l__tag_para_main_tag_tl}
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_beginpar_hmode:N}
-% If the block is already part of a part of a paragraph, i.e., when it has
-% some text directly in front, then the first thing to
-% do is to return to vertical mode. However, that should be done
-% without inserting a paragraph end tag, so before calling \cs{par}
-% to do its normal work, we disable paragraph tagging and
-% restarting afterwards again. The argument to this config point
-% simply gobbles the \cs{par} following it in the code above (which
-% is used when there is no tagging going on.
-% \begin{macrocode}
- \cs_set:Npn \@@_beginpar_hmode:N #1
- {
- \tag_mc_end:
- \int_gincr:N \g__tag_para_end_int
- \@@_debug_typeout:n{increment~ /P \on at line }
- \bool_if:NT \l__tag_para_show_bool
- { \tag_mc_begin:n{artifact}
- \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
- \tag_mc_end:
- }
- \tag_struct_end:
- \tagpdfparaOff \par \tagpdfparaOn
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\__kernel_displayblock_doendpe:}
-% If a display block ends and is followed by a blank line we have to end the
-% enclosing paragraph tagging structure.
-% \begin{macrocode}
-\cs_set:Npn \__kernel_displayblock_doendpe: {
- \bool_if:NT \l__tag_para_bool
- {
-% \end{macrocode}
-% Given that restoring \cs{par} through the legacy \LaTeXe{} method
-% can take a few iterations (for example, in case of nested lists,
-% e.g., \verb=...\end{itemize} \item ...\par= it can happen that
-% \cs{__kernel_displayblock_doendpe:} is called while
-% \texttt{@endpe} is already handled and then we should not attempt
-% to close a \texttt{text-unit} structure. So we need to check for this.
-% \begin{macrocode}
- \legacy_if:nT { @endpe }
- {
-% \end{macrocode}
-% If the display block currently ending was \enquote{flattened}
-% (i.e., uses simplified paragraphs that are not tagged by a
-% combination of \texttt{text-unit} followed by \struct{text}, but simply
-% with a \struct{text},
-% then we don't have to do anything, because the \struct{text} is already closed.
-% \begin{macrocode}
- \@@_debug_typeout:n
- { flattened= \bool_if:NTF
- \l__tag_para_flattened_bool {true}{false}
- \on at line }
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \@@_debug_typeout:n{Structure-end~
- \l__tag_para_main_tag_tl\space after~ displayblock \on at line }
- \int_gincr:N \g__tag_para_main_end_int
- \tag_struct_end: %text-unit
- }
- }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{para/begin}
-%
-% Paragraph tagging is mainly done using the paragraph hooks (will
-% get moved eventually). The default hook setting is not good
-% enough when lists get suppported: we need to delay starting the
-% paragraph tagging if we still have to place the list label.
-% We therefore remove the existing hook data and replace it with an
-% augmented version (this will get combined eventually).
-% \begin{macrocode}
-\RemoveFromHook{para/begin}[tagpdf]
-% \end{macrocode}
-%
-% \begin{macrocode}
-\AddToHook{para/begin}[tagpdf]{
- \bool_if:NT \l__tag_para_bool {
-% \end{macrocode}
-% if we are still waiting to typeset the list label we do nothing
-% (the paragraph tagging then happens when the list is finally
-% typeset).
-% \begin{macrocode}
- \legacy_if:nF { @inlabel }
- {
-% \end{macrocode}
-% Otherwise, we start a \struct{text} tag structure but only if we are not
-% starting a paragraph immediately \emph{after} a list, in which
-% case we only start a new MC (because the \struct{text} tag is still open from
-% before the list --- one of the reasons why lists are always put
-% \enquote{inside} paragraphs.
-%
-% We do this in a separate command, because it is needed elsewhere too.
-% \begin{macrocode}
- \@@_start_para_structure:n { \PARALABEL }
- }
- }
-}
-% \end{macrocode}
-%
-%
-% \begin{macro}{\@@_start_para_structure:n}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_start_para_structure:n #1 {
- \@@_debug_typeout:n
- { @endpe = \legacy_if:nTF { @endpe }{true}{false}
- \on at line }
- \legacy_if:nF { @endpe }
- {
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_begin_int
- \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
- }
- }
- \int_gincr:N \g__tag_para_begin_int
- \@@_debug_typeout:n{increment~ P \on at line }
- \tag_struct_begin:n
- {
- tag=\l__tag_para_tag_tl
- ,attribute-class=\l_tag_para_attr_class_tl
- }
- \__tag_check_para_begin_show:nn {green}{#1}
- \tag_mc_begin:n {}
-}
-% \end{macrocode}
-% The same code, but without testing \texttt{@endpe}. This is not
-% needed in the standalong e case and wrong inside lists.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_start_para_structure_unconditionally:n #1 {
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_begin_int
- \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
- }
- \int_gincr:N \g__tag_para_begin_int
- \@@_debug_typeout:n{increment~ P \on at line }
- \tag_struct_begin:n
- {
- tag=\l__tag_para_tag_tl
- ,attribute-class=\l_tag_para_attr_class_tl
- }
- \__tag_check_para_begin_show:nn {green}{#1}
- \tag_mc_begin:n {}
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macrocode}
-\tag_if_active:T {
-% \tagpdfsetup{add-new-tag={tag=text-unit,role=Part}}
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\RemoveFromHook{para/end}[tagpdf]
-\AddToHook{para/end}
- {
- \bool_if:NT \l__tag_para_bool
- {
- \int_gincr:N \g__tag_para_end_int
- \@@_debug_typeout:n{increment~ /P \on at line }
- \tag_mc_end:
- \__tag_check_para_end_show:nn {red}{}
- \tag_struct_end:
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tag_struct_end:
- }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\PARALABEL{NP-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\para_end:}
-% If we see a \cs{par} in vmode and a \texttt{text-unit} is still open
-% we need to close that. For this we check if a request for
-% \text{@endpe} was made (but the \cs{par} redefinition got lost
-% due to (bad?) coding).
-% \begin{macrocode}
-\cs_set_protected:Npn \para_end: {
- \scan_stop:
- \mode_if_horizontal:TF {
- \mode_if_inner:F {
- \tex_unskip:D
- \hook_use:n{para/end}
- \@kernel at after@para at end
- \mode_if_horizontal:TF {
- \if_int_compare:w 11 = \tex_lastnodetype:D
- \tex_hskip:D \c_zero_dim
- \fi:
- \tex_par:D
- \hook_use:n{para/after}
- \@kernel at after@para at after
- }
- { \msg_error:nnnn { hooks }{ para-mode }{end}{horizontal} }
- }
- }
- {
- \__kernel_endpe_vmode: % should do nothing if no tagging
- \tex_par:D
- }
-}
-\cs_set_eq:NN \par \para_end:
-\cs_set_eq:NN \@@par \para_end:
-\cs_set_eq:NN \endgraf \para_end:
-% \end{macrocode}
-%
-% \begin{macrocode}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\begin}
-% We need to do a little more than canceling \texttt{@endpe} now.
-% \begin{macrocode}
-\DeclareRobustCommand*\begin[1]{%
- \UseHook{env/#1/before}%
- \@ifundefined{#1}%
- {\def\reserved at a{\@latex at error{Environment #1 undefined}\@eha}}%
- {\def\reserved at a{\def\@currenvir{#1}%
- \edef\@currenvline{\on at line}%
- \@execute at begin@hook{#1}%
- \csname #1\endcsname}}%
- \@ignorefalse
- \begingroup
- \__kernel_endpe_vmode:
- \reserved at a}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\__kernel_endpe_vmode:}
-% Close an open \texttt{text-unit} if \texttt{@endpe} is true and we
-% are in vmode. Used in \cs{para_end:} and \cs{begin}.
-% \begin{macrocode}
-\cs_new:Npn \__kernel_endpe_vmode: {
- \if at endpe \ifvmode
- \bool_if:NT \l__tag_para_bool
- {
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tag_struct_end:
- }
- \@endpefalse
- }
- \fi \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\__kernel_list_label_after:}
-% If starting the text-unit/text tags got delayed because of a pending label we
-% have to do it after the label got typeset
-% \begin{macrocode}
-\cs_set:Npn \__kernel_list_label_after: {
- \bool_if:NT \l__tag_para_bool
- {
- \@@_start_para_structure_unconditionally:n { LI- }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_inner_begin:}
-% Start a block that has an inner structure if it isn't also a list.
-% \begin{macrocode}
-\cs_new:Npn \@@_inner_begin: {
- \tagstructbegin{tag=\l_@@_tag_inner_tag_tl}
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_inner_end:}
-% End a block (which isn't also a list).
-% \begin{macrocode}
-\cs_new:Npn \@@_inner_end: {
- \@@_debug_typeout:n{block-end \on at line}
- \legacy_if:nT { @endpe }
- {
- \int_gincr:N \g__tag_para_main_end_int
- \@@_debug_typeout:n{close~ /text-unit \on at line}
- \tagstructend
- }
- \tagstructend % end inner structure
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-%
-% \subsubsection{List tags}
-%
-%
-% \begin{macrocode}
-\tl_new:N \l__tag_L_tag_tl
-\tl_set:Nn \l__tag_L_tag_tl {L}
-
-\tl_new:N\l__tag_L_attr_class_tl
-\tl_set:Nn \l__tag_L_attr_class_tl {list}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\tag_if_active:T
-{
- \tagpdfsetup
- {
- % default if unknown
- newattribute = {list}{/O /List /ListNumbering/None},
- newattribute = {itemize}{/O /List /ListNumbering/Unordered},
- newattribute = {enumerate}{/O /List /ListNumbering/Ordered},
- newattribute = {description}{/O /List /ListNumbering/Description},
- }
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\LItag{LI}
-% \end{macrocode}
-%
-% \begin{macro}{\@@_list_begin:}
-% Start a list \ldots
-% \begin{macrocode}
-\cs_set:Npn \@@_list_begin: {
- \tagstructbegin
- {
- tag=\l__tag_L_tag_tl
- ,attribute-class=\l__tag_L_attr_class_tl
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_list_item_begin:}
-% Start tagging a list item.
-% \begin{macrocode}
-\cs_set:Npn \@@_list_item_begin: { \tagstructbegin{tag=\LItag} }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\__kernel_list_label_begin:}
-% A list label needs a \texttt{Lbl} structure tag and an MC.
-% \begin{macrocode}
-\cs_set:Npn \__kernel_list_label_begin: {
-%
-% FMi: this needs a different logic to decide when to make the label
-% an artifact (after cleaning up the the \item code ), therefore
-% disabled for now
-% \tl_if_empty:oTF \@itemlabel
-% {
-% \tag_mc_begin:n {artifact}
-% }
-% {
- \tagstructbegin{tag=Lbl}
- \tagmcbegin{tag=Lbl}
-% }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\__kernel_list_label_end:}
-% And when we are done with the label we have to close the MC and
-% the \texttt{Lbl} structure. We then start the \texttt{LBody}. The
-% material inside will be \enquote{paragraph} text and the tagging
-% for that is handled by the normal para tagging.
-% \begin{macrocode}
-\cs_set:Npn \__kernel_list_label_end: {
- \tagmcend % end mc-Lbl or artifact
-% FMi: unconditionally for now
-% \tl_if_empty:oF \@itemlabel
- \tagstructend % end Lbl
- \tagstructbegin{tag=\LBody}
-}
-\def\LBody{LBody}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@@_list_item_end:}
-% When a list item ends we have to close \texttt{LBody} and
-% \texttt{LI} but also a \struct{text} in the special case that the
-% item material ends in a list (identifiable via \texttt{@endpe}).
-% \begin{macrocode}
-\cs_set:Npn \@@_list_item_end: {
- \legacy_if:nT { @endpe }
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tagstructend % text-unit
-% \@@_debug_typeout:n{Structure-end~ P~ at~ item-end \on at line }
- }
- \tagstructend \tagstructend % end LBody, LI
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@@_list_end:}
-% Finally, at the list end we have to close the open
-% \texttt{LBody}, \texttt{LI}, \texttt{L}, and possibly a
-% \struct{text} if the last item ends with a list.
-% \begin{macrocode}
-\cs_set:Npn \@@_list_end: {
- \legacy_if:nT { @endpe }
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tagstructend % text-unit
- \@@_debug_typeout:n{Structure-end~ P~ at~ list-end \on at line }
- }
- \tagstructend\tagstructend % end LBody, LI
- \tagstructend % end L
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%
-%
-% End of tagging related declarations.
-% \begin{macrocode}
-}
-% \end{macrocode}
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%
-%
-%
-% \begin{macrocode}
-%<*latex-lab>
-\ProvidesFile{block-tagging-latex-lab-testphase.ltx}
- [\ltblocksdate\space \ltblocksversion\space
- blockenv implementation]
-\RequirePackage{latex-lab-testphase-block-tagging}
-%</latex-lab>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-%
-% \section{Documentation from first prototype implementations}
-%
-%
-% \subsection{Open questions}
-% \begin{itemize}
-% \item Existing questions --- moved to issues ---
-% \end{itemize}
-%
-% \subsection{Code cleanup}
-% \begin{itemize}
-% \item Actually implement what's announced.
-%
-% \item Encapsulate most uses of \cs[no-index]{legacy_if\dots} into
-% commands with \texttt{expl3} syntax: we cannot rename these booleans
-% for compatibility reasons but we can make the code cleaner
-% nevertheless. --- made issue ---
-%
-% \item The \tn{topsep} and \tn{partopsep} business is tricky to
-% reproduce exactly (see \tn{@topsepadd} and \tn{@topsep}) because of
-% how it accumulates when lists are nested immediately.
-%
-% \end{itemize}
-%
-%
-%
-% \subsection{Tasks}
-% \begin{itemize}
-%
-% \item Change author to LaTeX Team once it's nice enough to deserve
-% that label.
-%
-% \item Reproducing exactly the standard layouts and examples in the
-% \pkg{enumitem} documentation.
-%
-% \item Hooks, but do not duplicate those that already exist as
-% environment hooks. Hence, mostly around items.
-%
-% \item Customization and interaction with LDB:
-% \begin{itemize}
-% \item Allow arbitrary nesting depth with automatically defined
-% styles for labels, counters etc.
-% \item Adapt everything to font size! (e.g. footnotes).
-% \item How to model the inheritance from trivlist to list to
-% enumerate?
-% \end{itemize}
-%
-% \item Add key--value settings mimicking \pkg{enumitem}'s ability to
-% set any four of five horizontal parameters and deduce the fifth by
-% $\cs{leftmargin} + \cs{itemindent} = \cs{labelindent} +
-% \cs{labelwidth} + \cs{labelsep}$.
-%
-% \item Provide good ways to customize how overlong labels are dealt with.
-%
-% \item Use the \texttt{.aux} file.
-% \begin{itemize}
-% \item Implement the \tn{ref} styles that \pkg{enumitem} provides.
-% \item Reverse enumerations, important in publication lists and the
-% like. Somehow avoid needing 3 compilations for references to
-% reverse enumerations to settle?
-% \item Ability to calculate \tn{labelwidth} from the label contents.
-% Share calculated parameters between multiple environments (cf.\
-% \texttt{resume} option).
-% \end{itemize}
-%
-% \item Related to grabbing the whole list environment, and input syntax
-% variations:
-% \begin{itemize}
-% \item Other layouts: tabular (see \pkg{listliketab} vs
-% \pkg{typed-checklist}), multicolumn and horizontally numbered (see
-% \pkg{tasks}), inline lists, runin lists in the easy case where
-% there is no intervening \tn{par}.
-% \item Formatting the item text in a
-% box or similar (requires grabbing the whole list).
-% \item Filtering which items to show: hide certain items according to
-% criteria (useful together with list reuse), see
-% \pkg{typed-checklist}.
-% \item Shorthands \tn{iitem} for automatic nested lists, or \cs{1},
-% \cs{2} etc from \pkg{outlines}.
-% \item Support markdown input like \pkg{asciilist}.
-% \end{itemize}
-%
-% \item Check interaction with \texttt{babel} options such as
-% \texttt{french} or \texttt{accadian} (see FrenchItemizeSpacing)
-%
-% \item RTL and vertical typesetting.
-% \end{itemize}
-%
-% \section{Plan of attack of first prototype}
-%
-% Typesetting list environments involves a rather large number of
-% parameters. They can be affected by the context such as the total
-% list nesting level, the nesting level of the given type of list, and
-% the font size. An environment like \texttt{enumerate} has two main
-% aspects.
-% \begin{itemize}
-% \item It has a certain layout in the page, with vertical and
-% horizontal spacing around it. This type of layout is shared with
-% environments such as \texttt{quote}, \texttt{flushright}, or
-% \texttt{tabbing}. This common layout is implemented in \LaTeXe{}
-% through \cs{trivlist} (or \cs{list}).
-% \item It defines how each \cs{item} should be typeset: how to
-% construct the label, in particular the \texttt{counter} name, and
-% how to format the content of the item.
-% \end{itemize}
-%
-% This suggests defining two object types, \xt{block} and \xt{item}
-% covering these two aspects.\footnote{Possibly also \xt{endblock} to
-% deal with decorations at the end?} While the \xt{item} type will
-% perhaps have a single template, one could typeset a \xt{block} object
-% in several ways, for instance the standard \LaTeXe{} way or a fancy
-% colored box.
-%
-% The \xt{general} \xt{block} template should receive the following
-% parameters. The \xt{plain} \xt{block} template is a restricted
-% template that freezes all item-related parameters to dummy values
-% (\texttt{counter}, \texttt{start}, \texttt{resume},
-% \texttt{label-width}, \texttt{label-sep} and all \texttt{item-*}).
-% The \xt{list} \xt{block} template is a restricted template\footnote{A
-% better approach could be to have a notion of inheritance for object
-% types, so that we end up with two different \emph{object types}. Then
-% we can implement other template for the list object type: \xt{table}
-% for lists typeset as rows/columns of a table, \xt{inline} for lists
-% typeset in horizontal mode within a paragraph, and \xt{runin} for
-% run-in lists.} that omits the \texttt{heading} parameter and whose
-% default for \texttt{item-instance} is non-empty.
-% \begin{itemize}
-% \item Structural parameters: the \texttt{heading} to place before,
-% \texttt{counter} name, \texttt{start} value, whether to
-% \texttt{resume} a previous list, and the \texttt{item-instance} (an
-% \xt{item} instance) to use when typesetting items.
-% \item Vertical spacing and penalties: \texttt{beginpenalty},
-% \texttt{beginsep}, \texttt{begin-par-skip}, \texttt{item-penalty},
-% \texttt{item-skip}, \texttt{item-par-skip}, \texttt{endpenalty},
-% \texttt{end-skip}, \texttt{end-par-skip}.
-% \item Horizontal spacing: \texttt{rightmargin}, \texttt{leftmargin},
-% \texttt{parindent}, \texttt{item-indent}, \texttt{label-width},
-% \texttt{label-sep}.
-% \end{itemize}
-% A \docclass should edit these templates (or define restricted
-% templates) to set up default values that depend on \tn{g_block_nesting_depth_int},
-% namely how many lists are nested overall.\footnote{Does
-% \pkg{xtemplate} provide a way to specify default values that are only
-% evaluated once an instance is used?} The document class should then
-% set up an instance of these templates for each environment, with
-% appropriate settings such as a \texttt{heading}, a suitable
-% \texttt{item-instance}, or making \texttt{margin-right} equal to
-% \texttt{margin-left} in a \texttt{quote} environment.
-%
-% The \xt{inline-list} \xt{block} template receives many fewer
-% parameters. Note that \texttt{beginsep}, \texttt{item-skip},
-% \texttt{end-skip} are now \emph{horizontal} skips.
-% \begin{itemize}
-% \item Structural parameters: \texttt{counter}, \texttt{start},
-% \texttt{resume}, \texttt{item-instance}.
-% \item Spacing and penalties: \texttt{beginpenalty},
-% \texttt{beginsep}, \texttt{item-penalty}, \texttt{item-skip},
-% \texttt{endpenalty}, \texttt{end-skip}.
-% \item Horizontal spacing: \texttt{label-width}, \texttt{label-sep}.
-% \end{itemize}
-%
-% The \xt{std} \xt{item} template should receive the following
-% parameters. They depend on the type of list and its nesting level
-% among lists of such type, but typically not on the total nesting
-% level.
-% \begin{itemize}
-% \item Counter name (\texttt{counter}), shared with the parent
-% \xt{list} \xt{block} template, but needed for incrementing.
-% \item Label construction: a function \texttt{counter-label} that
-% produces the label from the counter name, used if \tn{item} is given
-% without argument.
-% \item References: a function \texttt{counter-ref} for how the label
-% should be referred to when it is constructed from the counter,
-% \texttt{label-ref} and \texttt{label-autoref} used when \tn{item}
-% has an optional argument.
-% \item Label formatting: \texttt{label-format} function,
-% \texttt{label-strut} boolean.
-% \item Label alignment (\texttt{label-align}, \texttt{label-boxed},
-% \texttt{next-line}).
-% \item Content parameters: \texttt{text-font}.
-% \item A \texttt{compatibility} boolean that controls for instance
-% whether \tn{makelabel} is used.
-% \end{itemize}
-% The \docclass should set up an instance such as \xt{enumiii} for each
-% environment and nesting level.\footnote{This should be made easily
-% extendible to deeper levels.}
-%
-% A given environment will adjust some nesting levels, then call the
-% \xt{block} instance appropriate to the environment type, passing it
-% the \xt{item} instance appropriate to the environment and depth.
-% Additional context-dependence could be provided by \pkg{l3ldb}, but
-% the main context-dependence should not rely on it for simplicity
-% reasons and incidentally because \pkg{l3ldb} is not yet available.
-%
-%
-% \Finale
-%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\endinput
Added: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx (rev 0)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,4101 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-block.dtx (C) Copyright 2021-2023 LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+\def\ltlabblockdate{2023-09-01}
+\def\ltlabblockversion{0.8h}
+%<*driver>
+\documentclass{l3doc}
+\usepackage{amstext}
+\EnableCrossrefs
+\CodelineIndex
+
+\usepackage{todonotes}
+
+\begin{document}
+ \DocInput{latex-lab-block.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
+%
+%
+% \title{Prototype reimplementation of \LaTeXe{}'s block environments using templates}
+% \author{\LaTeX{} Project\thanks{Initial reimplementation of lists done by Bruno
+% Le Floch, generalized second version with tagging support by Frank Mittelbach.}}
+% \date{v\ltlabblockversion\ \ltlabblockdate}
+%
+% \maketitle
+%
+%
+% \newcommand{\xt}[1]{\textsl{\textsf{#1}}}
+% \newcommand{\TODO}[1]{\textbf{[TODO:} #1\textbf{]}}
+% \newcommand{\docclass}{document class \marginpar{\raggedright document class
+% customizations}}
+%
+% \providecommand\hook[1]{\texttt{#1}}
+% \providecommand\struct[1]{\texttt{<#1>}}
+%
+% \NewDocElement[envlike, idxtype=objecttype, idxgroup=object types,
+% printtype=\textit{objecttype}] {ObjectType}{objecttype}
+%
+% \NewDocElement[envlike, idxtype=template, idxgroup=templates,
+% printtype=\textit{templ.}] {Template}{template}
+%
+% \NewDocElement[envlike, idxtype=instance, idxgroup=instances,
+% printtype=\textit{inst.}] {Instance}{instance}
+%
+%
+% \newcommand\valuefrom[1]{\textrm{value from }\texttt{#1}}
+% \newcommand\key[1]{\texttt{#1}}
+%
+%
+% \NewDocumentCommand\fmi{sO{}m}
+% {\IfBooleanTF{#1}{\todo[inline,#2]{#3}}^^A
+% {\todo[#2]{#3}}}
+%
+% \NewDocumentCommand\ufi{sO{}m}
+% {\IfBooleanTF{#1}{\todo[inline,#2]{UFi:#3}}^^A
+% {\todo[#2]{UFi:#3}}}
+% \makeatletter
+% \renewenvironment{TemplateInterfaceDescription}[1]
+% {
+% \subsubsection{The~object~type~`#1'}
+% \begingroup
+% \@beginparpenalty\@M
+% \description
+% \def\TemplateArgument##1##2{\item[Arg:~##1]##2\par}
+% \def\TemplateSemantics
+% {
+% \enddescription\endgroup
+% \subsubsection*{Semantics:}
+% }
+% }
+% {
+% \par\bigskip
+% }
+% \renewenvironment{TemplateDescription}[2]
+% {\subsubsection{The \texttt{#1} template `#2'}^^A
+% \paragraph*{Attributes:}^^A
+% \begingroup
+% \@beginparpenalty\@M
+% \description
+% \def\TemplateKey##1##2##3##4{^^A
+% \item[\texttt{##1}~(\textit{\mdseries##2})]##3^^A
+% \ifx\TemplateKey##4\TemplateKey\else
+% \hfill\penalty500\hbox{}\hfill Default:~\texttt{##4}^^A
+% \nobreak\hskip-\parfillskip\hskip0pt\relax
+% \fi
+% \par
+% }^^A
+% \def\TemplateSemantics{^^A
+% \enddescription\endgroup
+% \paragraph*{Semantics~\&~Comments:}^^A
+% }^^A
+% }
+% { \par \bigskip }
+% \makeatother
+%
+%
+% \begin{abstract}
+% \end{abstract}
+%
+%
+% \tableofcontents
+% \medskip
+%
+%
+% \begin{documentation}
+%
+%
+%
+% \section{Introduction}
+%
+% The list implementation in \LaTeXe{} serves a dual purpose: it
+% implements real lists such as \env{itemize} or \env{enumerate},
+% but it is also used as the basis for vertical blocks, i.e., to specify
+% the vertical spacing and paragraph handling after such block, e.g.,
+% in environments like \env{center}, \env{quote}, \env{verbatim}, or in
+% the theorem environments. They are all implemented as
+% \enquote{trivial} lists with a single (hidden) item.
+%
+% While this was convenient to get a consistent layout using a single
+% implementation it is not adequate if it comes to interpreting the
+% structure of a document, because environments based on \env{trivlist}
+% should not advertise themselves as being a \enquote{list} --- after all,
+% from a semantic point of view they aren't lists.
+%
+% The approach taking here is therefore to offer separate object
+% types: \xt{block} (horizontally or vertically oriented data that
+% needs some handling at the start and the end), \xt{para} (that deals
+% with different paragraph layouts), \xt{list} (that handles list
+% related parameters, and \xt{item} (for item layouts and handling), to address
+% the independent aspects and also offer the object type \xt{blockenv}
+% that ties them together as necessary.
+%
+% For example, a \env{quote} environment would make use of a (display)
+% \xt{block} and some \xt{para} handling while an standard
+% \env{enumerate} would make use of a display \xt{block}, a \xt{list},
+% and an \xt{item} and \xt{para} instance.
+% An inline list (like \env{enumerate*} from the \pkg{enumitem}
+% package) would be using the same \xt{list} instance but a different
+% (horizontally oriented) \xt{block}.
+%
+%
+% \section{Object types and templates for blocks and lists}
+%
+% \subsection{Object types}
+%
+% \begin{TemplateInterfaceDescription}{block}
+% \TemplateArgument{1}{key/value list to alter the default block parameters}
+% \TemplateSemantics
+% Handle the layout aspects of a block of data. In case of a
+% \enquote{display} block (i.e., vertically oriented) the spacing
+% and page breaking as well as the handling if the block starts a
+% paragraph or ends one, that is, if text is immediately following
+% the block without being separated by an empty line, then this
+% text is considered to be in the same paragraph as the block.
+%
+% In case of a horizontally oriented block it covers any special
+% handling at the start and end of the block, e.g, extra spacing,
+% prohibitying or encuraging line breaks, and so forth.
+% \end{TemplateInterfaceDescription}
+%
+% \begin{TemplateInterfaceDescription}{para}
+% \TemplateArgument{1}{key/value list to alter the default item parameters}
+% \TemplateSemantics
+% Sets up paragraph-specific parameters for H\&J, e.g., to
+% implement justification variations, the behavior of \verb=\\=
+% etc. The instances are used in higher-level templates, e.g., in a
+% \xt{block}.
+% \end{TemplateInterfaceDescription}
+%
+% \begin{TemplateInterfaceDescription}{list}
+% \TemplateArgument{1}{key/value list to alter the default item parameters}
+% \TemplateSemantics
+% Handle the aspects related to list design, e.g., the use and
+% formatting of counters, etc.
+%
+% Note that this does not cover block-related aspects, i.e., a list
+% instance could be used both for a display list or for an inline line.
+% \end{TemplateInterfaceDescription}
+%
+% \begin{TemplateInterfaceDescription}{item}
+% \TemplateArgument{1}{key/value list to alter the default item parameters}
+% \TemplateSemantics
+% A sub-type used as part of \xt{list} to easily cover alternative layout
+% for list items.
+% \end{TemplateInterfaceDescription}
+%
+%
+% \begin{TemplateInterfaceDescription}{blockenv}
+% \TemplateArgument{1}{key/value list to alter the default item parameters}
+% \TemplateSemantics
+% This object type is used to implement document-level
+% environments. It defines a \xt{block} instance to handle the
+% layout at the \enquote{edge} of the environment data, possibly
+% some paragraph setup through a \xt{para} instance, potentially an
+% \enquote{inner} instance for more complicated environments (such
+% as lists), and possibly some additional setup code for certain
+% environments.
+%
+% It also defines how the \xt{blockenv} behaves with respect to
+% nesting, e.g., does it change when nested and if so how many
+% levels of nesting are supported, etc.
+%
+% Finally, the object type defines how it appears in a tagged PDF
+% document, what tag names are used, how they are rolemapped and
+% whether it adds additional attributes, etc.
+% \end{TemplateInterfaceDescription}
+%
+%
+%
+% \subsection{Templates}
+%
+%
+% \begin{TemplateDescription}{blockenv}{display}
+%
+% \TemplateKey{env-name}{tokenlist}
+% {Name of the environment used only in tracing}{}
+% \TemplateKey{tag-name}{tokenlist}
+% {Name of the tag in the PDF. If not explicitly given
+% the name is defined by the \key{tagging-recipe}}{}
+% \TemplateKey{tag-class}{tokenlist}
+% {An explicit tag class attribute}{}
+% \TemplateKey{tagging-recipe}{tokenlist}
+% {Defines the way tagging is done. Currently the values
+% \texttt{basic}, \texttt{standard}, and \texttt{list}
+% are supported}{standard}
+% \TemplateKey{level-increase}{boolean}{Does this \xt{blockenv}
+% increase the block level if it is nested in an outer block?}{true}
+% \TemplateKey{setup-code}{tokenlist}
+% {Initial setup code. This is
+% executed after legacy defaults (from \cs{@listi},
+% \cs{@listii}, etc.) are used but before the block instance is called}{}
+% \TemplateKey{block-instance}{tokenlist}{Part of the name of the
+% \xt{block} instance that is called. The full name has
+% a \texttt{-}\meta{level} appended}{displayblock}
+% \TemplateKey{para-instance}{tokenlist}{}{}
+% \TemplateKey{inner-level-counter}{tokenlist}{Name of an existing (!) counter
+% that is incremented and used to determine final name
+% of the \key{inner-instance} or empty if always the
+% same inner instance should be used}{}
+% \TemplateKey{max-inner-levels}{tokenlist}{Maximum number of nested
+% environments of this kind. Only relevant if there is a
+% \key{inner-level-counter} specified}{4}
+% \TemplateKey{inner-instance-type}{tokenlist}{Object type of the
+% inner instance}{list}
+% \TemplateKey{inner-instance}{tokenlist}{Name of the inner instance
+% (if any).}{}
+% \TemplateKey{para-flattened}{boolean}{\emph{describe}}{false}
+% \TemplateKey{final-code}{tokenlist}{Final setup code}{\cs{ignorespaces}}
+%
+% \TemplateSemantics
+%
+% This \xt{blockenv} template supports the legacy list setting that
+% are found in many document classes in the macros \cs{@listi},
+% \cs{@listii}, up to \cs{@listvi}. It also uses the counter
+% \cs{@listdepth} to track nesting of block, again mainly to
+% support legacy setups (internally it gives it a more appropriate
+% name but it remains accessible through the \LaTeXe{} name).
+%
+%
+% It first checks that nothing is too deeply nested.
+% If the level should increase then the increments the
+% \cs{@listdepth} counter and
+% calls the corresponding \cs{@list...} macro to update the legacy
+% defaults. If \key{level-increase} is set to false this is bypassed.
+%
+% It then sets up the
+% tagging via the \key{tagging-recipe} setting and executes any
+% code in \key{setup-code}.
+%
+% Afterwards it calls the appropriate \xt{block} instance based on
+% \key{block-instance} and current level, e.g.,
+% \texttt{displayblock-1}. Then it sets up paragraph parameters if
+% a \key{para-instance} was specified (otherwise they stay as
+% they are).
+%
+% If a \key{inner-instance} was specified this is called next,
+% or more precisely: if no \key{inner-level-counter} was
+% specified the instance \key{inner-instance} is
+% called.
+%
+% Otherwise, the \key{inner-level-counter} is incremented and the
+% instance with the name
+% \key{inner-instance}\texttt{-}\key{inner-level-counter} is
+% called.
+%
+% Finally, the \key{final-code} is executed (by default
+% \cs{ignorespaces}).
+%
+%
+% \end{TemplateDescription}
+%
+% The maximum number of \xt{blockenv}s that can be nested into each
+% other is is restricted by the \LaTeX{} counter
+% \texttt{maxblocklevels} with a default value of \texttt{6}. If this
+% value is increased then it is necessary to provide additional
+% instances, e.g., \texttt{displayblock-7}, etc. Decreasing is, of
+% course, always possible, then some of the instances defined are not
+% used and instead the user gets an error that there is too much
+% nesting going on.
+%
+% If the key \key{level-increase} is set to \texttt{false} then such
+% an environment doesn't alter the nesting level and therefore you can
+% nest those environments as often as you like (a typical example
+% would be \env{flushleft} anywhere in the nesting hierarchy, that
+% would have no effect on hitting the boundary).
+%
+%
+% \begin{TemplateDescription}{block}{display}
+%
+% \TemplateKey{heading}{tokenlist}{\emph{not really used yet}}{}
+% \TemplateKey{beginsep}{skip}{}{\cs{topsep}}
+% \TemplateKey{begin-par-skip}{skip}{}{\cs{partopsep}}
+% \TemplateKey{par-skip}{skip}{}{\cs{parsep}}
+% \TemplateKey{end-skip}{skip}{}{\valuefrom{beginsep}}
+% \TemplateKey{end-par-skip}{skip}{}{\valuefrom{begin-par-skip}}
+% \TemplateKey{beginpenalty}{integer}{}{\cs{@beginparpenalty}}
+% \TemplateKey{endpenalty}{integer}{}{\cs{@endparpenalty}}
+% \TemplateKey{leftmargin}{length}{}{\cs{leftmargin}}
+% \TemplateKey{rightmargin}{length}{}{\cs{rightmargin}}
+% \TemplateKey{parindent}{length}{}{\cs{listparindent}}
+%
+% \TemplateSemantics
+%
+% The idea of a \key{heading} key needs some further
+% thoughts. Maybe instead the object type should accept a second
+% argument and receive input for such a headding from the document
+% level instead.
+%
+% The names of the keys need further thoughts and some
+% decision. Right now it is a mixture of those with hyphens and
+% those that match legacy register names (the way \pkg{enumitem}
+% did its keys).
+%
+% Also \key{parindent} conflicts with \key{indent-width}!
+%
+% \end{TemplateDescription}
+%
+%
+% \begin{TemplateDescription}{para}{std}
+%
+% \TemplateKey{indent-width}{length}{}{\cs{parindent}}
+% \TemplateKey{start-skip}{skip}{}{0pt}
+% \TemplateKey{left-skip}{skip}{}{0pt}
+% \TemplateKey{right-skip}{skip}{}{0pt}
+% \TemplateKey{end-skip}{skip}{}{\cs{@flushglue}}
+% \TemplateKey{fixed-word-spaces}{boolean}{}{false}
+% \TemplateKey{final-hyphen-demerits}{integer}{}{5000}
+% \TemplateKey{cr-cmd}{tokenlist}{}{\cs{@normalcr}}
+% \TemplateKey{para-class}{tokenlist}{}{justify}
+%
+% \TemplateSemantics
+%
+%
+% \end{TemplateDescription}
+%
+%
+%
+% \begin{TemplateDescription}{list}{std}
+%
+% \TemplateKey{counter}{tokenlist}
+% {Counter name to be used in a numbered list or empty,
+% if the list is unnumbered}{}
+% \TemplateKey{item-label}{tokenlist}
+% {Label \enquote{string} for a fixed label or as
+% generated from the current \key{counter} value}{}
+% \TemplateKey{start}{integer}
+% {Start value for the counter if the list is numbered,
+% otherwise irrelevant}{1}
+% \TemplateKey{resume}{boolean}
+% {Should a numbered list be resumed from the last instance?}{false}
+% \TemplateKey{item-instance}{instance}
+% {Instance of type \texttt{item} to be used to format
+% the label string}{basic}
+% \TemplateKey{item-skip}{skip}{The space in front of an item in the
+% list.\fmi{May need to be on a different template level}}{\cs{itemsep}}
+% \TemplateKey{item-indent}{length}{Horizontal displacement of the item.}{0pt}
+% \TemplateKey{item-penalty}{integer}
+% {Penalty for breaking before an
+% item (except the first)}{\cs{@itempenalty}}
+% \TemplateKey{label-width}{length}
+% {Width reserved for the formatted item label}{\cs{labelwidth}}
+% \TemplateKey{label-sep}{length}
+% {Horizontal separation between label and following text}{\cs{labelsep}}
+% \TemplateKey{legacy-support}{boolean}
+% {Is formatting the label via \cs{makelabel} supported?}{false}
+%
+% \TemplateSemantics
+%
+%
+% \end{TemplateDescription}
+%
+%
+% \begin{TemplateDescription}{item}{std}
+%
+% \TemplateKey{counter-label}{function{1}}{\emph{unused}}{\cs{arabic}\{\#1\}}
+% \TemplateKey{counter-ref}{function{1}}{\emph{unused}}{\valuefrom{counter-label}}
+% \TemplateKey{label-ref}{function{1}}{\emph{unused}}{\#1}
+% \TemplateKey{label-autoref}{function{1}}{\emph{unused}}{item~\#1}
+% \TemplateKey{label-format}{function{1}}
+% {Formatting of the label, questionable the way it is used}{\#1}
+% \TemplateKey{label-strut}{boolean}{Add a \cs{strut} to the label?}{false}
+% \TemplateKey{label-align}{choice}
+% {Supported values \texttt{left},\texttt{center},
+% \texttt{right}, and \texttt{parleft}. \emph{Only partly implemented}}{right}
+% \TemplateKey{label-boxed}{boolean}
+% {Should the label be boxed?}{true}
+% \TemplateKey{next-line}{boolean}{}{false}
+% \TemplateKey{text-font}{tokenlist}{\emph{unused}}{}
+% \TemplateKey{compatibility}{boolean}{}{true}
+%
+% \TemplateSemantics
+%
+% This template is only rudimentary implemented at the moment. It
+% probably needs other keys and the existing ones need a proper
+% implementation.
+%
+% \end{TemplateDescription}
+%
+%
+% \section{Tagging support}
+%
+% \subsection{Paragraph tags}
+%
+% Paragraphs in \LaTeX{} can be nested, e.g., you can have a paragraph
+% containing a display quote, which in turn consists of more than one
+% (sub)paragraph, followed by some more text which all belongs to the
+% same outer paragraph.
+%
+% In the PDF model and in the HTML model that is not supported --- a
+% limitation that conflicts with real live, given that such
+% constructs are quite normal in spoken and written language.
+%
+% The approach we take to resolve this is to model such \enquote{big}
+% paragraphs with a structure named \struct{text-unit} and use \struct{text} (rollmapped to \struct{P})
+% only for (portions of) the actual paragraph text in a way that the
+% \struct{text}s are not nested. As a result we have for a simple
+% paragraph the structures
+% \begin{tabbing}
+% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
+% \> \struct{text-unit}\\
+% \>\> \struct{text}\\
+% \>\>\> The paragraph text \ldots\\
+% \>\> \struct{/text}\\
+% \> \struct{/text-unit}
+% \end{tabbing}
+% The \struct{text-unit} structure is rollmapped to \struct{Part} or possibly to
+% \struct{Div} so we get a valid PDF, but processors who care can identify
+% the complete paragraphs by looking for \struct{text-unit} tags.
+%
+% In the case of an element, such as a display quote or a display list
+% inside the paragraph, we then have
+% \begin{tabbing}
+% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
+% \> \struct{text-unit}\\
+% \>\> \struct{text}\\
+% \>\>\> The paragraph text before the display element \ldots\\
+% \>\> \struct{/text}\\
+% \>\> \struct{display element structure}\\
+% \>\>\> Content of the display structure possiblly involving inner \struct{text-unit} tags\\
+% \>\> \struct{/display element structure}\\
+% \>\> \struct{text}\\
+% \>\>\> \ldots{} continuing the outer paragraph text\\
+% \>\> \struct{/text}\\
+% \> \struct{/text-unit}
+% \end{tabbing}
+% In other words such a display block is always embedded in a
+% \struct{text-unit} structure, possibly preceded by a \struct{text}\ldots\struct{/text} block
+% and possibly followed by one, though both such blocks are optional.
+%
+% Thus an \env{itemize} environment that has some introductory text
+% but no text immediately following the list
+% would be tagged as follows:
+% \begin{tabbing}
+% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
+% \> \struct{text-unit}\\
+% \>\> \struct{text}\\
+% \>\>\> The intro text for the \env{itemize} environment \ldots\\
+% \>\> \struct{/text}\\
+% \>\> \struct{itemize}\\
+% \>\>\> \struct{LI}\\
+% \>\>\>\> \struct{Lbl} label \struct{/Lbl}\\
+% \>\>\>\> \struct{LBody}\\
+% \>\>\>\>\> The text of the first item involving \struct{text-unit} as necessary \ldots\\
+% \>\>\>\> \struct{/LBody}\\
+% \>\>\> \struct{/LI}\\
+% \>\>\> \struct{LI}\\
+% \>\>\>\> The second item \ldots{}\\
+% \>\>\> \struct{/LI}\\
+% \>\>\> \ldots{} further items \ldots\\
+% \>\> \struct{/itemize}\\
+% \> \struct{/text-unit}
+% \end{tabbing}
+% The \struct{itemize} is rollmapped to \struct{L}.
+%
+% For some display blocks, such as centered text, we use a simpler
+% strategy. Such blocks still ensure that they are inside a \struct{text-unit}
+% structure but their body uses simple \struct{text} blocks and not
+% \struct{text-unit}\struct{text} inside, e.g., the input
+% \begin{verbatim}
+% This is a paragraph with some
+% \begin{center}
+% centered lines
+%
+% with a paragraph break between them
+% \end{center}
+% followed by some more text.
+% \end{verbatim}
+% will be tagged as follows:
+% \begin{tabbing}
+% \hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\=\hspace*{1em}\= \kill
+% \> \struct{text-unit}\\
+% \>\> \struct{text}\\
+% \>\>\> This is a paragraph with some\\
+% \>\> \struct{/text}\\
+% \>\> \struct{text /O /Layout /TextAlign/Center}\\
+% \>\>\> centered lines\\
+% \>\> \struct{/text}\\
+% \>\> \struct{text /O /Layout /TextAlign/Center}\\
+% \>\>\> with a paragraph break between them\\
+% \>\> \struct{/text}\\
+% \>\> \struct{text}\\
+% \>\>\> followed by some more text.\\
+% \> \struct{/text-unit}
+% \end{tabbing}
+%
+%
+% \subsection{Tagging recipes}
+%
+% There are a number of different tagging recipes that implement
+% different tagging approaches. They are selected through the
+% \key{tagging-recipe} of the \xt{blockenv} template. Currently the
+% following values are implemented:
+% \begin{description}
+% \item[\texttt{standalone}]
+% This recipe does the following:
+% \begin{itemize}
+% \item
+% Ensure that the \xt{blockenv} is not inside a \struct{text-unit}
+% structure. If necessary, close the open one (and any open
+% \struct{text} structure).
+%
+% \item
+% Text inside the body of the environment start with
+% \struct{text-unit}\struct{text} unless the key
+% \key{para-flattened} is set to \texttt{true}
+% (which is most likely the wrong thing to do because we then get just
+% \struct{text} as the structure).
+%
+% \item
+% At the end of the environment close \struct{/text} and possibly an
+% inner \struct{/text-unit} if open.
+%
+% \item
+% Finally, ensure that after the environment a new
+% \struct{text-unit} is started, if appropriate, e.g., if text is following.
+% \end{itemize}
+%
+% \item[\texttt{basic}]
+% This recipe does the following:
+% \begin{itemize}
+% \item
+% Ensure that the \xt{blockenv} is inside a \struct{text-unit}
+% structure, if necessary, start one.
+% \item
+% If inside a \struct{text-unit}\struct{text}, then close the \struct{/text} but
+% leave the \struct{text-unit} open.
+%
+% \item
+% Text inside the body of the environment start with
+% \struct{text-unit}\struct{text} if \key{para-flattened} is set to \texttt{false},
+% otherwise just with \struct{text}.
+%
+% \item
+% At the end of the environment close \struct{/text} and possibly an
+% inner \struct{/text-unit} if open.
+%
+% \item
+% Then look if the environment is followed by an empty line
+% (\cs{par}). If so, close the outer \struct{/text-unit} and start any
+% following text with \struct{text-unit}\struct{text}. Otherwise,
+% don't and following text restarts with a just a \struct{text} (and no
+% paragraph indentation)
+% \end{itemize}
+%
+% \item[\texttt{standard}]
+% This recipe is like the \texttt{basic} one as far as handling
+% \struct{text-unit} and \struct{text} is concerned. In addition
+% \begin{itemize}
+% \item
+% it starts an inner tagging structure (i.e., which is therefore a
+% child of the outer \struct{text-unit}).
+% \item
+% By default this structure is a \struct{Figure} unless overwritten
+% by the key \key{tag-name}. If that key is used, a suitable
+% rollmap needs to be provided for the name given.
+% \item
+% At the end of the environment that inner structure is closed
+% again so that we are back on the \struct{text-unit} level from the outside.
+% \item
+% Then the lookahead for an empty line is done as described previously.
+% \end{itemize}
+%
+%
+%
+% \item[\texttt{list}]
+% This recipe is like the \texttt{standard} one except that
+% \begin{itemize}
+% \item
+% the inner structure is a list (\struct{L}).
+% \item
+% Furthermore everything is set up so that we have list items
+% (\struct{LI}) with suitable substructures (\struct{Lbl} for the item
+% labels and \struct{LBody} for the item bodies).
+% \item
+% If the key \key{tag-name} is specified, this is used as the tag
+% name for the whole list instead of \struct{L}. Of course, it
+% should then have a suitable rollmap.
+% \item
+% If the key \key{tag-class} is specified then this is used as the
+% class attribute. Again, this requires a suitable setup on the outside.
+% \item
+% At the end of the environment the \struct{/LBody}, \struct{/LI}, and
+% \struct{/L} (or the tag name used) are closed.
+% \item
+% Then the lookahead for an empty line is done as described previously.
+% \end{itemize}
+%
+%
+% \end{description}
+%
+%
+%
+%
+%
+%
+% \end{documentation}
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+%
+% \begin{implementation}
+%
+% \section{The Implementation}
+%
+%
+% \begin{macrocode}
+%<*package>
+%<@@=block>
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\ProvidesPackage {latex-lab-testphase-block}
+ [\ltlabblockdate\space v\ltlabblockversion\space
+ blockenv implementation]
+% \end{macrocode}
+%
+% We make use of templates:
+% \begin{macrocode}
+\RequirePackage{xtemplate}
+% \end{macrocode}
+% Generell kernel changes, also loaded by the sec and toc code.
+% \begin{macrocode}
+\RequirePackage{latex-lab-kernel-changes}
+% \end{macrocode}
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \ufi{this variable(s) must be declared:}
+% \begin{macrocode}
+\tl_new:N \l_@@_item_align_tl
+\tl_new:N\l_@@_legacy_env_params_tl
+% \end{macrocode}
+
+% \subsection{Handling \cs{par} after the end of the list}
+%
+% An empty line (or a \cs{par}) after a list has semantic meaning as
+% it defines whether then following text is logically within the same
+% paragraph as the list (no empty line) or whether it starts a new
+% paragraph and the paragraph containing the list ends at the end of
+% the list (empty line after the list).
+% This is handled by \LaTeX{} using a legacy flag called
+% \texttt{@endpe} and set of commands inside the
+% generic \cs{end} (calling \cs{@doendpe}) and as part of the list
+% environments identifying themselves as \enquote{paragraph ending
+% environments} (by setting this flag).
+%
+% For the reimplementation of the list environments including support
+% of tagging we need to augment that mechanism slightly and add some
+% kernel hook(s) to add the tagging code if needed.
+%
+%
+%
+%
+% \begin{macro}{\@doendpe}
+% The original \LaTeXe{} command is augmented to allow for tagging.
+% \begin{macrocode}
+\def\@doendpe{\@endpetrue
+ \def\par
+ {
+ \@restorepar
+ \clubpenalty\@clubpenalty
+% \end{macrocode}
+% At this point we add the tagging code that closes an open
+% \struct{text-unit}, \struct{text} tag combination,
+% if necessary:
+% \begin{macrocode}
+ \__kernel_displayblock_doendpe:
+% \end{macrocode}
+%
+% The standard \cs{par} command (\cs{par_end:}) acts on
+% \texttt{@endpe} and attempts to close a still open \texttt{text-unit}
+% and this would be wrong if it was already closed above. So we
+% have to reset the switch to false first.
+% \begin{macrocode}
+ \@endpefalse
+ \everypar{}
+ \par
+ }
+ \everypar{{\setbox\z@\lastbox}
+ \everypar{}
+ \@endpefalse
+ }
+}
+% \end{macrocode}
+%
+% By default we don't do any tagging:
+% \begin{macrocode}
+\cs_new_eq:NN \__kernel_displayblock_doendpe: \prg_do_nothing:
+% \end{macrocode}
+% The flag itself should be set globally not locally.\fmi{verify
+% that this claim is actually correct!}
+% \begin{macrocode}
+\def\@endpetrue {\global\let\if at endpe\iftrue}
+\def\@endpefalse{\global\let\if at endpe\iffalse}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Object and template interfaces}
+%
+%
+% \begin{objecttype}{blockenv, block, para, list, item}
+% All object types expect a single
+% key--value argument used to tweak template parameters specific to a
+% given use in the document. This section is devoted to template
+% interfaces, and the template code is covered later.
+% \begin{macrocode}
+\DeclareObjectType{blockenv}{1}
+\DeclareObjectType{block}{1}
+\DeclareObjectType{para}{1}
+\DeclareObjectType{list}{1}
+\DeclareObjectType{item}{1}
+% \end{macrocode}
+% \end{objecttype}
+%
+%
+%
+% \begin{template}{blockenv display}
+%
+% \begin{macrocode}
+\DeclareTemplateInterface{blockenv}{display}{1}
+{
+ env-name : tokenlist ,
+ tag-name : tokenlist ,
+ tag-class : tokenlist ,
+ tagging-recipe : tokenlist = standard,
+ level-increase : boolean = true ,
+ setup-code : tokenlist ,
+ block-instance : tokenlist = displayblock ,
+ para-instance : tokenlist ,
+ inner-level-counter : tokenlist,
+ max-inner-levels : tokenlist = 4,
+ inner-instance-type : tokenlist = list ,
+ inner-instance : tokenlist ,
+ para-flattened : boolean = false ,
+ final-code : tokenlist = \ignorespaces ,
+}
+% \end{macrocode}
+% \end{template}
+%
+%
+% \begin{template}{block display}
+%
+% \begin{macrocode}
+\DeclareTemplateInterface{block}{display}{1}
+{
+ heading : tokenlist = , %??
+ beginsep : skip = \topsep ,
+ begin-par-skip : skip = \partopsep ,
+ par-skip : skip = \parsep ,
+ end-skip : skip = \KeyValue{beginsep} , % conflict with name below
+ end-par-skip : skip = \KeyValue{begin-par-skip} ,
+ beginpenalty : integer = \UseName{@beginparpenalty} ,
+ endpenalty : integer = \UseName{@endparpenalty} ,
+ leftmargin : length = \leftmargin ,
+ rightmargin : length = \rightmargin ,
+ parindent : length = \listparindent ,
+% font : tokenlist % maybe add? (or more general for fonts and color)
+}
+% \end{macrocode}
+% \end{template}
+%
+%
+% \begin{template}{para std}
+%
+% \begin{macrocode}
+\DeclareTemplateInterface{para}{std}{1}
+{
+ indent-width : length = \parindent ,
+ start-skip : skip = 0pt ,
+ left-skip : skip = 0pt ,
+ right-skip : skip = 0pt ,
+ end-skip : skip = \@flushglue ,
+ fixed-word-spaces : boolean = false ,
+ final-hyphen-demerits : integer = 5000 ,
+ cr-cmd : tokenlist = \@normalcr ,
+ para-class : tokenlist = justify ,
+}
+% \end{macrocode}
+% \end{template}
+%
+%
+% \begin{template}{list std}
+%
+% \begin{macrocode}
+\DeclareTemplateInterface{list}{std}{1} % optional
+{
+ counter : tokenlist = ,
+ item-label : tokenlist = ,
+ start : integer = 1 ,
+ resume : boolean = false ,
+ item-instance : instance{item} = basic ,
+ item-skip : skip = \itemsep ,
+ item-penalty : integer = \UseName{@itempenalty} ,
+ item-indent : length = 0pt , % was \itemindent
+ label-width : length = \labelwidth ,
+ label-sep : length = \labelsep ,
+ legacy-support : boolean = false ,
+}
+% \end{macrocode}
+% \end{template}
+%
+%
+% \begin{template}{item std}
+%
+% \begin{macrocode}
+\DeclareTemplateInterface{item}{std}{1}
+ {
+ counter-label : function{1} = \arabic{#1} ,
+ counter-ref : function{1} = \KeyValue{counter-label} ,
+ label-ref : function{1} = #1 ,
+ label-autoref : function{1} = item~#1 ,
+ label-format : function{1} = #1 ,
+ label-strut : boolean = false ,
+ label-align : choice {left,center,right,parleft} = right ,
+ label-boxed : boolean = true ,
+ next-line : boolean = false ,
+ text-font : tokenlist ,
+ compatibility : boolean = true ,
+ }
+% \end{macrocode}
+% \end{template}
+%
+%
+%
+%
+%
+%
+% \subsection{Useful helper commands}
+%
+% This section collects \pkg{expl3} commands that will be useful.
+%
+% \begin{macro}{\@@_skip_set_to_last:N,\@@_skip_remove_last:}
+% Set a skiip register to the value of an immediately preceding
+% skip or zero if there was none
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_skip_set_to_last:N #1 {
+ \skip_set:Nn #1 { \tex_lastskip:D }
+}
+% \end{macrocode}
+% Remove a skip previous skip if it is directly in front (not
+% allowed in unrestricted vertical mode).
+% \begin{macrocode}
+\cs_new_eq:NN \@@_skip_remove_last: \tex_unskip:D
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tl_if_novalue:nTF}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_if_novalue:nTF { o }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Debugging}
+%
+%
+% \begin{variable}{\g_@@_debug_bool}
+%
+% \begin{macrocode}
+\bool_new:N \g_@@_debug_bool
+% \end{macrocode}
+% \end{variable}
+%
+%
+% \begin{macro}{\@@_debug:n,\@@_debug_typeout:n}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@@_debug:n \use_none:n
+\cs_new_eq:NN \@@_debug_typeout:n \use_none:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\block_debug_on:,\block_debug_off:,
+% \@@_debug_gset:}
+% \begin{macrocode}
+\cs_new_protected:Npn \block_debug_on:
+ {
+ \bool_gset_true:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \block_debug_off:
+ {
+ \bool_gset_false:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_debug_gset:
+ {
+ \cs_gset_protected:Npx \@@_debug:n ##1
+ { \bool_if:NT \g_@@_debug_bool {##1} }
+ \cs_gset_protected:Npx \@@_debug_typeout:n ##1
+ { \bool_if:NT \g_@@_debug_bool { \typeout{==>~ ##1} } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DebugBlocksOn,\DebugBlocksOff}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \DebugBlocksOn { \block_debug_on: }
+\cs_new_protected:Npn \DebugBlocksOff { \block_debug_off: }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DebugBlocksOff
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Implementation of the document-level block environments}
+%
+% Most such environments are pretty simple: they take an option
+% argument and call a \texttt{blockenv} instance to do the work. At
+% the end of environment we call \cs{endblockenv} to finish.
+%
+%
+% \subsubsection{Displayblock environments}
+%
+%
+% There are two basic block environment which are similar to
+% \LaTeXe{}'s \env{trivlist} except that there aren't degenerated
+% lists and thus have no hidden \cs{item} inside.
+%
+%
+% \begin{environment}{displayblock}
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{displayblock}{ !O{} }
+ { \UseInstance{blockenv}{displayblock} {#1} }
+ { \endblockenv }
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+%
+% \begin{environment}{displayblockflattened}
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{displayblockflattened}{ !O{} }
+ { \UseInstance{blockenv}{displayblockflattened} {#1} }
+ { \endblockenv }
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+%
+%
+%
+%
+%
+% \begin{environment}{center,flushleft,flushright}
+%
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{center} { !O{} }
+ { \UseInstance{blockenv}{center}{#1} }
+ { \endblockenv }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \RenewDocumentEnvironment{flushright} { !O{} }
+ { \UseInstance{blockenv}{flushright}{#1} }
+ { \endblockenv }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \RenewDocumentEnvironment{flushleft} { !O{} }
+ { \UseInstance{blockenv}{flushleft}{#1} }
+ { \endblockenv }
+}
+% \end{macrocode}
+%
+%
+% \end{environment}
+%
+%
+%
+%
+% \subsubsection{Display quote environments}
+%
+%
+% \begin{environment}{quote,quotation}
+%
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{quote}{ !O{} }
+ { \UseInstance{blockenv}{quote} {#1} }
+ { \endblockenv }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \RenewDocumentEnvironment{quotation}{ !O{} }
+ { \UseInstance{blockenv}{quotation} {#1} }
+ { \endblockenv }
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+%
+%
+%
+% \subsubsection{Verbatim environments}
+%
+%
+% \begin{environment}{verbatim,verbatim*}
+%
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{verbatim}{ !O{} }
+ { \UseInstance{blockenv}{verbatim} {#1}
+% \end{macrocode}
+% This is the part of the code where \env{verbatim}
+% and\env{verbatim*} differ.
+% \begin{macrocode}
+ \@setupverbinvisiblespace\frenchspacing\@vobeyspaces
+ \@xverbatim
+ }
+ { \endblockenv }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \RenewDocumentEnvironment{verbatim*}{ !O{} }
+ { \UseInstance{blockenv}{verbatim} {#1}
+ \@setupverbvisiblespace\frenchspacing\@vobeyspaces
+ \@sxverbatim
+ }
+ { \endblockenv }
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+% \paragraph{Helper commands for verbatim}
+%
+%
+% \begin{macro}{\legacyverbatimsetup}
+%
+% This code resembles the \LaTeXe{} verbatim implementation with a
+% slight twist: in \LaTeXe{} each code line was a paragraph using
+% \cs{leftskip}=\cs{@totalleftmargin}. This was possible because
+% the whole environment was implemented as a trivlist. As this is
+% no longer the case setting \cs{leftskip} would alter the layout
+% of a surrounding list. So instead we need to make sure that the
+% paragraph end is executed in a group so that any parshape setup
+% is preserved.
+% \begin{macrocode}
+%<@@=>
+\def\legacyverbatimsetup{%
+ \language\l at nohyphenation
+ \@tempswafalse
+ \def\par{%
+ \if at tempswa
+ \leavevmode \null {\@@par}\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode{\@@par}\penalty\interlinepenalty\fi
+ \fi}%
+ \let\do\@makeother \dospecials
+ \obeylines \verbatim at font \@noligs
+ \everypar \expandafter{\the\everypar \unpenalty}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_set:Nn \l__tag_para_main_tag_tl {codeline}
+ \tagtool{paratag=Code}% oder faster: \tl_set:Nn\l__tag_para_tag_tl{Code}
+}
+%<@@=block>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@setupverbinvisiblespace}
+% In the \pdfTeX{} engine we need to use \cs{pdffakespace} chars
+% for the invisible spaces.
+% \begin{macrocode}
+\newcommand\@setupverbinvisiblespace{}
+\tag_if_active:T {
+ \bool_if:NF\g__tag_mode_lua_bool
+ {
+ \renewcommand\@setupverbinvisiblespace{\def\@xobeysp{\nobreakspace\pdffakespace}}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Standard list environments}
+%
+%
+% \begin{environment}{itemize,enumerate,description}
+%
+% For the standard lists everything is managed by the blockenv instance.
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{itemize}{!O{}}
+ { \UseInstance{blockenv}{itemize} {#1} }
+ { \endblockenv }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \RenewDocumentEnvironment{enumerate}{!O{}}
+ { \UseInstance{blockenv}{enumerate} {#1} }
+ { \endblockenv }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \RenewDocumentEnvironment{description}{!O{}}
+ { \UseInstance{blockenv}{description} {#1} }
+ { \endblockenv }
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsubsection{verse environment}
+%
+% \begin{environment}{verse}
+% The verse environment has not special tagging currently. It is
+% defined as a simple standard list and takes the tagging from there.
+% But it must be redefined so that \cs{itemindent} is correctly set.
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{verse}{ !O{} }
+ {
+ \let\\\@centercr
+ \UseInstance{blockenv}{list}
+ {
+ item-indent=-1.5em,
+ parindent=-1.5em,
+ item-skip=0pt,
+ rightmargin=\leftmargin,
+ leftmargin=\leftmargin+1.5em,
+ #1
+ }
+ \item\relax
+ }
+ { \endblockenv }
+ }
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \begin{environment}{list}
+%
+% The legacy 2e list environment is more complicated as we have to get the
+% extra arguments accounted for.
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{list}{O{} m m }
+ {
+% \end{macrocode}
+% We do this by storing them away and then call the list
+% instance. Inside this instance the \texttt{setup-code} key
+% contains \cs{legacylistsetupcode}, which makes use of the stored values.
+% \begin{macrocode}
+ \tl_set:Nn \@itemlabel {#2}
+ \tl_set:Nn \l_@@_legacy_env_params_tl {#3}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \UseInstance{blockenv}{list} {#1}
+ }
+ { \endblockenv }
+}
+% \end{macrocode}
+%
+% \end{environment}
+%
+%
+%
+% \begin{variable}{\l_@@_env_params_tl}
+% Declare the variable for the parameter argument; \cs{@itemlabel}
+% is already declared in \LaTeXe{}.
+% \begin{macrocode}
+\tl_new:N \l_@@_env_params_tl
+% \end{macrocode}
+% \end{variable}
+%
+%
+% \begin{macro}{\legacylistsetupcode}
+%
+% And here is the extra code for use in the list instance setup
+% inside the key \texttt{setup-code}.
+% \begin{macrocode}
+\cs_new:Npn \legacylistsetupcode {
+% \end{macrocode}
+% Reset values to defaults:
+% \begin{macrocode}
+ \dim_zero:N \listparindent
+ \dim_zero:N \rightmargin
+ \dim_zero:N \itemindent
+% \end{macrocode}
+%
+% By default a \env{list} environment is not numbered:
+% \begin{macrocode}
+ \tl_set:Nn \@listctr {}
+ \legacy_if_set_false:n { @nmbrlist } % needed if lists are nested
+% \end{macrocode}
+% By default there is a simple definition for \cs{makelabel}. It can be
+% overwritten in the second mandatory argument to the list
+% environment (stored in \cs{l_@@_legacy_env_params_tl}) and
+% is used if the instance sets the compatibility key to true.
+% \begin{macrocode}
+ \let\makelabel\@mklab % TODO: customize
+% \end{macrocode}
+% Now we use the argument with parameter settings to update some or
+% all of the above defaults:
+% \begin{macrocode}
+ \l_@@_legacy_env_params_tl
+% \end{macrocode}
+% As we don't know much about this list we can only make a guess about
+% the nature of the list and the setting of the tag name (default
+% \texttt{list} rolemapped to \texttt{L}) and any tag attributes
+% may have to be overwritten in the optional key/value argument. But we do have some hints to play with.
+% \begin{macrocode}
+ \legacy_if:nTF { @nmbrlist }
+ { \tl_set:Nn \l__tag_L_attr_class_tl {enumerate} } % numbered list
+ { \tl_if_empty:NTF \@itemlabel
+ { \tl_set:Nn \l__tag_L_attr_class_tl {list} } % no label
+ { \tl_set:Nn \l__tag_L_attr_class_tl {itemize} } % unnumbered, unordered
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{environment}{trivlist}
+%
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{trivlist}{ !O{} }
+ { \list[#1]{}
+ {
+ \dim_zero:N \leftmargin
+ \dim_zero:N \labelwidth
+ \cs_set_eq:NN \makelabel \use:n
+ }
+ }
+ { \endblockenv }
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsubsection{Theorem-like environments}
+%
+% Theorem-like environments are defined in \LaTeX{} with the help of
+% \cs{newtheorem} declarations. Internally they used a list with a
+% single item. Using lists was convenient back then, but in a tagged
+% document you end up with a strange structure. We therefore alter the
+% mechanism.
+%
+%
+% \begin{macro}{\newtheorem}
+% This is a slightly streamlined version of \cs{newtheorem}, but it
+% still uses a lot of the 2e code for now. Eventually this will change.
+% \begin{macrocode}
+\RenewDocumentCommand \newtheorem { m O{#1} m o }
+{
+ \expandafter\@ifdefinable\csname #1\endcsname
+ {
+ \str_if_eq:nnTF{#1}{#2}
+ {
+ \@definecounter {#2}
+ \IfNoValueTF {#4}
+ { % @ynthm
+ \tl_gset:cx { the #2 }
+ {
+ \@thmcounter{#2}
+ }
+ }
+ { % @xnthm
+ \@newctr{#1}[#4]
+ \tl_gset:cx { the #2 }
+ {
+ \expandafter\noexpand\csname the#4\endcsname
+ \@thmcountersep
+ \@thmcounter{#2}
+ }
+ }
+ }
+ { % @othm
+ \@ifundefined{c@#2}
+ { \@nocounterr{#2} }
+ {
+ \tl_gset:cn { the #1 }
+ { \UseName { the #2 } }
+ }
+ }
+ \global\@namedef{#1} { \@thm{#2}{#3} }
+ \global\@namedef{end#1}{ \@endtheorem }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@thm}
+% \cs{@thm} executes \cs{refstepcounter} too early for hyperref
+% and structure destinations: the generated target is outside the structure
+% and can be separated from the theorem by a page break. We therefore move
+% the anchor setting into \cs{@begintheorem}. \cs{@begintheorem} doesn't
+% currently get the name of the counter as argument, so we store it in variable
+% for now, to be able to pass it along.
+% \begin{macrocode}
+\tl_new:N \l_@@_thm_current_counter_tl
+\def\@thm#1#2{%
+ \@kernel at refstepcounter{#1}
+ \tl_set:Nn \l_@@_thm_current_counter_tl{#1}
+ \@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}}
+% \end{macrocode}
+% To avoid that hyperref overwrites the definition again we must its patch:
+% \begin{macrocode}
+\def\hyper at nopatch@thm{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@begintheorem,\@opargbegintheorem}
+%
+% The \cs{@thm} command expands to either \cs{@beginthorem} or
+% \cs{@opargbegintheorem}. For the moment we stick with this as it
+% will help with the transition. But instead of using a
+% \env{trivlist} we use a blockenv and some tagging for the title
+% (as a Caption).
+% We do not want potential tagging from \cs{textbf} here,
+% so we use \cs{bfseries} to set the font. The commands set also the link targets
+% which should be inside the main structure.
+% \begin{macrocode}
+\def\@begintheorem#1#2{
+ \UseInstance{blockenv}{theorem}{}
+ \tagpdfparaOff
+ \mode_leave_vertical:
+ \MakeLinkTarget{\l_@@_thm_current_counter_tl}
+ \tag_struct_begin:n{tag=Caption}
+ \group_begin:
+ \bfseries
+ \tag_mc_begin:n {}
+ #1\
+ \tag_mc_end:
+ \tag_struct_begin:n{tag=Lbl}
+ \tag_mc_begin:n {}
+ #2
+ \tag_mc_end:
+ \tag_struct_end:
+ \group_end:
+ \tag_struct_end:
+ \tagpdfparaOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_start_para_structure_unconditionally:n { \PARALABEL }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \itshape
+ \hskip\labelsep
+ \ignorespaces
+}
+\def\@opargbegintheorem#1#2#3{
+ \UseInstance{blockenv}{theorem}{}
+ \tagpdfparaOff
+ \mode_leave_vertical:
+ \MakeLinkTarget{\l_@@_thm_current_counter_tl}
+ \tag_struct_begin:n{tag=Caption}
+ \group_begin:
+ \bfseries
+ \tag_mc_begin:n {}
+ #1\
+ \tag_mc_end:
+ \tag_struct_begin:n{tag=Lbl}
+ \tag_mc_begin:n {}
+ #2
+ \tag_mc_end:
+ \tag_struct_end:
+ \tag_mc_begin:n {}
+ \ (#3)
+ \tag_mc_end:
+ \group_end:
+ \tag_struct_end:
+ \tagpdfparaOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_start_para_structure_unconditionally:n { \PARALABEL }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \itshape
+ \hskip\labelsep
+ \ignorespaces
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@endtheorem{\endblockenv}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \subsection{Implementation of templates}
+%
+%
+% \subsubsection{Implementation of blockenv templates \ldots}
+%
+%
+%
+% \begin{macro}{\g_block_nesting_depth_int}
+% \LaTeXe{} already has a counter to record the nesting depth of
+% blocks, but we want our own name because it isn't really tied to
+% \enquote{lists} any more. However, \cs{@listdepth} is really part
+% of the legacy interface (for example \env{minipage} alters it to
+% point to a different counter) so that we are stuck with using at
+% least indirectly for now and the following line makes this look
+% like an L3 integer variable but internally expands to \cs{@listdepth}:
+% \begin{macrocode}
+\cs_new:Npn \g_block_nesting_depth_int { \@listdepth } % a fake int
+ % for now
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{template}{blockenv display}
+%
+% \begin{macrocode}
+\DeclareTemplateCode{blockenv}{display}{1}
+{
+ env-name = \l_@@_env_name_tl ,
+ tag-name = \l_@@_tag_name_tl ,
+ tag-class = \l_@@_tag_class_tl ,
+ tagging-recipe = \l_@@_tagging_recipe_tl ,
+ level-increase = \l_@@_level_incr_bool ,
+ setup-code = \l_@@_setup_code_tl ,
+ block-instance = \l_@@_block_instance_tl ,
+ para-instance = \l_@@_para_instance_tl ,
+ inner-level-counter = \l_@@_inner_level_counter_tl ,
+ max-inner-levels = \l_@@_max_inner_levels_tl ,
+ inner-instance-type = \l_@@_inner_instance_type_tl ,
+ inner-instance = \l_@@_inner_instance_tl ,
+ para-flattened = \l__tag_para_flattened_bool ,
+ final-code = \l_@@_final_code_tl ,
+}
+{
+ \@@_debug_typeout:n{\l_@@_env_name_tl -env-start}
+%
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{blockenv}{display}{#1} }
+%
+% \end{macrocode}
+% We need to know later if we have nested blockenvs inside
+% a flattened environment. Whenever we start a new blockenv we
+% increment \cs{\l_@@_flattened_level_int} if it is already
+% different from zero. If it is zero we increment it if flattening
+% is requested.
+% Thus a value of \texttt{0} means no flattening requested so far
+% and \texttt{1} means this is the first blockenv requesting
+% flattening. In either case we have to make sure that the blockenv
+% is surrounded by a \texttt{text-unit} tag, while for any value above
+% \texttt{1} we have to omit the \texttt{text-unit}.
+ % \begin{macrocode}
+ \int_compare:nNnTF \l_@@_flattened_level_int > 0
+ {
+ \int_incr:N \l_@@_flattened_level_int
+ }
+ {
+ \bool_if:NT \l__tag_para_flattened_bool
+ {
+ \int_incr:N \l_@@_flattened_level_int
+ }
+ }
+%
+ \tl_if_empty:NF \l_@@_inner_level_counter_tl
+ {
+ \int_compare:nNnTF \l_@@_inner_level_counter_tl >
+ { \l_@@_max_inner_levels_tl - 1 }
+ { \@toodeep }
+ { \int_incr:N \l_@@_inner_level_counter_tl } % not clean "o"?
+ }
+% \end{macrocode}
+% Legacy defaults are only roped in if the list level changes. For
+% display blocks that remain on the same level the current values
+% are kept.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_level_incr_bool
+ {
+ \int_compare:nNnTF \g_block_nesting_depth_int >
+ { \c at maxblocklevels - 1 }
+ { \@toodeep }
+ {
+ \int_gincr:N \g_block_nesting_depth_int
+% \end{macrocode}
+% If there are no legacy defaults for that level then the next line
+% does nothing, i.e., the current values (from the last level
+% become the defaults for the next.
+% \begin{macrocode}
+ \use:c { @list \int_to_roman:n { \g_block_nesting_depth_int } }
+ }
+ }
+% \end{macrocode}
+% If we are doing tagging we load one of the available recipes for
+% tagging, which alters various kernel hooks to add appropriate
+% tagging structures.
+% \begin{macrocode}
+ \tag_if_active:T { \use:c { @@_recipe_ \l_@@_tagging_recipe_tl : } }
+% \end{macrocode}
+% Then run the setup code if any is given in the instance.
+% \begin{macrocode}
+ \l_@@_setup_code_tl
+% \end{macrocode}
+% Next call a block instance at the appropriate level passing it
+% any key/value list provided in the optional argument (keys that
+% are not recognized are ignored---currently with an
+% error).
+% \begin{macrocode}
+ \@@_debug_typeout:n{use~ instance:~
+ \l_@@_block_instance_tl - \int_use:N \g_block_nesting_depth_int }
+ \UseInstance{block}
+ { \l_@@_block_instance_tl - \int_use:N
+ \g_block_nesting_depth_int }
+ {#1}
+% \end{macrocode}
+% After the block instance call the para and then inner (list)
+% instance if either or both are
+% specified (which may not be the case).
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_para_instance_tl
+ {
+ \@@_debug_typeout:n{use~ para~ instance:~ \l_@@_para_instance_tl }
+% \end{macrocode}
+% For now we don't offer to alter instance parameters here so we
+% pass an empty argument.
+% \begin{macrocode}
+ \UseInstance{para}{ \l_@@_para_instance_tl } {}
+ }
+% \end{macrocode}
+% The inner instance may have its own levels or none depending
+% on which the instance name differs. Again we pass it the optional
+% key/value list.
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_inner_instance_tl
+ {
+ \@@_debug_typeout:n{use~ instance:~ \l_@@_inner_instance_tl
+ \tl_if_empty:NF \l_@@_inner_level_counter_tl
+ { - \int_use:N \l_@@_inner_level_counter_tl }}
+ \UseInstance{ \l_@@_inner_instance_type_tl }
+ { \l_@@_inner_instance_tl
+ \tl_if_empty:NF \l_@@_inner_level_counter_tl
+ { - \int_use:N \l_@@_inner_level_counter_tl } % not clean
+ % use "o"?
+ }
+ {#1}
+ }
+% \end{macrocode}
+% We finish off with \cs{l_@@_final_code_tl} which defaults to
+% \cs{ignorespaces} so that spaces between \verb=\begin{...}= and
+% the start of the text are ignored.
+% \begin{macrocode}
+ \l_@@_final_code_tl
+}
+% \end{macrocode}
+% \end{template}
+%
+%
+% \begin{macro}{\l_@@_flattened_level_int}
+% Count the levels of nested blockenvs starting with the first that
+% is \enquote{flattened}.
+% \begin{macrocode}
+\int_new:N \l_@@_flattened_level_int
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c at maxblocklevels}
+% A counter to increase or decrease the number of supported
+% level. If increased, one needs to supply additional level instances.
+% \begin{macrocode}
+\newcounter{maxblocklevels}
+\setcounter{maxblocklevels}{6}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endblockenv}
+% The code executed when a blockenv ends is 99\% the same for all
+% blockenvs (at least up to now). Small differences exist, though. They
+% are accounted for first in the conditionals.
+%
+% We make this a public command so that new block environments can
+% be set up without the need to resort to L3 layer
+% programming.\fmi{name is bad}
+% \begin{macrocode}
+\cs_new:Npn \endblockenv {
+ \@@_debug_typeout:n{blockenv~ common~ ending \on at line}
+% \end{macrocode}
+% If this block was incrementing the level we have to decrement it
+% now again:
+% \begin{macrocode}
+ \bool_if:NT \l_@@_level_incr_bool
+ { \int_gdecr:N \g_block_nesting_depth_int }
+% \end{macrocode}
+% If this block was a list and there are still \cs{item} labels to
+% be placed we move to horizontal mode to get them typeset.
+% \begin{macrocode}
+ \legacy_if:nT { @inlabel }
+ {
+ \mode_leave_vertical:
+ \legacy_if_gset_false:n { @inlabel }
+ }
+% \end{macrocode}
+% In a pure ``displayblock'' scenario \texttt{@newlist} will be
+% always false and the code bypassed, but we may have an outer list
+% followed immediately by a displayblock (with the \cs{item} missing)
+% \begin{macrocode}
+ \legacy_if:nT { @newlist }
+ {
+ \@noitemerr
+ \legacy_if_gset_false:n { @newlist }
+ }
+ \mode_if_horizontal:TF
+ { \@@_skip_remove_last: \@@_skip_remove_last: \par }
+ { \@inmatherr{\end{\@currenvir}} }
+% \end{macrocode}
+% Once we are back in vertical mode we can add the appropriate
+% closing tagging structure(s), if we are doing tagging.
+% \begin{macrocode}
+ \__kernel_displayblock_end:
+% \end{macrocode}
+% What to do in terms of vertical spacing in different situations
+% is still somewhat open to debate, right now this is more or less
+% implementing what \LaTeXe{} list environment have been
+% doing.\fmi{some redesign/extensions here?}
+% \begin{macrocode}
+% \@@_debug_typeout:n{@noparlist =
+% \legacy_if:nTF { @noparlist }{true}{false}}
+ \legacy_if:nF { @noparlist }
+ {
+ \@@_skip_set_to_last:N \l_tmpa_skip
+ \dim_compare:nNnT \l_tmpa_skip > \c_zero_dim
+ {
+ \skip_vertical:n { - \l_tmpa_skip }
+ \skip_vertical:n { \l_tmpa_skip + \parskip - \@outerparskip }
+ }
+ \addpenalty \@endparpenalty
+ \addvspace \l_@@_topsepadd_skip
+% \end{macrocode}
+% \LaTeXe{} triggered the paragraph handling after a list at this
+% point here, i.e., only if the list didn't start a paragraph. One
+% can make a case for that, but it can be somewhat surprising to
+% the user and there is a good argument that even such a list could
+% be followed explanatory text that is part of the same paragraph
+% and doesn't start a new one.\fmi{decide which logic we want to
+% use! If the old logic is used we need to close the text-unit
+% ourselves in the true branch}
+% \begin{macrocode}
+% \legacy_if_gset_true:n { @endpe }
+ }
+% \end{macrocode}
+% So this is for now always done. Probably \cs{l_@@_topsepadd_skip} above
+% should be added only if the paragraph ends here and not if it
+% continues, so this need some further cleanup.\fmi{decide}
+%
+% Finally, we have a socket that handles the \cs{par} handling
+% after the block. Normally, we use it with the \plug{on} plug (check for a
+% following \cs{par}) but in the case of standalone environments we
+% assign it the \plug{off} plug.
+% \begin{macrocode}
+ \socket_use:n {tagsupport/block-endpe}
+}
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \begin{macro}{\__kernel_displayblock_end:}
+% The kernel hook for tagging at the end of the block.
+% \begin{macrocode}
+\cs_new:Npn \__kernel_displayblock_end: {
+ \@@_debug_typeout:n{\detokenize{__kernel_displayblock_end:}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{socketdecl}{tagsupport/block-endpe}
+% This socket is responsible for the end environment \cs{par}
+% handling. We define two plugs for it (\plug{on} and \plug{off}).
+% \begin{macrocode}
+\socket_new:nn {tagsupport/block-endpe}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{plugdecl}{on,off}
+% The plugs set the legacy \texttt{@endpe} switch. This must always
+% happen because block environments with different settings can be nested
+% and should not inherit the setting from the outer environment.
+% \begin{macrocode}
+\socket_new_plug:nnn{tagsupport/block-endpe}{on}
+ { \legacy_if_gset_true:n { @endpe } }
+\socket_new_plug:nnn{tagsupport/block-endpe}{off}
+ { \legacy_if_gset_false:n { @endpe } }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\socket_assign_plug:nn{tagsupport/block-endpe}{on}
+% \end{macrocode}
+% \end{plugdecl}
+%
+%
+%
+%
+%
+% \subsubsection{Implementation of para templates \ldots}
+%
+% \begin{template}{para std}
+%
+% \begin{macrocode}
+\DeclareTemplateCode{para}{std}{1}
+{
+ indent-width = \parindent ,
+ start-skip = \l__par_start_skip , % name??
+ left-skip = \leftskip ,
+ right-skip = \rightskip ,
+ end-skip = \parfillskip ,
+ fixed-word-spaces = \l__par_fixed_word_spaces_bool , % name??
+ final-hyphen-demerits = \finalhyphendemerits ,
+ cr-cmd = \\ ,
+ para-class = \l_tag_para_attr_class_tl ,
+}
+{
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{para}{std}{#1} }
+ \skip_set:Nn \@rightskip \rightskip
+}
+% \end{macrocode}
+% \end{template}
+%
+%
+%
+%
+%
+% \subsubsection{Implementation of block templates \ldots}
+%
+%
+%
+%
+%
+% \begin{template}{block display}
+%
+% \begin{macrocode}
+\DeclareTemplateCode{block}{display}{1}
+{
+ heading = \l_@@_heading_tl ,
+ beginsep = \topsep ,
+ begin-par-skip = \partopsep ,
+ par-skip = \parsep ,
+ end-skip = \l_@@_botsep_skip ,
+ end-par-skip = \l_@@_parbotsep_skip ,
+ beginpenalty = \@beginparpenalty ,
+ endpenalty = \@endparpenalty ,
+ rightmargin = \rightmargin ,
+ leftmargin = \leftmargin ,
+ parindent = \listparindent ,
+}
+{
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{block}{display}{#1} }
+% \end{macrocode}
+% \fmi{generalize heading usage (or drop?)}
+% \begin{macrocode}
+ \tl_if_blank:oF \l_@@_heading_tl
+ { \mode_leave_vertical: \textbf{\l_@@_heading_tl} } % TODO customize
+% \end{macrocode}
+% The code largely follows the logic of \LaTeXe{}'s \env{trivlist}
+% implementation as far as it applicable for the \enquote{display
+% block} but coded using the L3 programming layer. However, we keep
+% all the legacy variables (e.g., \texttt{@noskipsec}) if there is
+% some chance that they are set in classes or packages.
+% \begin{macrocode}
+ \legacy_if:nT { @noskipsec } { \mode_leave_vertical: }
+ \skip_set:Nn \l_@@_topsepadd_skip { \topsep }
+ \mode_if_vertical:TF
+ {
+ \skip_add:Nn \l_@@_topsepadd_skip { \partopsep }
+% \end{macrocode}
+% At this point it is safe to add tagging structure(s) so we have
+% a kernel-owned hook here for tagging. This is used to possibly
+% start a paragraph structure (to surround the block, for example,
+% in case of lists) and possibly do some other preparation for
+% tagging the block.
+% \begin{macrocode}
+ \__kernel_displayblock_beginpar_vmode:
+ }
+ {
+% \end{macrocode}
+% If we are in horizontal mode then the displayblock has to return
+% to vertical mode now (after removing any immediately preceding
+% skip or kern. But before we actually issue the\cs{par} we execute
+% a kernel hook in which we can add tagging code. This hook is
+% \enquote{weird} because by default it does nothing, but if
+% tagging is wanted it takes an argument and grabs the following
+% \cs{par} in order to put tagging code before and after the \cs{par}.
+% \begin{macrocode}
+ \@@_skip_remove_last: \@@_skip_remove_last:
+ \__kernel_displayblock_beginpar_hmode:w \par
+ }
+% \end{macrocode}
+% Now we are back to legacy list implementation \ldots
+% \begin{macrocode}
+ \legacy_if:nTF { @inlabel }
+ {
+ \legacy_if_set_true:n { @noparitem }
+ \legacy_if_set_true:n { @noparlist }
+ }
+ {
+ \legacy_if:nT { @newlist } { \@noitemerr }
+ \legacy_if_set_false:n { @noparlist }
+ \skip_set_eq:NN \l_@@_effective_top_skip \l_@@_topsepadd_skip
+ }
+ \skip_add:Nn \l_@@_effective_top_skip { \parskip }
+% \end{macrocode}
+% Next lines set some paragraph defaults, this may get overwritten
+% if there is a \key{para-instance} specified on the \xt{blockenv}.
+% \begin{macrocode}
+ \skip_zero:N \leftskip
+ \skip_set_eq:NN \rightskip \@rightskip
+ \skip_set_eq:NN \parfillskip \@flushglue
+% \end{macrocode}
+% The next lines establish a parshape which is retained across
+% paragraphs be executing \cs{para_end:} within a group and thus
+% reestablishing the parshape for the next paragraph again. In case
+% a list got started \cs{par} is ignored until we have seen an
+% \cs{item} (or we have executed \cs{par} one thousand times.
+% \begin{macrocode}
+ \int_zero:N \par at deathcycles
+ \@setpar
+ {
+ \legacy_if:nTF { @newlist }
+ {
+ \int_incr:N \par at deathcycles
+ \int_compare:nNnTF \par at deathcycles > { 1000 }
+ { \@noitemerr
+ { \para_end: }
+ }
+ }
+ {
+ { \para_end: }
+ }
+ }
+ \skip_set_eq:NN \@outerparskip \parskip
+ \skip_set_eq:NN \parskip \parsep
+ \dim_set_eq:NN \parindent \listparindent
+ \dim_add:Nn \linewidth { - \rightmargin - \leftmargin }
+ \dim_add:Nn \@totalleftmargin { \leftmargin }
+ \tex_parshape:D 1 ~ \@totalleftmargin \linewidth
+% \end{macrocode}
+% This is the point where we are ready to add the tagging structure
+% for the block, e.g., an \verb=<L>=, a \verb=<Figure>= or some
+% other structure.
+% \begin{macrocode}
+ \__kernel_displayblock_begin:
+% \end{macrocode}
+% Finally, we have to output the vertical separation and penalty at
+% the start of the block and make corrections for a change in
+% \cs{parskip} and some other housekeeping, unless this block is inside a list and the list
+% \cs{item} has not yet placed. In that case the vertical
+% space and penalty us suppressed. This
+% is controled through the legacy switches \texttt{@noparitem},
+% \texttt{minipage}, and \texttt{@nobreak}.
+% \begin{macrocode}
+ \legacy_if:nTF { @noparitem }
+ {
+ \legacy_if_set_false:n { @noparitem }
+ \hbox_gset:Nn \g_@@_labels_box
+ {
+ \skip_horizontal:n { - \leftmargin }
+ \hbox_unpack_drop:N \g_@@_labels_box
+ \skip_horizontal:n { \leftmargin }
+ }
+% \end{macrocode}
+% \fmi{document 2e logic used here}
+% \begin{macrocode}
+ \legacy_if:nF { @minipage } % Why this chunk of code?
+ {
+ \@@_skip_set_to_last:N \l_@@_tmpa_skip
+ \skip_vertical:n { - \l_@@_tmpa_skip }
+ \skip_vertical:n { \l_@@_tmpa_skip + \@outerparskip - \parskip }
+ }
+ }
+ {
+ \legacy_if:nTF { @nobreak }
+ { \addvspace{\skip_eval:n{\@outerparskip-\parskip}} }
+ {
+ \addpenalty \@beginparpenalty
+ \addvspace \l_@@_effective_top_skip
+ \addvspace{-\parskip}
+ }
+ }
+}
+% \end{macrocode}
+%
+%
+% Extra keys to support enumitem conventions:
+% \begin{macrocode}
+\keys_define:nn { template/block/display }
+{
+ ,topsep .skip_set:N = \topsep
+ ,partopsep .skip_set:N = \partopsep
+ ,listparindent .skip_set:N = \listparindent
+}
+% \end{macrocode}
+% \end{template}
+%
+%
+%
+% \begin{macro}{\__kernel_displayblock_begin:,
+% \__kernel_displayblock_beginpar_hmode:w,
+% \__kernel_displayblock_beginpar_vmode:}
+% The internal kernel hooks for tagging.
+% \begin{macrocode}
+\cs_new:Npn \__kernel_displayblock_begin: {
+ \@@_debug_typeout:n{\detokenize{__kernel_displayblock_begin:}}
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new:Npn \__kernel_displayblock_beginpar_hmode:w {
+ \@@_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_hmode:w}}
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new:Npn \__kernel_displayblock_beginpar_vmode: {
+ \@@_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_vmode:}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsubsection{Implementation of list templates \ldots}
+%
+%
+%
+% \begin{macro}{\@itemlabel,\@listctr}
+% Both \cs{@itemlabel} and \cs{@listctr} from the \LaTeXe{} list
+% implementation are used (or set) by various packages. We
+% therefore use them too, so that these packages have a fighting
+% chance to work with the new tagging-aware implementation for
+% \env{list}.
+% \begin{macrocode}
+\tl_new:N \@itemlabel % should have a top-level definition
+\tl_new:N \@listctr % should have a top-level definition
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{template}{list std}
+%
+% This template implements numbered and unnumbered lists and can
+% be combined with display blocks or with inline blocks.
+% \begin{macrocode}
+\DeclareTemplateCode{list}{std}{1}
+{
+ counter = \l_@@_counter_tl,
+ item-label = \l_@@_item_label_tl,
+ start = \l_@@_counter_start_int ,
+ resume = \l_@@_resume_bool ,
+ item-instance = \@@_item_instance:n ,
+ item-skip = \itemsep ,
+% item-par-skip = \parsep ,
+ item-penalty = \@itempenalty ,
+ item-indent = \itemindent ,
+ label-width = \labelwidth ,
+ label-sep = \labelsep ,
+ legacy-support = \l_@@_legacy_support_bool , % FMi questionable
+}
+{
+ \@@_debug_typeout:n{template:list:std}
+%
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{list}{std}{#1} }
+% \end{macrocode}
+% Has this list a counter name defined in the instance?
+% \begin{macrocode}
+ \tl_if_empty:NTF \l_@@_counter_tl
+ {
+% \end{macrocode}
+% If not we check if \cs{@listctr} has a non-empty value to be used
+% for the list counter.
+%
+% We better test for blank not empty in case somebody had defined
+% \cs{@listctr} using \cs{renewcommand} or \cs{cs_set:Npn}.
+% \begin{macrocode}
+ \tl_if_blank:oF \@listctr
+ {
+% \end{macrocode}
+% In that case \texttt{@nmbrlist} should have been set too, for
+% example, through \cs{usecounter}, so we do not set it
+% explicitly. However, we check if we should resume a previous list.
+% \begin{macrocode}
+ \bool_if:NF \l_@@_resume_bool
+ {
+ \int_gset:cn{ c@ \@listctr }
+ { \l_@@_counter_start_int - 1 }
+ }
+ }
+% \end{macrocode}
+% If \cs{@listctr} is not set then we have definitely an unnumbered list.
+% \begin{macrocode}
+ { \@nmbrlistfalse }
+ }
+% \end{macrocode}
+% If a counter is set in the list instance we use that
+% one. This should be the name of a \LaTeX{} counter that is
+% already allocated externally---no runtime check is made for this:
+% if it is not declared one will get \enquote{no such counter}
+% error when the list is used.
+% \begin{macrocode}
+ {
+ \@nmbrlisttrue
+ \tl_set_eq:NN \@listctr \l_@@_counter_tl
+ \bool_if:NF \l_@@_resume_bool
+ {
+ \int_gset:cn{ c@ \@listctr }
+ { \l_@@_counter_start_int - 1 }
+ }
+ }
+% \end{macrocode}
+% Does the current instance has an item label representation? This
+% would be possible whether or not we have a numbered list. If yes,
+% then we use this for \cs{@itemlabel}, otherwise we expect that
+% \cs{@itemlabel} is provided from the outside, e.g., as part of
+% the \env{list} environment argument.
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_item_label_tl
+ {
+ \tl_set_eq:NN \@itemlabel \l_@@_item_label_tl
+ }
+% \end{macrocode}
+% finally, we signal that we are at the start of a new list (which
+% effects how the first \cs{item} is handled and how \cs{par}
+% commands are interpreted.
+% \begin{macrocode}
+ \legacy_if_gset_true:n { @newlist }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_debug_typeout:n{template:list:std~end}
+}
+% \end{macrocode}
+%
+%
+% Extra keys to support enumitem conventions:
+% \begin{macrocode}
+\keys_define:nn { template/list/std }
+{
+ ,nosep .code:n =
+ \dim_zero:N \itemsep
+ \dim_zero:N \parsep
+ \dim_zero:N \topsep
+ \dim_zero:N \l_@@_botsep_skip
+ \dim_zero:N \l_@@_parbotsep_skip
+ ,midsep .skip_set:N = \topsep
+}
+% \end{macrocode}
+%
+% \end{template}
+%
+%
+% \subsubsection{Implementation of \cs{item} template(s)}
+%
+%
+%
+% \begin{template}{item std}
+% The item template has one hidden key \texttt{label} which is not available on the
+% template for setting because it is only used to receive any
+% optional data passed to the \cs{item} command. We therefore
+% declare it with \cs{keys_define:nn} and ensure that the optional
+% argument data to \cs{item} (if it is not a key/value list
+% already) is passed to this \texttt{label} key.
+% \begin{macrocode}
+\keys_define:nn { template/item/std }
+ { label .tl_set:N = \l_@@_label_given_tl }
+% \end{macrocode}
+%
+% \fmi{alignment is mostly wrong (test short medium and multiline
+% labels)}
+% \begin{macrocode}
+\DeclareTemplateCode{item}{std}{1}
+ {
+ counter-label = \@@_counter_label:n ,
+ counter-ref = \@@_counter_ref:n ,
+% \end{macrocode}
+% \fmi{next set of key not yet used}
+% \begin{macrocode}
+ label-ref = \@@_label_ref:n ,
+ label-autoref = \@@_label_autoref:n ,
+ label-format = \@@_label_format:n ,
+ label-strut = \l_@@_label_strut_bool ,
+ label-boxed = \l_@@_label_boxed_bool ,
+ next-line = \l_@@_next_line_bool ,
+ text-font = \l_@@_text_font_tl ,
+ compatibility = \l_@@_item_compatibility_bool ,
+% \end{macrocode}
+% This probably needs a different implementation (and needs completing)\fmi{complete}
+% \begin{macrocode}
+ label-align = {
+ left = \tl_set:Nn \l_@@_item_align_tl { \relax \hss } ,
+ center = \tl_set:Nn \l_@@_item_align_tl { \hss \hss } ,
+ right = \tl_set:Nn \l_@@_item_align_tl { \hss \relax } ,
+ parleft = \NOT_IMPLEMENTED ,
+ } ,
+ }
+% \end{macrocode}
+% Then typeset the label at its natural width by applying
+% \cs{@@_make_label_box:n} to the label given or to a label constructed
+% from the counter. If it is boxed and reasonably short, add padding to
+% make it at least of size \tn{labelwidth}, then add another layer of
+% box. This way, when we unpack it in \cs{g_@@_labels_box} it correctly
+% remains boxed in those cases. Afterwards, in the \texttt{nextline}
+% case add \tn{newline} if the label did not fit in the allotted space.
+% \begin{macrocode}
+ {
+ \@@_debug_typeout:n{template:item:std}
+% \end{macrocode}
+%
+% First deal with the key--value input, which in particular may
+% provide a value for the label (the usual optional argument of
+% \cs{item}). For this we set \cs{l_@@_label_given_tl} to
+% \cs{c_novalue_tl} so that we can identify if an optional argument
+% was given.
+% \begin{macrocode}
+ \tl_set_eq:NN \l_@@_label_given_tl \c_novalue_tl
+ \tl_if_empty:nF{#1}{ \SetTemplateKeys{item}{std}{#1} }
+% \end{macrocode}
+% If no optional argument was given then \cs{l_@@_label_given_tl}
+% is still equal to \cs{c_novalue_tl} and so we can distinuish
+% that from \verb=\item[]=.
+%
+% \begin{macrocode}
+ \tl_if_novalue:oTF \l_@@_label_given_tl
+ {
+% \end{macrocode}
+% The rest of the code for this template needs work and is both
+% incomplete and partly wrong.\fmi{fix}
+% \begin{macrocode}
+ \tl_if_blank:oF \@listctr { \@kernel at refstepcounter \@listctr }
+ \bool_if:NTF \l_@@_item_compatibility_bool % not sure that conditional
+ % makes sense
+ { \@@_make_label_box:n { \MakeLinkTarget[\@listctr]{}\@itemlabel } } % TODO ?
+ { \@@_make_label_box:n { \MakeLinkTarget[\@listctr]{}\@@_counter_label:n { \@listctr } } }
+ }
+ {
+ \@@_debug_typeout:n{item~ with~ optional}
+ \@@_make_label_box:n { \l_@@_label_given_tl } }
+ \bool_if:nT
+ {
+ \l_@@_label_boxed_bool
+ && \dim_compare_p:n { \box_wd:N \l_@@_one_label_box <= \linewidth } % TODO: is \linewidth correct?
+ }
+ {
+ \dim_compare:nNnT
+ { \box_wd:N \l_@@_one_label_box } < \labelwidth
+ {
+ \hbox_set_to_wd:Nnn \l_@@_one_label_box { \labelwidth }
+ {
+ \exp_after:wN \use_i:nn \l_@@_item_align_tl
+% \end{macrocode}
+% FMi: \LaTeXe{} keeps the label boxed inside (not unboxed). This
+% means that the content stays rigid and does not vary based on
+% glue setting in the line with the label.
+% There are cases where we do want the unboxed version (I think
+% enumitem offers that in some cases too) but it should probably
+% not the default.
+% \begin{macrocode}
+% \hbox_unpack_drop:N \l_@@_one_label_box %TODO: customize?
+ \box_use_drop:N \l_@@_one_label_box
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \exp_after:wN \use_ii:nn \l_@@_item_align_tl
+ }
+ }
+ \hbox_set:Nn \l_@@_one_label_box
+ { \box_use_drop:N \l_@@_one_label_box }
+ }
+ \dim_compare:nNnTF { \box_wd:N \l_@@_one_label_box } > \labelwidth
+ { \bool_set_true:N \l_@@_long_label_bool }
+ { \bool_set_false:N \l_@@_long_label_bool }
+ \hbox_gset:Nn \g_@@_labels_box
+ {
+ \hbox_unpack_drop:N \g_@@_labels_box
+ \skip_horizontal:n { \itemindent - \labelsep - \labelwidth }
+ \hbox_unpack_drop:N \l_@@_one_label_box
+ \skip_horizontal:n { \labelsep }
+ \bool_if:NT \l_@@_next_line_bool
+ { \bool_if:NT \l_@@_long_label_bool { \nobreak \hfil \break } }
+ % version of \newline inside an hbox that will be unpacked
+ }
+ % \skip_set_eq:NN \parsep \l_@@_item_parsep_skip TODO??? FMi
+ % what's that?
+ \dim_set_eq:NN \parindent \listparindent
+% \end{macrocode}
+% Placing the list label(s) is done when the paragraph for the
+% \cs{item} is started, which executes \cs{@@_item_everypar:}
+% inside \hook{para/begin}. By default this command does nothing, now we
+% change it to attach the pending label or labels.
+% \begin{macrocode}
+ \cs_set_eq:NN \@@_item_everypar: \@@_item_everypar_std:
+ }
+% \end{macrocode}
+% \end{template}
+%
+%
+%
+%
+% \begin{variable}{\l_@@_one_label_box, \g_@@_labels_box}
+% Each label is typeset in \cs{l_@@_one_label_box} to be measured.
+% Once this is ready, it is put (boxed or unboxed) in
+% \cs{g_@@_labels_box}, together with any pending labels (for the case
+% where a list begins just after \tn{item}). This is an analogue of
+% \LaTeXe{}'s \tn{@labels}, but it is always unboxed before use, to
+% support both boxed and unboxed labels.
+% \begin{macrocode}
+\box_new:N \l_@@_one_label_box
+\box_new:N \g_@@_labels_box
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_long_label_bool}
+% Track whether the \cs{l_@@_one_label_box} is larger than
+% \tn{labelwidth}.
+% \begin{macrocode}
+\bool_new:N \l_@@_long_label_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_make_label_box:n, \@@_label_format:x}
+% Make one label, wrapped in \cs{@@_label_format:n}, with an
+% appropriate \tn{strut} and possibly \tn{makelabel} in compatibility
+% mode (used for the \env{list} environment).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_make_label_box:n #1
+ {
+ \hbox_set:Nn \l_@@_one_label_box
+ {
+% \end{macrocode}
+% If we do tagging then the contents of this box may need to be
+% wrapped into a structure, e.g., \verb=<Lbl>=.
+% \begin{macrocode}
+ \__kernel_list_label_begin:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_label_format:n
+ {
+ \bool_if:NT \l_@@_label_strut_bool { \strut }
+ \bool_if:NTF \l_@@_legacy_support_bool
+ \makelabel
+ \use:n
+ {#1}
+ }
+% \end{macrocode}
+% And what gets opened also needs closing:
+% \begin{macrocode}
+ \__kernel_list_label_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\__kernel_list_label_begin:,
+% \__kernel_list_label_end:}
+% If we aren't doing tagging the kernel hooks do nothing.
+% \begin{macrocode}
+\cs_new_eq:NN \__kernel_list_label_begin: \prg_do_nothing:
+\cs_new_eq:NN \__kernel_list_label_end: \prg_do_nothing:
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_item_everypar:, \@@_item_everypar_std:}
+% The \cs{@@_item_everypar:} command is executed as part of \hook{para/begin}
+% but most of the time does nothing, i.e., it has the following
+% default definition.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_item_everypar: \prg_do_nothing:
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AddToHook{para/begin}[lists]{\@@_item_everypar:}
+% \end{macrocode}
+%
+% Note that we have to make sure that the above code is executed
+% after the hook chunk from \texttt{tagpdf} because the latter uses
+% \texttt{@inlabel} to make a decision.
+%
+% By the end of the day both should probably move into the kernel
+% hook instead!
+% \begin{macrocode}
+\DeclareHookRule{para/begin}{lists}{after}{tagpdf}
+% \end{macrocode}
+%
+%
+% What follows is the version that resets various legacy booleans and puts
+% the label box in the right place and finally resets itself to do
+% nothing next time. \cs{@@_item_everypar:} is set to this by the
+% item template so that the next paragraph start runs the code below.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_item_everypar_std: {
+ \@@_debug_typeout:n{item~ everypar \on at line }
+ \legacy_if_set_false:n { @minipage }
+ \legacy_if_gset_false:n { @newlist }
+ \legacy_if:nT { @inlabel }
+ {
+ \legacy_if_gset_false:n { @inlabel }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \box_if_empty:NT \g_para_indent_box { \kern - \itemindent }
+ \para_omit_indent:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \box_use_drop:N \g_@@_labels_box
+% \end{macrocode}
+% After the labels are placed we start a paragraph structure (if
+% appropriate). This is handled in the following kernel hook:
+% \begin{macrocode}
+ \__kernel_list_label_after:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \penalty \c_zero_int
+ }
+ \legacy_if:nTF { @nobreak }
+ {
+ \legacy_if_gset_false:n { @nobreak }
+ \int_set:Nn \clubpenalty { 10000 }
+ }
+ {
+ \int_set_eq:NN \clubpenalty \@clubpenalty
+% \end{macrocode}
+% Once the label(s) are typeset and we are past any special
+% \texttt{@nobreak} handling we reset \cs{@@_item_everypar:} to do
+% nothing.
+% \begin{macrocode}
+ \cs_set_eq:NN \@@_item_everypar: \prg_do_nothing:
+ }
+}
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \begin{macro}{\__kernel_list_label_after:}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \__kernel_list_label_after: \prg_do_nothing:
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_tmpa_skip}
+% \begin{macrocode}
+\skip_new:N \l_@@_tmpa_skip
+% \end{macrocode}
+% \end{variable}
+%
+%
+%
+%
+%
+%
+%
+% \begin{variable}{\l_@@_topsepadd_skip, \l_@@_effective_top_skip}
+% Variables equivalent to \LaTeXe{}'s \tn{@topsepadd} and \tn{@topsep}.
+% Roughly equal to a mixture of \texttt{topsep}, \texttt{partopsep},
+% and various \texttt{parskip} at different nesting levels in lists.
+% The code is really elaborate when \texttt{@inlabel} is true.
+% \begin{macrocode}
+\skip_new:N \l_@@_topsepadd_skip
+\skip_new:N \l_@@_effective_top_skip
+% \end{macrocode}
+% \end{variable}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \begin{macro}{\item}
+% Here we already have all the building blocks. Complain in math
+% mode. Distingusih between first item (do necessary tagging) and
+% later items \cs{@@_inter_item:} to
+% cleanly close what's before, then call \cs{@@_item_instance:n} (which
+% calls \cs{UseInstance}\{item\}\marg{instance}) to prepare the
+% upcoming item: it will be actually inserted only once some later
+% material triggers \tn{everypar}.
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \RenewDocumentCommand{\item}{ ={label}o }
+ {
+ \@inmatherr \item
+% \end{macrocode}
+% TODO: Test for being outside of a list needs updating!
+% \begin{macrocode}
+ \tl_if_empty:oTF \@@_item_instance:n %%FMi?
+ { \msg_error:nnn { @@ } { item-in-nonlist } { \item[{#1}] } }
+ {
+ \legacy_if:nTF { @newlist }
+ { \__kernel_list_item_begin: }
+ { \@@_inter_item: }
+% \end{macrocode}
+% To avoid unnecessary key/val processing we make a quick check if
+% there was an optional argument.
+% \begin{macrocode}
+ \tl_if_novalue:nTF {#1} % avoids reparsing label={}
+ { \@@_item_instance:n { } }
+ { \@@_item_instance:n {#1} }
+% \end{macrocode}
+% Set the legacy switch that signals that we have a pending item label:
+% \begin{macrocode}
+ \legacy_if_gset_true:n { @inlabel }
+ \ignorespaces
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_inter_item:}
+% Between items. If the previous item had no content then we need to
+% trigger \tn{everypar}. Otherwise we simply close the previous item
+% with \tn{par} after removing some horizontal space. Between items,
+% there is a penalty and some space.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_inter_item: {
+ \legacy_if:nT { @inlabel }
+ { \indent \par } % case of \item\item
+% \end{macrocode}
+% \cs{par} may have a strange definition and may not get us back to
+% vertical mode in one go, so we better do not treat the next line
+% as an else case to the above conditional (for now).
+% \begin{macrocode}
+ \mode_if_horizontal:T { \@@_skip_remove_last:
+ \@@_skip_remove_last: \par }
+% \end{macrocode}
+% End any LI-tag, then start the next LI-tag (if doing tagging):
+% \begin{macrocode}
+ \__kernel_list_item_end:
+ \__kernel_list_item_begin:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \addpenalty \@itempenalty
+ \addvspace \itemsep
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\__kernel_list_item_begin:,
+% \__kernel_list_item_end:}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \__kernel_list_item_begin: \prg_do_nothing:
+\cs_new_eq:NN \__kernel_list_item_end: \prg_do_nothing:
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Tagging recipes}
+%
+% \begin{macro}{\@@_recipe_basic:}
+% The \texttt{basic} recipe simply ensures that the block is inside
+% a \texttt{text-unit} structure and if necessary starts one. When the
+% block ends and is followed by a blank line the \texttt{text-unit}
+% structure is closed too, otherwise it remains open and further
+% text starts with just a \struct{text} structure.
+%
+% There is otherwise no inner structure so
+% \cs{__kernel_displayblock_begin:} and
+% \cs{__kernel_displayblock_end:} do nothing---blockenvs with inner
+% structure use the \texttt{standard} or \texttt{list} recipe instead.
+% \begin{macrocode}
+\cs_new:Npn \@@_recipe_basic: {
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \@@_beginpar_hmode:N
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \@@_beginpar_vmode:
+ \let \__kernel_displayblock_begin: \prg_do_nothing:
+ \let \__kernel_displayblock_end: \prg_do_nothing:
+% \end{macrocode}
+% End environment \cs{par} handling:
+% \begin{macrocode}
+ \socket_assign_plug:nn{tagsupport/block-endpe}{on}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_recipe_standalone:}
+%
+% The \texttt{standalone} recipe produces a block that ensures that
+% a previous \texttt{text-unit} ends and that after the block a new
+% \texttt{text-unit} starts.
+% \begin{macrocode}
+\cs_new:Npn \@@_recipe_standalone: {
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \prg_do_nothing:
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \prg_do_nothing:
+ \cs_set_eq:NN \__kernel_displayblock_begin: \@@_inner_begin:
+ \cs_set_eq:NN \__kernel_displayblock_end: \@@_inner_end:
+% \end{macrocode}
+% End environment \cs{par} handling:
+% \begin{macrocode}
+ \socket_assign_plug:nn{tagsupport/block-endpe}{off}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_if_empty:NTF \l_@@_tag_name_tl
+ { \tl_set:Nn \l_@@_tag_inner_tag_tl {Sect} }
+ { \tl_set_eq:NN \l_@@_tag_inner_tag_tl \l_@@_tag_name_tl }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_recipe_standard:}
+% The \texttt{standard} recipe does the following:
+% \begin{itemize}
+% \item surround the block with a \texttt{text-unit}-structure if not already in a
+% a \texttt{text-unit}. In the latter case end the
+% MC and the \struct{text} but leave the \texttt{text-unit} open.
+%
+% If we are producing flattened paragraphs, just close any
+% \struct{text} but do not open a \texttt{text-unit}.
+%
+% \item Then open an new (inner) structure (by default
+% \texttt{Figure} but typically the one specified on the instance).
+% \item At the end of the block close the the inner structure
+% (\texttt{Figure} or explicit one)
+% but leave the \texttt{text-unit} open to be either continued or closed due to a
+% following \cs{par}.
+% \end{itemize}
+% \begin{macrocode}
+\cs_new:Npn \@@_recipe_standard:
+{
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \@@_beginpar_hmode:N
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \@@_beginpar_vmode:
+ \cs_set_eq:NN \__kernel_displayblock_begin: \@@_inner_begin:
+ \cs_set_eq:NN \__kernel_displayblock_end: \@@_inner_end:
+% \end{macrocode}
+% End environment \cs{par} handling:
+% \begin{macrocode}
+ \socket_assign_plug:nn{tagsupport/block-endpe}{on}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_if_empty:NTF \l_@@_tag_name_tl
+ { \tl_set:Nn \l_@@_tag_inner_tag_tl {Figure} }
+ { \tl_set_eq:NN \l_@@_tag_inner_tag_tl \l_@@_tag_name_tl }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\l_@@_tag_inner_tag_tl}
+% \begin{macrocode}
+\tl_new:N \l_@@_tag_inner_tag_tl
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_recipe_list:}
+% The \texttt{list} recipe does the following.
+% \begin{itemize}
+% \item It opens a \struct{text-unit}-structure or keeps the current one open (only
+% closing the MC).
+% \item It then starts a new structure rolemapped to L-structure
+% and arranges for handling list items, e.g., Li, Lbl and LBody
+% structures.
+% \item At the end it closes open list structures as needed but
+% keeps the \struct{text-unit}-structure open to continue the paragraph after the
+% list, if necessary.
+% \end{itemize}
+% \begin{macrocode}
+\cs_new:Npn \@@_recipe_list:
+{
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \@@_beginpar_hmode:N
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \@@_beginpar_vmode:
+ \cs_set_eq:NN \__kernel_displayblock_begin: \@@_list_begin:
+ \cs_set_eq:NN \__kernel_displayblock_end: \@@_list_end:
+% \end{macrocode}
+% The next two lines could be done globally, because they are only
+% called if we do have \cs{item}s, i.e., if we are in a list. It is
+% therefore also not necessary to reset them in other recipes
+% (right now---this may change if we get more templates (like
+% inline lists)).
+% \begin{macrocode}
+ \cs_set_eq:NN \__kernel_list_item_begin: \@@_list_item_begin:
+ \cs_set_eq:NN \__kernel_list_item_end: \@@_list_item_end:
+% \end{macrocode}
+% End environment \cs{par} handling:
+% \begin{macrocode}
+ \socket_assign_plug:nn{tagsupport/block-endpe}{on}
+% \end{macrocode}
+%
+% Handle the tag name and attribute classess using the key values
+% from the current list instance.
+% \begin{macrocode}
+ \tl_if_empty:NTF \l_@@_tag_name_tl
+ { \tl_set:Nn \l__tag_L_tag_tl {L} }
+ { \tl_set_eq:NN \l__tag_L_tag_tl \l_@@_tag_name_tl }
+ \tl_if_empty:NTF \l_@@_tag_class_tl
+ { \tl_set:Nn \l__tag_L_attr_class_tl {} }
+ { \tl_set_eq:NN \l__tag_L_attr_class_tl \l_@@_tag_class_tl }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \subsection{Blockenv instances}
+%
+%
+% \subsubsection{Basic instances}
+%
+% \begin{instance}{blockenv displayblock}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{displayblock}{display}
+{
+ env-name = displayblock,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ inner-instance = ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \begin{instance}{blockenv displayblockflattened}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{displayblockflattened}{display}
+{
+ env-name = displayblockflattened,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ inner-instance = ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \begin{instance}{blockenv center}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{center}{display}
+{
+ env-name = center,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ para-instance = center ,
+ inner-instance = ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \begin{instance}{blockenv flushleft}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{flushleft}{display}
+{
+ env-name = flushleft,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ para-instance = raggedright ,
+ inner-instance = ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \begin{instance}{blockenv flushright}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{flushright}{display}
+{
+ env-name = flushleft,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ para-instance = raggedleft ,
+ inner-instance = ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \subsubsection{Blockquote instances}
+%
+% \begin{instance}{blockenv quotation}
+ %
+% \begin{macrocode}
+\DeclareInstance{blockenv}{quotation}{display}
+{
+ env-name = quotation,
+ tag-name = quotation,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = true,
+ setup-code = ,
+ block-instance = quotationblock ,
+ inner-instance = ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \begin{instance}{blockenv quote}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{quote}{display}
+{
+ env-name = quote,
+ tag-name = quote,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = true,
+ setup-code = ,
+ block-instance = quoteblock ,
+ inner-instance = ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+% An alternative setup for quotations, using the displayblock instance and
+% just overwrite a bit in the setup code.\fmi{I guess the setup
+% code is still executed too early, have to check.}
+% This would be less flexible but would ensure visual consistency,
+% because the displayblock settings are used throughout.
+% \begin{macrocode}
+% \DeclareInstance{blockenv}{quotation}{display}
+% {
+% env-name = quotation,
+% tag-name = ,
+% tag-class = ,
+% tagging-recipe = blockquote,
+% inner-level-counter = ,
+% level-increase = true,
+% setup-code = \setlength\rightmargin{\leftmargin}
+% \setlength\parsep{1.5em} ,
+% block-instance = displayblock ,
+% inner-instance = ,
+% }
+% \end{macrocode}
+%
+% \begin{macrocode}
+% \DeclareInstance{blockenv}{quote}{display}
+% {
+% env-name = quote,
+% tag-name = ,
+% tag-class = ,
+% tagging-recipe = blockquote,
+% inner-level-counter = ,
+% level-increase = true,
+% setup-code = \setlength\rightmargin{\leftmargin} ,
+% block-instance = displayblock ,
+% inner-instance = ,
+% }
+% \end{macrocode}
+%
+
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{theorem}{display}
+{
+ env-name = theorem-like,
+ tag-name = theorem-like,
+ tag-class = ,
+ tagging-recipe = standalone,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+% inner-instance-type = innerblock ,
+% inner-instance = theorem,
+}
+% \end{macrocode}
+%
+% We use \struct{theorem-like} as the structure name and rolemap it
+% to a \struct{Sect} because that can hold a \struct{Caption}.
+%
+% \subsubsection{Verbatim instances}
+%
+% \begin{instance}{blockenv verbatim}
+%
+% The rolemapping is current verbatim to P and codeline to Sub (which is role mapped
+% to Span in pdf 1.7. Alternatives for PDF 1.7: Div and P.
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{verbatim}{display}
+{
+ env-name = verbatim,
+ tag-name = verbatim,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = verbatimblock ,
+ inner-instance = ,
+ final-code = \legacyverbatimsetup ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \subsubsection{Standard list instances}
+%
+% \begin{instance}{blockenv itemize}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{itemize}{display}
+{
+ env-name = itemize,
+ tag-name = itemize,
+ tag-class = itemize,
+ tagging-recipe = list,
+ inner-level-counter = \@itemdepth,
+ level-increase = true,
+ max-inner-levels = 4,
+ setup-code = ,
+ block-instance = list ,
+ inner-instance = itemize ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \begin{instance}{blockenv enumerate}
+%
+% \begin{macrocode}
+\DeclareInstance{blockenv}{enumerate}{display}
+{
+ env-name = enumerate,
+ tag-name = enumerate,
+ tag-class = enumerate,
+ tagging-recipe = list,
+ level-increase = true,
+ setup-code = ,
+ block-instance = list ,
+ inner-level-counter = \@enumdepth,
+ max-inner-levels = 4,
+ inner-instance = enum ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \begin{instance}{blockenv description}
+%
+% \begin{macrocode}
+
+\DeclareInstance{blockenv}{description}{display}
+{
+ env-name = description,
+ tag-name = description,
+ tag-class = description,
+ tagging-recipe = list,
+ inner-level-counter = ,
+ level-increase = true,
+ setup-code = ,
+ block-instance = list ,
+ inner-instance = description ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \begin{instance}{blockenv list}
+% The general (legacy) \env{list} environment does some of its
+% setup in the \texttt{setup-code} key.
+% \begin{macrocode}
+\DeclareInstance{blockenv}{list}{display}
+{
+ env-name = list,
+ tag-name = list,
+ tag-class = ,
+ tagging-recipe = list,
+ level-increase = true,
+ setup-code = \legacylistsetupcode ,
+ block-instance = list ,
+ inner-level-counter = ,
+ inner-instance = legacy ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+%
+% \subsection{Block instances}
+%
+% \subsubsection{Displayblock instances}
+%
+% We provide 6 nesting levels (as in \LaTeXe{}). If you want to
+% provide more you need to change the \texttt{maxblocklevels}
+% counter, offer further \texttt{displayblock-xx} instances but
+% also define further (legacy) \cs{list\meta{romannumeral}} commands
+% for the defaults. If not, then the settings from the previous
+% level are reused automatically---which may or may not be good enough).
+% \begin{macrocode}
+\setcounter{maxblocklevels}{6}
+% \end{macrocode}
+%
+% \begin{instance}{block displayblock-0,
+% block displayblock-1,
+% block displayblock-2,
+% block displayblock-3,
+% block displayblock-4,
+% block displayblock-5,
+% block displayblock-6 }
+%
+% Here we need level zero as well in case a flattened displayblock
+% (like the center env) it is used on top-level.
+% \begin{macrocode}
+\DeclareInstance{block}{displayblock-0}{display}
+ {
+ leftmargin = 0pt ,
+ parindent = 0pt ,
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstanceCopy{block}{displayblock-1}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-2}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-3}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-4}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-5}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-6}{displayblock-0}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \subsubsection{Verbatim instances}
+%
+% Verbatim instances have there own levels so that one can specify
+% specific indentations or vertical separations between line.
+%
+% \begin{instance}{block verbatimblock-0,
+% block verbatimblock-1,
+% block verbatimblock-2,
+% block verbatimblock-3,
+% block verbatimblock-4,
+% block verbatimblock-5,
+% block verbatimblock-6 }
+%
+% \begin{macrocode}
+\DeclareInstance{block}{verbatimblock-0}{display}
+ {
+ leftmargin = 0pt ,
+ parindent = 0pt ,
+ par-skip = 0pt ,
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstanceCopy{block}{verbatimblock-1}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-2}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-3}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-4}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-5}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-6}{verbatimblock-0}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+%
+% \subsubsection{Quote/quotationblock instances}
+%
+% Quote and quotation are not flattened, i.e., they change levels,
+% thus they start with level 1 not 0.
+%
+% \begin{instance}{block quoteblock-1,
+% block quoteblock-2,
+% block quoteblock-3,
+% block quoteblock-4,
+% block quoteblock-5,
+% block quoteblock-6 }
+% Default layout is to indent equaly from both side.
+% \begin{macrocode}
+\DeclareInstance{block}{quoteblock-1}{display}
+ { rightmargin = \KeyValue{leftmargin} }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstanceCopy{block}{quoteblock-2}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-3}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-4}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-5}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-6}{quoteblock-1}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \begin{instance}{block quotationblock-1,
+% block quotationblock-2,
+% block quotationblock-3,
+% block quotationblock-4,
+% block quotationblock-5,
+% block quotationblock-6 }
+% Quotation additionally changes the parindent.
+% \begin{macrocode}
+\DeclareInstance{block}{quotationblock-1}{display}
+ { parindent = 1.5em , rightmargin = \KeyValue{leftmargin} }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstanceCopy{block}{quotationblock-2}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-3}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-4}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-5}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-6}{quotationblock-1}
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \subsubsection{Block instances for the standard lists}
+%
+% \begin{instance}{block list-1,
+% block list-2,
+% block list-3,
+% block list-4,
+% block list-5,
+% block list-6 }
+% The block instances for the various list environments use the
+% same underlying instance (well by default) and nothing
+% needs to be set up specifically (because that is already done in
+% the legacy \cs{list\meta{romannumeral}} unless a
+% different layout is wanted.
+% \begin{macrocode}
+\DeclareInstance{block}{list-1}{display}{
+% heading = ,
+% beginsep = \topsep ,
+% begin-par-skip = \partopsep ,
+% par-skip = \parsep ,
+% end-skip = \KeyValue{beginsep} ,
+% end-par-skip = \KeyValue{begin-par-skip} ,
+% beginpenalty = \UseName{@beginparpenalty} ,
+% endpenalty = \UseName{@endparpenalty} ,
+% leftmargin = \leftmargin ,
+% rightmargin = \rightmargin ,
+% parindent = \listparindent ,
+}
+\DeclareInstance{block}{list-2}{display}{}
+\DeclareInstance{block}{list-3}{display}{}
+\DeclareInstance{block}{list-4}{display}{}
+\DeclareInstance{block}{list-5}{display}{}
+\DeclareInstance{block}{list-6}{display}{}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \subsection{List instances for the standard lists}
+%
+% For all list instances we have to say what kind of label we want
+% (\texttt{label-instance}) and how it should be formatted.
+%
+% \begin{instance}{list itemize-1,
+% list itemize-2,
+% list itemize-3,
+% list itemize-4}
+% For \env{itemize} environments this is all we need to do and we
+% refer back to the external definitions rather than defining the
+% \texttt{item-label} code in the instance to ensure that old
+% documents still work.
+%
+% \begin{macrocode}
+\DeclareInstance{list}{itemize-1}{std}{ item-label = \labelitemi }
+\DeclareInstance{list}{itemize-2}{std}{ item-label = \labelitemii }
+\DeclareInstance{list}{itemize-3}{std}{ item-label = \labelitemiii }
+\DeclareInstance{list}{itemize-4}{std}{ item-label = \labelitemiv }
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \begin{instance}{list enumerate-1,
+% list enumerate-2,
+% list enumerate-3,
+% list enumerate-4}
+% \env{enumerate} environments are similar, except that we also
+% have to say which counter to use on every level.
+% \begin{macrocode}
+\DeclareInstance{list}{enum-1}{std}
+ { item-label = \labelenumi , counter = enumi }
+\DeclareInstance{list}{enum-2}{std}
+ { item-label = \labelenumii , counter = enumii }
+\DeclareInstance{list}{enum-3}{std}
+ { item-label = \labelenumiii , counter = enumiii }
+\DeclareInstance{list}{enum-4}{std}
+ { item-label = \labelenumiv , counter = enumiv }
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \begin{instance}{list legacy}
+% For the legacy \env{list} environment there is only one instance
+% which is reused on all levels. This is done this way one because
+% the legacy \env{list} environment sets all its
+% parameters through its arguments. So this instances shouldn't
+% really be touched. It sets the \texttt{legacy-support} key to
+% true, which means that the list code uses \cs{makelabel} for
+% formatting the label
+% \begin{macrocode}
+\DeclareInstance{list}{legacy}{std} {
+ item-instance = basic ,
+ legacy-support = true ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \begin{instance}{list description}
+% The \env{description} lists also use only a single list instance
+% with only one key not using the default:
+% \begin{macrocode}
+\DeclareInstance{list}{description}{std} { item-instance = description }
+% \end{macrocode}
+% \end{instance}
+%
+%
+% \subsection{Item instances}
+%
+%
+% \begin{instance}{item basic, item description}
+% There two item instances set up: \texttt{description} for use
+% with the \env{description} environment and \texttt{basic} for use
+% with all other lists (up to now).
+% \begin{macrocode}
+\DeclareInstance{item}{basic}{std}
+ {
+ label-align = right ,
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstance{item}{description}{std}
+ {
+ label-format = \normalfont\bfseries #1 ,
+ }
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+% \subsection{Para instances}
+%
+% \begin{macrocode}
+\tag_if_active:T
+{
+ \tagpdfsetup
+ {
+ newattribute = {justify} {/O /Layout /TextAlign/Justify},
+ newattribute = {center} {/O /Layout /TextAlign/Center},
+ newattribute = {raggedright}{/O /Layout /TextAlign/Start},
+ newattribute = {raggedleft} {/O /Layout /TextAlign/End},
+ }
+}
+% \end{macrocode}
+%
+% \begin{instance}{para center}
+% \begin{macrocode}
+\DeclareInstance{para}{center}{std}
+{
+ indent-width = 0pt ,
+ start-skip = 0pt ,
+ left-skip = \@flushglue ,
+ right-skip = \@flushglue ,
+ end-skip = \z at skip ,
+ final-hyphen-demerits = 0 ,
+ cr-cmd = \@centercr ,
+ para-class = center ,
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstance{para}{raggedright}{std}
+{
+ indent-width = 0pt ,
+ start-skip = 0pt ,
+ left-skip = \z at skip ,
+ right-skip = \@flushglue ,
+ end-skip = \z at skip ,
+ final-hyphen-demerits = 0 ,
+ cr-cmd = \@centercr ,
+ para-class = raggedright ,
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstance{para}{raggedleft}{std}
+{
+ indent-width = 0pt ,
+ start-skip = 0pt ,
+ left-skip = \@flushglue ,
+ right-skip = \z at skip ,
+ end-skip = \z at skip ,
+ final-hyphen-demerits = 0 ,
+ cr-cmd = \@centercr ,
+ para-class = raggedleft ,
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareInstance{para}{justify}{std}
+{
+% indent-width = 0pt ,
+ start-skip = 0pt ,
+ left-skip = \z at skip ,
+ right-skip = \z at skip ,
+ end-skip = \@flushglue ,
+ final-hyphen-demerits = 5000 ,
+ cr-cmd = \@normalcr ,
+ para-class = justify ,
+}
+% \end{macrocode}
+% \end{instance}
+%
+%
+%
+%
+% \begin{macrocode}
+\DeclareRobustCommand\centering {\UseInstance{para}{center}{}}
+\DeclareRobustCommand\raggedleft {\UseInstance{para}{raggedleft}{}}
+\DeclareRobustCommand\raggedright{\UseInstance{para}{raggedright}{}}
+\DeclareRobustCommand\justifying {\UseInstance{para}{justify}{}}
+
+\justifying
+% \end{macrocode}
+%
+%
+%
+%
+%
+% \subsection{Tagging support}
+%
+% In this section we provide code to the various kernel hooks to support
+% the tagging of the different displayblock environments.
+%
+%
+%
+% All of the following definitions should only be made if tagging
+% is active!
+% \begin{macrocode}
+\tag_if_active:TF {
+% \end{macrocode}
+%
+% \begin{macro}{\@@_beginpar_vmode:}
+% When a block starts out in vertical mode, i.e., is not yet part of
+% a paragraph, we have to start a paragraph
+% structure. However, this is not the case if we are already
+% flattening paragraphs, thus in this case we do nothing.
+% We also do nothing if \texttt{@endpe} is currently true, because
+% that means we are right now just after the end of a
+% \texttt{blockenv} and in the process of looking if we have to end
+% the current \texttt{text-unit}, i.e., it is already open.
+% \begin{macrocode}
+ \cs_set:Npn \@@_beginpar_vmode: {
+ \@@_debug_typeout:n
+ { @endpe = \legacy_if:nTF { @endpe }{true}{false}
+ \on at line }
+ \legacy_if:nTF { @endpe }
+ {
+ \legacy_if_gset_false:n { @endpe }
+ }
+% \end{macrocode}
+% We test for \texttt{<2} because the first flattened environment
+% has to surround itself with a \texttt{text-unit}. Only any inner ones
+% then have to avoid adding another \texttt{text-unit}.
+% \begin{macrocode}
+ {
+ \int_compare:nNnT \l_@@_flattened_level_int < 2
+ {
+ \int_gincr:N \g__tag_para_main_begin_int
+ \tagstructbegin{tag=\l__tag_para_main_tag_tl}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_beginpar_hmode:N}
+% If the block is already part of a part of a paragraph, i.e., when it has
+% some text directly in front, then the first thing to
+% do is to return to vertical mode. However, that should be done
+% without inserting a paragraph end tag, so before calling \cs{par}
+% to do its normal work, we disable paragraph tagging and
+% restarting afterwards again. The argument to this config point
+% simply gobbles the \cs{par} following it in the code above (which
+% is used when there is no tagging going on.
+% \begin{macrocode}
+ \cs_set:Npn \@@_beginpar_hmode:N #1
+ {
+ \tag_mc_end:
+ \int_gincr:N \g__tag_para_end_int
+ \@@_debug_typeout:n{increment~ /P \on at line }
+ \bool_if:NT \l__tag_para_show_bool
+ { \tag_mc_begin:n{artifact}
+ \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
+ \tag_mc_end:
+ }
+ \tag_struct_end:
+ \tagpdfparaOff \par \tagpdfparaOn
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\__kernel_displayblock_doendpe:}
+% If a display block ends and is followed by a blank line we have to end the
+% enclosing paragraph tagging structure.
+% \begin{macrocode}
+\cs_set:Npn \__kernel_displayblock_doendpe: {
+ \bool_if:NT \l__tag_para_bool
+ {
+% \end{macrocode}
+% Given that restoring \cs{par} through the legacy \LaTeXe{} method
+% can take a few iterations (for example, in case of nested lists,
+% e.g., \verb=...\end{itemize} \item ...\par= it can happen that
+% \cs{__kernel_displayblock_doendpe:} is called while
+% \texttt{@endpe} is already handled and then we should not attempt
+% to close a \texttt{text-unit} structure). So we need to check for this.
+% \begin{macrocode}
+ \legacy_if:nT { @endpe }
+ {
+% \end{macrocode}
+% If the display block currently ending was \enquote{flattened}
+% (i.e., uses simplified paragraphs that are not tagged by a
+% combination of \texttt{text-unit} followed by \struct{text}, but simply
+% with a \struct{text}),
+% then we don't have to do anything, because the \struct{text} is already closed.
+% \begin{macrocode}
+ \@@_debug_typeout:n
+ { flattened= \bool_if:NTF
+ \l__tag_para_flattened_bool {true}{false}
+ \on at line }
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \@@_debug_typeout:n{Structure-end~
+ \l__tag_para_main_tag_tl\space after~ displayblock \on at line }
+ \int_gincr:N \g__tag_para_main_end_int
+ \tag_struct_end: %text-unit
+ }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{para/begin}
+%
+% Paragraph tagging is mainly done using the paragraph hooks (will
+% get moved eventually). The default hook setting is not good
+% enough when lists get supported: we need to delay starting the
+% paragraph tagging if we still have to place the list label.
+% We therefore remove the existing hook data and replace it with an
+% augmented version (this will get combined eventually).
+% \begin{macrocode}
+\RemoveFromHook{para/begin}[tagpdf]
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AddToHook{para/begin}[tagpdf]{
+ \bool_if:NT \l__tag_para_bool {
+% \end{macrocode}
+% if we are still waiting to typeset the list label we do nothing
+% (the paragraph tagging then happens when the list is finally
+% typeset).
+% \begin{macrocode}
+ \legacy_if:nF { @inlabel }
+ {
+% \end{macrocode}
+% Otherwise, we start a \struct{text} tag structure but only if we are not
+% starting a paragraph immediately \emph{after} a list, in which
+% case we only start a new MC (because the \struct{text} tag is still open from
+% before the list --- one of the reasons why lists are always put
+% \enquote{inside} paragraphs.
+%
+% We do this in a separate command, because it is needed elsewhere too.
+% \begin{macrocode}
+ \@@_start_para_structure:n { \PARALABEL }
+ }
+ }
+}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\@@_start_para_structure:n}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_start_para_structure:n #1 {
+ \@@_debug_typeout:n
+ { @endpe = \legacy_if:nTF { @endpe }{true}{false}
+ \on at line }
+ \legacy_if:nF { @endpe }
+ {
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_begin_int
+ \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
+ }
+ }
+ \int_gincr:N \g__tag_para_begin_int
+ \@@_debug_typeout:n{increment~ P \on at line }
+ \tag_struct_begin:n
+ {
+ tag=\l__tag_para_tag_tl
+ ,attribute-class=\l_tag_para_attr_class_tl
+ }
+ \__tag_check_para_begin_show:nn {green}{#1}
+ \tag_mc_begin:n {}
+}
+% \end{macrocode}
+% The same code, but without testing \texttt{@endpe}. This is not
+% needed in the standalone case and wrong inside lists.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_start_para_structure_unconditionally:n #1 {
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_begin_int
+ \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
+ }
+ \int_gincr:N \g__tag_para_begin_int
+ \@@_debug_typeout:n{increment~ P \on at line }
+ \tag_struct_begin:n
+ {
+ tag=\l__tag_para_tag_tl
+ ,attribute-class=\l_tag_para_attr_class_tl
+ }
+ \__tag_check_para_begin_show:nn {green}{#1}
+ \tag_mc_begin:n {}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\RemoveFromHook{para/end}[tagpdf]
+\AddToHook{para/end}
+ {
+ \bool_if:NT \l__tag_para_bool
+ {
+ \int_gincr:N \g__tag_para_end_int
+ \@@_debug_typeout:n{increment~ /P \on at line }
+ \tag_mc_end:
+ \__tag_check_para_end_show:nn {red}{}
+ \tag_struct_end:
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tag_struct_end:
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\PARALABEL{NP-}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\para_end:}
+% If we see a \cs{par} in vmode and a \texttt{text-unit} is still open
+% we need to close that. For this we check if a request for
+% \text{@endpe} was made (but the \cs{par} redefinition got lost
+% due to (bad?) coding).
+% \begin{macrocode}
+\cs_set_protected:Npn \para_end: {
+ \scan_stop:
+ \mode_if_horizontal:TF {
+ \mode_if_inner:F {
+ \tex_unskip:D
+ \hook_use:n{para/end}
+ \@kernel at after@para at end
+ \mode_if_horizontal:TF {
+ \if_int_compare:w 11 = \tex_lastnodetype:D
+ \tex_hskip:D \c_zero_dim
+ \fi:
+ \tex_par:D
+ \hook_use:n{para/after}
+ \@kernel at after@para at after
+ }
+ { \msg_error:nnnn { hooks }{ para-mode }{end}{horizontal} }
+ }
+ }
+ {
+ \__kernel_endpe_vmode: % should do nothing if no tagging
+ \tex_par:D
+ }
+}
+\cs_set_eq:NN \par \para_end:
+\cs_set_eq:NN \@@par \para_end:
+\cs_set_eq:NN \endgraf \para_end:
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \begin{macro}{\begin}
+% We need to do a little more than canceling \texttt{@endpe} now.
+% \begin{macrocode}
+\DeclareRobustCommand*\begin[1]{%
+ \UseHook{env/#1/before}%
+ \@ifundefined{#1}%
+ {\def\reserved at a{\@latex at error{Environment #1 undefined}\@eha}}%
+ {\def\reserved at a{\def\@currenvir{#1}%
+ \edef\@currenvline{\on at line}%
+ \@execute at begin@hook{#1}%
+ \csname #1\endcsname}}%
+ \@ignorefalse
+ \begingroup
+ \__kernel_endpe_vmode:
+ \reserved at a}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\__kernel_endpe_vmode:}
+% Close an open \texttt{text-unit} if \texttt{@endpe} is true and we
+% are in vmode. Used in \cs{para_end:} and \cs{begin}.
+% \begin{macrocode}
+\cs_new:Npn \__kernel_endpe_vmode: {
+ \if at endpe \ifvmode
+ \bool_if:NT \l__tag_para_bool
+ {
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tag_struct_end:
+ }
+ \@endpefalse
+ }
+ \fi \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\__kernel_list_label_after:}
+% If starting the text-unit/text tags got delayed because of a pending label we
+% have to do it after the label got typeset
+% \begin{macrocode}
+\cs_set:Npn \__kernel_list_label_after: {
+ \bool_if:NT \l__tag_para_bool
+ {
+ \@@_start_para_structure_unconditionally:n { LI- }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_inner_begin:}
+% Start a block that has an inner structure if it isn't also a list.
+% \begin{macrocode}
+\cs_new:Npn \@@_inner_begin: {
+ \tagstructbegin{tag=\l_@@_tag_inner_tag_tl}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_inner_end:}
+% End a block (which isn't also a list).
+% \begin{macrocode}
+\cs_new:Npn \@@_inner_end: {
+ \@@_debug_typeout:n{block-end \on at line}
+ \legacy_if:nT { @endpe }
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \@@_debug_typeout:n{close~ /text-unit \on at line}
+ \tagstructend
+ }
+ \tagstructend % end inner structure
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \subsubsection{List tags}
+%
+%
+% \begin{macrocode}
+\tl_new:N \l__tag_L_tag_tl
+\tl_set:Nn \l__tag_L_tag_tl {L}
+
+\tl_new:N\l__tag_L_attr_class_tl
+\tl_set:Nn \l__tag_L_attr_class_tl {list}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\tag_if_active:T
+{
+ \tagpdfsetup
+ {
+ % default if unknown
+ newattribute = {list}{/O /List /ListNumbering/None},
+ newattribute = {itemize}{/O /List /ListNumbering/Unordered},
+ newattribute = {enumerate}{/O /List /ListNumbering/Ordered},
+ newattribute = {description}{/O /List /ListNumbering/Description},
+ }
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\LItag{LI}
+% \end{macrocode}
+%
+% \begin{macro}{\@@_list_begin:}
+% Start a list \ldots
+% \begin{macrocode}
+\cs_set:Npn \@@_list_begin: {
+ \tagstructbegin
+ {
+ tag=\l__tag_L_tag_tl
+ ,attribute-class=\l__tag_L_attr_class_tl
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_list_item_begin:}
+% Start tagging a list item.
+% \begin{macrocode}
+\cs_set:Npn \@@_list_item_begin: { \tagstructbegin{tag=\LItag} }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\__kernel_list_label_begin:}
+% A list label needs a \texttt{Lbl} structure tag and an MC.
+% \begin{macrocode}
+\cs_set:Npn \__kernel_list_label_begin: {
+%
+% FMi: this needs a different logic to decide when to make the label
+% an artifact (after cleaning up the the \item code ), therefore
+% disabled for now
+% \tl_if_empty:oTF \@itemlabel
+% {
+% \tag_mc_begin:n {artifact}
+% }
+% {
+ \tagstructbegin{tag=Lbl}
+ \tagmcbegin{tag=Lbl}
+% }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\__kernel_list_label_end:}
+% And when we are done with the label we have to close the MC and
+% the \texttt{Lbl} structure. We then start the \texttt{LBody}. The
+% material inside will be \enquote{paragraph} text and the tagging
+% for that is handled by the normal para tagging.
+% \begin{macrocode}
+\cs_set:Npn \__kernel_list_label_end: {
+ \tagmcend % end mc-Lbl or artifact
+% FMi: unconditionally for now
+% \tl_if_empty:oF \@itemlabel
+ \tagstructend % end Lbl
+ \tagstructbegin{tag=\LBody}
+}
+\def\LBody{LBody}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_list_item_end:}
+% When a list item ends we have to close \texttt{LBody} and
+% \texttt{LI} but also a \struct{text} in the special case that the
+% item material ends in a list (identifiable via \texttt{@endpe}).
+% \begin{macrocode}
+\cs_set:Npn \@@_list_item_end: {
+ \legacy_if:nT { @endpe }
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tagstructend % text-unit
+% \@@_debug_typeout:n{Structure-end~ P~ at~ item-end \on at line }
+ }
+ \tagstructend \tagstructend % end LBody, LI
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_list_end:}
+% Finally, at the list end we have to close the open
+% \texttt{LBody}, \texttt{LI}, \texttt{L}, and possibly a
+% \struct{text} if the last item ends with a list.
+% \begin{macrocode}
+\cs_set:Npn \@@_list_end: {
+ \legacy_if:nT { @endpe }
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tagstructend % text-unit
+ \@@_debug_typeout:n{Structure-end~ P~ at~ list-end \on at line }
+ }
+ \tagstructend\tagstructend % end LBody, LI
+ \tagstructend % end L
+}
+% \end{macrocode}
+% \end{macro}
+% End of tagging related declarations.
+% \begin{macrocode}
+}
+% \end{macrocode}
+% These command should have a dummy declaration if tagging is not active
+% \begin{macrocode}
+{
+ \cs_new:Npn \@@_start_para_structure_unconditionally:n #1 {}
+}
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+%<*latex-lab>
+\ProvidesFile{block-latex-lab-testphase.ltx}
+ [\ltlabblockdate\space v\ltlabblockversion\space
+ blockenv implementation]
+\RequirePackage{latex-lab-testphase-block}
+%</latex-lab>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+%
+% \section{Documentation from first prototype implementations}
+%
+%
+% \subsection{Open questions}
+% \begin{itemize}
+% \item Existing questions --- moved to issues ---
+% \end{itemize}
+%
+% \subsection{Code cleanup}
+% \begin{itemize}
+% \item Actually implement what's announced.
+%
+% \item Encapsulate most uses of \cs[no-index]{legacy_if\dots} into
+% commands with \texttt{expl3} syntax: we cannot rename these booleans
+% for compatibility reasons but we can make the code cleaner
+% nevertheless. --- made issue ---
+%
+% \item The \tn{topsep} and \tn{partopsep} business is tricky to
+% reproduce exactly (see \tn{@topsepadd} and \tn{@topsep}) because of
+% how it accumulates when lists are nested immediately.
+%
+% \end{itemize}
+%
+%
+%
+% \subsection{Tasks}
+% \begin{itemize}
+%
+% \item Change author to LaTeX Team once it's nice enough to deserve
+% that label.
+%
+% \item Reproducing exactly the standard layouts and examples in the
+% \pkg{enumitem} documentation.
+%
+% \item Hooks, but do not duplicate those that already exist as
+% environment hooks. Hence, mostly around items.
+%
+% \item Customization and interaction with LDB:
+% \begin{itemize}
+% \item Allow arbitrary nesting depth with automatically defined
+% styles for labels, counters etc.
+% \item Adapt everything to font size! (e.g. footnotes).
+% \item How to model the inheritance from trivlist to list to
+% enumerate?
+% \end{itemize}
+%
+% \item Add key--value settings mimicking \pkg{enumitem}'s ability to
+% set any four of five horizontal parameters and deduce the fifth by
+% $\cs{leftmargin} + \cs{itemindent} = \cs{labelindent} +
+% \cs{labelwidth} + \cs{labelsep}$.
+%
+% \item Provide good ways to customize how overlong labels are dealt with.
+%
+% \item Use the \texttt{.aux} file.
+% \begin{itemize}
+% \item Implement the \tn{ref} styles that \pkg{enumitem} provides.
+% \item Reverse enumerations, important in publication lists and the
+% like. Somehow avoid needing 3 compilations for references to
+% reverse enumerations to settle?
+% \item Ability to calculate \tn{labelwidth} from the label contents.
+% Share calculated parameters between multiple environments (cf.\
+% \texttt{resume} option).
+% \end{itemize}
+%
+% \item Related to grabbing the whole list environment, and input syntax
+% variations:
+% \begin{itemize}
+% \item Other layouts: tabular (see \pkg{listliketab} vs
+% \pkg{typed-checklist}), multicolumn and horizontally numbered (see
+% \pkg{tasks}), inline lists, runin lists in the easy case where
+% there is no intervening \tn{par}.
+% \item Formatting the item text in a
+% box or similar (requires grabbing the whole list).
+% \item Filtering which items to show: hide certain items according to
+% criteria (useful together with list reuse), see
+% \pkg{typed-checklist}.
+% \item Shorthands \tn{iitem} for automatic nested lists, or \cs{1},
+% \cs{2} etc from \pkg{outlines}.
+% \item Support markdown input like \pkg{asciilist}.
+% \end{itemize}
+%
+% \item Check interaction with \texttt{babel} options such as
+% \texttt{french} or \texttt{accadian} (see FrenchItemizeSpacing)
+%
+% \item RTL and vertical typesetting.
+% \end{itemize}
+%
+% \section{Plan of attack of first prototype}
+%
+% Typesetting list environments involves a rather large number of
+% parameters. They can be affected by the context such as the total
+% list nesting level, the nesting level of the given type of list, and
+% the font size. An environment like \texttt{enumerate} has two main
+% aspects.
+% \begin{itemize}
+% \item It has a certain layout in the page, with vertical and
+% horizontal spacing around it. This type of layout is shared with
+% environments such as \texttt{quote}, \texttt{flushright}, or
+% \texttt{tabbing}. This common layout is implemented in \LaTeXe{}
+% through \cs{trivlist} (or \cs{list}).
+% \item It defines how each \cs{item} should be typeset: how to
+% construct the label, in particular the \texttt{counter} name, and
+% how to format the content of the item.
+% \end{itemize}
+%
+% This suggests defining two object types, \xt{block} and \xt{item}
+% covering these two aspects.\footnote{Possibly also \xt{endblock} to
+% deal with decorations at the end?} While the \xt{item} type will
+% perhaps have a single template, one could typeset a \xt{block} object
+% in several ways, for instance the standard \LaTeXe{} way or a fancy
+% colored box.
+%
+% The \xt{general} \xt{block} template should receive the following
+% parameters. The \xt{plain} \xt{block} template is a restricted
+% template that freezes all item-related parameters to dummy values
+% (\texttt{counter}, \texttt{start}, \texttt{resume},
+% \texttt{label-width}, \texttt{label-sep} and all \texttt{item-*}).
+% The \xt{list} \xt{block} template is a restricted template\footnote{A
+% better approach could be to have a notion of inheritance for object
+% types, so that we end up with two different \emph{object types}. Then
+% we can implement other template for the list object type: \xt{table}
+% for lists typeset as rows/columns of a table, \xt{inline} for lists
+% typeset in horizontal mode within a paragraph, and \xt{runin} for
+% run-in lists.} that omits the \texttt{heading} parameter and whose
+% default for \texttt{item-instance} is non-empty.
+% \begin{itemize}
+% \item Structural parameters: the \texttt{heading} to place before,
+% \texttt{counter} name, \texttt{start} value, whether to
+% \texttt{resume} a previous list, and the \texttt{item-instance} (an
+% \xt{item} instance) to use when typesetting items.
+% \item Vertical spacing and penalties: \texttt{beginpenalty},
+% \texttt{beginsep}, \texttt{begin-par-skip}, \texttt{item-penalty},
+% \texttt{item-skip}, \texttt{item-par-skip}, \texttt{endpenalty},
+% \texttt{end-skip}, \texttt{end-par-skip}.
+% \item Horizontal spacing: \texttt{rightmargin}, \texttt{leftmargin},
+% \texttt{parindent}, \texttt{item-indent}, \texttt{label-width},
+% \texttt{label-sep}.
+% \end{itemize}
+% A \docclass should edit these templates (or define restricted
+% templates) to set up default values that depend on \tn{g_block_nesting_depth_int},
+% namely how many lists are nested overall.\footnote{Does
+% \pkg{xtemplate} provide a way to specify default values that are only
+% evaluated once an instance is used?} The document class should then
+% set up an instance of these templates for each environment, with
+% appropriate settings such as a \texttt{heading}, a suitable
+% \texttt{item-instance}, or making \texttt{margin-right} equal to
+% \texttt{margin-left} in a \texttt{quote} environment.
+%
+% The \xt{inline-list} \xt{block} template receives many fewer
+% parameters. Note that \texttt{beginsep}, \texttt{item-skip},
+% \texttt{end-skip} are now \emph{horizontal} skips.
+% \begin{itemize}
+% \item Structural parameters: \texttt{counter}, \texttt{start},
+% \texttt{resume}, \texttt{item-instance}.
+% \item Spacing and penalties: \texttt{beginpenalty},
+% \texttt{beginsep}, \texttt{item-penalty}, \texttt{item-skip},
+% \texttt{endpenalty}, \texttt{end-skip}.
+% \item Horizontal spacing: \texttt{label-width}, \texttt{label-sep}.
+% \end{itemize}
+%
+% The \xt{std} \xt{item} template should receive the following
+% parameters. They depend on the type of list and its nesting level
+% among lists of such type, but typically not on the total nesting
+% level.
+% \begin{itemize}
+% \item Counter name (\texttt{counter}), shared with the parent
+% \xt{list} \xt{block} template, but needed for incrementing.
+% \item Label construction: a function \texttt{counter-label} that
+% produces the label from the counter name, used if \tn{item} is given
+% without argument.
+% \item References: a function \texttt{counter-ref} for how the label
+% should be referred to when it is constructed from the counter,
+% \texttt{label-ref} and \texttt{label-autoref} used when \tn{item}
+% has an optional argument.
+% \item Label formatting: \texttt{label-format} function,
+% \texttt{label-strut} boolean.
+% \item Label alignment (\texttt{label-align}, \texttt{label-boxed},
+% \texttt{next-line}).
+% \item Content parameters: \texttt{text-font}.
+% \item A \texttt{compatibility} boolean that controls for instance
+% whether \tn{makelabel} is used.
+% \end{itemize}
+% The \docclass should set up an instance such as \xt{enumiii} for each
+% environment and nesting level.\footnote{This should be made easily
+% extendible to deeper levels.}
+%
+% A given environment will adjust some nesting levels, then call the
+% \xt{block} instance appropriate to the environment type, passing it
+% the \xt{item} instance appropriate to the environment and depth.
+% Additional context-dependence could be provided by \pkg{l3ldb}, but
+% the main context-dependence should not rely on it for simplicity
+% reasons and incidentally because \pkg{l3ldb} is not yet available.
+%
+%
+% \Finale
+%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
Property changes on: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-block.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-firstaid.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -16,6 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabfirstaiddate{2023-07-20}
+\def\ltlabfirstaidversion{0.85a}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -28,9 +30,9 @@
% \fi
%
% \title{The \textsf{latex-lab-firstaid} package\\
-% Temporary patches to external packages}
+% Temporary patches to external packages needed for the tagging project}
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{Version 0.80 2023-06-04}
+% \date{v\ltlabfirstaidversion\ \ltlabfirstaiddate}
%
% \maketitle
%
@@ -58,8 +60,9 @@
%<@@=tag>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesPackage {latex-lab-testphase-firstaid} [2023-06-04 v0.8
- Temporary patches to external packages need for the tagging project]
+\ProvidesPackage {latex-lab-testphase-firstaid} [%
+ \ltlabfirstaiddate\space v\ltlabfirstaiddate\space
+ Temporary patches to external packages needed for the tagging project]
% \end{macrocode}
% \subsection{blindtext}
@@ -103,43 +106,38 @@
}%
}
% \end{macrocode}
-% \subsection{ltugboat}
-% ltugboat need only a redefinition of \cs{l at section} to add the hooks
+% \subsection{cleveref}
+% The cleveref package redefines \cs{@makefntext} and this means that the patches in
+% the new footnote code fails. We use a hook instead
% \begin{macrocode}
-\AddToHook{file/ltugboat.cls/after}
+\AddToHook{package/cleveref/after}
{
- \def\l at section#1#2{\addpenalty{\@secpenalty}%
- \addvspace{\TBtocsectionspace}%
- \@tempdima 1.5em
- \begingroup
- \parindent\z@ \rightskip\z@ % article style makes \rightskip > 0
- \parfillskip\z@
- \TBtocsectionfont
- \leavevmode\advance\leftskip\@tempdima\hskip-\leftskip
- \UseHookWithArguments{contentsline/text/before}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- \csname contentsline at text@1 at format\endcsname{#1}%
- \UseHookWithArguments{contentsline/text/after}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- \nobreak\hfil
- \nobreak\hb at xt@\@pnumwidth{\hss
- \UseHookWithArguments{contentsline/page/before}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- #2%
- \UseHookWithArguments{contentsline/page/after}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- }\par
- \endgroup}
- }
+ \let\@makefntext\cref at old@makefntext
+ \AddToHook{cmd/@makefntext/before}{%
+ \cref at constructprefix{footnote}{\cref at result}%
+ \protected at edef\cref at currentlabel{%
+ [footnote][\arabic{footnote}][\cref at result]%
+ \p at footnote\@thefnmark}}
% \end{macrocode}
-
+% The second problem is that it redefines \cs{refstepcounter} to use an argument.
+% In itself this isn't a problem but as the new definition doesn't grab the arguments
+% directly it fails over the generic hook inserted at the end of the definition
% \begin{macrocode}
+ \RenewDocumentCommand\refstepcounter{om}{%
+ \IfNoValueTF{#1}%
+ {\refstepcounter at noarg{#2}}%
+ {\refstepcounter at optarg[#1]{#2}}%
+ }%
+ }
+% \end{macrocode}
+% \begin{macrocode}
%</package>
% \end{macrocode}
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{firstaid-latex-lab-testphase.ltx}
- [2023-06-04 v0.8 Temporary patches to external packages need for the tagging project]
+ [\ltlabfirstaiddate\space v\ltlabfirstaidversion\space
+ latex-lab wrapper firstaid]
\RequirePackage{latex-lab-testphase-firstaid}
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-float.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -16,6 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabfloatdate{2023-07-20}
+\def\ltlabfloatversion{0.81a}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -31,7 +33,7 @@
% \title{The \textsf{latex-lab-floats} package\\
% Tagging of floats }
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{v0.81 2023-06-07}
+% \date{v\ltlabfloatversion\ \ltlabfloatdate}
%
% \maketitle
%
@@ -128,17 +130,11 @@
% \begin{implementation}
% \section{Implementation}
% \begin{macrocode}
-\ProvidesExplPackage {latex-lab-testphase-float} {2023-04-28} {0.8}
+\ProvidesExplPackage {latex-lab-testphase-float} {\ltlabfloatdate} {\ltlabfloatversion}
{Code related to the tagging of floats}
% \end{macrocode}
% \subsection{Variables}
-% We rolemap to Aside, and float sections to Sect
-%
-% \begin{macrocode}
-\tagpdfsetup{add-new-tag=float/Aside}
-\tagpdfsetup{add-new-tag=figures/Sect}
-\tagpdfsetup{add-new-tag=tables/Sect}
-% \end{macrocode}
+% We rolemap to float to Aside, and float sections to Sect.
%
% \begin{variable}{
% \g_@@_float_sect_prop,
@@ -408,6 +404,32 @@
\fi
\fi
}
+% \end{macrocode}
+% and similar for double floats:
+% \begin{macrocode}
+\def\end at dblfloat{%
+ \if at twocolumn
+ \@endfloatbox
+ \@nameuse{@@_float_end:}%
+ \ifnum\@floatpenalty <\z@
+ \@largefloatcheck
+ \global\dp\@currbox1sp %
+ \@cons\@currlist\@currbox
+ \ifnum\@floatpenalty <-\@Mii
+ \penalty -\@Miv
+ \@tempdima\prevdepth
+ \vbox{}%
+ \prevdepth\@tempdima
+ \penalty\@floatpenalty
+ \else
+ \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack
+ \@nameuse{@@_float_start_par:} %restart P safe here??
+ \fi
+ \fi
+ \else
+ \end at float
+ \fi
+}%
\ExplSyntaxOn
% \end{macrocode}
%
@@ -417,6 +439,22 @@
% \begin{macrocode}
\def\hyper at nopatch@caption{}
% \end{macrocode}
+%
+% With hyperref that means that the \cs{refstepcounter} now can affect spacing so we
+% change that to the kernel refstepcounter:
+% \begin{macrocode}
+\let\@kernel at refstepcounter\refstepcounter %as long it is not in the kernel
+\def\caption{%
+ \ifx\@captype\@undefined
+ \@latex at error{\noexpand\caption outside float}\@ehd
+ \expandafter\@gobble
+ \else
+ \@kernel at refstepcounter\@captype
+ \expandafter\@firstofone
+ \fi
+ {\@dblarg{\@caption\@captype}}%
+}
+% \end{macrocode}
% As we will use the structure number in the target, we need to provide a
% theH-representation. (Once the kernel will create
% theH-representation generally this will be provided automatically, as tagpdf uses
@@ -471,7 +509,7 @@
\tag_mc_end:
\tag_struct_end:
\tag_mc_begin:n{}
- #2\par
+ #2
\tag_mc_end:\hfil}%
\fi
\tag_struct_end: %caption
@@ -487,7 +525,7 @@
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{float-latex-lab-testphase.ltx}
- [2023-04-30 v0.8 code related to the tagging of floats]
+ [\ltlabfloatdate\space v\ltlabfloatversion\space latex-lab wrapper float]
\RequirePackage{latex-lab-testphase-float}
%</latex-lab>
% \end{macrocode}
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-footnotes.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -17,6 +17,9 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabfootnotedate{2023-09-04}
+\def\ltlabfootnoteversion{0.8c}
+
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -38,8 +41,15 @@
% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
% \providecommand\class[1]{\texttt{#1.cls}}
% \providecommand\pkg[1]{\texttt{#1}}
-% \providecommand\hook[1]{\texttt{#1}}
%
+% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
+%
% \begin{abstract}
% \emph{to be written}
% \end{abstract}
@@ -56,7 +66,7 @@
% some adjustments are mutually exclusive). This is achieved by
% providing a larger number of hooks (for areas where different
% packages/classes can easily coexist with their adjustments) and a
-% number of configuration points to which only one class or package
+% number of sockets to which only one class or package
% can write to successfully (in case of multiple changes the
% last one wins). The latter are for special functionality, e.g.,
% if footnote text is typeset as a single paragraph, it can't be configured
@@ -67,7 +77,7 @@
% for this to work, all packages altering the footnote setup should
% use the interfaces provided here and not do it through the
% legacy methods (though there is some support for the latter as
-% well, but if will not work in a cases).
+% well, but it will not work in all cases).
%
% \subsection{Configuration methods}
%
@@ -103,11 +113,14 @@
%
%
%
-% \section{Hooks and configuration points}
+% \section{Sockets and hooks}
%
-% Note: the configuration points do not have an interface mechanism
-% yet and all their names are temporary right now.
-% Also note that configuration points are of interest only to very
+% We use sockets for those parts that can be controlled only by one
+% package or by the kernel and hooks for places where it may be
+% possible that several packages or the document class adds code
+% (typically declarations such as font changes, etc.).
+%
+% Note that sockets are of interest only to very
% few specialized packages, mainly \pkg{footmisc}, and packages
% providing similar functionality---the current documentation is
% therefore fairly sketchy.
@@ -124,7 +137,7 @@
% in the same place, etc.
%
%
-% \subsubsection{Configuration points}
+% \subsubsection{Sockets}
%
% None: everything is implemented through a single definition for
% \cs{@footnotemark} that offers a number of hooks that can be used
@@ -132,12 +145,14 @@
% formatting of marks.
%
%
-% \subsubsection{Hooks}
+% \subsubsection{Hooks for formatting the footnote mark in text}
%
% The hooks to customize the marks in the text are the following:
% \begin{description}
% \item[\hook{fnmark/before}]
%
+% \DescribeHook[noprint]{fnmark/before}
+%
% Executed at the very beginning of \cs{footnotemark}. Currently
% there are two packages (\pkg{bibarts} and \pkg{chextras}) that
% prepend material at this point (not necessarily correctly, e.g.,
@@ -147,6 +162,8 @@
%
% \item[\hook{fnmark}]
%
+% \DescribeHook[noprint]{fnmark}
+%
% Executed in horizontal mode and after the current space factor
% has been saved away for reuse. This is where currently code for multiple
% marks does its preparation (as done by \pkg{footmisc} and
@@ -156,12 +173,14 @@
% generated in math --- maybe that means the multiple handling
% should happen later?
%
-% After the hook \cs{nobreak} is executed, so any
+% After the hook a \cs{nobreak} is executed, so any
% ``material'' added in the hook is tied to the following mark
% unless it contains its own permissible penalty.
%
% \item[\hook{fnmark/begin}]
%
+% \DescribeHook[noprint]{fnmark/begin}
+%
% This hook is executed directly in front of the typeset mark.
% This is the place where \pkg{hyperref} would have added
% part of its code, i.e., after the \cs{nobreak} mentioned above.
@@ -170,6 +189,8 @@
%
% \item[\hook{fnmark/end}]
%
+% \DescribeHook[noprint]{fnmark/end}
+%
% This hook is executed directly after the typeset mark. It is
% used by \pkg{memhfixc}, \pkg{scrlttr2}, and
% \pkg{footmisc}. Used, for example, to implement support for
@@ -180,6 +201,8 @@
%
% \item[\hook{fnmark/after}]
%
+% \DescribeHook[noprint]{fnmark/after}
+%
% This hook is executed at the very end of the \cs{footnotemark} command.
%
% It is a reversed hook to pair with \hook{fnmark/before}
@@ -201,79 +224,115 @@
% appears at the bottom of the page (default case), or possibly
% elsewhere, e.g. in the margin.
%
-% \subsubsection{Configuration points}
+% \subsubsection{Sockets}
%
% To cater for different layout configurations there are four
-% configuration points which can be set only by one package or
-% class, if two packages/classes set them they are mutually
-% incompatible.
+% sockets that can be set by a package or
+% class but there should be only one per document setting them, i.e., if two packages/classes set them they are mutually
+% incompatible (or rather the last one wins most likely).
% These are:
% \begin{description}
-% \item[\cs{@footnotetext at cfgpoint} (1 argument)]
+% \item[\socket{fntext/process} (1 argument)]
%
-% This receives all material that is to be processed (or stored)
-% including color protection code and what have you. The default
-% definition is to run \cs{insert}\cs{footins}.
+% \DescribeSocket[noprint]{fntext/process}
%
-% \item[\cs{@footnotetext at cfgpointii} (1 argument)]
+% This socket receives all material that is to be processed (or
+% stored) including color protection code and what have you.
+% The \plug{default} executes \cs{insert}\cs{footins}.
%
-% The default definition runs \cs{@makefntext} which contains
+% Available plugs are \plug{default}, \plug{side} (side notes), and \plug{mp} (minipage).
+%
+%
+% \item[\socket{fntext/make} (1 argument)]
+%
+% \DescribeSocket[noprint]{fntext/make}
+%
+% This socket receives the \meta{text} as given in \cs{footnote}
+% or \cs{footnotetext} in the document and adds formatting
+% instructions to it.
+%
+% The \plug{default} plug runs \cs{@makefntext} which contains
% various hooks for customization. For most scenarios this is
% sufficient. However, when running all footnotes as a single
% paragraph at the bottom, then each footnote needs to be
-% prepared prior to storing in the insert and this configuration
-% point allows running extra code to do that.
+% prepared prior to storing it with \cs{insert} and this socket
+% allows running extra code to do that.
%
-% \item[\cs{@footnotetext at cfgpointiii} (no argument)]
+% Available plugs are \plug{default} and \plug{para}.
%
-% By default this configuration point adds a strut to the
-% footnote material so that consecutive footnotes are properly
-% spaced vertically. In some use cases this is not appropriate
-% (e.g., when running all footnotes as a single paragraph) and so
-% this configuration point can cancel the action or do something
-% else instead.
+% \item[\socket{fntext/begin} (no argument)]
%
-% The configuration point is executed near the start of the
-% argument for the configuration point
-% \cs{@footnotetext at cfgpointii}.
+% \DescribeSocket[noprint]{fntext/begin}
%
-% \item[\cs{@footnotetext at cfgpointiv} (no argument)]
+% The socket is executed near the start of the
+% argument for the \socket{fntext/make} socket.
+% By \plug{default} it adds a strut to the footnote
+% material so that consecutive footnotes are properly spaced
+% vertically. In some use cases this is not appropriate (e.g.,
+% when running all footnotes as a single paragraph) and so with
+% this socket one can cancel the action or do something else
+% instead.
%
-% This configuration point is executed at the very end of the
-% argument passed to \cs{@footnotetext at cfgpointii}.
-% By default it adds a final strut as long as we are still in
-% horizontal mode (i.e., processing the footnote text paragraph.
-% When running several footnotes in one paragraph some additional
-% material (some horizontal glue) needs adding at this point.
+% Available plugs are \plug{default} and \plug{noop}.
%
+%
+% \item[\socket{fntext/end} (no argument)]
+%
+% \DescribeSocket[noprint]{fntext/end}
+%
+% This socket is executed at the very end of the argument passed
+% to socket \socket{fntext/make}. By \plug{default} it
+% adds a final strut as long as we are still in horizontal mode
+% (i.e., processing the footnote text paragraph). When running
+% several footnotes in one paragraph some additional material
+% (some horizontal glue) needs adding at this point which is done
+% with the plug \plug{para}.
+%
+% Available plugs are \plug{default}, \plug{para}, and
+% \plug{noop}.
% \end{description}
-% The configuration point \cs{@footnotetext at cfgpointii} runs
+%
+%
+% All standard plugs for the socket \socket{fntext/make} run
% \cs{@makefntext} and this command contains two further
-% configuration points (and a few hooks):
+% sockets (unless it is overwritten by a legacy class):
% \begin{description}
-% \item[\cs{@makefntext at cfgpoint} (1 argument)]
+% \item[\socket{fntext/mark} (0 arguments)]
%
-% This configuration point receives the material to typeset the
-% footnote mark. By default, all it does is running \cs{indent}
-% to get a paragraph indentation (if one is set up---in most
-% layouts it is 0~points) and then typesets the mark, but in
-% some designs it executes more elaborate code.
+% \DescribeSocket[noprint]{fntext/mark}
%
-% If tagging is produced this configuration point is also
-% responsible for surrounding the mark with the appropriate tags
-% marking the mark as an Lbl. It does this using the command
-% \cs{tag at FENoteLbl}.
+% This socket has no input arguments but uses \cs{@makefnmark} to
+% typeset the mark in front of the footnote text. Its
+% \plug{default} uses code that examines the value of
+% \cs{footnotemargin} and based on its setting typeset the mark
+% in different ways:
+% \begin{itemize}
+% \item positive: typeset the mark in a box of that size
+% \item zero: use \cs{llap} around the mark
+% \item negative: use \cs{llap} but with a box of the given size
+% negated inside
+% \item \texttt{-}\cs{maxdimen}: just use \cs{@makefnmark}
+% \end{itemize}
+% For most cases this would be flexible enough, but if not then a
+% class can define its own plug to specify the placement of the mark.
%
-% \item[\cs{@makefntext at cfgpointii} (1 argument)]
+% Available plugs are \plug{default} and \plug{noop} (no mark is produced).
%
-% This configuration point manages the formatting of the footnote
-% text once the mark has been typeset.
%
-% If tagging is produced this configuration point is also
-% responsible for surrounding the mark with the appropriate tags
-% marking the mark as an MC of type FENote. It does this using
-% the command \cs{tag at FENotetext}.
+% \item[\socket{fntext/text} (1 argument)]
%
+% \DescribeSocket[noprint]{fntext/text}
+%
+% This socket manages the formatting of the footnote text
+% (presented as an argument) once the mark has been typeset. In
+% all cases we can think of this formatting is better configured
+% via the available hooks described below, so the \plug{default}
+% just grabs the argument and processes it without any other
+% action. It is really only there to allow for some fancy stuff
+% that some design comes up with.
+%
+% Available plugs are \plug{identity} (default) and \plug{noop}.
+%
% \end{description}
%
%
@@ -284,13 +343,15 @@
%
%
%
-% \subsubsection{Hooks}
+% \subsubsection{Hooks for formatting the footnote text}
%
% \begin{description}
% \item[\hook{fntext/before}]
%
+% \DescribeHook[noprint]{fntext/before}
+%
% Executed at the very beginning of \cs{footnotetext}. Currently
-% there is on package (\pkg{linguex}) that
+% there is one package (\pkg{linguex}) that
% prepends material at this point.
%
% This hook is paired with hook \hook{fnmark/after}.
@@ -297,6 +358,8 @@
%
% \item[\hook{fntext}]
%
+% \DescribeHook[noprint]{fntext}
+%
% Executed at the beginning of the material passed to the first
% configuration point. Typically used to set any baseline
% stretch for the footnote text, e.g., by \pkg{setspace},
@@ -308,26 +371,34 @@
%
% \item[\hook{fntext/para}]
%
-% After the font is set default paragraph parameters are set up
+% \DescribeHook[noprint]{fntext/para}
+%
+% After the font is set (after the previous hook), some default
+% paragraph parameters
+% are set up
% including \cs{interlinepenalty}, \cs{hsize}, \cs{parindent} and
% a number of others, as some of them depend on the font
-% size. Then the \hook{fntext/para} is run. If one wants to
+% size. Then the \hook{fntext/para} is run which can overwrite
+% the default. If one wants to
% change the font size, it is probably necessary to reset these
% other parameters too, e.g., \cs{parindent}, which can be done
% here.
%
-% The configuration point \cs{@footnotetext at cfgpointii} normally
+% Note: the socket \socket{fntext/make} normally
% runs the command \cs{@makefntext} or some code that eventually
-% runs this command, and this then produces the footnote mark (in
-% front of the footnote text) and the formatted footnote text. In
+% runs this command, and this then produces the footnote mark in
+% front of the formatted footnote text. In
% front of both the mark and the footnote text some classes have
% placed paragraph parameter adjustments in their redefinition of
% \cs{@makefntext}. However, there is no need to place it there
% it could equally well go into the \hook{fntext/para} hook. We
-% therefore do not provide another hook at this point.
+% therefore do not provide another hook at this other point.
%
% \item[\hook{fntext/begin} \& \hook{fntext/end}]
%
+% \DescribeHook[noprint]{fntext/begin}
+% \DescribeHook[noprint]{fntext/end}
+%
% The footnote text itself is surrounded by the hooks
% \hook{fntext/begin} and \hook{fntext/end}. The two hooks are
% not paired as they are typically used independently.
@@ -334,6 +405,8 @@
%
% \item[\hook{fntext/after}]
%
+% \DescribeHook[noprint]{fntext/after}
+%
% At the very end of \cs{footnotetext} we execute the hook
% \hook{fntext/after} which is a reversed hook paired with
% \hook{fntext/before}. Some packages, e.g., \pkg{linguex}, have
@@ -384,6 +457,8 @@
%
% \section{Tagging and hyperlinking support}
%
+% \fmi{this section needs work (and probably csname changes)}
+%
% Footnotes consist of a \emph{footnotemark} (short: mark) that is typically placed in the text
% as a superscript number like this\footnotemark[1], and a \emph{footnotetext}
% (short: note) that is placed at the bottom of the page.
@@ -407,6 +482,38 @@
%
% \subsection{Technical details for the tagging}
%
+% The following sockets are set up for kernel use, when doing tagging:
+% \begin{description}
+% \item[\socket{tagsupport/fnmark} (1 argument)]
+%
+% \DescribeSocket[noprint]{tagsupport/fnmark}
+%
+% \fmi{describe and decide on names}
+%
+%
+% \item[\socket{tagsupport/fntext/begin} (no argument)]
+%
+% \DescribeSocket[noprint]{tagsupport/fntext/begin}
+%
+%
+% \item[\socket{tagsupport/fntext/end} (no argument)]
+%
+% \DescribeSocket[noprint]{tagsupport/fntext/end}
+%
+%
+% \item[\socket{tagsupport/fntext/mark} (1 argument)]
+%
+% \DescribeSocket[noprint]{tagsupport/fntext/mark}
+%
+%
+% \item[\socket{tagsupport/fntext/text} (1 argument)]
+%
+% \DescribeSocket[noprint]{tagsupport/fntext/text}
+%
+%
+% \end{description}
+%
+%
% The \emph{footnotemark} should create a \texttt{/Lbl} structure\footnote{to make it easier
% to identify the role we use \texttt{/footnotemark} which we rolemap to \texttt{/Lbl}} that should contain a \texttt{/Ref} entry pointing
% to the structure of the \emph{footnotetext}.
@@ -475,36 +582,36 @@
% as long as nothing unusual is done to \cs{@thefnmark}.
% It also works if a document uses more than one footnote series as long as they have distinct numbering
% systems, but in case a distinction is needed it is possible to define
-% a new data structure and to switch locally to use this
-% container. The following three commands are used for this.
+% a new class with its own data structure and to switch locally to use this
+% class. The following three commands are used for this.
%
-% The default property uses the name \texttt{default}
+% The default class uses the name \texttt{default}
%
-% \begin{function}{\fnote_new:nn}
+% \begin{function}{\fnote_class_new:nn}
% \begin{syntax}
-% \cs{fnote_new:nn}\Arg{name}\Arg{key/value option}
+% \cs{fnote_class_new:nn}\Arg{name}\Arg{key/value option}
% \end{syntax}
-%
-% This commands set up the needed data structure. Currently this only
-% consists of a property which is used to store and manage the mark values.
-% There are no options yet.
+% This declaration sets up the needed data structure. Currently this only
+% consists of a property list which is used to store and manage the mark values.
+% There are no options yet.
% \end{function}
%
% \begin{function}{\fnote_mark_gput:nn,\fnote_mark_gput:no,\fnote_mark_gput:oo}
% \begin{syntax}
-% \cs{fnote_mark_gput:nn}\Arg{mark}\Arg{footnote type name}
+% \cs{fnote_mark_gput:nn}\Arg{mark}\Arg{class name}
% \end{syntax}
-% This command stores the current structure number as key and the \meta{mark} as
-% value in the property associated with the \meta{footnote type name}
+% This command stores the current structure number as key and the \meta{mark} as
+% value in the property list associated with the \meta{class name}.
% \end{function}
%
-% \begin{function}{\fnote_mark_gpop:nnN}
+% \begin{function}{\fnote_mark_gpop_all:nnN}
% \begin{syntax}
-% \cs{fnote_mark_gpop:nnN}\Arg{mark}\Arg{footnote type name}\meta{sequence}
+% \cs{fnote_mark_gpop_all:nnN}\Arg{mark}\Arg{class name}\meta{sequence}
% \end{syntax}
-% This command stores the keys/structure numbers whose value are \meta{mark} in the
-% property associated with \meta{footnote type name} in the \meta{sequence}
-% and then remove them from the property. The content of the sequence can then be
+% This command stores all the keys/structure numbers whose value in the
+% property list for \meta{class name} are equal to \meta{mark}
+% into the sequence \meta{sequence} and then removes them from the property list.
+% The content of the sequence can then be
% used to create link targets and references.
% \end{function}
%
@@ -516,7 +623,7 @@
% above, as it contains a reference command it can't be used to match a note, also \cs{footref} can
% be used after the note has already been set. \cs{footref} disables therefore the automatic detection.
%
-% Instead the \cs{label} command is (currently with the help of a hook from the \texttt{nameref} package)
+% Instead the \cs{label} command is
% extended in the \cs{footnotetext} command to also store the structure number and \cs{footref} retrieves this
% number to setup the reference and the link.
%
@@ -560,29 +667,34 @@
% by the mark commands) and one for the structure number of the footnotetest itself
% (used as target by \cs{footref}s commands).
%
-% \subsection{Implementation details}
+% \subsection{Implementation details regarding tagging}
%
% \subsection{Handling the mark}
%
-% The mark in the text is handled by redefining the kernel configuration point
-% \cs{@kernel at process@makefnmark} to \cs{tag at FEMark}.
-% It takes one argument, \cs{@makefnmark}, the command which formats the
-% mark, and surrounds it by link and tagging commands.
-% At the point where \cs{@kernel at process@makefnmark} is issued \cs{@thefnmark} has already been
-% defined and can be used to setup the reference detections.
+% The mark in the text is handled by assigning an appropriate
+% plug to the socket \socket{tagsupport/fnmark}.
+% It takes one argument, \cs{@makefnmark}, the
+% command which formats the mark, and surrounds it by link and tagging
+% commands. At the point where the socket is
+% executed, \cs{@thefnmark} has already been defined and can be used to
+% setup the reference detections.
%
%
% \subsection{Handling the footnotetext}
%
-% The main part is done by redefining \cs{@kernel at process@footnotetext}. This configuration point takes two arguments, \cs{@footnotetext at cfgpoint} (by default \verb+\insert\footins+) and as second argument lots of code related to typesetting the notemark and the footnote text with the actual content of the footnote text somewhere in the middle.
+% The main part is done by assigning a different plug to socket \socket{tagsupport/fntext/begin}
+% and \socket{tagsupport/fntext/end}
+% surrounding the footnote text.
+% These sockets are used to start and end the structure and
+% attempt to detect to which mark the note is related.
%
-% The redefinition of \cs{@kernel at process@footnotetext} surrounds the content with the structure command
-% and tries to detect to which mark the note is related.
+% The actual typesetting of the note text is done by
+% \cs{fnote_makefntext:n} (or its \LaTeXe{} name \cs{@makefntext}). In
+% the new implementation this contains two further kernel sockets for tagging:
+% \socket{tagsupport/fntext/mark} and
+% \socket{tagsupport/fntext/text}. They get plugs assigned that add the
+% tagging commands around note mark and note text.
%
-% The actual typesetting of the note text is done
-% by \cs{@makefntext}/\cs{fnote_makefntext:n}. In the new implementation this contains two configuration
-% points, \cs{@makefntext at cfgpoint} and \cs{@makefntext at cfgpointii}. These are redefined to add the tagging commands around note mark and note text.
-%
% \subsection{Footnotes in minipages}
%
% In minipages the \cs{footnote} command uses a special marker
@@ -603,13 +715,6 @@
%
% \begin{itemize}
%
-% \item tagging destroys footnotes directly following the text with pdflatex.
-%
-% \item there is a dependency on nameref as it provides the hook in \cs{label}
-% used by the \cs{footref} code.
-%
-% \item there is a dependency to etoolbox as we patch \cs{\@iiiminipage}
-%
% \item Special formatting of footnote marks in the text, e.g. if ranges or commas are
% used require special care as they should normally mark up such text as artifacts and
% perhaps have to insert empty structures to represent an invisible mark. This must be coordinated
@@ -617,9 +722,6 @@
%
% \item manyfoot doesn't work correctly and must be analyzed.
%
-% \item Check if additional kernel configuration points are needed/possible
-% to avoid the redefinitions of \cs{@makefntext at cfgpoint} and \cs{@makefntext at cfgpointii}.
-%
% \item \pkg{memoir} is not supported at all and errors when the code tries to patch
% \cs{@makefntext}.
% \end{itemize}
@@ -644,7 +746,8 @@
% \subsection{File declaration}
% \begin{macrocode}
\ProvidesFile{latex-lab-footnotes.ltx}
- [2023-02-04 v0.7 changes to the footnote interfaces]
+ [\ltlabfootnotedate\space v\ltlabfootnoteversion\space
+ changes to the footnote interfaces]
% \end{macrocode}
%
% \subsection{code not fully handled yet}
@@ -796,7 +899,6 @@
% \subsection{Variants}
%
% \begin{macrocode}
-\cs_generate_variant:Nn \ref_label:nn { Vn }
\cs_generate_variant:Nn \ref_value:nn { Vn }
\cs_generate_variant:Nn \prop_gput:Nnn {cxn}
\cs_generate_variant:Nn \hook_gput_code:nnn{nne}
@@ -852,7 +954,10 @@
%
% \subsection{Hooks}
%
-% Hooks in the footnotemark command.
+% \begin{hookdecl}{fnmark/before,fnmark/after,
+% fnmark,
+% fnmark/begin,fnmark/end}
+% Hooks in the footnotemark command.
% \begin{macrocode}
\NewMirroredHookPair{fnmark/before}{fnmark/after}
\NewHook{fnmark}
@@ -859,7 +964,12 @@
\NewHook{fnmark/begin}
\NewHook{fnmark/end}
% \end{macrocode}
-% Hooks in the footnotetext command
+% \end{hookdecl}
+%
+% \begin{hookdecl}{fntext/before,fntext/after,
+% fntext,
+% fntext/begin,fntext/end,fntext/para}
+% Hooks in the footnotetext command:
% \begin{macrocode}
\NewMirroredHookPair{fntext/before}{fntext/after}
\NewHook{fntext}
@@ -867,6 +977,7 @@
\NewHook{fntext/begin}
\NewHook{fntext/end}
% \end{macrocode}
+% \end{hookdecl}
%
% \subsection{Debugging code}
% the debugging code is just temporary
@@ -882,11 +993,11 @@
{
\bool_if:NT \g_fnote_debug_bool
{
- \LogHook{fnmark/before}
- \LogHook{fnmark}
- \LogHook{fnmark/begin}
- \LogHook{fnmark/end}
- \LogHook{fnmark/after}
+ \hook_log:n {fnmark/before}
+ \hook_log:n {fnmark}
+ \hook_log:n {fnmark/begin}
+ \hook_log:n {fnmark/end}
+ \hook_log:n {fnmark/after}
\cs_gset_eq:NN \@@_debug_footnotemark: \prg_do_nothing:
}
}
@@ -897,19 +1008,33 @@
{
\bool_if:NT \g_fnote_debug_bool
{
- \cs_log:N\@footnotetext at cfgpoint
- \cs_log:N\@footnotetext at cfgpointii
- \cs_log:N\@footnotetext at cfgpointiii
- \cs_log:N\@footnotetext at cfgpointiv
- \cs_log:N\@makefntext at cfgpoint
- \cs_log:N\@makefntext at cfgpointii
- \LogHook{fntext/before}
- \LogHook{fntext}
- \LogHook{fntext/para}
- \LogHook{fntext/begin}
- \LogHook{fntext/end}
- \LogHook{fntext/after}
+ \socket_log:n {fntext/process}
+ \socket_log:n {fntext/make}
+ \socket_log:n {fntext/begin}
+ \socket_log:n {fntext/end}
% \end{macrocode}
+%
+% \begin{macrocode}
+ \socket_log:n {fntext/mark}
+ \socket_log:n {fntext/text}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \socket_log:n {tagsupport/fnmark}
+ \socket_log:n {tagsupport/fntext/begin}
+ \socket_log:n {tagsupport/fntext/end}
+ \socket_log:n {tagsupport/fntext/mark}
+ \socket_log:n {tagsupport/fntext/text}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \hook_log:n {fntext/before}
+ \hook_log:n {fntext}
+ \hook_log:n {fntext/para}
+ \hook_log:n {fntext/begin}
+ \hook_log:n {fntext/end}
+ \hook_log:n {fntext/after}
+% \end{macrocode}
% Show the info only once (if at all).
% \begin{macrocode}
\cs_gset_eq:NN \@@_debug_footnotetext: \prg_do_nothing:
@@ -926,7 +1051,7 @@
%-------
% bibarts
% chextras --- actually in the wrong place does an \unskip
- \UseHook{fnmark/before}
+ \hook_use:n {fnmark/before}
%-------
\leavevmode
\ifhmode
@@ -936,21 +1061,24 @@
% (a bit less efficient)
% memhfixc.sty
% footmisc.sty
- \UseHook{fnmark}
+ \hook_use:n {fnmark}
%-------
\nobreak
\fi
%-------
% hyperref.sty
- \UseHook{fnmark/begin}
+ \hook_use:n {fnmark/begin}
%-------
- \@kernel at process@makefnmark
- \@makefnmark
+% \end{macrocode}
+% The kernel socket for tagging. It picks up \cs{@makefnmark} as its
+% argument and if tagging is not active it contains the \plug{identity} plug.
+% \begin{macrocode}
+ \socket_use:nn {tagsupport/fnmark} \@makefnmark
%-------
% \end{macrocode}
% If a footnote mark is placed by its own then it should finish by
-% executing \hook{fnmark/end}, resetting the space factor, and
-% finishing with \hook{fnmark/after}. However, in a complete
+% executing the hook \hook{fnmark/end}, resetting the space factor, and
+% finishing with the hook \hook{fnmark/after}. However, in a complete
% footnote these actions have to happen only after we have handled
% the footnote text (e.g., by placing it into an \cs{insert}). In
% such a situation \cs{_@@_footmark_finish:} below does nothing
@@ -961,9 +1089,10 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_finish:,\@@_footnotemark_finish:}
+% \begin{macro}{\@@_footnotemark_default_finish:,\@@_footnotemark_finish:}
+% The default definition for \cs{@@_footnotemark_finish:} is called \cs{@@_footnotemark_default_finish:}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_finish: {
+\cs_new_protected:Npn \@@_footnotemark_default_finish: {
% hyperref.sty
% memhfixc.sty --- could move fnmark/after
% scrlttr2.cls --- could vanish if footmisc uses a hook
@@ -978,20 +1107,24 @@
\UseHook{fnmark/after}
%-------
}
-
-\cs_new_eq:NN \@@_footnotemark_finish: \@@_finish:
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\@kernel at process@makefnmark}
-% Not a public config point but the kernel hook to add tagging
% \begin{macrocode}
-\def \@kernel at process@makefnmark { }
+\cs_new_eq:NN \@@_footnotemark_finish: \@@_footnotemark_default_finish:
% \end{macrocode}
% \end{macro}
%
+% \begin{socketdecl}{tagsupport/fnmark}
+% Not a public socket but reserved for tagging. By
+% default it contains \plug{identity} and is reassigned if tagging is active.
+% \begin{macrocode}
+\NewSocket{tagsupport/fnmark}{1}
+% \end{macrocode}
+% \end{socketdecl}
+%
% \begin{macro}{\@footnotemark}
-% At last provide the name \LaTeXe{} is used to.
+% Here we provide the traditional \LaTeXe{} name in case it is directly used
+% in some legacy class.
% \begin{macrocode}
\cs_set_eq:NN \@footnotemark \fnote_footnotemark:
% \end{macrocode}
@@ -1007,16 +1140,23 @@
\@@_debug_footnotetext:
%-------
% ./linguex/linguex.sty
- \UseHook{fntext/before}
+ \hook_use:n {fntext/before}
%-------
- \@kernel at process@footnotetext
- \@footnotetext at cfgpoint { % config point
+% \end{macrocode}
+% Execute a kernel socket for tagging.
+% \begin{macrocode}
+ \socket_use:n {tagsupport/fntext/begin}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \socket_use:nn {fntext/process}
+ {
%-------
% resetting baselinestretch ... (could be done further down)
% ./uafthesis/uafthesis.cls
% ./setspace/setspace.sty
% ./footmisc/footmisc.sty (normal)
- \UseHook{fntext}
+ \hook_use:n {fntext}
%-------
\reset at font
\footnotesize
@@ -1046,23 +1186,24 @@
% and \cs{@currentlabel} is that is necessary.
%
% ./resphilosophica/resphilosophica.cls
- \UseHook{fntext/para}
+ \hook_use:n {fntext/para}
%-------
\color at begingroup
%-------
-% fnpara wants to replace \@makefntext{...} and para and side option of footmisc etc too ...
-% so we make this a config point
+% fnpara wants to replace \@makefntext{...} and para and side
+% option of footmisc etc too ...
+% so we make this a socket, because only one action can be active:
%-------
- \@footnotetext at cfgpointii % config point
+ \socket_use:nn {fntext/make}
{
%-------
% ./resphilosophica/resphilosophica.cls
%-------
- \@footnotetext at cfgpointiii % config point
+ \socket_use:n {fntext/begin}%
%-------
% bibarts
% fnbreak.sty
- \UseHook{fntext/begin}
+ \hook_use:n {fntext/begin}
%-------
\ignorespaces
#1
@@ -1069,61 +1210,120 @@
%-------
% bibarts
% fnbreak.sty
- \UseHook{fntext/end}
+ \hook_use:n {fntext/end}
%-------
- \@footnotetext at cfgpointiv % config point
+% \end{macrocode}
+% The socket code (by default adding a strut) has to come
+% \emph{after} everything added into the hook above.
+% \begin{macrocode}
+ \socket_use:n {fntext/end}
}
\par
\color at endgroup
}
%-------
+% \end{macrocode}
+% The corresponding kernel hook that ends the tagging structure if
+% tagging is active.
+% \begin{macrocode}
+ \socket_use:n{tagsupport/fntext/end}
+%-------
% ./linguex/linguex.sty
- \UseHook{fntext/after}
+ \hook_use:n {fntext/after}
%-------
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@footnotetext at cfgpoint}
-% default for config point (1 arg)
+% \begin{socketdecl}{fntext/process}
+%
% \begin{macrocode}
-\cs_new_protected:Npn \@footnotetext at cfgpoint { \insert\footins }
+\NewSocket {fntext/process}{1}
+\NewSocketPlug{fntext/process}{default}{ \insert\footins {#1} }
+\NewSocketPlug{fntext/process}{side} { \marginpar {#1} }
% \end{macrocode}
-% \end{macro}
+%
+% \begin{macrocode}
+\AssignSocketPlug{fntext/process}{default}
+% \end{macrocode}
+% \end{socketdecl}
%
%
-% \begin{macro}{\@footnotetext at cfgpointii}
-% default for config point (1 arg)
+%
+% \begin{socketdecl}{fntext/make}
+% This socket receives the \meta{text} from the \cs{footnote} or
+% \cs{footnotetext} and formats it.
% \begin{macrocode}
-\cs_new_protected:Npn \@footnotetext at cfgpointii { \@makefntext }
+\NewSocket {fntext/make}{1}
+\NewSocketPlug{fntext/make}{default}{ \@makefntext {#1} }
% \end{macrocode}
-% \end{macro}
+% When running several footnotes together as a paragraph some
+% additional work is necessary to unbox the individual footnotes
+% recursively (see \TeX{}book algorithm in appendix~D).
+% \begin{macrocode}
+\NewSocketPlug{fntext/make}{para}
+{
+ \setbox\FN at tempboxa\hbox{\@makefntext{#1}}%
+ \dp\FN at tempboxa\z@
+ \ht\FN at tempboxa
+ \dimexpr\wd\FN at tempboxa *%
+ \footnotebaselineskip /\columnwidth\relax
+ \box\FN at tempboxa
+}
+% \end{macrocode}
%
-% \begin{macro}{\@footnotetext at cfgpointiii}
-% default for config point (0 args)
% \begin{macrocode}
-\cs_new_protected:Npn \@footnotetext at cfgpointiii { \rule\z@\footnotesep }
+\AssignSocketPlug{fntext/make}{default}
% \end{macrocode}
-% \end{macro}
+% \end{socketdecl}
%
-% \begin{macro}{\@footnotetext at cfgpointiv}
-% default for config point (0 args)
+% \begin{socketdecl}{fntext/begin}
+% By default adds a strut at the start of the footnote text.
% \begin{macrocode}
-\cs_new_protected:Npn \@footnotetext at cfgpointiv { \@finalstrut\strutbox }
+\NewSocket {fntext/begin}{0}
+\NewSocketPlug{fntext/begin}{default}{ \rule\z@\footnotesep }
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\@kernel at process@footnotetext}
-% kernel hook for tagging (2 args)
% \begin{macrocode}
-\cs_new_protected:Npn \@kernel at process@footnotetext {}
+\AssignSocketPlug{fntext/begin}{default}
% \end{macrocode}
-% \end{macro}
+% \end{socketdecl}
%
+% \begin{socketdecl}{fntext/end}
+% By default adds a strut at the end of the footnote text unless we
+% are no longer in hmode.
+% \begin{macrocode}
+\NewSocket {fntext/end}{0}
+\NewSocketPlug{fntext/end}{default}{ \@finalstrut\strutbox }
+% \end{macrocode}
+% When running several footnotes together as a paragraph some
+% additional glue has to be added between them.
+% \begin{macrocode}
+\NewSocketPlug{fntext/end}{para}
+ {%
+ \strut
+ \penalty-10\relax
+ \hskip\footglue
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AssignSocketPlug{fntext/end}{default}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/fntext/begin,tagsupport/fntext/end}
+% Kernel sockets for tagging.
+% \begin{macrocode}
+\NewSocket{tagsupport/fntext/begin}{0}
+\NewSocket{tagsupport/fntext/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
% Provide the name \LaTeXe{} is used to and do this unconditionally
-% (no patching of class code if any). This means that if a class provides it own
-% definition that gets lost and if necessary needs to be handled
-% with firstaid (or updating of the class).
+% (no patching of class code if any). This means that if a class
+% provides it own definition that gets lost and if necessary needs to
+% be handled with firstaid (or updating of the class).
% \begin{macrocode}
\AddToHook{begindocument}
{
@@ -1131,6 +1331,9 @@
}
% \end{macrocode}
%
+%
+%
+%
% \subsection{The new \cs{@makefntext} command}
%
% \cs{footnotemargin} is the logic implemented by footmisc. Perhaps we
@@ -1147,57 +1350,85 @@
\fi
}
% \end{macrocode}
-
+%
+%
+%
+%
% \begin{macro}{\fnote_makefntext:n}
% \begin{macrocode}
\cs_new_protected:Npn \fnote_makefntext:n #1 {
% \end{macrocode}
% Some classes in their redefinition for \cs{@makefntext} have
-% places some paragraph parameters at this point, but those can
+% placed some paragraph parameters at this point, but those can
% equally well go into the hook \hook{fntext/para}. We therefore do
% not provide a further hook at this point.
% \begin{macrocode}
- \@makefntext at cfgpoint
- {
- \ifdim\footnotemargin>\z@
- \hb at xt@ \footnotemargin{\hss\@makefnmark}
- \else
- \ifdim\footnotemargin=\z@
- \llap{\@makefnmark}
- \else
- \ifdim\footnotemargin=-\maxdimen
- \@makefnmark
- \else
- \llap{\hb at xt@ -\footnotemargin{\@makefnmark\hss}}
- \fi
- \fi
- \fi
- }
- \@makefntext at cfgpointii
- { #1 }
+ \noindent
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \socket_use:nn {tagsupport/fntext/mark} { \socket_use:n {fntext/mark} }
+ \socket_use:nn {tagsupport/fntext/text} { \socket_use:nn {fntext/text}{#1} }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@makefntext at cfgpoint}
-% default for config point (1 arg)
+% \begin{socketdecl}{fntext/mark}
+% A socket to typeset the mark at the start of a footnote.
% \begin{macrocode}
-\cs_new_protected:Npn \@makefntext at cfgpoint { \noindent }
+\NewSocket {fntext/mark}{0}
% \end{macrocode}
-% \end{macro}
+% The \plug{default} plug implements the logic introduced with the
+% \pkg{footmisc} package.
+% \begin{macrocode}
+\NewSocketPlug{fntext/mark}{default}{
+ \ifdim\footnotemargin>\z@
+ \hb at xt@ \footnotemargin{\hss\@makefnmark}
+ \else
+ \ifdim\footnotemargin=\z@
+ \llap{\@makefnmark}
+ \else
+ \ifdim\footnotemargin=-\maxdimen
+ \@makefnmark
+ \else
+ \llap{\hb at xt@ -\footnotemargin{\@makefnmark\hss}}
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
%
-% \begin{macro}{\@makefntext at cfgpointii}
-% default for config point (1 arg)
% \begin{macrocode}
-\cs_new_protected:Npn \@makefntext at cfgpointii #1 { #1 }
+\AssignSocketPlug{fntext/mark}{default}
% \end{macrocode}
-% \end{macro}
+% \end{socketdecl}
%
+% \begin{socketdecl}{fntext/text}
+% By default this socket does nothing special and simply processes
+% its argument as provided.
+% \begin{macrocode}
+\NewSocket {fntext/text}{1}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+%
+% \begin{socketdecl}{tagsupport/fntext/mark,tagsupport/fntext/text}
+% Not a public socket but reserved for tagging. By
+% default it contains \plug{identity} and is reassigned if tagging is active.
+% \begin{macrocode}
+\NewSocket{tagsupport/fntext/mark}{1}
+\NewSocket{tagsupport/fntext/text}{1}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+%
% \subsubsection{Making documents use the new \cs{@makefntext}}
%
% If the definition for \cs{@makefntext} is that of the standard
% classes then replace it with \cs{fnote_makefntext:n}, otherwise
-% try to patch the definition.
+% try to patch the definition used in the class.
%
% Here is the definition the way it is in
% \texttt{classes.dtx}. Notice that (for saving space) there is no
@@ -1217,11 +1448,13 @@
%
% Here is the messy code for patching. Note that this is only there
% to help classes along that aren't updated yet so it does some
-% minimal patching to hopefully add configuration points in the
-% right place.
+% minimal patching to hopefully add kernel configuration hooks in the
+% right place while otherwise leaving the legacy code alone. An
+% updated class would not redefine \cs{@makefntext} but simply add
+% appropriate code to the provided hooks.
%
% What it does is roughly the
-% following: It look for a definition of \cs{@makefntext} of the form
+% following: It looks for a definition of \cs{@makefntext} of the form
%\begin{verbatim}
% {AAA \hbox BBB { CCC } DDD #1 EEE }
%\end{verbatim}
@@ -1228,11 +1461,11 @@
% where ``BBB'' is something like \texttt{to 1em} or similar. It then
% replaces that with
%\begin{verbatim}
-% {AAA \@makefntext at cfgpoint{\hbox BBB { CCC }} DDD
-% \@makefntext at cfgpointii{#1} EEE }
+% {AAA \UseSocket{tagsupport/fntext/mark}{\hbox BBB { CCC }} DDD
+% \UseSocket{tagsupport/fntext/text}{#1} EEE }
%\end{verbatim}
% The patching is not very careful, i.e., it assumes there is only
-% one \verb=#1= in the replacement text and that a \cs{hbox} found
+% one \verb=#1= in the replacement text and that the first \cs{hbox} found
% is the right one to patch. But that is enough to cater for all
% definitions of \cs{@makefntext} out there in the TL distribution.
%
@@ -1247,7 +1480,7 @@
\cs_new_protected:Npn \@@_patch:
{
- \tl_set:No \l_@@_patch_tl { \@makefntext { \@makefntext at cfgpointii{##1} } }
+ \tl_set:No \l_@@_patch_tl { \@makefntext { \UseSocket{tagsupport/fntext/text}{##1} } }
\tl_if_in:NnTF \l_@@_patch_tl { \hbox }
{ \cs_set_eq:NN \@@_tmp:w \@@_patch_hbox:w }
{
@@ -1268,7 +1501,7 @@
% \end{macrocode}
%
% If \cs{@makefntext} contains \cs{hbox} then grab ``AAA'' as
-% \verb=#1= and ``BBB'' (up to the open \verb={=) and return it as
+% \verb=#1= and ``BBB'' (up to the open \texttt{\{}) and return it as
%\begin{verbatim}
% AAA \@makefntext at processX { \hbox BBB }
%\end{verbatim}
@@ -1291,12 +1524,13 @@
% not a patch person, so this is the simple way out for now:
%
% \begin{macrocode}
-\cs_new:Npn \@makefntext at processX #1#2{\@makefntext at cfgpoint{#1{#2}}}
+\cs_new:Npn \@makefntext at processX #1#2{\UseSocket{tagsupport/fntext/mark}{#1{#2}}}
% \end{macrocode}
%
% At \verb=\begin{document}= check if the current definition is
% that of the standard classes and if so replace it by
% \cs{fnote_makefntext:n} otherwise try and patch the definition
+% made by some class or package
% using the approach above.
% \begin{macrocode}
@@ -1340,7 +1574,7 @@
\fnote_step_fnmark:nn {#1} \@mpfn
\cs_set_eq:NN \@@_footnotemark_finish: \prg_do_nothing:
\@footnotemark
- \cs_set_eq:NN \@@_footnotemark_finish: \@@_finish:
+ \cs_set_eq:NN \@@_footnotemark_finish: \@@_footnotemark_default_finish:
\@footnotetext {#2}
\@@_footnotemark_finish:
}
@@ -1362,7 +1596,7 @@
% \cs{footref} used the starred \cs{ref} in \cs{@thefnmark}
% as the linking is handled by the tagging code inside
% the \cs{@footnotemark}.
-% \cs{footref} should not try to link to its related related
+% \cs{footref} should not try to link to its related
% note automatically but should instead use the label.
% This is passed to \cs{@footnotemark} through
% \cs{l__fnote_currentlabel_tl}.
@@ -1388,9 +1622,8 @@
% Tagging of footnotes in minipages require a change in the minipage commands
% We define at first a local configuration command for minipage footnotes.
%
-% TODO remove the dependency to etoolbox, and need for the patch.
% \begin{macrocode}
-\cs_new_protected:Npn \@mpfootnotetext at cfgpoint #1
+\NewSocketPlug{fntext/process}{mp}
{
\global\setbox\@mpfootins\vbox{%
\unvbox\@mpfootins
@@ -1398,16 +1631,6 @@
}
}
% \end{macrocode}
-% Then we patch \cs{@iiiminipage}
-% \begin{macrocode}
-\RequirePackage{etoolbox}
-\ExplSyntaxOff
-\patchcmd\@iiiminipage
- {\let\@footnotetext\@mpfootnotetext}
- {\let\@footnotetext at cfgpoint\@mpfootnotetext at cfgpoint}
- {}{\ERROR}
-\ExplSyntaxOn
-% \end{macrocode}
%
% \subsubsection{\pkg{memoir}}
% The \pkg{memoir} class redefines various internal commands to inject its
@@ -1484,7 +1707,7 @@
% For \cs{footref} and (perhaps later for labeled footnotes)
% we must extend the label system.
% Beside the normal values we also need the structure number of the note.
-% We use the \pkg{nameref} hook until latex provides a hook for its label.
+% We use the inbuild label hook
% At first we define a suitable attribute, it uses as value the structure
% number of the note as stored in \cs{l__fnote_currentstruct_tl}
% \begin{macrocode}
@@ -1491,28 +1714,21 @@
\ref_attribute_gset:nnnn {fnote/struct}{1}{now}{\l_@@_currentstruct_tl}
% \end{macrocode}
%
-% We add a hook to the \pkg{nameref} hook. By default it does nothing
-% \begin{macro}{\@@_label_hook:}
+% We add a hook to the label hook. By default it does nothing
+% \begin{macro}{\@@_label_hook:n}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_label_hook: {}
-\AddToHook{begindocument/before}
- {
- \RequirePackage{nameref}
- \g at addto@macro\label at hook
- {
- \@@_label_hook:
- }
- }
+\cs_new_protected:Npn \@@_label_hook:n #1 {}
+\AddToHookWithArguments{label}{ \@@_label_hook:n{#1}}
% \end{macrocode}
% \end{macro}
% Inside a footnotetext we change the hook to store the structure number too.
-% nameref provides the name of label in \cs{label at name}.
+% The name of label is provided as argument in the label hook.
% \begin{macrocode}
\AddToHook{fntext/begin}
{
- \cs_set_protected:Npn \@@_label_hook:
+ \cs_set_protected:Npn \@@_label_hook:n #1
{
- \ref_label:Vn \label at name {fnote/struct}
+ \ref_label:nn {#1} {fnote/struct}
}
}
% \end{macrocode}
@@ -1526,7 +1742,7 @@
% tabular notes, other footnote series) to make use of this.
%
%
-% \begin{macro}{\fnote_new:nn}
+% \begin{macro}{\fnote_class_new:nn}
% This sets up a new footnote type, the first argument
% is the name, the second is meant for options. Currently
% it does nothing at all.
@@ -1534,19 +1750,19 @@
% command as its own type!
%
% \begin{macrocode}
-\cs_new_protected:Npn \fnote_new:nn #1 #2 % #1 name, #2 options
+\cs_new_protected:Npn \fnote_class_new:nn #1 #2 % #1 name, #2 options
{
\prop_new:c { g_@@_currentmarks_ #1 _prop }
}
-\fnote_new:nn {default}{}
+\fnote_class_new:nn {default}{}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\fnote_mark_gput:nn}
-% This commands takes as argument the representation of the mark
-% (e.g. \cs{@thefnmark} and the type (typically default should work)
+% This commands takes as argument the representation of the mark,
+% e.g., \cs{@thefnmark} and the type (typically default should work).
% \begin{macrocode}
\cs_new_protected:Npn \fnote_mark_gput:nn #1 #2 % #1 the representation of the mark, #2 type
{
@@ -1559,13 +1775,13 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\fnote_mark_gpop:nnN}
+% \begin{macro}{\fnote_mark_gpop_all:nnN}
% This commands takes as argument the representation of the mark
-% (e.g. the content of\cs{@thefnmark}), the series (typically default should work)
+% (e.g. the content of\cs{@thefnmark}), the class (typically |default| should work)
% and a sequence into which every structure number in the property
-% is stored that has the same value as the mark
+% is stored that has the same value as the mark. The sequence is cleared first.
% \begin{macrocode}
-\cs_new_protected:Npn \fnote_mark_gpop:nnN #1 #2 #3
+\cs_new_protected:Npn \fnote_mark_gpop_all:nnN #1 #2 #3
{
\seq_clear:N #3
\prop_set_eq:Nc \l_@@_tmpa_prop { g_@@_currentmarks_ #2 _prop }
@@ -1584,20 +1800,28 @@
}
}
}
-\cs_generate_variant:Nn\fnote_mark_gpop:nnN {ooN}
+\cs_generate_variant:Nn\fnote_mark_gpop_all:nnN {ooN}
% \end{macrocode}
% \end{macro}
-
-
+%
+%
+%
+%
% \subsubsection{Enabling tagging and links for the mark command}
-% To handle the mark in the text, we define a special command
-% which will surround \cs{@makefntext}.
-% At this time \cs{@thefnmark} is already set.
+%
+%
+% \begin{plugdecl}{FEMark}
+%
+% To handle the mark in the text, we define a special plug for
+% the socket \socket{tagsupport/fnmark} that receives
+% \cs{@makefntext} as its argument. At this time \cs{@thefnmark}
+% is already set.
+%
% \begin{macrocode}
-\cs_new_protected:Npn \tag at FEMark #1 %#1 content
+\NewSocketPlug{tagsupport/fnmark}{FEMark}
{
% \end{macrocode}
-% end an open mc and start the structure.
+% End an open mc and start the structure.
% \begin{macrocode}
\tag_mc_end_push:
\tag_struct_begin:n { tag=footnotemark }
@@ -1658,11 +1882,15 @@
\tag_mc_begin_pop:n{}
}
% \end{macrocode}
-% At last set the kernel command to this one
+% At last assign the plug:
% \begin{macrocode}
-\cs_set_eq:NN \@kernel at process@makefnmark \tag at FEMark
+\AssignSocketPlug{tagsupport/fnmark}{FEMark}
% \end{macrocode}
-
+% \end{plugdecl}
+%
+%
+%
+%
% \subsubsection{The footnote text}
% We need a public command to append values to the Ref keys
@@ -1688,11 +1916,13 @@
\tl_new:N \l_@@_dflt_struct_tl
\tl_set:Nn \l_@@_dflt_struct_tl {1}
% \end{macrocode}
-% kernel hook for tagging (2 args)
+% kernel hooks for taggin
% this sets the structure around the whole text
%
+%
+% \begin{plugdecl}{FENote}
% \begin{macrocode}
-\cs_new_protected:Npn \tag at FENote #1#2 % #1 config point, \insert\footins #2 content
+\NewSocketPlug{tagsupport/fntext/begin}{FENote}
{
\tag_mc_end_push:
% \end{macrocode}
@@ -1724,7 +1954,7 @@
% \end{macrocode}
% find open marks with identical \cs{@thefnmark}
% \begin{macrocode}
- \fnote_mark_gpop:ooN { \@thefnmark }{ \l_fnote_type_tl } \l_@@_currentrefs_seq
+ \fnote_mark_gpop_all:ooN { \@thefnmark }{ \l_fnote_type_tl } \l_@@_currentrefs_seq
% \end{macrocode}
% Then we store the object numbers of the marks in the /Ref of the FENote structure:
% and the number of the FEnote into the marks structure:
@@ -1744,57 +1974,62 @@
{%no auto
}
+ }
% \end{macrocode}
% This finish the setup of the tagging structure.
+% \end{plugdecl}
+
+
+
% Now we process the text. The destinations for the links are set with the label
% so that we can be sure that we are in hmode.
% \begin{macrocode}
- #1 {#2}
+\NewSocketPlug{tagsupport/fntext/end}{FENote}
+ {
\tag_struct_end:
\tag_mc_begin_pop:n{}
}
% \end{macrocode}
-% At last set the kernel command to this one
+% At last assign the plugs:
% \begin{macrocode}
-\cs_set_eq:NN \@kernel at process@footnotetext \tag at FENote
+\AssignSocketPlug{tagsupport/fntext/begin}{FENote}
+\AssignSocketPlug{tagsupport/fntext/end}{FENote}
% \end{macrocode}
%
-% \cs{@makefntext at cfgpoint} is the configuration point responsible for
-% typesetting the mark in the note. We use it to surround
+% The kernel socket \socket{tagsupport/fntext/mark} is responsible for
+% tagging the mark in the note. We use it to surround
% the mark with the needed tagging commands.
%
-% TODO check if this should/can be kernel configuration points
-% or if an additional kernel configuration points are needed.
+% TODO check if additional kernel configuration points are needed.
% If yes, what about the paragraph start and the paratagging??
%
+%
+%
+%^^A If tagging is produced this configuration point is also
+%^^A responsible for surrounding the mark with the appropriate tags
+%^^A marking the mark as an Lbl. It does this using the
+%^^A \socket{tagsupport/fntext/mark} socket.
+%
+% \begin{plugdecl}{FENoteLbl}
+% This plug creates the label in the note on the bottom.
+% It also adds link targets for the hyperlinking.
% \begin{macrocode}
-\cs_set_protected:Npn \@makefntext at cfgpoint #1 %#1 code that typesets the mark.
+\NewSocketPlug{tagsupport/fntext/mark}{FENoteLbl}
{
- \noindent
\tag_mc_end_push:
- \tag at FENoteLbl { #1 }
- \tag_mc_begin_pop:n{}
- }
% \end{macrocode}
-% \cs{tag at FENoteLbl} creates the label in the note on the bottom.
-% It also adds link targets for the hyperlinking.
-%
-% \begin{macro}{\tag at FENoteLbl}
+% We create a link target for every related mark. The name is
+% \texttt{footnote*} \meta{structure number of the mark}. We also add a link
+% target for the current structure (for \cs{footref}).
% \begin{macrocode}
-\cs_new_protected:Npn \tag at FENoteLbl #1
- {
-% \end{macrocode}
-% We create a link target for every related mark. The name is footnote* + structure number
-% of the mark. We also add a link target for the current structure (for footref)
-% \begin{macrocode}
%\seq_show:N\l_@@_currentrefs_seq
\seq_map_inline:Nn\l_@@_currentrefs_seq {\MakeLinkTarget*{footnote*.##1}}
\MakeLinkTarget*{footnote*.\l_@@_currentstruct_tl}
% \end{macrocode}
-% now we add the tagging commands. We move the structure of the label to
-% to the container at the begin of the note.
+% Now we add the tagging commands. We move the structure of the label to
+% to the container at the begin of the note.
% \begin{NOTE}{UF}
-% check if the NonStruct is really needed. Perhaps we can simply move the mc.
+% Check if the NonStruct is really needed. Perhaps we can simply move the mc.
% \end{NOTE}
% \begin{macrocode}
\tag_struct_begin:n { tag=NonStruct,parent=\l_@@_currentstruct_tl +1 }
@@ -1802,37 +2037,43 @@
#1
\tag_mc_end:
\tag_struct_end:
+ \tag_mc_begin_pop:n{}
}
% \end{macrocode}
-% \end{macro}
%
-%
-% \cs{@makefntext at cfgpointii} is the
-% configuration point around the actual note text.
-%
-% TODO check if this should/can be kernel configuration points
% \begin{macrocode}
-\cs_set_protected:Npn \@makefntext at cfgpointii #1
- {
- \tag_mc_end_push:
- \tag at FENotetext { #1 }
- \tag_mc_begin_pop:n{}
- }
+\AssignSocketPlug{tagsupport/fntext/mark}{FENoteLbl}
% \end{macrocode}
-% \begin{macro}{\tag at FENotetext}
+% \end{plugdecl}
%
-% This command currently only adds an MC chunk,
%
+%^^A If tagging is produced this configuration point is also
+%^^A responsible for surrounding the mark with the appropriate tags
+%^^A marking the mark as an MC of type FENote. It does this using
+%^^A the socket \socket{tagsupport/fntext/text}.
+%
+% \begin{plugdecl}{FENotetext}
+%
+% This plug is for the kernel socket \socket{tagsupport/fntext/text}
+% around the actual note text when doing tagging.
+% Currently it only adds an MC chunk.
+%
% TODO Should it set a mc or could it rely on the content?
% \begin{macrocode}
-\cs_new_protected:Npn \tag at FENotetext #1
+\NewSocketPlug{tagsupport/fntext/text}{FENotetext}
{
+ \tag_mc_end_push:
\tag_mc_begin:n{}
#1
\tag_mc_end:
+ \tag_mc_begin_pop:n{}
}
% \end{macrocode}
-% \end{macro}
+%
+% \begin{macrocode}
+\AssignSocketPlug{tagsupport/fntext/text}{FENotetext}
+% \end{macrocode}
+% \end{plugdecl}
%-------------------------------------
% \begin{macrocode}
@@ -1849,7 +2090,7 @@
%<*footmisc>
%%
%% Copyright (c) 1995-2011 Robin Fairbairns
-%% Copyright (c) 2018-2022 Robin Fairbairns, Frank Mittelbach
+%% Copyright (c) 2018-2023 Robin Fairbairns, Frank Mittelbach
%%
%% This file is part of the `latex-lab Bundle'.
%% --------------------------------------------
@@ -1864,9 +2105,6 @@
%%
%% This work has the LPPL maintenance status 'maintained'.
%%
-%%
-%% File: footmisc.dtx (C) Copyright 1995-2011 Robin Fairbairns
-%% (C) Copyright 2018-2022 Frank Mittelbach
\NeedsTeXFormat{LaTeX2e}
\providecommand\DeclareRelease[3]{}
\providecommand\DeclareCurrentRelease[2]{}
@@ -1916,14 +2154,14 @@
option "para"}%
{I shall ignore "\CurrentOption"}%
\else
- \def\@footnotetext at cfgpoint {\marginpar}
\AddToHook{fntext/para}{%
\hsize\marginparwidth % correct the default \hsize
\footnotesep\z@ % don't add a default separation
}
- \def\@footnotetext at cfgpointii {\@makefntext}
- \def\@footnotetext at cfgpointiii {}
- \def\@footnotetext at cfgpointiv {}
+ \AssignSocketPlug{fntext/process}{side}
+% \AssignSocketPlug{fntext/make}{default}
+ \AssignSocketPlug{fntext/begin}{noop}
+ \AssignSocketPlug{fntext/end}{noop}
\fi
}
\let\footnotelayout\@empty
@@ -1992,16 +2230,6 @@
\DeclareOption{multiple}{\FN at multiplefootnotetrue}
\ProcessOptions
% \end{macrocode}
-% This version of \pkg{footmisc} can assume that the new OR code is
-% already available, thus nothing needs loading at this
-% point. However, as long as we use this code also in a package
-% version that can be loaded by other package while we are in a
-% transition phase it is not clear whether not the kernel code is
-% already available for other packages.
-% \begin{macrocode}
-%\@ifundefined{@kernel at before@cclv}
-% {\input{latex-lab-new-or.ltx}}{}
-% \end{macrocode}
%
% Footnote box layout for para footnotes;
% this would also be the hook to support dblfootnotes (from the
@@ -2008,9 +2236,10 @@
% \texttt{dblfnote} package if we integrate that).
% \begin{macrocode}
\ifFN at para
- \def\@makecol at cfgpointii {%
+ \NewSocketPlug{@makecol/footnotes}{para}{%
\global\setbox\footins\vbox{\FN at makefootnoteparagraph}%
}
+ \AssignSocketPlug{@makecol/footnotes}{para}
\fi
% \end{macrocode}
%
@@ -2038,64 +2267,29 @@
% \end{macrocode}
%
%
-%
% \begin{macrocode}
\ifcase \FN at bottomcases\relax
-\ERROR
-\or
+ \ERROR
+\or %1
\ifFN at abovefloats
- \def\@makecol at cfgpoint {%
- \@if at footnotes@TF
- {\@outputbox at append{\vfill}}%
- {\@if at bfloats@TF{\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}}%
- \@outputbox at appendfootnotes
- \@outputbox at attachfloats
- }
+ \AssignSocketPlug {@makecol/outputbox}{space-footnotes-floats}
\else
- \def\@makecol at cfgpoint {%
- \@outputbox at attachfloats
- \@if at footnotes@TF
- {\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}%
- \@outputbox at appendfootnotes
- }
+ \AssignSocketPlug {@makecol/outputbox}{floats-footnotes-space}
\fi
-\or
+\or %2
\ifFN at abovefloats
- \def\@makecol at cfgpoint {%
- \@outputbox at appendfootnotes
- \@if at bfloats@TF
- {\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}%
- \@outputbox at attachfloats
- }
+ \AssignSocketPlug {@makecol/outputbox}{footnotes-space-floats}
\else
- \def\@makecol at cfgpoint {%
- \@if at footnotes@TF
- {\@outputbox at append{\vfill}}%
- {\@if at bfloats@TF{\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}}%
- \@outputbox at attachfloats
- \@outputbox at appendfootnotes
- }
+ \AssignSocketPlug {@makecol/outputbox}{space-floats-footnotes}
\fi
-\or
+\or %3
\ifFN at abovefloats
- \def\@makecol at cfgpoint {%
- \@outputbox at appendfootnotes
- \@outputbox at attachfloats
- \@outputbox at reinsertbskip
- }
+ \AssignSocketPlug {@makecol/outputbox}{footnotes-floats}
\else
- \def\@makecol at cfgpoint {%
- \@outputbox at attachfloats
- \@outputbox at appendfootnotes
- \@outputbox at reinsertbskip
-}
+ \AssignSocketPlug {@makecol/outputbox}{floats-footnotes}
\fi
\else
-\ERROR
+ \ERROR
\fi
% next can be dropped when cleaned up
@@ -2120,24 +2314,12 @@
\ifFN at para
- \def\@footnotetext at cfgpoint {\insert\footins}
- \long\def\@footnotetext at cfgpointii #1{%
- \setbox\FN at tempboxa\hbox{\@makefntext{#1}}%
- \dp\FN at tempboxa\z@
- \ht\FN at tempboxa
- \dimexpr\wd\FN at tempboxa *%
- \footnotebaselineskip /\columnwidth\relax
- \box\FN at tempboxa
- }
-
-
- \def\@footnotetext at cfgpointiii {}
- \def\@footnotetext at cfgpointiv {% config point
- \strut
- \penalty-10\relax
- \hskip\footglue
- }
+% \AssignSocketPlug{fntext/process}{default}
+ \AssignSocketPlug{fntext/make}{para}
+ \AssignSocketPlug{fntext/begin}{noop}
+ \AssignSocketPlug{fntext/end}{para}
+
\fi
@@ -2211,7 +2393,7 @@
% perpage is loaded this results in updating counters on the reset
% list to 1 (or to a higher starting value if \cs{MakePerPage} is
% used with an optional argument, which is precisely the problem
-% here. By subtracting 1 in that case we set it back to 1 lower
+% here). By subtracting 1 in that case we set it back to 1 lower
% than the starting value.
%
% But to make this fully work we also need to update a support
@@ -2236,11 +2418,8 @@
%}
-\AddToHook{fntext/begin}{\nobreak \hspace{.2em}}
+ \AddToHook{fntext/begin}{\nobreak \hspace{.2em}}
-
-
-
\else
\ifFN at hangfoot
@@ -2296,7 +2475,11 @@
\ifFN at multiplefootnote
\providecommand*{\multiplefootnotemarker}{3sp}
-% we tag the separator as artifact
+% \end{macrocode}
+%
+% We tag the separator as artifact
+% \fmi{why is this done with \cs{providecommand}?}
+% \begin{macrocode}
\ExplSyntaxOn
\providecommand*{\multfootsep}{\tag_mc_end_push:\tag_mc_begin:n{artifact},\tag_mc_end:\tag_mc_begin_pop:n{}}
\ExplSyntaxOff
@@ -2526,7 +2709,7 @@
{\mathparagraph\mathparagraph\mathparagraph}%
}
\newcommand\mpfootnotemark{%
- \@ifnextchar[%
+ \@ifnextchar[%]
\@xmpfootnotemark
{%
\stepcounter\@mpfn
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-graphic.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -15,6 +15,8 @@
% https://github.com/latex3/latex2e/required/latex-lab
%
% for those people who are interested or want to report an issue.
+\def\ltlabgraphicdate{2023-07-20}
+\def\ltlabgraphicversion{0.80a}
%
%<*driver>
\documentclass{l3doc}
@@ -31,7 +33,7 @@
% \title{The \textsf{latex-lab-graphic} package\\
% Tagging of included graphics }
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{v0.8 2023-04-07}
+% \date{v\ltlabgraphicversion\ \ltlabgraphicdate}
%
% \maketitle
%
@@ -174,7 +176,7 @@
% \begin{implementation}
% \section{Implementation}
% \begin{macrocode}
-\ProvidesExplPackage {latex-lab-testphase-graphic} {2023-04-07} {0.8}
+\ProvidesExplPackage {latex-lab-testphase-graphic} {\ltlabgraphicdate} {\ltlabgraphicversion}
{Code related to the tagging of graphics}
% \end{macrocode}
% We load l3opacity for the debug code
@@ -1066,7 +1068,7 @@
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{graphic-latex-lab-testphase.ltx}
- [2023-04-07 v0.8 code related to the tagging included graphics]
+ [\ltlabgraphicdate\space v\ltlabgraphicversion\space latex-lab wrapper graphic]
\RequirePackage{latex-lab-testphase-graphic}
%</latex-lab>
% \end{macrocode}
Added: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx (rev 0)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,1314 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-math.dtx
+%
+% Copyright (C) 2022-2023 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%
+\def\ltlabmathdate{2023-09-11}
+\def\ltlabmathversion{0.5c}
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+
+\usepackage{todonotes}
+
+\begin{document}
+ \DocInput{latex-lab-math.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \texttt{latex-lab-math} code\thanks{}}
+% \author{Frank Mittelbach, Joseph Wright, \LaTeX{} Project}
+% \date{v\ltlabmathversion\ \ltlabmathdate}
+%
+% \maketitle
+%
+% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
+% \providecommand\class[1]{\texttt{#1.cls}}
+% \providecommand\pkg[1]{\texttt{#1}}
+% \providecommand\hook[1]{\texttt{#1}}
+%
+% ^^A \car {...} for marginal comments
+% ^^A \car*{...} for longer inline comments
+%
+% \NewDocumentCommand\car{sO{}m}
+% {\IfBooleanTF{#1}{\todo[inline,color=blue!10,#2]{#3}}^^A
+% {\todo[color=blue!10,#2]{#3}}}
+%
+% \NewDocumentCommand\fmi{sO{}m}
+% {\IfBooleanTF{#1}{\todo[inline,#2]{#3}}^^A
+% {\todo[#2]{#3}}}
+%
+%
+%
+% \begin{abstract}
+% This is an experimental prototype. It captures math material
+% (basically okay, but the interfaces for packages aren't yet
+% there) and tags the material (which is not yet anywhere near the
+% final state). That part is provided for experimentation and to
+% gather feedback, etc.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+% \car*{Todo: update all the documentation! Both here and
+% (what little there is!) in the implementation section.}
+%
+% This file implements capture of all math mode material at the outer
+% level, i.e., a formula is captured in its entirety with inner text
+% blocks (possibly containing further math) absorbed as part of the
+% formula. For example,
+%\begin{verbatim}
+% \[ a \in A \text{ for all $a<5$} \]
+%\end{verbatim}
+% would only result in a single capture of the tokens
+% ``\verb*/a \in A \text{ for all $a<5$}/''.
+%
+% \subsection{Code level interfaces}
+%
+% \begin{function}{\math_register_env:n, \math_register_env:nn}
+% \begin{syntax}
+% \cs{math_register_env:n} \Arg{env}
+% \cs{math_register_env:nn} \Arg{env} \Arg{options}
+% \end{syntax}
+% Registers the \meta{env} as a math environment which should be captured
+% and made available. This is necessary for all top-level math mode
+% environments: low-level errors may result if these are not correct
+% set up. One or more key--value \meta{options} may also be given:
+% \begin{itemize}
+% \item[\texttt{arg-spec}] The argument specification taken by the
+% beginning of the environment; this is used to remove non-mathematical
+% material.
+% \end{itemize}
+% \end{function}
+%
+% \begin{function}{\math_processor:n}
+% \begin{syntax}
+% \cs{math_processor:n} \Arg{tokens}
+% \end{syntax}
+% Declares that the captured math content should be passed to the
+% \meta{tokens}, which will receive the environment type as |#1| and
+% the content as |#2|.
+% \end{function}
+%
+% \subsection{Document level interfaces}
+%
+% \begin{function}{\RegisterMathEnvironment}
+% \begin{syntax}
+% \cs{RegisterMathEnvironment} \oarg{options} \Arg{env}
+% \end{syntax}
+% Registers the \meta{env} as a math environment which should be captured
+% and made available. This is necessary for all top-level math mode
+% environments: low-level errors may result if these are not correct
+% set up. One or more key--value \meta{options} may also be given:
+% \begin{itemize}
+% \item[\texttt{arg-spec}] The argument specification taken by the
+% beginning of the environment; this is used to remove non-mathematical
+% material.
+% \end{itemize}
+% \end{function}
+%
+% \section{Known current bugs, etc.}
+% \car*{New Section, now with subsections.\\
+% As indicated, these lists are probably incomplete.\\
+% Some of these have been addressed in a more recent branch.}
+%
+% \subsection{Capture/grabbing problems}
+%
+% \begin{enumerate}
+% \item Incorrect grabbing of |$|-math when there is also
+% explicit |$|-math within a \textit{text environment}
+% that is itself within the math that should all be grabbed.
+% \item Similar incorrect grabbing with |$$| also.
+% \item The grabbing, for all the display environments (and |\) \]|), needs
+% to deal with nesting: \pkg{amsmath} contains code for this.
+% \item
+% \end{enumerate}
+%
+% \subsection{Other problems}
+%
+% \begin{enumerate}
+% \item
+% The presence of \cs{m at th} in association with \cs{ensuremath}
+% does not necessarily indicate fakemath. This is because
+% wanting mathsurround to be zero is very reasonable and common,
+% \emph{even when the math is genuine} (and hence needs to be collected).
+% \item User-defined environments can create problems; but this area, of
+% new, copied and changed environments, has not yet been developed.
+%
+% \car*{Joseph wrote, inter alia:\\
+% My thinking [regarding] \cs{RegisterMathEnvironment}\\
+% - (New) Math environments should not be created-then-patched, but only
+% generated by a [(future)] dedicated command (\cs{DeclareMathEnviornment},
+% presumably)\\
+% - Math environments created with \pkg{ltcmd} [commands] should not be copied, . . .\\
+% - Package authors should be able to manually set up math environments with a public boolean.}
+%
+% \item
+% \end{enumerate}
+%
+%
+% \subsection{Other ToDos}
+%
+% \begin{enumerate}
+% \item Add (some of) the math display commands that were \enquote{lifted from
+% plain}, e.g., \cs{displaylines} \cs{eqalign}(??).
+% \item
+% \end{enumerate}
+%
+%
+% \car*{\cs{MaybeStop} (temporarily) not executed, as it is unknown on Chris' system.}
+% \iffalse
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+% \else
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+% \fi
+%
+% \section{The Implementation}
+%
+% \begin{macrocode}
+%<@@=math>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*kernel>
+% \end{macrocode}
+%
+% \subsection{File declaration}
+%
+% \car{Change description here?}
+% \begin{macrocode}
+\ProvidesFile{latex-lab-math.ltx}
+ [\ltlabmathdate\space
+ v\ltlabmathversion\space
+ Grab all the math(s) and tag it (experiments)]
+% \end{macrocode}
+%
+% Temp loading \ldots
+% \begin{macrocode}
+\AddToHook{begindocument/before}{\RequirePackage{latex-lab-testphase-block}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \subsection{Setup}
+%
+% Loading \pkg{amsmath} is an absolute requirement: this avoids needing to
+% have conditional definitions and deals with how to define \cs{[}/\cs{]}
+% neatly.
+% \begin{macrocode}
+\tl_gput_right:Nn \@kernel at before@begindocument
+ { \RequirePackage { amsmath } }
+% \end{macrocode}
+%
+%
+% \subsection{Data structures}
+%
+%
+%
+% \begin{variable}{\l_@@_collected_bool}
+% Tracks whether math mode material has been collected, which happens inside
+% \pkg{amsmath} environments as well as those handled directly here.
+%
+%
+% \begin{macrocode}
+\bool_new:N \l_@@_collected_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \car{Change first tl name below: `env' $=>$ `info'?\\
+% Or do we need an extra storage tl?}
+%
+% \begin{variable}{\g_@@_grabbed_env_tl, \g_@@_grabbed_math_tl}
+% \begin{macrocode}
+\tl_new:N \g_@@_grabbed_env_tl
+\tl_new:N \g_@@_grabbed_math_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Interface commands}
+%
+% \begin{macro}
+% {\@@_process:nn, \@@_process:Vn, \@@_process_auxi:nn, \@@_process_auxii:nn}
+% A no-op place-holder; the internal wrapper means that it does not need to
+% be concerned with internals.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_process:nn #1#2
+ {
+ \legacy_if:nF { measuring@ }
+ {
+ \tl_if_in:nnF {#2} { \m at th }
+ { \tl_trim_spaces_apply:nN {#2} \@@_process_auxi:nn {#1} }
+ }
+ }
+\cs_generate_variant:Nn \@@_process:nn { V }
+\cs_new_protected:Npn \@@_process_auxi:nn #1#2
+ {
+ \tl_gset:Nn \g_@@_grabbed_env_tl {#2}
+ \tl_gset:Nn \g_@@_grabbed_math_tl {#1}
+ \@@_process_auxii:nn {#2} {#1}
+ }
+\cs_new_protected:Npn \@@_process_auxii:nn #1#2 { }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math_processor:n}
+% A simple installer
+% \begin{macrocode}
+\cs_new_protected:Npn \math_processor:n #1
+ { \cs_set_protected:Npn \@@_process_auxii:nn ##1##2 {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Content grabbing}
+%
+% \begin{macro}{\@@_grab_dollar:w}
+% Grab up to a single |$|, for inline math mode, suppressing
+% any processing if the first token is \tn{m at th}.
+%
+% \fmi{what's that test doing?}
+%
+% \car{It is some kind of fix, to avoid the remote
+% possibility that the math is empty, making the code
+% produce an unwanted \texttt{\$\$}.}
+%
+%\car{cf.~the code for this in \cs{@ensuredmath}}
+%
+%\car{It is harmless but unnecessary in the dollardollar grabbing below.}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_grab_dollar:w % $
+ #1 $
+ {
+% \end{macrocode}
+% \fmi{what's that test doing?}
+% \begin{macrocode}
+ \tl_if_blank:nF {#1}
+ {
+ \@@_process:nn { math } {#1} % $
+% fairly simple this one
+% \end{macrocode}
+% We do not want math tagging in fakemath or when measuring,
+% so we imitate the test inside
+% \cs{@@_process:nn} for now, see https://github.com/latex3/tagging-project/issues/5
+% \begin{macrocode}
+ \legacy_if:nTF { measuring@ }
+ { #1 $ }
+ {
+ \tl_if_in:nnTF {#1} { \m at th }
+ { #1 $ }
+ {
+ \tagmcend %end P-chunk, in code: \tag_mc_end_push:
+ \@kernel at math@begin
+ #1 $
+ \@kernel at math@end
+ \tagmcbegin{} % restart P-chunk (whatsits in pdftex)
+ }
+ }
+
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_grab_dollardollar:w}
+% And for the classical \TeX{} display structure.
+% \begin{macrocode}
+
+\skip_new:N \l_@@_tmpa_skip
+
+\cs_new_protected:Npn \@@_grab_dollardollar:w % $$
+ #1 $$
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \@@_tag_dollardollar_display:nn { equation* }{#1}
+ #1
+ $$
+ }
+ }
+% \end{macrocode}
+% To allow to use the code without tagging we guard. But probably tagpdf should
+% provide some tools for such manual para-ends.
+% \begin{macrocode}
+\cs_new_protected:Npn \@kernel at close@P {
+ \tag_if_active:T
+ {
+ \tagmcend %end P-chunk, should perhaps be \tag_mc_end_push: ...
+ \int_gincr:N \g__tag_para_end_int
+ \bool_if:NT \l__tag_para_show_bool
+ { \tag_mc_begin:n{artifact}
+ \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
+ \tag_mc_end:
+ }
+ \tag_struct_end:
+ }
+}
+
+
+
+\cs_new_protected:Npn \@@_tag_dollardollar_display:nn #1#2 {
+ \@@_process:nn {#1} {#2}
+ \@kernel at close@P
+ \@kernel at math@begin
+% \skip_set:Nn \belowdisplayskip {-\belowdisplayskip}
+% \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip}
+% \int_set:Nn \postdisplaypenalty {10000}
+%%
+% \group_insert_after:N \@@_tag_dollardollar_display_end:
+}
+
+\cs_new_protected:Npn \@@_tag_dollardollar_display_end: {
+% \typeout{== tag dollarldollar display end}
+% \ShowTagging{struct-stack}
+ \tagpdfparaOff
+ \para_raw_end:
+ \tagpdfparaOn
+ \l_@@_tmpa_skip \lastskip
+ \@kernel at math@end
+ \penalty \postdisplaypenalty
+% \end{macrocode}
+% This reinserts the below display skips. It must be doubled to
+% get the right amount:
+% \begin{macrocode}
+ \skip_vertical:n { -\l_@@_tmpa_skip * 2 }
+%
+ \@doendpe % this has no \end{...} to take care of it
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_grab_inline:w}
+% Collect inline math content and deal with the need to move to math mode.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_grab_inline:w % \(
+ #1 \)
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \@@_process:nn { math } {#1}
+ $ #1 $
+ }
+ \bool_set_false:N \l_@@_collected_bool
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_grab_eqn:w}
+% For the most common use of \cs{[}/\cs{]}: turn into an environment.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_grab_eqn:w % \[
+ #1 \]
+ {
+% \typeout{collected? = \bool_if:NTF \l_@@_collected_bool {true}{false}}
+ \begin { equation* } #1 \end { equation* }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Marking math environments}
+%
+% A general mechanism for math mode environments that do not grab their
+% content (\emph{cf.}~most \pkg{amsmath} environments).
+%
+% \begin{variable}{\l_@@_env_name_tl}
+% To allow us to carry out \enquote{special effects}
+% \begin{macrocode}
+\tl_new:N \l_@@_env_name_tl
+% \end{macrocode}
+% \end{variable}
+%
+% Here we set up specialised handling of environments. The idea for the
+% \texttt{arg-spec} key is that if an environment takes arguments, we
+% don't worry during the main grabbing. Rather, we remove the arguments
+% from the grabbed content and forward only the payload. That is done by
+% (ab)using \pkg{ltcmd}.
+% \begin{macrocode}
+\keys_define:nn { @@ }
+ {
+ arg-spec .code:n =
+ {
+ \ExpandArgs { c } \DeclareDocumentCommand
+ { @@_env \l_@@_env_name_tl _aux: }
+ {#1}
+ { \@@_env_forward:w }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\math_register_env:nn}
+% \begin{macro}{\math_register_env:n}
+% \begin{macro}{\RegisterMathEnvironment}
+% Set up to capture environment content and make available.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \math_register_env:nn #1#2
+ {
+ \tl_set:Nn \l_@@_env_name_tl {#1}
+ \keys_set:nn { @@ } {#2}
+ \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
+ \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
+%
+ \ExpandArgs { nnx } \RenewDocumentEnvironment {#1} { b }
+ {
+% \bool_set_true:N \exp_not:N \l_@@_collected_bool
+% \cs_if_exist:cTF { @@_env #1 _aux: }
+% {
+% \exp_not:c { @@_env #1 _aux: }
+% ####1 \exp_not:N \@@_env_end: {#1}
+% }
+% { \exp_not:N \@@_process:nn {#1} {####1} }
+ \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool
+ {
+% \typeout{===>B1}
+ }
+ {
+% \typeout{===>B2}
+ \cs_if_exist:cTF { @@_env #1 _aux: }
+ {
+ \exp_not:c { @@_env #1 _aux: }
+ ####1 \exp_not:N \@@_env_end: {#1}
+ }
+ { \exp_not:N \@@_process:nn {#1} {####1} }
+ \exp_not:n { \@kernel at math@registered at begin }
+ \bool_set_true:N \exp_not:N \l_@@_collected_bool
+ }
+% \exp_not:N \tracingall
+ \exp_not:c { @@_env_ #1 _begin: }
+ ####1
+ \exp_not:c { @@_env_ #1 _end: }
+% \exp_not:c { @@_env_ #1 _end: }
+% \exp_not:N \tracingnone
+% \exp_not:n { \@kernel at math@registered at end }
+ }
+ {
+ }
+ }
+
+\cs_set_protected:Npn \__cs_tmp:w #1
+ {
+ \group_begin:
+ \exp_args:No \__cs_generate_internal_variant:n
+ { \tl_to_str:n {#1} }
+ \group_end:
+ }
+\__cs_tmp:w { nnxx }
+
+
+\cs_new_protected:Npn \math_register_halign_env:nn #1#2
+ {
+ \tl_set:Nn \l_@@_env_name_tl {#1}
+ \keys_set:nn { @@ } {#2}
+ \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
+ \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
+%
+ \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
+ {
+% \bool_set_true:N \exp_not:N \l_@@_collected_bool
+% \cs_if_exist:cTF { @@_env #1 _aux: }
+% {
+% \exp_not:c { @@_env #1 _aux: }
+% ####1 \exp_not:N \@@_env_end: {#1}
+% }
+% { \exp_not:N \@@_process:nn {#1} {####1} }
+ \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool
+ {
+% \typeout{===>B1}
+ }
+ {
+% \typeout{===>B2}
+ \cs_if_exist:cTF { @@_env #1 _aux: }
+ {
+ \exp_not:c { @@_env #1 _aux: }
+ ####1 \exp_not:N \@@_env_end: {#1}
+ }
+ { \exp_not:N \@@_process:nn {#1} {####1} }
+ \exp_not:n { \@kernel at math@registered at begin }
+ \bool_set_true:N \exp_not:N \l_@@_collected_bool
+ }
+% \exp_not:N \tracingall
+ \exp_not:c { @@_env_ #1 _begin: }
+ ####1
+% \exp_not:c { @@_env_ #1 _end: }
+% \exp_not:N \tracingnone
+ }
+ {
+ \exp_not:c { @@_env_ #1 _end: }
+ }
+ }
+
+\cs_new_protected:Npn \math_register_odd_env:nn #1#2
+ {
+ \tl_set:Nn \l_@@_env_name_tl {#1}
+ \keys_set:nn { @@ } {#2}
+ \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
+ \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
+%
+ \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
+ {
+ \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool
+ {
+% \typeout{===>B1}
+ }
+ {
+% \typeout{===>B2}
+ \cs_if_exist:cTF { @@_env #1 _aux: }
+ {
+ \exp_not:c { @@_env #1 _aux: }
+ ####1 \exp_not:N \@@_env_end: {#1}
+ }
+ { \exp_not:N \@@_process:nn {#1} {####1} }
+ \exp_not:n { \@kernel at math@registered at begin }
+ \bool_set_true:N \exp_not:N \l_@@_collected_bool
+ }
+% \exp_not:N \tracingall
+ \exp_not:c { @@_env_ #1 _begin: }
+ ####1
+ }
+ {
+ \exp_not:c { @@_env_ #1 _end: }
+% needed if we don't have $$...$$
+% \exp_not:n { \typeout{---> @kernel at math@registered at end }}
+ \exp_not:n { \@kernel at math@registered at end }
+ }
+ }
+
+
+% FMi: compare with block change!
+%
+% \DeclareRobustCommand*\begin[1]{%
+% \UseHook{env/#1/before}%
+% \@ifundefined{#1}%
+% {\def\reserved at a{\@latex at error{Environment #1 undefined}\@eha}}%
+% {\def\reserved at a{\def\@currenvir{#1}%
+% \edef\@currenvline{\on at line}%
+% \@execute at begin@hook{#1}%
+% \csname #1\endcsname}}%
+% \@ignorefalse
+% \begingroup
+% \@endpefalse % tmp!!! is it ok to drop this here?
+% \reserved at a}
+
+
+\cs_new:Npn \@kernel at math@registered at begin {
+% \ShowTagging{struct-stack}
+%\typeout{==>A1}\ShowTagging{struct-stack,mc-current}
+ \mode_if_vertical:TF
+ {
+% \legacy_if:nTF { @endpe }
+% { \legacy_if_set_false:n { @endpe } }
+% { \__block_list_beginpar_vmode: }
+%
+% \typeout{==>~ at:~ \g__tag_struct_tag_tl}
+%
+ \exp_args:Noo\str_if_eq:nnF \g__tag_struct_tag_tl { \l__tag_para_main_tag_tl } % needs correction!
+ {
+% \typeout{==>A2}
+ \__block_beginpar_vmode:
+ } % needs correction!
+ }
+ {
+% \typeout{==>A3}
+ \@kernel at close@P
+% \tagmcend % needs correction!
+ }
+ \@kernel at math@begin
+ \tagpdfparaOff
+% \typeout{==>MC1}\ShowTagging{mc-current}
+}
+
+\cs_new:Npn \@kernel at math@registered at end {
+% \typeout{==>MC2}\ShowTagging{mc-current}
+ \para_raw_end:
+ \tagpdfparaOn
+ \@kernel at math@end
+% \typeout{==>MC3}\ShowTagging{mc-current}
+ \@endpetrue
+}
+
+\cs_new_protected:Npn \math_register_env:n #1
+ { \math_register_env:nn {#1} { } }
+\NewDocumentCommand \RegisterMathEnvironment { O{} m }
+ { \math_register_env:nn {#2} {#1} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_env_forward:w}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_env_forward:w #1 \@@_env_end: #2
+ { \@@_process:nn {#2} {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Document commands}
+%
+% \car*{Add one more here: \texttt{displaymath}, which
+% is equivalent to \cs{[} , \cs{]}\\
+% and hence to the basic \texttt{equation*}.\\
+% Added in more recent branch.}
+%
+% \begin{macro}
+% {\equation, \@@_equation_begin:, \equation*, \@@_equation_star_begin:}
+% \begin{macro}
+% {\endequation, \@@_equation_end:, \endequation*, \@@_equation_star_end:}
+% These environments are not set up by \pkg{amsmath} to collect their body,
+% so we do that here. This has to be done \emph{after} we can be sure
+% \pkg{amsmath} is loaded.
+%
+% \car*{Note that with \pkg{amsmath} loaded, \texttt{equation*} and \texttt{equation}\\
+% are the two basics: they are used to define the other single-row\\
+% display environments, etc.}
+%
+% \begin{macrocode}
+\tl_gput_right:Nn \@kernel at before@begindocument
+ {
+ \math_register_env:n { equation }
+ \math_register_env:n { equation* }
+% at the moment register_env can only do display math
+% \math_register_env:n { math }
+ \RenewDocumentEnvironment{math} {b}{$#1$}{}
+% and this one doesn't work either
+% \math_register_env:n { displaymath }
+ \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\(, \)}
+% If math mode has not been collected, we need to do that; otherwise, worry
+% about whether we are in math mode or not. The closing command here can only
+% occur inside a collected math block: otherwise it will be simply used as
+% a delimiter.
+% \begin{macrocode}
+\cs_gset_protected:Npn \( % \)
+ {
+ \bool_if:NTF \l_@@_collected_bool
+ {
+ \mode_if_math:TF
+ { \@badmath }
+ { $ }
+ }
+ {
+ \bool_set_true:N \l_@@_collected_bool
+ \@@_grab_inline:w
+ }
+ } % \(
+\cs_gset_protected:Npn \)
+ {
+ \mode_if_math:TF
+ { $ }
+ { \@badmath }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\[, \]}
+% Again, we need to watch for when \pkg{amsmath} is loaded after this code.
+% The flag usage here is to cover the case where \cs{[}/\cs{]} is hidden
+% inside another environment. In this case the grabbing happens on
+% the outer level and should not be repeated.
+% \begin{macrocode}
+\tl_gput_right:Nn \@kernel at before@begindocument
+ {
+ \cs_gset_protected:Npn \[ % \]
+ {
+ \bool_if:NTF \l_@@_collected_bool
+ { \begin { equation* } }
+ { \@@_grab_eqn:w }
+ } % \[
+ \cs_gset_protected:Npn \]
+ {
+ \bool_if:NTF \l_@@_collected_bool
+ { \end{ equation* } }
+ { \@badmath }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ensuremath}
+% A bit of nesting fun to make sure we collect only if required.
+% \fmi{why does ensuremath need handling at all?}
+%
+% \car{Indeed! Currently, this is setup to process the math that
+% it has anyways already captured as its argument; thus it is more
+% efficient than leaving the capture to be repeated by the \cs{everymath}}
+%
+% \begin{macrocode}
+%\cs_gset_protected:Npn \ensuremath #1
+% {
+% \mode_if_math:TF
+% {#1}
+% {
+% \bool_if:NTF \l_@@_collected_bool
+% { \@ensuredmath {#1} }
+% {
+% \bool_set_true:N \l_@@_collected_bool
+% \@@_process:nn { math } {#1}
+% \@ensuredmath {#1}
+% \bool_set_false:N \l_@@_collected_bool
+% }
+% }
+% }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{\cs{everymath} and \cs{everydisplay}}
+%
+% The business end for grabbing inline math and \enquote{raw} \TeX{}
+% display. Most display math mode is actually handled elsewhere, as we
+% have macro control.
+% \begin{macrocode}
+
+\tl_new:N\tmpmathcontent
+
+
+\def\@kernel at math@begin {
+% \typeout{==>~math~begin}
+% needs different handling if we support nesting
+ \tl_gset:Nx\tmpmathcontent
+ {
+ LaTeX~ formula~ starts~
+ \exp_not:N\begin{\g__math_grabbed_env_tl}
+ \space
+ \exp_not:V\g__math_grabbed_math_tl
+ \space
+ \exp_not:N\end{\g__math_grabbed_env_tl}
+ \space LaTeX~ formula~ ends~
+ }
+ \tagstructbegin{tag=Formula,
+ AFinline-o=\tmpmathcontent,
+ title-o=\g__math_grabbed_env_tl,
+ actualtext=\tmpmathcontent
+% alt=\tmpmathcontent
+ }
+% inner formula if multiple parts (not really implemented yet)
+ \grabaformulapartandstart
+% the above does:
+% \tagstructbegin{tag=Formula}\tagmcbegin{}
+% or just
+% \tagmcbegin{}
+}
+\def\@kernel at math@end {
+% \typeout{==>~math~end}
+% \ShowTagging{struct-stack}
+ \tagmcend
+ \if at subformulas
+ \tagstructend
+ \else
+ \fi
+ \tagstructend
+% \ShowTagging{struct-stack}
+}
+
+\exp_args:No \tex_everymath:D
+ {
+ \tex_the:D \tex_everymath:D
+ \bool_if:NF \l_@@_collected_bool
+ {
+ \bool_set_true:N \l_@@_collected_bool
+ \@@_grab_dollar:w
+ }
+ }
+
+\exp_args:No \tex_everydisplay:D
+ {
+ \tex_the:D \tex_everydisplay:D
+ \iftrue % this may have to be a settable flag!
+% {
+% \typeout{==>~ in~ everydisplay}
+% \end{macrocode}
+% flipping the \cs{belowdisplay} values is done so that we get (assumption)
+% a negative skip and not make the page bigger then we take that out,
+% then we add the tagging code (in \cs{@@_tag_dollardollar_display_end} ) and
+% then we put a real \cs{postdisplaypenalty} in and
+% the right skip (of which we don't know if it is short or a
+% normal \cs{belowdisplayskip}). This might need some refinement if that skip
+% is actually negative from the start
+% (not sure it ever is and is worth bothering about)
+% \begin{macrocode}
+ \skip_set:Nn \belowdisplayskip {-\belowdisplayskip}
+ \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip}
+ \int_set:Nn \postdisplaypenalty {10000}
+%
+ \group_insert_after:N \@@_tag_dollardollar_display_end:
+% }
+ \fi
+ \bool_if:NF \l_@@_collected_bool
+ {
+ \bool_set_true:N \l_@@_collected_bool
+ \@@_grab_dollardollar:w
+ }
+ }
+% \end{macrocode}
+%
+% \subsection{Modifying kernel environments}
+%
+% We need to cover this even though it is, of course, not encouraged.
+% \begin{macrocode}
+\math_register_env:n { eqnarray }
+\math_register_env:n { eqnarray* }
+% \end{macrocode}
+%
+% Places where math mode is (ab)used.
+% \begin{macrocode}
+\clist_map_inline:nn
+ { tabular }
+ {
+ \AddToHook{ env / #1 / begin }
+ { \bool_set_true:N \l_@@_collected_bool }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_m at th:, \m at th}
+% Handle non-math use of math mode. At present nesting isn't supported as
+% \cs{m at th} pops up in a few places that \emph{are} math mode!
+% \begin{macrocode}
+\cs_new_eq:NN \@@_m at th: \m at th
+\cs_gset_protected:Npn \m at th
+ {
+ \bool_set_true:N \l_@@_collected_bool
+ \@@_m at th:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Modifying \pkg{amsmath}}
+%
+% \begin{macro}{\@@_amsmath_align@:nn}
+% \begin{macro}
+% {
+% \@@_amsmath_gather@:n ,
+% \@@_amsmath_multline@:n
+% }
+% \begin{macro}{\align@}
+% \begin{macro}{\gather@, \multline@}
+% Mark up all of the display environments as the content is captured anyway.
+% We then use an internal macro in each environment type to insert the
+% processing code. Each of these is slightly different, so we cannot use a
+% simple loop here. The test for \cs{split at tag} is required as the
+% \texttt{split} environment internally uses \texttt{gather} \emph{when not
+% within an \pkg{amsmath}} environment, for example inside \texttt{equation}.
+% Without the precaution, we'd get two copies of the grabbed math, the second
+% of which would start with \cs{split at tag}.
+% \begin{macrocode}
+
+
+
+\tl_gput_right:Nn \@kernel at before@begindocument {
+%
+\renewenvironment{gather*}{%
+ \start at gather\st at rredtrue
+}
+{%
+% this redirection doesn't work if we alter "gather"!
+ % \endgather
+% so replace it with its real meaning
+ \math at cr \black@\totwidth@ \egroup
+ $$\ignorespacesafterend
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\common at align@ending {
+ \math at cr \black@\totwidth@
+ \egroup
+ \ifingather@
+ \restorealignstate@
+ \egroup
+ \nonumber
+ \ifnum0=`{\fi\iffalse}\fi
+ \else
+ $$%
+ \fi
+ \ignorespacesafterend
+}
+\renewenvironment{alignat}{%
+ \start at align\z@\st at rredfalse
+}{%
+ \common at align@ending
+}
+\renewenvironment{alignat*}{%
+ \start at align\z@\st at rredtrue
+}{%
+ \common at align@ending
+}
+\renewenvironment{xalignat}{%
+ \start at align\@ne\st at rredfalse
+}{%
+ \common at align@ending
+}
+\renewenvironment{xalignat*}{%
+ \start at align\@ne\st at rredtrue
+}{%
+ \common at align@ending
+}
+\renewenvironment{xxalignat}{%
+ \start at align\tw@\st at rredtrue
+}{%
+ \common at align@ending
+}
+\renewenvironment{align}{%
+ \start at align\@ne\st at rredfalse\m at ne
+}{%
+ \common at align@ending
+}
+\renewenvironment{align*}{%
+ \start at align\@ne\st at rredtrue\m at ne
+}{%
+ \common at align@ending
+}
+\renewenvironment{flalign}{%
+ \start at align\tw@\st at rredfalse\m at ne
+}{%
+ \common at align@ending
+}
+\renewenvironment{flalign*}{%
+ \start at align\tw@\st at rredtrue\m at ne
+}{%
+ \common at align@ending
+}
+%
+\renewenvironment{multline*}{\start at multline\st at rredtrue}
+{%
+ \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi
+ \ignorespacesafterend
+}
+% \end{macrocode}
+% Also for "false?"
+% \begin{macrocode}
+\def\measuring at true{\let\ifmeasuring@\iftrue\tag_stop:}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%
+ \math_register_halign_env:nn {align}{}
+ \math_register_halign_env:nn {align*}{}
+ \math_register_halign_env:nn {flalign}{}
+ \math_register_halign_env:nn {flalign*}{}
+ \math_register_halign_env:nn {gather}{}
+ \math_register_halign_env:nn {gather*}{}
+ \math_register_halign_env:nn {multline}{}
+ \math_register_halign_env:nn {multline*}{}
+ \math_register_halign_env:nn {xalignat}{}
+ \math_register_halign_env:nn {xalignat*}{}
+ \math_register_halign_env:nn {xxalignat}{}
+ %
+ \@namedef{maketag @ @ @} #1{%
+% \typeout{--->maketag @ @ @}
+ \ifmeasuring@
+ \hbox{\m at th\normalfont#1}%
+ \else
+ \tagmcend \tagstructbegin{tag=Lbl}%
+ \tagmcbegin{tag=Lbl}%
+ \hbox{\m at th\normalfont#1}%
+ \tagmcend \tagstructend \tagmcbegin{}%
+ \fi
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def\intertext@{%
+ \def\intertext##1{%
+ \ifvmode\else\\\@empty\fi
+ \noalign{%
+% we have to flip the sign on the skip because we flipped it on the outside
+ \penalty\postdisplaypenalty\vskip-\belowdisplayskip
+ \vbox{
+% \end{macrocode}
+% Stop tagging when measuring:
+% \begin{macrocode}
+ \ifmeasuring@\tag_stop:\fi
+ \normalbaselines
+ \ifdim\linewidth=\columnwidth
+ \else \parshape\@ne \@totalleftmargin \linewidth
+ \fi
+% \end{macrocode}
+% End the previous mc:\fmi{if we use 2 levels of formulas this would
+% need changing}
+% \begin{macrocode}
+ \tag_mc_end_push:
+% \end{macrocode}
+% We are already in a par so we change now to Span:\fmi{not true any longer}
+% \begin{macrocode}
+ \tagpdfsetup{paratag=P}%
+ \tagpdfparaOn
+ \noindent\ignorespaces##1\par
+% \end{macrocode}
+% Restart the MC
+% \begin{macrocode}
+ \tag_mc_begin_pop:n{}}%
+ \penalty\predisplaypenalty\vskip\abovedisplayskip%
+ }%
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@namedef{math at cr @ @ @ gather}{%
+ \ifst at rred\nonumber\fi
+ &\relax
+ \make at display@tag
+%
+ \maybestartnewformulatag
+%
+ \ifst at rred\else\global\@eqnswtrue\fi
+ \global\advance\row@\@ne
+ \cr
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@namedef{math at cr @ @ @ align}{%
+ \ifst at rred\nonumber\fi
+ \if at eqnsw \global\tag at true \fi
+ \global\advance\row@\@ne
+ \add at amps\maxfields@
+ \omit
+ \kern-\alignsep@
+ \iftag@
+ \setboxz at h{\@lign\strut@{\make at display@tag}}%
+ \place at tag
+ \fi
+%
+ \maybestartnewformulatag
+%
+ \ifst at rred\else\global\@eqnswtrue\fi
+ \global\lineht@\z@
+ \cr
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\restore at math@cr{\@namedef{math at cr @ @ @}{
+%
+ \maybestartnewformulatag
+%
+ \cr}}
+\restore at math@cr
+% \end{macrocode}
+%
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+
+% \begin{macro}{}
+%
+% \begin{macrocode}
+\cs_new:Npn \@@_split_at_nl_first:w #1 \\ #2 \\ #3 \s_stop
+ {
+ \quark_if_nil:nTF {#2}
+ { {#1} { } }
+ {
+ \@@_split_chk_if_begin:ww #1 \begin \q_nil \s_mark
+ #2 \\ #3 \s_stop
+ }
+ }
+\cs_new:Npn \@@_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark
+ #4 \\ \q_nil \\ \s_stop
+ {
+ \quark_if_nil:nTF {#2}
+ { {#1} {#4} }
+ {
+ \exp_after:wN \@@_split_collect_one_end:w
+ \@@_split_cleanup_begin_q_nil:w #1 \begin{#2} #3 \\ #4 \s_stop
+ { } { 1 }
+ }
+ }
+\cs_new:Npn \@@_split_cleanup_begin_q_nil:w #1 \begin \q_nil {#1}
+\cs_new:Npn \@@_split_collect_one_end:w #1 \end #2 #3 \s_stop #4 #5
+ {
+ \exp_args:Nf \@@_split_check_count_begins:nnnn
+ { \@@_split_count_begins:n { #4 #1 } } {#5}
+ { #4 #1 \end{#2} } {#3}
+ }
+\cs_new:Npn \@@_split_count_begins:n #1
+ { \int_eval:n { 0 \@@_split_count_begins:w #1 \begin \q_nil } }
+\cs_new:Npn \@@_split_count_begins:w #1 \begin #2
+ { \quark_if_nil:nF {#2} { +1 \@@_split_count_begins:w } }
+\cs_new:Npn \@@_split_check_count_begins:nnnn #1 #2 #3 #4
+ {
+ \int_compare:nNnTF {#1} = {#2}
+ {
+ \exp_last_unbraced:Nf \@@_split_final_cleanup:nn
+ { \split:n { \@@_split_guard:n {#3} #4 } }
+ }
+ {
+ \exp_args:No \use_ii_i:nn
+ { \exp_after:wN { \int_value:w \int_eval:n { #2 + 1 } } }
+ { \@@_split_collect_one_end:w #4 \s_stop {#3} }
+ }
+ }
+\cs_new:Npn \@@_split_final_cleanup:nn #1 #2
+ {
+ \exp:w \@@_split_final_cleanup:w #1
+ \@@_split_guard:n \q_nil \s_mark { }
+ {#2}
+ }
+\cs_new:Npn \@@_split_final_cleanup:w #1 \@@_split_guard:n #2 #3 \s_mark #4
+ {
+ \quark_if_nil:nTF {#2}
+ { \exp_end: { #4 #1 } }
+ { \@@_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } }
+ }
+\NewDocumentCommand \splitnl { mm +m }
+ {
+ \tl_set:Nf \l_tmpa_tl { \split:n {#3} }
+ \show \l_tmpa_tl
+ \exp_after:wN \__splitnl_aux:nnNN \l_tmpa_tl #1 #2
+ }
+
+
+\cs_new:Npn \split:n #1 {
+ \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
+
+\cs_new:Npn \@@_split_at_nl:NN #1#2 {
+ \tl_set:Nf \l_tmpa_tl {
+ \exp_after:wN \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
+ \exp_after:wN \@@_split_at_nl_aux:nnNN \l_tmpa_tl #1 #2
+}
+
+\cs_new_protected:Npn \@@_split_at_nl_aux:nnNN #1 #2 #3 #4
+ {
+ \tl_gset:Nn #4 {#1}
+ \tl_gset:Nn #3 {#2}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\maybestartnewformulatag}
+%
+% \begin{macrocode}
+
+\newif\if at subformulas
+\tl_new:N \result
+
+\cs_new_protected:Npn\grabaformulapartandstart {
+ \@@_split_at_nl:NN \g__math_grabbed_math_tl \result
+ \typeout{====>first-result=\meaning\result}
+ \typeout{====>first-tmpmathcontent=\meaning\g__math_grabbed_math_tl}
+ \tl_if_empty:NTF \g__math_grabbed_math_tl
+ {
+ \typeout{====>formula~ has~ no~ subparts}
+ \global\@subformulasfalse
+ }
+ {
+ \typeout{====>formula~ has~ subparts}
+ \global\@subformulastrue
+ \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
+ \tagstructbegin{tag=Formula,
+% \end{macrocode}
+% For now we don't put anything in /alt or /ActualText on subformulas
+% \begin{macrocode}
+% alt=\result,
+ title-o=\resulttitle
+ }
+ }
+ \tagmcbegin{}
+}
+
+\cs_new_protected:Npn\grabaformulapartandmayberestart {
+ \@@_split_at_nl:NN \g__math_grabbed_math_tl \result
+ \typeout{====>result=\meaning\result}
+ \typeout{====>tmpmathcontent=\meaning\g__math_grabbed_math_tl}
+% \tl_if_empty:NTF \g__math_grabbed_math_tl
+% {
+% \typeout{====>tmpmathcontent=empty}
+% }
+% {
+% \typeout{====>tmpmathcontent=not-empty}
+ \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
+ \tagstructbegin{tag=Formula,
+ alt=\result,
+ title-o=\resulttitle
+ }
+% }
+ \tagmcbegin{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macrocode}
+\def\maybestartnewformulatag {
+\if at subformulas
+ \ifmeasuring@\else
+%
+ \tl_if_empty:NF \g__math_grabbed_math_tl
+ {
+ \tagmcend
+ \tagstructend
+ \grabaformulapartandmayberestart
+ }
+ \fi
+\fi
+}
+% \end{macrocode}
+%
+% The breqn packages changes catcodes and that isn't yet covered
+% by our mechanism.
+% \begin{macrocode}
+%\AddToHook{package/breqn/after}{
+% \typeout{===>~ in~ hook}
+% \math_register_halign_env:nn {dmath}{}
+% \math_register_halign_env:nn {dgroup*}{}
+%}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</kernel>
+% \end{macrocode}
+%
+% \Finale
+%
+%
Property changes on: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-math.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtagging.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtagging.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-mathtagging.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,1280 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: latex-lab-mathtagging.dtx
-%
-% Copyright (C) 2022-2023 The LaTeX Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% https://www.latex-project.org/lppl.txt
-%
-%
-% The development version of the bundle can be found below
-%
-% https://github.com/latex3/latex2e/required/latex-lab
-%
-% for those people who are interested or want to report an issue.
-%
-%
-\def\ltmathtaggingdate{2023-03-08}
-\def\ltmathtaggingversion{v0.5a}
-%
-%<*driver>
-\documentclass{l3doc}
-\EnableCrossrefs
-\CodelineIndex
-
-\usepackage{todonotes}
-
-\begin{document}
- \DocInput{latex-lab-mathtagging.dtx}
-\end{document}
-%</driver>
-%
-% \fi
-%
-%
-% \title{The \texttt{latex-lab-mathtagging} code\thanks{}}
-% \author{Frank Mittelbach, Joseph Wright, \LaTeX{} Project}
-%
-% \maketitle
-%
-% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
-% \providecommand\class[1]{\texttt{#1.cls}}
-% \providecommand\pkg[1]{\texttt{#1}}
-% \providecommand\hook[1]{\texttt{#1}}
-%
-% ^^A \car {...} for marginal comments
-% ^^A \car*{...} for longer inline comments
-%
-% \NewDocumentCommand\car{sO{}m}
-% {\IfBooleanTF{#1}{\todo[inline,color=blue!10,#2]{#3}}^^A
-% {\todo[color=blue!10,#2]{#3}}}
-%
-% \NewDocumentCommand\fmi{sO{}m}
-% {\IfBooleanTF{#1}{\todo[inline,#2]{#3}}^^A
-% {\todo[#2]{#3}}}
-%
-%
-%
-% \begin{abstract}
-% This is an experimental prototype. It captures math material
-% (basically okay, but the interfaces for packages aren't yet
-% there) and tags the material (which is not yet anywhere near the
-% final state). That part is provided for experimentation and to
-% gather feedback, etc.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \section{Introduction}
-% \car*{Todo: update all the documentation! Both here and
-% (what little there is!) in the implementation section.}
-%
-% This file implements capture of all math mode material at the outer
-% level, i.e., a formula is captured in its entirety with inner text
-% blocks (possibly containing further math) absorbed as part of the
-% formula. For example,
-%\begin{verbatim}
-% \[ a \in A \text{ for all $a<5$} \]
-%\end{verbatim}
-% would only result in a single capture of the tokens
-% ``\verb*/a \in A \text{ for all $a<5$}/''.
-%
-% \subsection{Code level interfaces}
-%
-% \begin{function}{\math_register_env:n, \math_register_env:nn}
-% \begin{syntax}
-% \cs{math_register_env:n} \Arg{env}
-% \cs{math_register_env:nn} \Arg{env} \Arg{options}
-% \end{syntax}
-% Registers the \meta{env} as a math environment which should be captured
-% and made available. This is necessary for all top-level math mode
-% environments: low-level errors may result if these are not correct
-% set up. One or more key--value \meta{options} may also be given:
-% \begin{itemize}
-% \item[\texttt{arg-spec}] The argument specification taken by the
-% beginning of the environment; this is used to remove non-mathematical
-% material.
-% \end{itemize}
-% \end{function}
-%
-% \begin{function}{\math_processor:n}
-% \begin{syntax}
-% \cs{math_processor:n} \Arg{tokens}
-% \end{syntax}
-% Declares that the captured math content should be passed to the
-% \meta{tokens}, which will receive the environment type as |#1| and
-% the content as |#2|.
-% \end{function}
-%
-% \subsection{Document level interfaces}
-%
-% \begin{function}{\RegisterMathEnvironment}
-% \begin{syntax}
-% \cs{RegisterMathEnvironment} \oarg{options} \Arg{env}
-% \end{syntax}
-% Registers the \meta{env} as a math environment which should be captured
-% and made available. This is necessary for all top-level math mode
-% environments: low-level errors may result if these are not correct
-% set up. One or more key--value \meta{options} may also be given:
-% \begin{itemize}
-% \item[\texttt{arg-spec}] The argument specification taken by the
-% beginning of the environment; this is used to remove non-mathematical
-% material.
-% \end{itemize}
-% \end{function}
-%
-% \section{Known current bugs, etc.}
-% \car*{New Section, now with subsections.\\
-% As indicated, these lists are probably incomplete.\\
-% Some of these have been addressed in a more recent branch.}
-%
-% \subsection{Capture/grabbing problems}
-%
-% \begin{enumerate}
-% \item Incorrect grabbing of |$|-math when there is also
-% explicit |$|-math within a \textit{text environment}
-% that is itself within the math that should all be grabbed.
-% \item Similar incorrect grabbing with |$$| also.
-% \item The grabbing, for all the display environments (and |\) \]|), needs
-% to deal with nesting: \pkg{amsmath} contains code for this.
-% \item
-% \end{enumerate}
-%
-% \subsection{Other problems}
-%
-% \begin{enumerate}
-% \item
-% The presence of \cs{m at th} in association with \cs{ensuremath}
-% does not necessarily indicate fakemath. This is because
-% wanting mathsurround to be zero is very reasonable and common,
-% \emph{even when the math is genuine} (and hence needs to be collected).
-% \item User-defined environments can create problems; but this area, of
-% new, copied and changed environments, has not yet been developed.
-%
-% \car*{Joseph wrote, inter alia:\\
-% My thinking [regarding] \cs{RegisterMathEnvironment}\\
-% - (New) Math environments should not be created-then-patched, but only
-% generated by a [(future)] dedicated command (\cs{DeclareMathEnviornment},
-% presumably)\\
-% - Math environments created with \pkg{ltcmd} [commands] should not be copied, . . .\\
-% - Package authors should be able to manually set up math environments with a public boolean.}
-%
-% \item
-% \end{enumerate}
-%
-%
-% \subsection{Other ToDos}
-%
-% \begin{enumerate}
-% \item Add (some of) the math display commands that were \enquote{lifted from
-% plain}, e.g., \cs{displaylines} \cs{eqalign}(??).
-% \item
-% \end{enumerate}
-%
-%
-% \car*{\cs{MaybeStop} (temporarily) not executed, as it is unknown on Chris' system.}
-% \iffalse
-% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
-% \else
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
-% \fi
-%
-% \section{The Implementation}
-%
-% \begin{macrocode}
-%<@@=math>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*kernel>
-% \end{macrocode}
-%
-% \subsection{File declaration}
-%
-% \car{Change description here?}
-% \begin{macrocode}
-\ProvidesFile{latex-lab-mathtagging.ltx}
- [\ltmathtaggingdate\space
- \ltmathtaggingversion\space
- Grab all the math(s) and tag it (experiments)]
-% \end{macrocode}
-%
-% Temp loading \ldots
-% \begin{macrocode}
-\AddToHook{begindocument/before}{\RequirePackage{latex-lab-testphase-block-tagging}}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ExplSyntaxOn
-% \end{macrocode}
-%
-% \subsection{Setup}
-%
-% Loading \pkg{amsmath} is an absolute requirement: this avoids needing to
-% have conditional definitions and deals with how to define \cs{[}/\cs{]}
-% neatly.
-% \begin{macrocode}
-\tl_gput_right:Nn \@kernel at before@begindocument
- { \RequirePackage { amsmath } }
-% \end{macrocode}
-%
-%
-% \subsection{Data structures}
-%
-%
-%
-% \begin{variable}{\l_@@_collected_bool}
-% Tracks whether math mode material has been collected, which happens inside
-% \pkg{amsmath} environments as well as those handled directly here.
-%
-%
-% \begin{macrocode}
-\bool_new:N \l_@@_collected_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \car{Change first tl name below: `env' $=>$ `info'?\\
-% Or do we need an extra storage tl?}
-%
-% \begin{variable}{\g_@@_grabbed_env_tl, \g_@@_grabbed_math_tl}
-% \begin{macrocode}
-\tl_new:N \g_@@_grabbed_env_tl
-\tl_new:N \g_@@_grabbed_math_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Interface commands}
-%
-% \begin{macro}
-% {\@@_process:nn, \@@_process:Vn, \@@_process_auxi:nn, \@@_process_auxii:nn}
-% A no-op place-holder; the internal wrapper means that it does not need to
-% be concerned with internals.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_process:nn #1#2
- {
- \legacy_if:nF { measuring@ }
- {
- \tl_if_in:nnF {#2} { \m at th }
- { \tl_trim_spaces_apply:nN {#2} \@@_process_auxi:nn {#1} }
- }
- }
-\cs_generate_variant:Nn \@@_process:nn { V }
-\cs_new_protected:Npn \@@_process_auxi:nn #1#2
- {
- \tl_gset:Nn \g_@@_grabbed_env_tl {#2}
- \tl_gset:Nn \g_@@_grabbed_math_tl {#1}
- \@@_process_auxii:nn {#2} {#1}
- }
-\cs_new_protected:Npn \@@_process_auxii:nn #1#2 { }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\math_processor:n}
-% A simple installer
-% \begin{macrocode}
-\cs_new_protected:Npn \math_processor:n #1
- { \cs_set_protected:Npn \@@_process_auxii:nn ##1##2 {#1} }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Content grabbing}
-%
-% \begin{macro}{\@@_grab_dollar:w}
-% Grab up to a single |$|, for inline math mode, suppressing
-% any processing if the first token is \tn{m at th}.
-%
-% \fmi{what's that test doing?}
-%
-% \car{It is some kind of fix, to avoid the remote
-% possibility that the math is empty, making the code
-% produce an unwanted \texttt{\$\$}.}
-%
-%\car{cf.~the code for this in \cs{@ensuredmath}}
-%
-%\car{It is harmless but unnecessary in the dollardollar grabbing below.}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_dollar:w % $
- #1 $
- {
-% \end{macrocode}
-% \fmi{what's that test doing?}
-% \begin{macrocode}
- \tl_if_blank:nF {#1}
- {
- \@@_process:nn { math } {#1} % $
-% fairly simple this one
- \tagmcend %end P-chunk, in code: \tag_mc_end_push:
- \@kernel at math@begin
- #1 $
- \@kernel at math@end
- \tagmcbegin{} % restart P-chunk (whatsits in pdftex)
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\@@_grab_dollardollar:w}
-% And for the classical \TeX{} display structure.
-% \begin{macrocode}
-
-\skip_new:N \l_@@_tmpa_skip
-
-\cs_new_protected:Npn \@@_grab_dollardollar:w % $$
- #1 $$
- {
- \tl_if_blank:nF {#1}
- {
- \@@_tag_dollardollar_display:nn { equation* }{#1}
- #1
- $$
- }
- }
-
-\cs_new_protected:Npn \@kernel at close@P {
- \tagmcend %end P-chunk, in code: \tag_mc_end_push:
- \int_gincr:N \g__tag_para_end_int
- \bool_if:NT \l__tag_para_show_bool
- { \tag_mc_begin:n{artifact}
- \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
- \tag_mc_end:
- }
- \tag_struct_end:
-}
-
-
-
-\cs_new_protected:Npn \@@_tag_dollardollar_display:nn #1#2 {
- \@@_process:nn {#1} {#2}
- \@kernel at close@P
- \@kernel at math@begin
-% \skip_set:Nn \belowdisplayskip {-\belowdisplayskip}
-% \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip}
-% \int_set:Nn \postdisplaypenalty {10000}
-%%
-% \group_insert_after:N \@@_tag_dollardollar_display_end:
-}
-
-\cs_new_protected:Npn \@@_tag_dollardollar_display_end: {
-% \typeout{== tag dollarldollar display end}
-% \ShowTagging{struct-stack}
- \tagpdfparaOff
- \para_raw_end:
- \tagpdfparaOn
- \l_@@_tmpa_skip \lastskip
- \@kernel at math@end
- \penalty \postdisplaypenalty
- \skip_vertical:n { -\l_@@_tmpa_skip }
-%
- \@doendpe % this has no \end{...} to take care of it
-}
-
-
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_grab_inline:w}
-% Collect inline math content and deal with the need to move to math mode.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_inline:w % \(
- #1 \)
- {
- \tl_if_blank:nF {#1}
- {
- \@@_process:nn { math } {#1}
- $ #1 $
- }
- \bool_set_false:N \l_@@_collected_bool
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\@@_grab_eqn:w}
-% For the most common use of \cs{[}/\cs{]}: turn into an environment.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_eqn:w % \[
- #1 \]
- {
-% \typeout{collected? = \bool_if:NTF \l_@@_collected_bool {true}{false}}
- \begin { equation* } #1 \end { equation* }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Marking math environments}
-%
-% A general mechanism for math mode environments that do not grab their
-% content (\emph{cf.}~most \pkg{amsmath} environments).
-%
-% \begin{variable}{\l_@@_env_name_tl}
-% To allow us to carry out \enquote{special effects}
-% \begin{macrocode}
-\tl_new:N \l_@@_env_name_tl
-% \end{macrocode}
-% \end{variable}
-%
-% Here we set up specialised handling of environments. The idea for the
-% \texttt{arg-spec} key is that if an environment takes arguments, we
-% don't worry during the main grabbing. Rather, we remove the arguments
-% from the grabbed content and forward only the payload. That is done by
-% (ab)using \pkg{ltcmd}.
-% \begin{macrocode}
-\keys_define:nn { @@ }
- {
- arg-spec .code:n =
- {
- \ExpandArgs { c } \DeclareDocumentCommand
- { @@_env \l_@@_env_name_tl _aux: }
- {#1}
- { \@@_env_forward:w }
- }
- }
-% \end{macrocode}
-%
-% \begin{macro}{\math_register_env:nn}
-% \begin{macro}{\math_register_env:n}
-% \begin{macro}{\RegisterMathEnvironment}
-% Set up to capture environment content and make available.
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \math_register_env:nn #1#2
- {
- \tl_set:Nn \l_@@_env_name_tl {#1}
- \keys_set:nn { @@ } {#2}
- \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
- \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
-%
- \ExpandArgs { nnx } \RenewDocumentEnvironment {#1} { b }
- {
-% \bool_set_true:N \exp_not:N \l_@@_collected_bool
-% \cs_if_exist:cTF { @@_env #1 _aux: }
-% {
-% \exp_not:c { @@_env #1 _aux: }
-% ####1 \exp_not:N \@@_env_end: {#1}
-% }
-% { \exp_not:N \@@_process:nn {#1} {####1} }
- \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool
- {
-% \typeout{===>B1}
- }
- {
-% \typeout{===>B2}
- \cs_if_exist:cTF { @@_env #1 _aux: }
- {
- \exp_not:c { @@_env #1 _aux: }
- ####1 \exp_not:N \@@_env_end: {#1}
- }
- { \exp_not:N \@@_process:nn {#1} {####1} }
- \exp_not:n { \@kernel at math@registered at begin }
- \bool_set_true:N \exp_not:N \l_@@_collected_bool
- }
-% \exp_not:N \tracingall
- \exp_not:c { @@_env_ #1 _begin: }
- ####1
- \exp_not:c { @@_env_ #1 _end: }
-% \exp_not:c { @@_env_ #1 _end: }
-% \exp_not:N \tracingnone
-% \exp_not:n { \@kernel at math@registered at end }
- }
- {
- }
- }
-
-\cs_set_protected:Npn \__cs_tmp:w #1
- {
- \group_begin:
- \exp_args:No \__cs_generate_internal_variant:n
- { \tl_to_str:n {#1} }
- \group_end:
- }
-\__cs_tmp:w { nnxx }
-
-
-\cs_new_protected:Npn \math_register_halign_env:nn #1#2
- {
- \tl_set:Nn \l_@@_env_name_tl {#1}
- \keys_set:nn { @@ } {#2}
- \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
- \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
-%
- \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
- {
-% \bool_set_true:N \exp_not:N \l_@@_collected_bool
-% \cs_if_exist:cTF { @@_env #1 _aux: }
-% {
-% \exp_not:c { @@_env #1 _aux: }
-% ####1 \exp_not:N \@@_env_end: {#1}
-% }
-% { \exp_not:N \@@_process:nn {#1} {####1} }
- \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool
- {
-% \typeout{===>B1}
- }
- {
-% \typeout{===>B2}
- \cs_if_exist:cTF { @@_env #1 _aux: }
- {
- \exp_not:c { @@_env #1 _aux: }
- ####1 \exp_not:N \@@_env_end: {#1}
- }
- { \exp_not:N \@@_process:nn {#1} {####1} }
- \exp_not:n { \@kernel at math@registered at begin }
- \bool_set_true:N \exp_not:N \l_@@_collected_bool
- }
-% \exp_not:N \tracingall
- \exp_not:c { @@_env_ #1 _begin: }
- ####1
-% \exp_not:c { @@_env_ #1 _end: }
-% \exp_not:N \tracingnone
- }
- {
- \exp_not:c { @@_env_ #1 _end: }
- }
- }
-
-\cs_new_protected:Npn \math_register_odd_env:nn #1#2
- {
- \tl_set:Nn \l_@@_env_name_tl {#1}
- \keys_set:nn { @@ } {#2}
- \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
- \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
-%
- \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
- {
- \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool
- {
-% \typeout{===>B1}
- }
- {
-% \typeout{===>B2}
- \cs_if_exist:cTF { @@_env #1 _aux: }
- {
- \exp_not:c { @@_env #1 _aux: }
- ####1 \exp_not:N \@@_env_end: {#1}
- }
- { \exp_not:N \@@_process:nn {#1} {####1} }
- \exp_not:n { \@kernel at math@registered at begin }
- \bool_set_true:N \exp_not:N \l_@@_collected_bool
- }
-% \exp_not:N \tracingall
- \exp_not:c { @@_env_ #1 _begin: }
- ####1
- }
- {
- \exp_not:c { @@_env_ #1 _end: }
-% needed if we don't have $$...$$
-% \exp_not:n { \typeout{---> @kernel at math@registered at end }}
- \exp_not:n { \@kernel at math@registered at end }
- }
- }
-
-
-% FMi: compare with block change!
-%
-% \DeclareRobustCommand*\begin[1]{%
-% \UseHook{env/#1/before}%
-% \@ifundefined{#1}%
-% {\def\reserved at a{\@latex at error{Environment #1 undefined}\@eha}}%
-% {\def\reserved at a{\def\@currenvir{#1}%
-% \edef\@currenvline{\on at line}%
-% \@execute at begin@hook{#1}%
-% \csname #1\endcsname}}%
-% \@ignorefalse
-% \begingroup
-% \@endpefalse % tmp!!! is it ok to drop this here?
-% \reserved at a}
-
-
-\cs_new:Npn \@kernel at math@registered at begin {
-% \ShowTagging{struct-stack}
-%\typeout{==>A1}\ShowTagging{struct-stack,mc-current}
- \mode_if_vertical:TF
- {
-% \legacy_if:nTF { @endpe }
-% { \legacy_if_set_false:n { @endpe } }
-% { \__block_list_beginpar_vmode: }
-%
-% \typeout{==>~ at:~ \g__tag_struct_tag_tl}
-%
- \exp_args:Noo\str_if_eq:nnF \g__tag_struct_tag_tl { \l__tag_para_main_tag_tl } % needs correction!
- {
-% \typeout{==>A2}
- \__block_beginpar_vmode:
- } % needs correction!
- }
- {
-% \typeout{==>A3}
- \@kernel at close@P
-% \tagmcend % needs correction!
- }
- \@kernel at math@begin
- \tagpdfparaOff
-% \typeout{==>MC1}\ShowTagging{mc-current}
-}
-
-\cs_new:Npn \@kernel at math@registered at end {
-% \typeout{==>MC2}\ShowTagging{mc-current}
- \para_raw_end:
- \tagpdfparaOn
- \@kernel at math@end
-% \typeout{==>MC3}\ShowTagging{mc-current}
- \@endpetrue
-}
-
-\cs_new_protected:Npn \math_register_env:n #1
- { \math_register_env:nn {#1} { } }
-\NewDocumentCommand \RegisterMathEnvironment { O{} m }
- { \math_register_env:nn {#2} {#1} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_env_forward:w}
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_env_forward:w #1 \@@_env_end: #2
- { \@@_process:nn {#2} {#1} }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Document commands}
-%
-% \car*{Add one more here: \texttt{displaymath}, which
-% is equivalent to \cs{[} , \cs{]}\\
-% and hence to the basic \texttt{equation*}.\\
-% Added in more recent branch.}
-%
-% \begin{macro}
-% {\equation, \@@_equation_begin:, \equation*, \@@_equation_star_begin:}
-% \begin{macro}
-% {\endequation, \@@_equation_end:, \endequation*, \@@_equation_star_end:}
-% These environments are not set up by \pkg{amsmath} to collect their body,
-% so we do that here. This has to be done \emph{after} we can be sure
-% \pkg{amsmath} is loaded.
-%
-% \car*{Note that with \pkg{amsmath} loaded, \texttt{equation*} and \texttt{equation}\\
-% are the two basics: they are used to define the other single-row\\
-% display environments, etc.}
-%
-% \begin{macrocode}
-\tl_gput_right:Nn \@kernel at before@begindocument
- {
- \math_register_env:n { equation }
- \math_register_env:n { equation* }
-% at the moment register_env can only do display math
-% \math_register_env:n { math }
- \RenewDocumentEnvironment{math} {b}{$#1$}{}
-% and this one doesn't work either
-% \math_register_env:n { displaymath }
- \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\(, \)}
-% If math mode has not been collected, we need to do that; otherwise, worry
-% about whether we are in math mode or not. The closing command here can only
-% occur inside a collected math block: otherwise it will be simply used as
-% a delimiter.
-% \begin{macrocode}
-\cs_gset_protected:Npn \( % \)
- {
- \bool_if:NTF \l_@@_collected_bool
- {
- \mode_if_math:TF
- { \@badmath }
- { $ }
- }
- {
- \bool_set_true:N \l_@@_collected_bool
- \@@_grab_inline:w
- }
- } % \(
-\cs_gset_protected:Npn \)
- {
- \mode_if_math:TF
- { $ }
- { \@badmath }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\[, \]}
-% Again, we need to watch for when \pkg{amsmath} is loaded after this code.
-% The flag usage here is to cover the case where \cs{[}/\cs{]} is hidden
-% inside another environment. In this case the grabbing happens on
-% the outer level and should not be repeated.
-% \begin{macrocode}
-\tl_gput_right:Nn \@kernel at before@begindocument
- {
- \cs_gset_protected:Npn \[ % \]
- {
- \bool_if:NTF \l_@@_collected_bool
- { \begin { equation* } }
- { \@@_grab_eqn:w }
- } % \[
- \cs_gset_protected:Npn \]
- {
- \bool_if:NTF \l_@@_collected_bool
- { \end{ equation* } }
- { \@badmath }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\ensuremath}
-% A bit of nesting fun to make sure we collect only if required.
-% \fmi{why does ensuremath need handling at all?}
-%
-% \car{Indeed! Currently, this is setup to process the math that
-% it has anyways already captured as its argument; thus it is more
-% efficient than leaving the capture to be repeated by the \cs{everymath}}
-%
-% \begin{macrocode}
-%\cs_gset_protected:Npn \ensuremath #1
-% {
-% \mode_if_math:TF
-% {#1}
-% {
-% \bool_if:NTF \l_@@_collected_bool
-% { \@ensuredmath {#1} }
-% {
-% \bool_set_true:N \l_@@_collected_bool
-% \@@_process:nn { math } {#1}
-% \@ensuredmath {#1}
-% \bool_set_false:N \l_@@_collected_bool
-% }
-% }
-% }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{\cs{everymath} and \cs{everydisplay}}
-%
-% The business end for grabbing inline math and \enquote{raw} \TeX{}
-% display. Most display math mode is actually handled elsewhere, as we
-% have macro control.
-% \begin{macrocode}
-
-\tl_new:N\tmpmathcontent
-
-
-\def\@kernel at math@begin {
-% \typeout{==>~math~begin}
-% needs different handling if we support nesting
- \tl_gset:Nx\tmpmathcontent
- {
- LaTeX~ formula~ starts~
- \exp_not:N\begin{\g__math_grabbed_env_tl}
- \space
- \exp_not:V\g__math_grabbed_math_tl
- \space
- \exp_not:N\end{\g__math_grabbed_env_tl}
- \space LaTeX~ formula~ ends~
- }
- \tagstructbegin{tag=Formula,
- AFinline-o=\tmpmathcontent,
- title-o=\g__math_grabbed_env_tl,
- actualtext=\tmpmathcontent
-% alt=\tmpmathcontent
- }
-% inner formula if multiple parts (not really implemented yet)
- \grabaformulapartandstart
-% the above does:
-% \tagstructbegin{tag=Formula}\tagmcbegin{}
-% or just
-% \tagmcbegin{}
-}
-\def\@kernel at math@end {
-% \typeout{==>~math~end}
-% \ShowTagging{struct-stack}
- \tagmcend
- \if at subformulas
- \tagstructend
- \else
- \fi
- \tagstructend
-% \ShowTagging{struct-stack}
-}
-
-\exp_args:No \tex_everymath:D
- {
- \tex_the:D \tex_everymath:D
- \bool_if:NF \l_@@_collected_bool
- {
- \bool_set_true:N \l_@@_collected_bool
- \@@_grab_dollar:w
- }
- }
-\exp_args:No \tex_everydisplay:D
- {
- \tex_the:D \tex_everydisplay:D
- \iftrue % this may have to be a settable flag!
-% {
-% \typeout{==>~ in~ everydisplay}
- \skip_set:Nn \belowdisplayskip {-\belowdisplayskip}
- \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip}
- \int_set:Nn \postdisplaypenalty {10000}
-%
- \group_insert_after:N \@@_tag_dollardollar_display_end:
-% }
- \fi
- \bool_if:NF \l_@@_collected_bool
- {
- \bool_set_true:N \l_@@_collected_bool
- \@@_grab_dollardollar:w
- }
- }
-% \end{macrocode}
-%
-% \subsection{Modifying kernel environments}
-%
-% We need to cover this even though it is, of course, not encouraged.
-% \begin{macrocode}
-\math_register_env:n { eqnarray }
-\math_register_env:n { eqnarray* }
-% \end{macrocode}
-%
-% Places where math mode is (ab)used.
-% \begin{macrocode}
-\clist_map_inline:nn
- { tabular }
- {
- \AddToHook{ env / #1 / begin }
- { \bool_set_true:N \l_@@_collected_bool }
- }
-% \end{macrocode}
-%
-% \begin{macro}{\@@_m at th:, \m at th}
-% Handle non-math use of math mode. At present nesting isn't supported as
-% \cs{m at th} pops up in a few places that \emph{are} math mode!
-% \begin{macrocode}
-\cs_new_eq:NN \@@_m at th: \m at th
-\cs_gset_protected:Npn \m at th
- {
- \bool_set_true:N \l_@@_collected_bool
- \@@_m at th:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Modifying \pkg{amsmath}}
-%
-% \begin{macro}{\@@_amsmath_align@:nn}
-% \begin{macro}
-% {
-% \@@_amsmath_gather@:n ,
-% \@@_amsmath_multline@:n
-% }
-% \begin{macro}{\align@}
-% \begin{macro}{\gather@, \multline@}
-% Mark up all of the display environments as the content is captured anyway.
-% We then use an internal macro in each environment type to insert the
-% processing code. Each of these is slightly different, so we cannot use a
-% simple loop here. The test for \cs{split at tag} is required as the
-% \texttt{split} environment internally uses \texttt{gather} \emph{when not
-% within an \pkg{amsmath}} environment, for example inside \texttt{equation}.
-% Without the precaution, we'd get two copies of the grabbed math, the second
-% of which would start with \cs{split at tag}.
-% \begin{macrocode}
-
-
-
-\tl_gput_right:Nn \@kernel at before@begindocument {
-%
-\renewenvironment{gather*}{%
- \start at gather\st at rredtrue
-}
-{%
-% this redirection doesn't work if we alter "gather"!
- % \endgather
-% so replace it with its real meaning
- \math at cr \black@\totwidth@ \egroup
- $$\ignorespacesafterend
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\common at align@ending {
- \math at cr \black@\totwidth@
- \egroup
- \ifingather@
- \restorealignstate@
- \egroup
- \nonumber
- \ifnum0=`{\fi\iffalse}\fi
- \else
- $$%
- \fi
- \ignorespacesafterend
-}
-\renewenvironment{alignat}{%
- \start at align\z@\st at rredfalse
-}{%
- \common at align@ending
-}
-\renewenvironment{alignat*}{%
- \start at align\z@\st at rredtrue
-}{%
- \common at align@ending
-}
-\renewenvironment{xalignat}{%
- \start at align\@ne\st at rredfalse
-}{%
- \common at align@ending
-}
-\renewenvironment{xalignat*}{%
- \start at align\@ne\st at rredtrue
-}{%
- \common at align@ending
-}
-\renewenvironment{xxalignat}{%
- \start at align\tw@\st at rredtrue
-}{%
- \common at align@ending
-}
-\renewenvironment{align}{%
- \start at align\@ne\st at rredfalse\m at ne
-}{%
- \common at align@ending
-}
-\renewenvironment{align*}{%
- \start at align\@ne\st at rredtrue\m at ne
-}{%
- \common at align@ending
-}
-\renewenvironment{flalign}{%
- \start at align\tw@\st at rredfalse\m at ne
-}{%
- \common at align@ending
-}
-\renewenvironment{flalign*}{%
- \start at align\tw@\st at rredtrue\m at ne
-}{%
- \common at align@ending
-}
-%
-\renewenvironment{multline*}{\start at multline\st at rredtrue}
-{%
- \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi
- \ignorespacesafterend
-}
-% \end{macrocode}
-% Also for "false?"
-% \begin{macrocode}
-\def\measuring at true{\let\ifmeasuring@\iftrue\tag_stop:}
-% \end{macrocode}
-%
-% \begin{macrocode}
-%
- \math_register_halign_env:nn {align}{}
- \math_register_halign_env:nn {align*}{}
- \math_register_halign_env:nn {flalign}{}
- \math_register_halign_env:nn {flalign*}{}
- \math_register_halign_env:nn {gather}{}
- \math_register_halign_env:nn {gather*}{}
- \math_register_halign_env:nn {multline}{}
- \math_register_halign_env:nn {multline*}{}
- \math_register_halign_env:nn {xalignat}{}
- \math_register_halign_env:nn {xalignat*}{}
- \math_register_halign_env:nn {xxalignat}{}
- %
- \@namedef{maketag @ @ @} #1{%
-% \typeout{--->maketag @ @ @}
- \ifmeasuring@
- \hbox{\m at th\normalfont#1}%
- \else
- \tagmcend \tagstructbegin{tag=Lbl}%
- \tagmcbegin{tag=Lbl}%
- \hbox{\m at th\normalfont#1}%
- \tagmcend \tagstructend \tagmcbegin{}%
- \fi
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \def\intertext@{%
- \def\intertext##1{%
- \ifvmode\else\\\@empty\fi
- \noalign{%
-% we have to flip the sign on the skip because we flipped it on the outside
- \penalty\postdisplaypenalty\vskip-\belowdisplayskip
- \vbox{
-% \end{macrocode}
-% Stop tagging when measuring:
-% \begin{macrocode}
- \ifmeasuring@\tag_stop:\fi
- \normalbaselines
- \ifdim\linewidth=\columnwidth
- \else \parshape\@ne \@totalleftmargin \linewidth
- \fi
-% \end{macrocode}
-% End the previous mc:\fmi{if we use 2 levels of formulas this would
-% need changing}
-% \begin{macrocode}
- \tag_mc_end_push:
-% \end{macrocode}
-% We are already in a par so we change now to Span:\fmi{not true any longer}
-% \begin{macrocode}
- \tagpdfsetup{paratag=P}%
- \tagpdfparaOn
- \noindent\ignorespaces##1\par
-% \end{macrocode}
-% Restart the MC
-% \begin{macrocode}
- \tag_mc_begin_pop:n{}}%
- \penalty\predisplaypenalty\vskip\abovedisplayskip%
- }%
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\@namedef{math at cr @ @ @ gather}{%
- \ifst at rred\nonumber\fi
- &\relax
- \make at display@tag
-%
- \maybestartnewformulatag
-%
- \ifst at rred\else\global\@eqnswtrue\fi
- \global\advance\row@\@ne
- \cr
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\@namedef{math at cr @ @ @ align}{%
- \ifst at rred\nonumber\fi
- \if at eqnsw \global\tag at true \fi
- \global\advance\row@\@ne
- \add at amps\maxfields@
- \omit
- \kern-\alignsep@
- \iftag@
- \setboxz at h{\@lign\strut@{\make at display@tag}}%
- \place at tag
- \fi
-%
- \maybestartnewformulatag
-%
- \ifst at rred\else\global\@eqnswtrue\fi
- \global\lineht@\z@
- \cr
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\restore at math@cr{\@namedef{math at cr @ @ @}{
-%
- \maybestartnewformulatag
-%
- \cr}}
-\restore at math@cr
-% \end{macrocode}
-%
-% \begin{macrocode}
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-
-% \begin{macro}{}
-%
-% \begin{macrocode}
-\cs_new:Npn \@@_split_at_nl_first:w #1 \\ #2 \\ #3 \s_stop
- {
- \quark_if_nil:nTF {#2}
- { {#1} { } }
- {
- \@@_split_chk_if_begin:ww #1 \begin \q_nil \s_mark
- #2 \\ #3 \s_stop
- }
- }
-\cs_new:Npn \@@_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark
- #4 \\ \q_nil \\ \s_stop
- {
- \quark_if_nil:nTF {#2}
- { {#1} {#4} }
- {
- \exp_after:wN \@@_split_collect_one_end:w
- \@@_split_cleanup_begin_q_nil:w #1 \begin{#2} #3 \\ #4 \s_stop
- { } { 1 }
- }
- }
-\cs_new:Npn \@@_split_cleanup_begin_q_nil:w #1 \begin \q_nil {#1}
-\cs_new:Npn \@@_split_collect_one_end:w #1 \end #2 #3 \s_stop #4 #5
- {
- \exp_args:Nf \@@_split_check_count_begins:nnnn
- { \@@_split_count_begins:n { #4 #1 } } {#5}
- { #4 #1 \end{#2} } {#3}
- }
-\cs_new:Npn \@@_split_count_begins:n #1
- { \int_eval:n { 0 \@@_split_count_begins:w #1 \begin \q_nil } }
-\cs_new:Npn \@@_split_count_begins:w #1 \begin #2
- { \quark_if_nil:nF {#2} { +1 \@@_split_count_begins:w } }
-\cs_new:Npn \@@_split_check_count_begins:nnnn #1 #2 #3 #4
- {
- \int_compare:nNnTF {#1} = {#2}
- {
- \exp_last_unbraced:Nf \@@_split_final_cleanup:nn
- { \split:n { \@@_split_guard:n {#3} #4 } }
- }
- {
- \exp_args:No \use_ii_i:nn
- { \exp_after:wN { \int_value:w \int_eval:n { #2 + 1 } } }
- { \@@_split_collect_one_end:w #4 \s_stop {#3} }
- }
- }
-\cs_new:Npn \@@_split_final_cleanup:nn #1 #2
- {
- \exp:w \@@_split_final_cleanup:w #1
- \@@_split_guard:n \q_nil \s_mark { }
- {#2}
- }
-\cs_new:Npn \@@_split_final_cleanup:w #1 \@@_split_guard:n #2 #3 \s_mark #4
- {
- \quark_if_nil:nTF {#2}
- { \exp_end: { #4 #1 } }
- { \@@_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } }
- }
-\NewDocumentCommand \splitnl { mm +m }
- {
- \tl_set:Nf \l_tmpa_tl { \split:n {#3} }
- \show \l_tmpa_tl
- \exp_after:wN \__splitnl_aux:nnNN \l_tmpa_tl #1 #2
- }
-
-
-\cs_new:Npn \split:n #1 {
- \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
-
-\cs_new:Npn \@@_split_at_nl:NN #1#2 {
- \tl_set:Nf \l_tmpa_tl {
- \exp_after:wN \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
- \exp_after:wN \@@_split_at_nl_aux:nnNN \l_tmpa_tl #1 #2
-}
-
-\cs_new_protected:Npn \@@_split_at_nl_aux:nnNN #1 #2 #3 #4
- {
- \tl_gset:Nn #4 {#1}
- \tl_gset:Nn #3 {#2}
-}
-
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\maybestartnewformulatag}
-%
-% \begin{macrocode}
-
-\newif\if at subformulas
-\tl_new:N \result
-
-\cs_new_protected:Npn\grabaformulapartandstart {
- \@@_split_at_nl:NN \g__math_grabbed_math_tl \result
- \typeout{====>first-result=\meaning\result}
- \typeout{====>first-tmpmathcontent=\meaning\g__math_grabbed_math_tl}
- \tl_if_empty:NTF \g__math_grabbed_math_tl
- {
- \typeout{====>formula~ has~ no~ subparts}
- \global\@subformulasfalse
- }
- {
- \typeout{====>formula~ has~ subparts}
- \global\@subformulastrue
- \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
- \tagstructbegin{tag=Formula,
-% \end{macrocode}
-% For now we don't put anything in /alt or /ActualText on subformulas
-% \begin{macrocode}
-% alt=\result,
- title-o=\resulttitle
- }
- }
- \tagmcbegin{}
-}
-
-\cs_new_protected:Npn\grabaformulapartandmayberestart {
- \@@_split_at_nl:NN \g__math_grabbed_math_tl \result
- \typeout{====>result=\meaning\result}
- \typeout{====>tmpmathcontent=\meaning\g__math_grabbed_math_tl}
-% \tl_if_empty:NTF \g__math_grabbed_math_tl
-% {
-% \typeout{====>tmpmathcontent=empty}
-% }
-% {
-% \typeout{====>tmpmathcontent=not-empty}
- \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
- \tagstructbegin{tag=Formula,
- alt=\result,
- title-o=\resulttitle
- }
-% }
- \tagmcbegin{}
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \begin{macrocode}
-\def\maybestartnewformulatag {
-\if at subformulas
- \ifmeasuring@\else
-%
- \tl_if_empty:NF \g__math_grabbed_math_tl
- {
- \tagmcend
- \tagstructend
- \grabaformulapartandmayberestart
- }
- \fi
-\fi
-}
-% \end{macrocode}
-%
-% The breqn packages changes catcodes and that isn't yet covered
-% by our mechanism.
-% \begin{macrocode}
-%\AddToHook{package/breqn/after}{
-% \typeout{===>~ in~ hook}
-% \math_register_halign_env:nn {dmath}{}
-% \math_register_halign_env:nn {dgroup*}{}
-%}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ExplSyntaxOff
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</kernel>
-% \end{macrocode}
-%
-% \Finale
-%
-%
-
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-minipage.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -16,6 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabminipagedate{2023-08-20}
+\def\ltlabminipageversion{0.81b}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -27,15 +29,11 @@
%
% \fi
%
-
-\def\ltlistsversion{v0.81}
-\def\ltlistsdate{2023/05/10}
-
%
% \title{The \textsf{latex-lab-minipage} package\\
% Changes related to the tagging of minipage and parbox}
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{\ltlistsversion\ \ltlistsdate}
+% \date{v\ltlabminipageversion\ \ltlabminipagedate}
%
% \maketitle
%
@@ -64,9 +62,15 @@
%
% \section{Implementation}
% \begin{macrocode}
-\ProvidesExplPackage {latex-lab-testphase-minipage} {2023-05-10} {0.81}
+\ProvidesExplPackage {latex-lab-testphase-minipage}
+ {\ltlabminipagedate} {\ltlabminipageversion}
{Code related to the tagging of minipages and parboxes}
% \end{macrocode}
+% As minipage uses a socket from the footnote code we must load the OR-code:
+% \begin{macrocode}
+\RequirePackage{latex-lab-testphase-new-or-1}
+\RequirePackage{latex-lab-testphase-new-or-2}
+% \end{macrocode}
%
% \subsection{Provide the kernel hooks}
@@ -111,7 +115,7 @@
\textwidth\hsize \columnwidth\hsize
\@parboxrestore
\def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c at mpfootnote\z@
- \let\@footnotetext\@mpfootnotetext
+ \AssignSocketPlug{fntext/process}{mp}%
\let\@listdepth\@mplistdepth \@mplistdepth\z@
\@minipagerestore
\@setminipage}
@@ -196,7 +200,8 @@
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{minipage-latex-lab-testphase.ltx}
- [2022-10-26 v0.8 code related to the tagging of sectioning commands]
+ [\ltlabminipagedate\space v\ltlabminipageversion
+ code related to the tagging of minipage and parbox]
\RequirePackage{latex-lab-testphase-minipage}
%</latex-lab>
% \end{macrocode}
Added: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx (rev 0)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,100 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-namespace.dtx (C) Copyright 2023 LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%<*driver>
+\documentclass{l3doc}
+\usepackage{amstext}
+\EnableCrossrefs
+\CodelineIndex
+
+\usepackage{todonotes}
+
+\begin{document}
+ \DocInput{latex-lab-namespace.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{Prototype reimplementation of \LaTeXe{}'s role mapping}
+% \author{\LaTeX{} Project, initial implementation Ulrike Fischer}
+% \date{v0.8 2023-09-04}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+%
+%
+% \section{Introduction}
+%
+% This short file collects tag names from the \LaTeX{} namespace and their role mapping used
+% in the latex-lab files. The names and the roles are not necessarly the final ones!
+%
+% Later settings of the same tag overwrite previous settings.
+% The syntax of a line is a list of three strings ending with commas:
+% \begin{verbatim}
+% latex-tag, PDF-tag, name space,
+% \end{verbatim}
+%
+% The name space is normally pdf2 with the exception of the following PDF-tags
+% which are only in pdf namespace:
+% Art, BlockQuote, TOC, TOCI, Index, Private, Quote, Note,
+% Reference, BibEntry, Code.
+%
+% \end{documentation}
+% \begin{implementation}
+% \begin{macrocode}
+%<*ns-latex-lab>
+%% \ProvidesExplFile {tagpdf-ns-latex-lab.def} {2023-09-04} {0.8}
+%% {latex} {https://www.latex-project.org/ns/lab/2022}{}
+% \end{macrocode}
+% \subsection{Role from tagpdf}
+% The following tags are already set by tagpdf, so deleting here will not remove them.
+% \begin{macrocode}
+title, Title, pdf2,
+part, Title, pdf2,
+section, H1, pdf2,
+subsection, H2, pdf2,
+subsubsection,H3, pdf2,
+paragraph, H4, pdf2,
+subparagraph, H5, pdf2,
+list, L, pdf2,
+itemize, L, pdf2,
+enumerate, L, pdf2,
+description, L, pdf2,
+quote, BlockQuote,pdf,
+quotation, BlockQuote,pdf,
+verbatim, Div, pdf2,
+item, LI, pdf2,
+itemlabel, Lbl, pdf2,
+itembody, LBody, pdf2,
+footnote, FENote, pdf2,
+footnotemark, Lbl, pdf2,
+footnotelabel,Lbl, pdf2,
+text-unit, Part, pdf2,
+text, P, pdf2,
+% \end{macrocode}
+% \subsection{From block code}
+% \begin{macrocode}
+theorem-like, Sect, pdf2,
+verbatim, P, pdf2,
+codeline, Sub, pdf2,
+% \end{macrocode}
+% \subsection{From float code}
+% \begin{macrocode}
+float, Aside, pdf2,
+figures, Sect, pdf2,
+tables, Sect, pdf2,
+% \end{macrocode}
+% \begin{macrocode}
+%</ns-latex-lab>
+% \end{macrocode}
+% \end{implementation}
+\endinput
Property changes on: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-namespace.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-1.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -9,6 +9,8 @@
%
% https://www.latex-project.org/lppl.txt
%
+\def\ltlabneworIdate{2023-07-20}
+\def\ltlabneworIversion{0.85a}
%<*driver>
\documentclass{l3doc}
@@ -27,7 +29,8 @@
%
% \title{Temporary output patches for tagging and better link support}
% \author{Frank Mittelbach \and Ulrike Fischer}
-%
+% \date{v\ltlabneworIversion\ \ltlabneworIdate}
+%
% \maketitle
%
% \section{Introduction}
@@ -47,12 +50,13 @@
%
% \section{The Implementation}
% \begin{macrocode}
-%<*code>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
\ProvidesPackage{latex-lab-testphase-new-or-1}
- [2022-11-94 v0.1a Temporary output patches for tagging and better link support]
+ [\ltlabneworIdate\space v\ltlabneworIversion\space
+ Temporary output patches for tagging and better link support]
\RequirePackage{etoolbox}
% \end{macrocode}
%
@@ -94,18 +98,36 @@
%
% We patch \cs{@makecol}, if new-or-2 is loaded too it will overwrite that again.
% \begin{macrocode}
- \providecommand\@kernel at before@footins{}
- \providecommand\@kernel at before@cclv{}
+\providecommand\@kernel at before@footins{}
+\providecommand\@kernel at tagsupport@@makecol{}
- \patchcmd\@makecol
- {\vskip\skip\footins}
- {\vskip\skip\footins\@kernel at before@footins}
- {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
+\patchcmd\@makecol
+ {\vskip\skip\footins}
+ {\vskip\skip\footins\@kernel at before@footins}
+ {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
-%for some reason patching with etoolbox only works in this order ...
+\patchcmd\@makecol
+ {\let\@elt\relax}
+ {\@kernel at tagsupport@@makecol\let\@elt\relax}
+ {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
- \pretocmd\@makecol{\@kernel at before@cclv}
- {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
+\AddToHook{package/footmisc/after}
+ {%
+ \def\@makecol{%
+ \setbox\@outputbox \box\@cclv
+ \@outputbox at removebskip
+ \@kernel at tagsupport@@makecol
+ \let\@elt\relax
+ \xdef\@freelist{\@freelist\@midlist}%
+ \global \let \@midlist \@empty
+ \@makecol at appendblocks
+ \ifvbox\@kludgeins
+ \@makespecialcolbox
+ \else
+ \@makenormalcolbox
+ \fi
+ \global \maxdepth \@maxdepth}
+}
% \end{macrocode}
% \end{macro}
%
@@ -150,10 +172,17 @@
\def\@kernel at after@foot {\pdfannot_link_on:}
\ExplSyntaxOff
% \end{macrocode}
-%
% \begin{macrocode}
-%</code>
+%</package>
% \end{macrocode}
+% \begin{macrocode}
+%<*latex-lab>
+\ProvidesFile{new-or-1-latex-lab-testphase.ltx}
+ [\ltlabneworIdate\space v\ltlabneworIversion\space
+ latex-lab wrapper new-or-1]
+\RequirePackage{latex-lab-testphase-new-or-1}
+%</latex-lab>
+% \end{macrocode}
%
% \Finale
%
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-new-or-2.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: latex-lab-new-or-2.dtx
-% Copyright (C) 2022 The LaTeX Project
+% Copyright (C) 2022-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -17,6 +17,9 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabneworIIdate{2023-09-04}
+\def\ltlabneworIIversion{0.85c}
+
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -31,7 +34,7 @@
%
% \title{The \texttt{latex-lab-testphase-new-or-2} code\thanks{}}
% \author{Frank Mittelbach, \LaTeX{} Project}
-%
+% % \date{v\ltlabneworIIversion\ \ltlabneworIIdate}
% \maketitle
%
% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}}
@@ -38,34 +41,51 @@
% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
% \providecommand\pkg[1]{\texttt{#1}}
%
+% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
+% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+%
+%
% \begin{abstract}
+% This code implements changes to the output routine intended to be
+% moved in the \LaTeX{} kernel at some point in the future.
% \end{abstract}
%
-% \section{Introduction}
%
-% This code implements changes to the output routine.
%
%
+% \section{Introduction}
%
%
-% \section{Hooks and configuration points}
+% \section{Hooks and replaceable code blocks}
%
-% Note: the configuration points do not have an interface mechanism
-% yet and all their names are temporary right now.
%
+% \subsubsection{Replaceable code blocks (sockets)}
%
-% \subsubsection{Configuration points}
-%
% To cater for different layouts with respect to text, footnotes,
-% and bottom-floats placements there are two configuration points for
+% and bottom-floats placements there are two sockets for
% now.
% \begin{description}
-% \item[\cs{@makecol at cfgpoint} (0 arguments)]
+% \item[\socket{@makecol/outputbox} (0 arguments)]
%
-% In this configuration point the \cs{@outputbox} (holding the
+% In code for this socket the \cs{@outputbox} (holding the
% galley text for the current column or page) is augmented by
% attaching floats and footnote areas together with appropriate
-% spacing. Before the code is run any existing glue at the bottom
+% spacing.
+%
+% Prior to calling the socket the output routine has already
+% decided which floats go into which area and which get deferred.
+% Therefore, the assumption is that the code in the socket attaches all
+% areas that contain floats. If this is not done, then the order
+% of floats is likely to be screwed up unless unused floats
+% are moved to the defer list in an appropriate way (for now we
+% don't offer any interface for that scenario).
+%
+% Before the code in the socket is run, any existing glue at the bottom
% of the \cs{@outputbox} is removed and stored in a safe
% place. If needed, it can be reinserted with one of the helper
% commands.
@@ -74,11 +94,15 @@
% \begin{description}
% \item[\cs{@outputbox at append} (1 argument)]
%
+% \DescribeMacro[noprint]{@outputbox at append}
+%
% This general purpose command alters the \cs{@outputbox} box by
% appending material to it.
%
% \item[\cs{@outputbox at appendfootnotes} (0 arguments)]
%
+% \DescribeMacro[noprint]{@outputbox at appendfootnotes}
+%
% This command appends the footnotes to the \cs{@outputbox} (if
% there are any). If not, then it does nothing.
%
@@ -85,6 +109,10 @@
% \item[\cs{@outputbox at attachfloats} (0 arguments)]
% \item[\cs{@outputbox at attachtopfloats} (0 arguments)]
% \item[\cs{@outputbox at attachbottomfloats} (0 arguments)]
+%
+% \DescribeMacro[noprint]{@outputbox at attachfloats}
+% \DescribeMacro[noprint]{@outputbox at attachtopfloats}
+% \DescribeMacro[noprint]{@outputbox at attachbottomfloats}
%
% Attaching top and bottom floats can usually be done in one
% go, but for special layouts we might want more control so we
@@ -92,11 +120,16 @@
%
% \item[\cs{@outputbox at reinsertbskip} (0 arguments)]
%
+% \DescribeMacro[noprint]{@outputbox at reinsertbskip}
+%
% Reinsert the bottom skip of the \cs{@outputbox} that was
% saved before.
%
% \item[Testing for existence of material]
%
+% \DescribeMacro[noprint]{@if at footnotes@TF}
+% \DescribeMacro[noprint]{@if at bfloats@TF}
+%
% There are a number of helpers to run conditional code
% depending on whether or not there are footnotes or bottom
% floats. They are \cs{@if at footnotes@TF} and
@@ -104,17 +137,68 @@
% (names are likely to change).
%
% \end{description}
-% This configuration point needs an appropriate definition; a
-% default is already given in the kernel.
%
-% \item[\cs{@makecol at cfgpointii} (0 arguments)]
+% \fmi{Decide on names for these helper commands. We could keep
+% them similar to the above (because they are only supposed to be
+% used by a few packages). However, we could alternatively use
+% CamelCase names, under the assumption that classes may also
+% directly define a plug for the socket, instead of loading a
+% support package such as \pkg{footmisc} (or in addition
+% to). --- decide}
+%
+% This socket cannot be empty but needs appropriate code; a set
+% of suitable plugs for it are already given in the kernel. These
+% are
+% \begin{description}
+% \item[\plug{space-footnotes-floats}]
%
-% This configuration point is used to manipulate the footnote
+% After the galley text there is a vertical \cs{vfill}
+% followed by any footnotes followed by the bottom floats, if any.
+%
+% \item[\plug{floats-footnotes-space}]
+%
+% As before but the \cs{vfill} is at the bottom (page is
+% ragged bottom).
+%
+% \item[\plug{footnotes-space-floats}]
+%
+% As before but the \cs{vfill} is between footnotes and floats.
+%
+% \item[\plug{space-floats-footnotes}]
+%
+% Here the footnotes come last.\footnote{There are two more
+% permutations, but neither of them has ever been requested so
+% they aren't set up by default --- doing that in a class
+% would be trivial though.}
+%
+% \item[\plug{floats-footnotes}]
+%
+% All excess space has to be distributed across the existing
+% glue on the page, e.g., within the text galley, the
+% separation between blocks, etc.
+% The order is text, floats, footnotes.
+%
+% \item[\plug{footnotes-floats}]
+%
+% As the previous one but floats and footnotes are
+% swapped. This is the \LaTeX{} default, i.e., this plug is
+% assigned to the socket.
+%
+% \end{description}
+%
+%-----------------------
+%
+% \item[\socket{@makecol/footnotes} (0 arguments)]
+%
+% This socket is used to manipulate the footnote
% material inside \cs{box}\cs{footins}. It if contains code, it
% is supposed to do some processing of that box and then write
% the result back into it (and nothing else!). By default it
-% does nothing.
+% does nothing, i.e., has the \plug{noop} assigned.
%
+% If (short) footnotes are run as a paragraph this socket gets
+% the plug \plug{para} assigned which is defined elsewhere.
+%
% \end{description}
%
% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
@@ -123,28 +207,32 @@
% \section{The Implementation}
%
% \begin{macrocode}
-%<*code>
+%<*package>
% \end{macrocode}
%
% \subsection{File declaration}
% \begin{macrocode}
\ProvidesPackage{latex-lab-testphase-new-or-2}
- [2022-11-04 v0.1c changes to the output routine]
+ [\ltlabneworIIdate\space v\ltlabneworIIversion\space
+ Changes to the output routine]
% \end{macrocode}
+%
% \subsection{\cs{@makecol} reimplementation}
%
% In order for other packages to prepend or append code to
-% \cs{@makecol}, they can use the generic command hooks
-% \texttt{cmd/@makecol/before} and \texttt{cmd/@makecol/after}, so
-% there is nothing we need to do here.
+% \cs{@makecol} the generic command hooks
+% \texttt{cmd/@makecol/before} and \texttt{cmd/@makecol/after} can
+% be used, so for now there is nothing we need to do for this.
%
%
% \begin{macro}{\@makecol}
% \cs{@makecol} is shortened a lot, basically all the hardwired
-% code in the middle has moved into a configuration point.
+% code in the middle has moved into a socket.
% \begin{macrocode}
\def \@makecol {%
- \@kernel at before@cclv
+% \end{macrocode}
+% Save away box 255 as \cs{@outputbox} to make it available for further adjustments.
+% \begin{macrocode}
\setbox\@outputbox \box\@cclv
% \end{macrocode}
% The only real addition is the next command which either does
@@ -153,7 +241,13 @@
% \begin{macrocode}
\@outputbox at removebskip
% \end{macrocode}
-% Any ``here'' floats in the \cs{@outputbox} are now handled so we
+% Now a kernel hook for tagging.
+% \fmi{The name is likely to change and it probably will eventually
+% be replaced with a socket.}
+% \begin{macrocode}
+ \@kernel at tagsupport@@makecol
+% \end{macrocode}
+% When this code is run any ``here'' floats in the \cs{@outputbox} are already handled, so we
% recycle their registers and put them back to the \cs{@freelist}.
% \begin{macrocode}
\let\@elt\relax
@@ -160,18 +254,18 @@
\xdef\@freelist{\@freelist\@midlist}%
\global \let \@midlist \@empty
% \end{macrocode}
-% Here we have the configurable part.
-% \fmi{Interface to configuration points will change in the future}
+% Here we have the configurable part. This socket is supposed to add floats,
+% footnotes and stretchable vertical space as appropriate to the \cs{@outputbox}.
% \begin{macrocode}
- \@makecol at cfgpoint
+ \UseSocket{@makecol/outputbox}%
% \end{macrocode}
-% The we deal with any \cs{enlargethispage} or run the normal code
+% Then we deal with any \cs{enlargethispage} or run the normal code
% to build a column.
% \begin{macrocode}
\ifvbox\@kludgeins
- \@makespecialcolbox
+ \@make at specialcolbox
\else
- \@makenormalcolbox
+ \@make at normalcolbox
\fi
\global \maxdepth \@maxdepth
}
@@ -188,10 +282,10 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@makenormalcolbox}
+% \begin{macro}{\@make at normalcolbox}
% Taken out of \cs{@makecol} for readability.
% \begin{macrocode}
-\def \@makenormalcolbox {%
+\def \@make at normalcolbox {%
\setbox\@outputbox \vbox to\@colht {%
\@texttop
\@outputbox at depth \dp\@outputbox
@@ -204,10 +298,10 @@
% \end{macro}
%
%
-% \begin{macro}{\@makespecialcolbox}
+% \begin{macro}{\@make at specialcolbox}
% Make the colbox when \cs{enlargethispage} was used.
% \begin{macrocode}
-\def \@makespecialcolbox {%
+\def \@make at specialcolbox {%
\@outputbox at append {\vskip-\@outputbox at depth}%
\@tempdima \@colht
\ifdim \wd\@kludgeins>\z@
@@ -235,7 +329,7 @@
% \begin{macro}{\@outputbox at removebskip}
%
% This is really a bug fix for the kernel but one we only
-% automatically make in new documents using \cs{DocumentMetadata}.
+% automatically make in new documents that are using \cs{DocumentMetadata}.
% \fmi{may make optional for legacy docs}
% If
% \cs{raggedbottom} is in force, footnotes get attached to the main
@@ -248,7 +342,7 @@
% short, but the footnotes are not pushed to the bottom.
%
% In \pkg{footmisc} \cs{@outputbox at removebskip} is only applied when
-% \pkg{footmisc} is called with with an option specifying the
+% \pkg{footmisc} is called with an option specifying the
% footnote placement, i.e., not in the default case.
% In new documents we apply it always.
% \begin{macrocode}
@@ -270,6 +364,7 @@
\ifnum \gluestretchorder\@tempskipa>\z@
\vskip-\@tempskipa
% \end{macrocode}
+%
% \begin{macro}{\@outputbox at reinsertbskip}
% We also record the value so that it can be reinserted
% elsewhere. As we have to do this globally, we also need to
@@ -295,17 +390,20 @@
%
%
%
-% \begin{macro}{\@kernel at before@cclv}
-% \begin{macro}{\@kernel at before@footins}
+% \begin{macro}{\@kernel at before@cclv,
+% \@kernel at before@footins}
% These two commands are internal kernel hooks intended for tagging
-% support in case that is active. By default they do nothing (and
+% support in case that is active. They should not be altered by package code!
+% By default they do nothing (and
% may have been defined already by \cs{DocumentMetadata}).
+% \fmi{The names might change and perhaps each of them is turned
+% into a socket named something like \socket{tagsupport/before/cclv}
+% or similar.}
% \begin{macrocode}
\providecommand\@kernel at before@cclv{}
\providecommand\@kernel at before@footins{}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
%
%
@@ -312,8 +410,8 @@
%
% \subsection{The output routine configuration components}
%
-% Here we provide the components that are used to define
-% \cs{@makecol at cfgpoint}.
+% Here we provide the components that are used to define code for the
+% \socket{@makecol/outputbox} socket.
%
%
% \begin{macro}{\@outputbox at append}
@@ -346,7 +444,7 @@
% \begin{macro}{\@outputbox at appendfootnotes}
%
% This command appends the footnotes to the \cs{@outputbox} (if
-% there are any). If not then it does nothing.
+% there are any). If not, then it does nothing.
% \begin{macrocode}
\def\@outputbox at appendfootnotes {%
\ifvoid\footins \else
@@ -354,22 +452,34 @@
% First come two configuration points: what to do if we are in a split
% footnote situation and a second one that does some manipulation
% of the \cs{footins} box before it gets appended.
-% \fmi{this code will get revised as part of CP handling in the future}
+% \fmi{The code for handling split footnotes will get revised as part of socket handling in the future}
% \begin{macrocode}
\@makecol at handlesplitfootnotes
- \@makecol at cfgpointii
% \end{macrocode}
+%
+% \begin{macrocode}
+ \UseSocket{@makecol/footnotes}%
+% \end{macrocode}
% Then the footnotes are appended:
% \begin{macrocode}
\@outputbox at append{%
\vskip \skip\footins
+% \end{macrocode}
+% This is a kernel hook for tagging.
+% \fmi{The name is likely to change and it probably will eventually
+% be replaced with a socket.}
+% \begin{macrocode}
\@kernel at before@footins
+% \end{macrocode}
+%
+% \begin{macrocode}
\color at begingroup
\normalcolor
\footnoterule
% \end{macrocode}
% Support for \pkg{pdfcolfoot}, eventually this can go once color
-% is properly supported.
+% is properly supported. The csname is constructed in case it
+% doesn't exist.
% \begin{macrocode}
\csname pdfcolfoot at current\endcsname
\unvbox \footins
@@ -435,20 +545,19 @@
%
%
%
-% \begin{macro}{\@makecol at cfgpointii}
+% \begin{socketdecl}{@makecol/footnote}
%
-% Configuration point to support manipulation of footins box
-% (result needs to be moved back in there). Used by the
-% \texttt{para} option.
-% \fmi{Interface will change in the future}
+% The socket allowing the manipulation of \cs{footins} box
+% (result needs to be moved back in there). Used when footnotes are
+% reformatted into a single paragraph by the
+% \texttt{para} option of \pkg{footmisc}. By default it does nothing.
% \begin{macrocode}
-\let \@makecol at cfgpointii \@empty
+\NewSocket{@makecol/footnotes}{0}
% \end{macrocode}
+% \end{socketdecl}
%
-% \end{macro}
%
%
-%
% \fmi{Some temp interfaces until configuration points are available.}
%
% \begin{macro}{\@if at flushbottom@TF}
@@ -497,17 +606,93 @@
% \subsection{The \cs{@makecol} configuration}
%
%
-% \begin{macro}{\@makecol at cfgpoint}
+% \begin{socketdecl}{@makecol/outputbox}
+% We have one socket that is supposed to augment the \cs{@outputbox}
+% by attaching floats and footnotes with appropriate spacing.
%
-% Here is only the configuration for the default case for now,
-% others are provided by \pkg{footmisc}.
+% \begin{macrocode}
+\NewSocket{@makecol/outputbox}{0}
+% \end{macrocode}
+% \end{socketdecl}
%
+% The following plugs are available for
+% this socket:
+%
+% \begin{plugdecl}{space-footnotes-floats}
+% After the galley text there is a vertical \cs{vfill} followed by
+% any footnotes followed by the bottom floats, if any.
% \begin{macrocode}
- \def\@makecol at cfgpoint {%
- \@outputbox at appendfootnotes
- \@outputbox at attachfloats
+\NewSocketPlug {@makecol/outputbox}{space-footnotes-floats} {%
+ \@if at footnotes@TF
+ {\@outputbox at append{\vfill}}%
+ {\@if at bfloats@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}%
+ }%
+ \@outputbox at appendfootnotes
+ \@outputbox at attachfloats
+}
% \end{macrocode}
-% We do, however, reinsert the bottom skip from \cs{newpage} if it
+% \end{plugdecl}
+%
+% \begin{plugdecl}{floats-footnotes-space}
+% As before but the \cs{vfill} is at the bottom (page is ragged
+% bottom).
+% \begin{macrocode}
+\NewSocketPlug {@makecol/outputbox}{floats-footnotes-space} {%
+ \@outputbox at attachfloats
+ \@if at footnotes@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}%
+ \@outputbox at appendfootnotes
+}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{plugdecl}{footnotes-space-floats}
+% As before but the \cs{vfill} is between footnotes and floats.
+% \begin{macrocode}
+\NewSocketPlug {@makecol/outputbox}{footnotes-space-floats} {%
+ \@outputbox at appendfootnotes
+ \@if at bfloats@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}%
+ \@outputbox at attachfloats
+}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{plugdecl}{space-floats-footnotes}
+% Here the footnotes come last.\footnote{There are two more
+% permutations, but neither of them has ever been requested so
+% they aren't set up by default --- doing that in a class
+% would be trivial though.}
+% \begin{macrocode}
+\NewSocketPlug {@makecol/outputbox}{space-floats-footnotes} {%
+ \@if at footnotes@TF
+ {\@outputbox at append{\vfill}}%
+ {\@if at bfloats@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}}%
+ \@outputbox at attachfloats
+ \@outputbox at appendfootnotes
+}
+% \end{macrocode}
+% \end{plugdecl}
+%
+%
+%
+% \begin{plugdecl}{floats-footnotes}
+% All excess space has to be distributed across the existing
+% glue on the page, e.g., within the text galley, the
+% separation between blocks, etc.
+% The order is text, floats, footnotes.
+% \begin{macrocode}
+\NewSocketPlug {@makecol/outputbox}{floats-footnotes} {%
+ \@outputbox at attachfloats
+ \@outputbox at appendfootnotes
+% \end{macrocode}
+% We do reinsert the bottom skip from \cs{newpage} if it
% was taken out earlier. This is, strictly speaking, not necessary
% in most cases, but it is a \cs{vfil} while \cs{raggedbottom} is
% only generating \verb=\vspace{0pt plus .0001fil}=, so if you have
@@ -514,12 +699,33 @@
% several \cs{vfil} on the page before the \cs{newpage} you would
% alter the space distribution if one is taken out.
% \begin{macrocode}
- \@outputbox at reinsertbskip
- }
+ \@outputbox at reinsertbskip
+}
% \end{macrocode}
-% \end{macro}
%
+% \end{plugdecl}
%
+% \begin{plugdecl}{footnotes-floats}
+% \begin{macrocode}
+\NewSocketPlug {@makecol/outputbox}{footnotes-floats} {%
+ \@outputbox at appendfootnotes
+ \@outputbox at attachfloats
+ \@outputbox at reinsertbskip
+}
+% \end{macrocode}
+% The \texttt{footnote-floats} plug is the default used by
+% \LaTeX{}; it can be overwritten either through \pkg{footmisc} or
+% by assigning any of the other plugs (or by coding yet another
+% plug for the socket).
+% \begin{macrocode}
+\AssignSocketPlug {@makecol/outputbox}{footnotes-floats}
+% \end{macrocode}
+% \end{plugdecl}
+%
+%
+%
+%
+%
% \section {Replacement for the \pkg{footmisc} package}
%
% The replacement for \pkg{footmisc}. If the new code is used, we must replace
@@ -532,6 +738,7 @@
%
% \section {Temp stuff that is related but should go to the kernel}
%
+% This is the code from \texttt{latex-lab-footnotes.dtx}.
% \begin{macrocode}
\input{latex-lab-footnotes.ltx}
% \end{macrocode}
@@ -538,7 +745,7 @@
%
%
% \begin{macrocode}
-%</code>
+%</package>
% \end{macrocode}
%
% \Finale
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -16,6 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabsecdate{2023-07-20}
+\def\ltlabsecversion{0.84a}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -31,7 +33,7 @@
% \title{The \textsf{latex-lab-sec} package\\
% Changes related to the tagging of sectioning commands}
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{v0.83 2023-06-07}
+% \date{v\ltlabsecversion\ \ltlabsecdate}
%
% \maketitle
%
@@ -147,7 +149,7 @@
%
% \section{Implementation}
% \begin{macrocode}
-\ProvidesExplPackage {latex-lab-testphase-sec} {2023-05-20} {0.81}
+\ProvidesExplPackage {latex-lab-testphase-sec} {\ltlabsecdate} {\ltlabsecversion}
{Code related to the tagging of sectioning commands}
% \end{macrocode}
%
@@ -177,10 +179,12 @@
% \begin{macrocode}
%<*kernelchange>
\ifdefined\directlua
- \pdfvariable gentounicode =1
- \protected\def\pdfglyphtounicode {\pdfextension glyphtounicode }
- \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
- \input{glyphtounicode}
+ \ifnum\outputmode > 0
+ \pdfvariable gentounicode =1
+ \protected\def\pdfglyphtounicode {\pdfextension glyphtounicode }
+ \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
+ \input{glyphtounicode}
+ \fi
\fi
\ifdefined\pdfglyphtounicode
\input{glyphtounicode-cmex}
@@ -437,45 +441,48 @@
% \end{macrocode}
% This redefines \cs{part} in article class.
% \begin{macrocode}
- \RenewDocumentCommand\part{ s O{#3} m }
+ \@ifundefined{part}{}
{
- \if at noskipsec \leavevmode \fi
- \par
- \addvspace{4ex}%
- \@afterindentfalse
+ \RenewDocumentCommand\part{ s O{#3} m }
+ {
+ \if at noskipsec \leavevmode \fi
+ \par
+ \addvspace{4ex}%
+ \@afterindentfalse
% \end{macrocode}
% This are the tagging commands needed at the begin. They open a Part structure
% and the structure for the title of the heading.
% \begin{macrocode}
% tagging start commands
- \tag_tool:n {sec-start-part=#2}
+ \tag_tool:n {sec-start-part=#2}
% end tagging start commands
% \end{macrocode}
% This adds a manual target if the part is unnumbered or starred.
% It replaces the hyperref patches.
% \begin{macrocode}
- \bool_lazy_any:nT
- {
- { #1 }
- {
- \int_compare_p:nNn {\c at secnumdepth}<{-1}
- }
- }
- {
- \MakeLinkTarget[part]{}
- }
+ \bool_lazy_any:nT
+ {
+ { #1 }
+ {
+ \int_compare_p:nNn {\c at secnumdepth}<{-1}
+ }
+ }
+ {
+ \MakeLinkTarget[part]{}
+ }
% \end{macrocode}
% The main call to the underlying commands.
% \begin{macrocode}
- \IfBooleanTF
- {#1}
- { \@spart {#3} }
- { \@part [#2]{#3} }
+ \IfBooleanTF
+ {#1}
+ { \@spart {#3} }
+ { \@part [#2]{#3} }
% \end{macrocode}
% and now the closing command for the tagging of the title.
% \begin{macrocode}
- \tag_tool:n {sec-stop-part}
- }
+ \tag_tool:n {sec-stop-part}
+ }
+ }
}
% \end{macrocode}
% Redefinitions for book and report
@@ -812,8 +819,8 @@
% \begin{macrocode}
%<*latex-lab>
-\ProvidesFile{sec-tagging-latex-lab-testphase.ltx}
- [2023-05-20 v0.82 code related to the tagging of sectioning commands]
+\ProvidesFile{sec-latex-lab-testphase.ltx}
+ [\ltlabsecdate\space v\ltlabsecversion\space latex-lab wrapper sec]
\RequirePackage{latex-lab-testphase-sec}
%</latex-lab>
% \end{macrocode}
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-testphase.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -41,12 +41,15 @@
% \section{Introduction}
%
% This code implements small files which can be loaded with the |testphase|
-% key of \cs{DocumentMetadata}. This will be extended to allow user to load
+% key of \cs{DocumentMetadata} and which bundle various testphase modules.
+% This will be extended to allow user to load
% well defined parts of the tagged PDF project.
-% Currently the values |phase-I|, |phase-II| and |new-or| are provided.
+%
+% Currently the values |phase-I|, |phase-II|, |phase-III| and |new-or| (bundles |new-or-1|
+% and |new-or-2|) are provided.
% |tagpdf| is an undocumented alias for |phase-II| which is kept for compability.
+% The value |math| combines various math related files.
%
-%
% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
%
%
@@ -53,17 +56,12 @@
% \section{The Implementation}
% new-or-1 contains the code for header and footer (tagging and
% suppressing links) and is always loaded
-% \begin{macrocode}
-%<*new-or-1>
-\ProvidesFile{new-or-1-latex-lab-testphase.ltx}
- [2022-11-04 v0.1a latex-lab wrapper new-or-1]
-%</new-or-1>
-% \end{macrocode}
+
% new-or combines all new-or parts (currently 1+2)
% \begin{macrocode}
%<*new-or>
\ProvidesFile{new-or-latex-lab-testphase.ltx}
- [2022-11-04 v0.1a latex-lab wrapper new-or]
+ [2023-06-15 v0.1b latex-lab wrapper new-or]
%</new-or>
% \end{macrocode}
% \begin{macrocode}
@@ -75,17 +73,17 @@
% \begin{macrocode}
%<*phase-II>
\ProvidesFile{phase-II-latex-lab-testphase.ltx}
- [2022-11-04 v0.1a latex-lab wrapper phase-II]
+ [2023-06-15 v0.1b latex-lab wrapper phase-II]
%</phase-II>
% \end{macrocode}
% \begin{macrocode}
%<*phase-III>
\ProvidesFile{phase-III-latex-lab-testphase.ltx}
- [2023-03-06 v0.1a latex-lab wrapper phase-III]
+ [2023-07-20 v0.1b latex-lab wrapper phase-III]
\input{phase-II-latex-lab-testphase.ltx}
\IfFormatAtLeastTF{2023-06-01}
{
- \RequirePackage{latex-lab-testphase-block-tagging}
+ \RequirePackage{latex-lab-testphase-block}
\RequirePackage{latex-lab-testphase-sec}
\RequirePackage{latex-lab-testphase-toc}
\RequirePackage{latex-lab-testphase-minipage}
@@ -106,11 +104,11 @@
%</tagpdf>
% \end{macrocode}
% \begin{macrocode}
-%<*tagpdf|phase-I|phase-II|new-or|new-or-1>
+%<*tagpdf|phase-I|phase-II|new-or>
\RequirePackage{latex-lab-testphase-new-or-1}
-%</tagpdf|phase-I|phase-II|new-or|new-or-1>
+%</tagpdf|phase-I|phase-II|new-or>
% \end{macrocode}
-% New output routine code is loaded in phase-II and new-or:
+% Support for the new output routine code are loaded in phase-II and new-or:
% \begin{macrocode}
%<*tagpdf|phase-II|new-or>
\RequirePackage{latex-lab-testphase-new-or-2}
@@ -135,23 +133,23 @@
% \begin{macrocode}
%</tagpdf|phase-I|phase-II>
% \end{macrocode}
-% Wrapper files for math tagging:
+% testphase wrapper files for math:
% \begin{macrocode}
-%<*math-lab>
+%<*math>
\ProvidesFile{math-latex-lab-testphase.ltx}
- [2023-01-07 v0.8 code related to the math tagging]
+ [2023-07-20 v0.8a latex-lab wrapper math]
\RequirePackage{latex-lab-testphase-math}
-%</math-lab>
+%</math>
% \end{macrocode}
% \begin{macrocode}
-%<*math-sty>
+%<*math-package>
\ProvidesPackage{latex-lab-testphase-math}
- [2023-01-07 v0.8 code related to the math tagging]
-\input{latex-lab-mathtagging.ltx}
+ [2023-07-20 v0.8a code related to the math tagging]
+\input{latex-lab-math.ltx}
\input{latex-lab-amsmath.ltx}
\input{latex-lab-mathtools.ltx}
\input{latex-lab-mathpkg.ltx}
-%</math-sty>
+%</math-package>
% \end{macrocode}
% \Finale
%
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-text.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -16,6 +16,9 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabtextdate{2023-07-20}
+\def\ltlabtextversion{0.85a}
+
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -30,7 +33,7 @@
% \title{The \textsf{latex-lab-text} package\\
% Changes and additions to the kernel related to the tagging of various small text commands}
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{Version 0.80 2023-05-28}
+% \date{v\ltlabtextversion\ \ltlabtextdate}
%
% \maketitle
%
@@ -61,8 +64,8 @@
%<@@=tag>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesExplPackage {latex-lab-testphase-text} {2023-05-28} {0.8}
- {Code related to the tagging of inline text commands}
+\ProvidesExplPackage {latex-lab-testphase-text} {\ltlabtextdate} {\ltlabtextversion}
+ {Code related to the tagging of various small text commands}
% \end{macrocode}
% \subsection{The \LaTeX\ and \TeX\ logo}
@@ -124,7 +127,8 @@
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{text-latex-lab-testphase.ltx}
- [2023-05-28 v0.8 code related to the tagging of bib and citations]
+ [\ltlabtextdate\space v\ltlabtextversion\space
+ code related to the tagging of various small text commands]
\RequirePackage{latex-lab-testphase-text}
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-hyperref-changes.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -16,6 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
+\def\ltlabtochyperdate{2023-07-20}
+\def\ltlabtochyperversion{0.85a}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -29,7 +31,7 @@
% \title{The \textsf{latex-lab-toc-hyperref-changes} package\\
% Changes and additions to hyperref related to toc entries}
% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{Version 0.83 2023-06-07}
+% \date{v\ltlabtochyperversion\ \ltlabtochyperdate}
%
% \maketitle
%
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-kernel-changes.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-toc-kernel-functions.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2023 LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -16,6 +16,9 @@
%
% for those people who are interested or want to report an issue.
%
+% dates for latex-lab-kernel-changes.sty (pulled from various sources, see ins)
+\def\ltlabkerneldate{2023-07-20}
+\def\ltlabkernelversion{0.85a}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -56,6 +59,13 @@
% They are marked as [class]. They are inserted with hooks here: this will break
% if a non-standard class is used.
%
+% \subsection{Package declaration}
+% \begin{macrocode}
+%<*kernelchange>
+\ProvidesPackage{latex-lab-kernel-changes}
+ [\ltlabkerneldate\space v\ltlabkernelversion\space
+ General kernel and class changes]
+% \end{macrocode}
% \subsection{Providing the counter representation \cs{theHxx} generally}
% [kernel?]
%
@@ -67,7 +77,6 @@
%
% At first we suppress the patches from hyperref:
% \begin{macrocode}
-%<*kernelchange>
\def\hyper at nopatch@counter{}
% \end{macrocode}
%
@@ -461,13 +470,3 @@
% \begin{macrocode}
%</package>
% \end{macrocode}
-
-% \begin{macrocode}
-%<*latex-lab>
-\ProvidesFile{toc-tagging-latex-lab-testphase.ltx}
- [2023-05-20 v0.81 code related to the tagging of toc and similar lists]
-
-\RequirePackage{latex-lab-testphase-toc}
-
-%</latex-lab>
-% \end{macrocode}
Deleted: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-tagging-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-tagging-functions.dtx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc-tagging-functions.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,365 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: latex-lab-toc-tagging-functions.dtx (C) Copyright 2022-2023 LaTeX Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% https://www.latex-project.org/lppl.txt
-%
-%
-% The development version of the bundle can be found below
-%
-% https://github.com/latex3/latex2e/required/latex-lab
-%
-% for those people who are interested or want to report an issue.
-%
-%<*driver>
-\documentclass{l3doc}
-\EnableCrossrefs
-\CodelineIndex
-\begin{document}
- \DocInput{latex-lab-toc-tagging-functions.dtx}
-\end{document}
-%</driver>
-%
-% \fi
-%
-%
-% \title{The \textsf{latex-lab-toc-tagging-functions} package\\
-% Tagpdf functions related to the tagging of toc and similar lists}
-% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
-% \date{Version 0.82 2023-05-20}
-%
-% \maketitle
-%
-% \newcommand{\xt}[1]{\textsl{\textsf{#1}}}
-% \newcommand{\TODO}[1]{\textbf{[TODO:} #1\textbf{]}}
-% \newcommand{\docclass}{document class \marginpar{\raggedright document class
-% customizations}}
-%
-% \providecommand\hook[1]{\texttt{#1}}
-%
-% \begin{abstract}
-% \end{abstract}
-%
-% Header for the testphase package
-% \begin{macrocode}
-%<*header>
-\ProvidesExplPackage {latex-lab-testphase-toc} {2023-05-20} {0.82}
- { commands related to the tagging of toc-like lists}
-%</header>
-% \end{macrocode}
-%
-% \section{Introduction}
-%
-% The followings contains various functions related to the tagging of the
-% table of contents and similar list. The functions will at some time
-% be moved inside the tagpdf code.
-% \begin{macrocode}
-%<*package>
-%<@@=tag>
-% \end{macrocode}
-% \section{Temporary variables}
-% \begin{macro}{\l_@@_toc_tmpa_tl}
-% \begin{macrocode}
-\tl_new:N \l_@@_toc_tmpa_tl
-% \end{macrocode}
-% \end{macro}
-%
-% \section{General struct commands}
-% The following variables and commands are not restricted to toc, but
-% probably will be need in other places too.
-% \begin{variable}{\g_@@_struct_dest_num_prop}
-% This variable records for (some or all, not clear yet)
-% destination names the related structure number to allow
-% to reference them in a Ref. The key is the destination.
-% Moved into tagpdf!
-% \end{variable}
-%
-% We use \cs{refstepcounter} to store the relation between
-% destination names/\cs{@currentHref} and structure numbers
-%
-% TODO: the functions should be moved into tagpdf so that one
-% doesn't has to test if the prop exists or not.
-% \begin{macrocode}
-\AddToHook{cmd/refstepcounter/after}
- {
- \tl_if_blank:VF \@currentHref
- {
- \prop_if_exist:NT \g_@@_struct_dest_num_prop
- {
- \prop_gput:Nxx \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}}
- }
- }
- }
-\AddToHook{cmd/H at refstepcounter/after}
- {
- \tl_if_blank:VF \@currentHref
- {
- \prop_if_exist:NT \g_@@_struct_dest_num_prop
- {
- \prop_gput:Nxx \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}}
- }
- }
- }
-% \end{macrocode}
-% \begin{variable}{\g_@@_struct_ref_by_dest_prop}
-% This variable contains structures whose Ref key should be updated
-% at the end to point to structured related with this destination.
-% As this is probably need in other places too, it is not only a toc-variable.
-% Moved into tagpdf!
-% \end{variable}
-%
-% \begin{macro}{\g_@@_struct_ref_by_dest:}
-% This command is executed and update the Ref keys
-% of the structures listed in |\g_@@_struct_ref_by_dest_prop|.
-% It is currently only relevant for the |TOCI|. But other structures
-% could need that later too.
-% The command is executed in the |tagpdf/finish/before| hook.
-% \begin{macrocode}
-\msg_new:nnn { tag } {struct-dest-unknown}
- {
- Destination~#1~has~no~related~structure.\\
- /Ref~for~structure~#2~not~updated
- }
-
-\cs_new_protected:Npn \g_@@_struct_ref_by_dest:
- {
- \prop_map_inline:Nn\g_@@_struct_ref_by_dest_prop
- {
- \prop_get:NnNTF \g_@@_struct_dest_num_prop {##2} \l_@@_tmpa_tl
- {
- \@@_struct_gput_data_ref:ee
- { ##1 }
- { \tag_struct_object_ref:e{ \l_@@_tmpa_tl }}
- }
- {
- \msg_warning:nnnn {tag}{struct-dest-unknown}{##2}{ ##1}
- }
- }
- }
-\hook_gput_code:nnn {tagpdf/finish/before}{tagpdf/struct/Ref}{\g_@@_struct_ref_by_dest:}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{Toc code}
-% \begin{variable}{\g_@@_toc_level_int,\g_@@_toc_stack_seq}
-% |\g_@@_toc_level_int| records in a toc the current absolute level.
-% We must close open structures at the end of the toc, for this
-% we maintain a stack |\g_@@_toc_stack_seq|.
-% \begin{macrocode}
-\int_new:N \g_@@_toc_level_int
-\seq_new:N \g_@@_toc_stack_seq
-% \end{macrocode}
-% \end{variable}
-
-% \begin{macro}{\_tag_toc_starttoc_init:n}
-% The init code clears the stack, and set the level to -100
-% and start to TOC structure. We also disable paratagging.
-% The |/Title| is currently simply the type, but this could be done nicer.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_toc_starttoc_init:n #1
- {
- \bool_set_false:N \l_@@_para_bool
- \seq_gclear:N \g_@@_toc_stack_seq
- \int_gset:Nn \g_@@_toc_level_int {-100}
- \tag_struct_begin:n{tag=TOC,title=#1}
- }
-% \end{macrocode}
-% Now map it into the config point:
-% \begin{macrocode}
-\cs_set_protected:Npn\@starttoc at cfgpoint@before#1
- {
- \@@_toc_starttoc_init:n{#1}
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\@@_toc_starttoc_finalize:}
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_toc_starttoc_finalize:
- {
- \int_step_inline:nn
- {\seq_count:N \g_@@_toc_stack_seq }
- {\tag_struct_end:}
- \tag_struct_end:
- \seq_gclear:N \g_@@_toc_stack_seq
- }
-% \end{macrocode}
-% Now map it into the config point:
-% \begin{macrocode}
-\cs_set_protected:Npn\@starttoc at cfgpoint@after#1
- {
- \@@_toc_starttoc_finalize:
- }
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\@@_toc_end:n}
-% This commands ends all TOC on the stack with a level higher than the argument
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_toc_end:n #1
- {
- \seq_get:NNT\g_@@_toc_stack_seq \l_@@_toc_tmpa_tl
- {
- \bool_lazy_and:nnT
- {
- \str_if_eq_p:ee{\tl_head:N\l_@@_toc_tmpa_tl}{TOC}
- }
- {
- \int_compare_p:nNn {#1}<{\tl_tail:N \l_@@_toc_tmpa_tl}
- }
- {
- \seq_gpop:NN\g_@@_toc_stack_seq \l_@@_toc_tmpa_tl
- \tag_struct_end:
- \@@_toc_end:n{#1}
- }
- }
- }
-\cs_generate_variant:Nn \@@_toc_end:n {e}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_toc_contentsline_begin:nnn}
-% This is main command executed at the begin of a |\contentsline|.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_toc_contentsline_begin:nnn #1 #2 #3 %#1 level, #2 content, #3 destination
- {
- \tag_if_active:T
- {
-% \end{macrocode}
-% We detect the intended level by checking the value of |toclevel at ...|
-% (currently only provided by hyperref, but should be there always).
-% To be on the safe side we set it to 1 if not defined.
-% \begin{macrocode}
- \ExpandArgs{c}\providecommand { toclevel@#1 }{ 1 } % just in case ...
- \int_compare:nNnF { \use:c{toclevel@#1} } > {\use:c{c at tocdepth}}
- {
-% \end{macrocode}
-% if level goes up, start new sub TOC unless we are at the begin
-% \begin{macrocode}
- \bool_lazy_and:nnT
- { \int_compare_p:nNn { \g_@@_toc_level_int } > {-100} }
- { \int_compare_p:nNn { \use:c{toclevel@#1} } > { \g_@@_toc_level_int } }
- {
- \seq_gpush:Nx \g_@@_toc_stack_seq {{TOC}\use:c{toclevel@#1}}
- \tag_struct_begin:n{tag=TOC}
- }
-% \end{macrocode}
-% if level goes down close all TOC's with a higher level
-% \begin{macrocode}
- \int_compare:nNnT
- { \use:c{toclevel@#1} } < { \g_@@_toc_level_int }
- {
- \@@_toc_end:e { \use:c{toclevel@#1} }
- }
-% \end{macrocode}
-%if same level do nothing
-% update toclevel to the current level.
-% \begin{macrocode}
- \int_gset:Nn \g_@@_toc_level_int { \use:c{toclevel@#1} }
-% \end{macrocode}
-% now open the TOCI, the tagging of the
-% inner structure is left to the |\l at xxx| commands.
-% setting the title is not strictly necessary but looks nicer
-% but we have to remove the |\numberline|
-% \begin{NOTE}{UF}
-% perhaps keep the number? How to insert a space then
-% \end{NOTE}
-% \begin{macrocode}
- \group_begin:
- \text_declare_expand_equivalent:Nn \numberline \use_none:n
- \exp_args:Nx \tag_struct_begin:n{tag=TOCI,title={\text_purify:n {#2}}}
-% \end{macrocode}
-% The TOCI structure should get a /Ref, so we put a request with its destination
-% name into the prop.
-% \begin{NOTE}{UF}
-% This only works with hyperref currently. Without hyperref we
-% need to store fake names.
-% \end{NOTE}
-% \begin{macrocode}
- \prop_gput:Nxx \g_@@_struct_ref_by_dest_prop
- { \tag_get:n {struct_num} }{#3}
- \seq_gpush:Nx \g_@@_toc_stack_seq {{TOCI}\use:c{toclevel@#1}}
- \group_end:
- }
- }
- }
-% \end{macrocode}
-% Now map it into the config point:
-% \begin{macrocode}
-\cs_set_protected:Npn\@contentsline at cfgpoint@before#1#2#3#4
- {
- \@@_toc_contentsline_begin:nnn {#1}{#2}{#4}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_toc_contentsline_end:n}
-% This is the closing code of a |\contentsline|.
-% If the contentsline was actually printed, the code has to
-% close the TOCI structure and to update the stack.
-% \begin{macrocode}
-\msg_new:nnn {tag}{toc-no-TOCI}{Missing~TOCI~structure~on~toc~stack}
-
-\cs_new_protected:Npn \@@_toc_contentsline_end:n #1 %#1 level name
- {
- \int_compare:nNnF { \use:c{toclevel@#1} } > {\use:c{c at tocdepth}}
- {
- \seq_gpop:NNT \g_@@_toc_stack_seq\l_@@_tmpa_tl
- {
- \str_if_eq:eeTF{\tl_head:N\l_@@_tmpa_tl}{TOCI}
- {
- \tag_struct_end:
- }
- {
- \msg_warning:nn{tag}{toc-no-TOCI}
- }
- }
- }
- }
-% \end{macrocode}
-% Now we map it to the config point
-% \begin{macrocode}
-\cs_set_protected:Npn \@contentsline at cfgpoint@after #1#2#3#4
- {
- \@@_toc_contentsline_end:n {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Tagging of the content}
-% This need discussion.
-%
-% \begin{macrocode}
-\AddToHook{contentsline/text/before}[tagpdf]{%
- \tag_struct_begin:n{tag=Reference}%
- \tag_mc_begin:n{tag=Reference}}
-\AddToHook{contentsline/text/after}[tagpdf]{%
- \tag_mc_end:}
-\AddToHook{contentsline/page/before}[tagpdf]{%
- \tag_mc_begin:n{tag=Reference}}
-\AddToHook{contentsline/page/after}[tagpdf]{%
- \tag_mc_end:
- \tag_struct_end:} %Reference
-\AddToHook{contentsline/number/before}[tagpdf]{%
- \tag_mc_end:
- \tag_struct_begin:n{tag=Lbl}%
- \tag_mc_begin:n{tag=Lbl}}
-\AddToHook{contentsline/number/after}[tagpdf]{%
- \tag_mc_end:
- \tag_struct_end:
- \tag_mc_begin:n{tag=Reference}}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\def\@dottedtocline at cfgpoint@leaders#1{%
- \tag_mc_begin:n{artifact}\tag_stop:n{leaders}\nobreak#1\nobreak\tag_start:n{leaders}\tag_mc_end:}
-% \end{macrocode}
-
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
Added: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx (rev 0)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,377 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-toc.dtx (C) Copyright 2022-2023 LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+\def\ltlabtocdate{2023-07-20}
+\def\ltlabtocversion{0.85a}
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-toc.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \textsf{latex-lab-toc} package\\
+% Changes related to the tagging of toc and similar lists}
+% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
+% \date{v\ltlabtocdate\ \ltlabtocversion}
+%
+% \maketitle
+%
+% \newcommand{\xt}[1]{\textsl{\textsf{#1}}}
+% \newcommand{\TODO}[1]{\textbf{[TODO:} #1\textbf{]}}
+% \newcommand{\docclass}{document class \marginpar{\raggedright document class
+% customizations}}
+%
+% \providecommand\hook[1]{\texttt{#1}}
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% Header for the testphase package
+% \begin{macrocode}
+%<*header>
+\ProvidesExplPackage {latex-lab-testphase-toc} {\ltlabtocdate} {\ltlabtocversion}
+ { Code related to the tagging of toc-like lists}
+%</header>
+% \end{macrocode}
+%
+% \section{Introduction}
+%
+% The followings contains various functions related to the tagging of the
+% table of contents and similar list. The functions will at some time
+% be moved inside the tagpdf code.
+% \begin{macrocode}
+%<*package>
+%<@@=tag>
+% \end{macrocode}
+% \section{Temporary variables}
+% \begin{macro}{\l_@@_toc_tmpa_tl}
+% \begin{macrocode}
+\tl_new:N \l_@@_toc_tmpa_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \section{General struct commands}
+% The following variables and commands are not restricted to toc, but
+% probably will be need in other places too.
+% \begin{variable}{\g_@@_struct_dest_num_prop}
+% This variable records for (some or all, not clear yet)
+% destination names the related structure number to allow
+% to reference them in a Ref. The key is the destination.
+% Moved into tagpdf!
+% \end{variable}
+%
+% We use \cs{refstepcounter} to store the relation between
+% destination names/\cs{@currentHref} and structure numbers
+%
+% TODO: the functions should be moved into tagpdf so that one
+% doesn't has to test if the prop exists or not.
+% \begin{macrocode}
+\AddToHook{cmd/refstepcounter/after}
+ {
+ \tl_if_blank:VF \@currentHref
+ {
+ \prop_if_exist:NT \g_@@_struct_dest_num_prop
+ {
+ \prop_gput:Nxx \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}}
+ }
+ }
+ }
+\AddToHook{cmd/H at refstepcounter/after}
+ {
+ \tl_if_blank:VF \@currentHref
+ {
+ \prop_if_exist:NT \g_@@_struct_dest_num_prop
+ {
+ \prop_gput:Nxx \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}}
+ }
+ }
+ }
+% \end{macrocode}
+% \begin{variable}{\g_@@_struct_ref_by_dest_prop}
+% This variable contains structures whose Ref key should be updated
+% at the end to point to structured related with this destination.
+% As this is probably need in other places too, it is not only a toc-variable.
+% Moved into tagpdf!
+% \end{variable}
+%
+% \begin{macro}{\g_@@_struct_ref_by_dest:}
+% This command is executed and update the Ref keys
+% of the structures listed in |\g_@@_struct_ref_by_dest_prop|.
+% It is currently only relevant for the |TOCI|. But other structures
+% could need that later too.
+% The command is executed in the |tagpdf/finish/before| hook.
+% \begin{macrocode}
+\msg_new:nnn { tag } {struct-dest-unknown}
+ {
+ Destination~#1~has~no~related~structure.\\
+ /Ref~for~structure~#2~not~updated
+ }
+
+\cs_new_protected:Npn \g_@@_struct_ref_by_dest:
+ {
+ \prop_map_inline:Nn\g_@@_struct_ref_by_dest_prop
+ {
+ \prop_get:NnNTF \g_@@_struct_dest_num_prop {##2} \l_@@_tmpa_tl
+ {
+ \@@_struct_gput_data_ref:ee
+ { ##1 }
+ { \tag_struct_object_ref:e{ \l_@@_tmpa_tl }}
+ }
+ {
+ \msg_warning:nnnn {tag}{struct-dest-unknown}{##2}{ ##1}
+ }
+ }
+ }
+\hook_gput_code:nnn {tagpdf/finish/before}{tagpdf/struct/Ref}{\g_@@_struct_ref_by_dest:}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Toc code}
+% \begin{variable}{\g_@@_toc_level_int,\g_@@_toc_stack_seq}
+% |\g_@@_toc_level_int| records in a toc the current absolute level.
+% We must close open structures at the end of the toc, for this
+% we maintain a stack |\g_@@_toc_stack_seq|.
+% \begin{macrocode}
+\int_new:N \g_@@_toc_level_int
+\seq_new:N \g_@@_toc_stack_seq
+% \end{macrocode}
+% \end{variable}
+
+% \begin{macro}{\_tag_toc_starttoc_init:n}
+% The init code clears the stack, and set the level to -100
+% and start to TOC structure. We also disable paratagging.
+% The |/Title| is currently simply the type, but this could be done nicer.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_toc_starttoc_init:n #1
+ {
+ \bool_set_false:N \l_@@_para_bool
+ \seq_gclear:N \g_@@_toc_stack_seq
+ \int_gset:Nn \g_@@_toc_level_int {-100}
+ \tag_struct_begin:n{tag=TOC,title=#1}
+ }
+% \end{macrocode}
+% Now map it into the config point:
+% \begin{macrocode}
+\cs_set_protected:Npn\@starttoc at cfgpoint@before#1
+ {
+ \@@_toc_starttoc_init:n{#1}
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_toc_starttoc_finalize:}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_toc_starttoc_finalize:
+ {
+ \int_step_inline:nn
+ {\seq_count:N \g_@@_toc_stack_seq }
+ {\tag_struct_end:}
+ \tag_struct_end:
+ \seq_gclear:N \g_@@_toc_stack_seq
+ }
+% \end{macrocode}
+% Now map it into the config point:
+% \begin{macrocode}
+\cs_set_protected:Npn\@starttoc at cfgpoint@after#1
+ {
+ \@@_toc_starttoc_finalize:
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\@@_toc_end:n}
+% This commands ends all TOC on the stack with a level higher than the argument
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_toc_end:n #1
+ {
+ \seq_get:NNT\g_@@_toc_stack_seq \l_@@_toc_tmpa_tl
+ {
+ \bool_lazy_and:nnT
+ {
+ \str_if_eq_p:ee{\tl_head:N\l_@@_toc_tmpa_tl}{TOC}
+ }
+ {
+ \int_compare_p:nNn {#1}<{\tl_tail:N \l_@@_toc_tmpa_tl}
+ }
+ {
+ \seq_gpop:NN\g_@@_toc_stack_seq \l_@@_toc_tmpa_tl
+ \tag_struct_end:
+ \@@_toc_end:n{#1}
+ }
+ }
+ }
+\cs_generate_variant:Nn \@@_toc_end:n {e}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_toc_contentsline_begin:nnn}
+% This is main command executed at the begin of a |\contentsline|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_toc_contentsline_begin:nnn #1 #2 #3 %#1 level, #2 content, #3 destination
+ {
+ \tag_if_active:T
+ {
+% \end{macrocode}
+% We detect the intended level by checking the value of |toclevel at ...|
+% (currently only provided by hyperref, but should be there always).
+% To be on the safe side we set it to 1 if not defined.
+% \begin{macrocode}
+ \ExpandArgs{c}\providecommand { toclevel@#1 }{ 1 } % just in case ...
+ \int_compare:nNnF { \use:c{toclevel@#1} } > {\use:c{c at tocdepth}}
+ {
+% \end{macrocode}
+% if level goes up, start new sub TOC unless we are at the begin
+% \begin{macrocode}
+ \bool_lazy_and:nnT
+ { \int_compare_p:nNn { \g_@@_toc_level_int } > {-100} }
+ { \int_compare_p:nNn { \use:c{toclevel@#1} } > { \g_@@_toc_level_int } }
+ {
+ \seq_gpush:Nx \g_@@_toc_stack_seq {{TOC}\use:c{toclevel@#1}}
+ \tag_struct_begin:n{tag=TOC}
+ }
+% \end{macrocode}
+% if level goes down close all TOC's with a higher level
+% \begin{macrocode}
+ \int_compare:nNnT
+ { \use:c{toclevel@#1} } < { \g_@@_toc_level_int }
+ {
+ \@@_toc_end:e { \use:c{toclevel@#1} }
+ }
+% \end{macrocode}
+%if same level do nothing
+% update toclevel to the current level.
+% \begin{macrocode}
+ \int_gset:Nn \g_@@_toc_level_int { \use:c{toclevel@#1} }
+% \end{macrocode}
+% now open the TOCI, the tagging of the
+% inner structure is left to the |\l at xxx| commands.
+% setting the title is not strictly necessary but looks nicer
+% but we have to remove the |\numberline|
+% \begin{NOTE}{UF}
+% perhaps keep the number? How to insert a space then
+% \end{NOTE}
+% \begin{macrocode}
+ \group_begin:
+ \text_declare_expand_equivalent:Nn \numberline \use_none:n
+ \exp_args:Nx \tag_struct_begin:n{tag=TOCI,title={\text_purify:n {#2}}}
+% \end{macrocode}
+% The TOCI structure should get a /Ref, so we put a request with its destination
+% name into the prop.
+% \begin{NOTE}{UF}
+% This only works with hyperref currently. Without hyperref we
+% need to store fake names.
+% \end{NOTE}
+% \begin{macrocode}
+ \prop_gput:Nxx \g_@@_struct_ref_by_dest_prop
+ { \tag_get:n {struct_num} }{#3}
+ \seq_gpush:Nx \g_@@_toc_stack_seq {{TOCI}\use:c{toclevel@#1}}
+ \group_end:
+ }
+ }
+ }
+% \end{macrocode}
+% Now map it into the config point:
+% \begin{macrocode}
+\cs_set_protected:Npn\@contentsline at cfgpoint@before#1#2#3#4
+ {
+ \@@_toc_contentsline_begin:nnn {#1}{#2}{#4}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_toc_contentsline_end:n}
+% This is the closing code of a |\contentsline|.
+% If the contentsline was actually printed, the code has to
+% close the TOCI structure and to update the stack.
+% \begin{macrocode}
+\msg_new:nnn {tag}{toc-no-TOCI}{Missing~TOCI~structure~on~toc~stack}
+
+\cs_new_protected:Npn \@@_toc_contentsline_end:n #1 %#1 level name
+ {
+ \int_compare:nNnF { \use:c{toclevel@#1} } > {\use:c{c at tocdepth}}
+ {
+ \seq_gpop:NNT \g_@@_toc_stack_seq\l_@@_tmpa_tl
+ {
+ \str_if_eq:eeTF{\tl_head:N\l_@@_tmpa_tl}{TOCI}
+ {
+ \tag_struct_end:
+ }
+ {
+ \msg_warning:nn{tag}{toc-no-TOCI}
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% Now we map it to the config point
+% \begin{macrocode}
+\cs_set_protected:Npn \@contentsline at cfgpoint@after #1#2#3#4
+ {
+ \@@_toc_contentsline_end:n {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Tagging of the content}
+% This need discussion.
+%
+% \begin{macrocode}
+\AddToHook{contentsline/text/before}[tagpdf]{%
+ \tag_struct_begin:n{tag=Reference}%
+ \tag_mc_begin:n{tag=Reference}}
+\AddToHook{contentsline/text/after}[tagpdf]{%
+ \tag_mc_end:}
+\AddToHook{contentsline/page/before}[tagpdf]{%
+ \tag_mc_begin:n{tag=Reference}}
+\AddToHook{contentsline/page/after}[tagpdf]{%
+ \tag_mc_end:
+ \tag_struct_end:} %Reference
+\AddToHook{contentsline/number/before}[tagpdf]{%
+ \tag_mc_end:
+ \tag_struct_begin:n{tag=Lbl}%
+ \tag_mc_begin:n{tag=Lbl}}
+\AddToHook{contentsline/number/after}[tagpdf]{%
+ \tag_mc_end:
+ \tag_struct_end:
+ \tag_mc_begin:n{tag=Reference}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@dottedtocline at cfgpoint@leaders#1{%
+ \tag_mc_begin:n{artifact}\tag_stop:n{leaders}\nobreak#1\nobreak\tag_start:n{leaders}\tag_mc_end:}
+% \end{macrocode}
+
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% Wrapper for the testphase key.
+% \begin{macrocode}
+%<*latex-lab>
+\ProvidesFile{toc-latex-lab-testphase.ltx}
+ [\ltlabtocdate\space v\ltlabtocversion latex-lab wrapper toc]
+
+\RequirePackage{latex-lab-testphase-toc}
+
+%</latex-lab>
+% \end{macrocode}
Property changes on: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-toc.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab.ins 2023-09-14 20:25:56 UTC (rev 68279)
@@ -66,43 +66,39 @@
% files that should be loadable with the testphase key should use the naming scheme
% #1-latex-lab-testphase.ltx
+
+%%% phases and bundles %%%
+% phases
\generate{\file{phase-I-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{phase-I}}}
\generate{\file{phase-II-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{phase-II}}}
\generate{\file{phase-III-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{phase-III}}}
+% obsolete
+\generate{\file{tagpdf-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{tagpdf}}}
-\generate{\file{tagpdf-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{tagpdf}}}
+%new-or (no style, only wrapper, private and not documentated)
\generate{\file{new-or-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{new-or}}}
-\generate{\file{new-or-1-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{new-or-1}}}
-\generate{\file{math-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{math-lab}}}
-\generate{\file{latex-lab-testphase-math.sty}{\from{latex-lab-testphase.dtx}{math-sty}}}
+% math
+\generate{\file{math-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{math}}}
+\generate{\file{latex-lab-testphase-math.sty}{\from{latex-lab-testphase.dtx}{math-package}}}
-% support files (the new-or code is a private package to make life easier)
-\generate{\file{latex-lab-testphase-new-or-2.sty}{\from{latex-lab-new-or-2.dtx}{code}}}
-\generate{\file{latex-lab-testphase-new-or-1.sty}{\from{latex-lab-new-or-1.dtx}{code}}}
+%%% support files loaded by phases and testphase modules %%%
+%footnotes
\generate{\file{latex-lab-footmisc.ltx}{\from{latex-lab-footnotes.dtx}{footmisc}}}
\generate{\file{latex-lab-footnotes.ltx}{\from{latex-lab-footnotes.dtx}{kernel}}}
-\generate{\file{latex-lab-mathtagging.ltx}{\from{latex-lab-mathtagging.dtx}{kernel}}}
+%new-or-2
+\generate{\file{latex-lab-testphase-new-or-2.sty}{\from{latex-lab-new-or-2.dtx}{package}}}
+
+%math
+\generate{\file{latex-lab-math.ltx}{\from{latex-lab-math.dtx}{kernel}}}
\generate{\file{latex-lab-amsmath.ltx}{\from{latex-lab-amsmath.dtx}{kernel}}}
\generate{\file{latex-lab-mathtools.ltx}{\from{latex-lab-mathtools.dtx}{kernel}}}
\generate{\file{latex-lab-mathpkg.ltx}{\from{latex-lab-mathpkg.dtx}{kernel}}}
-\generate{\file{latex-lab-testphase-sec.sty}{\from{latex-lab-sec.dtx}{package}}}
-\generate{\file{sec-tagging-latex-lab-testphase.ltx}{\from{latex-lab-sec.dtx}{latex-lab}}}
-
-
-\generate{\file{latex-lab-testphase-toc.sty}{%
- \from{latex-lab-toc-tagging-functions.dtx}{header}
- \from{latex-lab-toc-kernel-changes.dtx}{package}
- \from{latex-lab-toc-tagging-functions.dtx}{package}
- \from{latex-lab-toc-hyperref-changes.dtx}{package}}}
-
-\generate{\file{toc-tagging-latex-lab-testphase.ltx}{%
- \from{latex-lab-toc-kernel-changes.dtx}{latex-lab}}}
-
+% kernel changes need by more than one module
\generate{\file{latex-lab-kernel-changes.sty}
{\from{latex-lab-toc-kernel-changes.dtx}{kernelchange}
\from{latex-lab-sec.dtx}{kernelchange}
@@ -109,44 +105,60 @@
}}
-\generate{\file{latex-lab-testphase-graphic.sty}{%
- \from{latex-lab-graphic.dtx}{package}}}
+%%% single modules %%%
+%new-or-1
+\generate{\file{new-or-1-latex-lab-testphase.ltx}{\from{latex-lab-new-or-1.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-new-or-1.sty}{\from{latex-lab-new-or-1.dtx}{package}}}
-\generate{\file{graphic-latex-lab-testphase.ltx}{%
- \from{latex-lab-graphic.dtx}{latex-lab}}}
+%sec
+\generate{\file{sec-latex-lab-testphase.ltx}{\from{latex-lab-sec.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-sec.sty}{\from{latex-lab-sec.dtx}{package}}}
-\generate{\file{latex-lab-testphase-block-tagging.sty}{\from{latex-lab-block-tagging.dtx}{package}}}
-\generate{\file{block-tagging-latex-lab-testphase.ltx}{\from{latex-lab-block-tagging.dtx}{latex-lab}}}
-\generate{\file{latex-lab-testphase-minipage.sty}{%
- \from{latex-lab-minipage.dtx}{package}}}
+%toc
+\generate{\file{toc-latex-lab-testphase.ltx}{\from{latex-lab-toc.dtx}{latex-lab}}}
-\generate{\file{minipage-latex-lab-testphase.ltx}{%
- \from{latex-lab-minipage.dtx}{latex-lab}}}
-
- \generate{\file{latex-lab-testphase-float.sty}{%
- \from{latex-lab-float.dtx}{package}}}
+\generate{\file{latex-lab-testphase-toc.sty}{%
+ \from{latex-lab-toc.dtx}{header}
+ \from{latex-lab-toc-kernel-changes.dtx}{package}
+ \from{latex-lab-toc.dtx}{package}
+ \from{latex-lab-toc-hyperref-changes.dtx}{package}}}
-\generate{\file{float-latex-lab-testphase.ltx}{%
- \from{latex-lab-float.dtx}{latex-lab}}}
-
-\generate{\file{latex-lab-testphase-bib.sty}{%
- \from{latex-lab-bib.dtx}{package}}}
+%graphic
+\generate{\file{graphic-latex-lab-testphase.ltx}{\from{latex-lab-graphic.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-graphic.sty}{\from{latex-lab-graphic.dtx}{package}}}
-\generate{\file{bib-latex-lab-testphase.ltx}{%
- \from{latex-lab-bib.dtx}{latex-lab}}}
+% block
+\generate{\file{latex-lab-testphase-block.sty}{\from{latex-lab-block.dtx}{package}}}
+\generate{\file{block-latex-lab-testphase.ltx}{\from{latex-lab-block.dtx}{latex-lab}}}
-\generate{\file{latex-lab-testphase-text.sty}{%
- \from{latex-lab-text.dtx}{package}}}
+% minipage
+\generate{\file{minipage-latex-lab-testphase.ltx}{\from{latex-lab-minipage.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-minipage.sty}{\from{latex-lab-minipage.dtx}{package}}}
-\generate{\file{text-latex-lab-testphase.ltx}{%
- \from{latex-lab-text.dtx}{latex-lab}}}
+%float
+\generate{\file{float-latex-lab-testphase.ltx}{\from{latex-lab-float.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-float.sty}{\from{latex-lab-float.dtx}{package}}}
-\generate{\file{latex-lab-testphase-firstaid.sty}{%
- \from{latex-lab-firstaid.dtx}{package}}}
+%bib
+\generate{\file{bib-latex-lab-testphase.ltx}{\from{latex-lab-bib.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-bib.sty}{\from{latex-lab-bib.dtx}{package}}}
-\generate{\file{firstaid-latex-lab-testphase.ltx}{%
- \from{latex-lab-firstaid.dtx}{latex-lab}}}
+%text
+\generate{\file{text-latex-lab-testphase.ltx}{\from{latex-lab-text.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-text.sty}{\from{latex-lab-text.dtx}{package}}}
+
+%firstaid
+\generate{\file{firstaid-latex-lab-testphase.ltx}{\from{latex-lab-firstaid.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-firstaid.sty}{\from{latex-lab-firstaid.dtx}{package}}}
+
+% stop docstrip adding \endinput
+\preamble
+\endpreamble
+\postamble
+\endpostamble
+% namespace definitions
+\generate{\file{tagpdf-ns-latex-lab.def}{\from{latex-lab-namespace.dtx}{ns-latex-lab}}}
\endbatchfile
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/bib-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/bib-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/bib-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,8 +33,11 @@
%%
%%
%% File: latex-lab-bib.dtx (C) Copyright 2023 LaTeX Project
+\def\ltlabbibdate{2023-07-20}
+\def\ltlabbibversion{0.81a}
\ProvidesFile{bib-latex-lab-testphase.ltx}
- [2023-05-18 v0.8 code related to the tagging of bib and citations]
+ [\ltlabbibdate\space v\ltlabbibversion\space
+ latex-lab wrapper bib]
\RequirePackage{latex-lab-testphase-bib}
Added: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-latex-lab-testphase.ltx (rev 0)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,46 @@
+%%
+%% This is file `block-latex-lab-testphase.ltx',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% latex-lab-block.dtx (with options: `latex-lab')
+%%
+%% This is a generated file.
+%%
+%% Copyright 2021-2023 LaTeX Project
+%%
+%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
+%% ------------------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
+%% without such generated files.
+%%
+%% The newest sources can be found below
+%%
+%% https://github.com/latex3/latex2e/required/latex-lab
+%%
+%% where one can also log issues in case there are any.
+%%
+%%
+%% File: latex-lab-block.dtx (C) Copyright 2021-2023 LaTeX Project
+\def\ltlabblockdate{2023-09-01}
+\def\ltlabblockversion{0.8h}
+\ProvidesFile{block-latex-lab-testphase.ltx}
+ [\ltlabblockdate\space v\ltlabblockversion\space
+ blockenv implementation]
+\RequirePackage{latex-lab-testphase-block}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%
+%% End of file `block-latex-lab-testphase.ltx'.
Property changes on: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-latex-lab-testphase.ltx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-tagging-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-tagging-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/block-tagging-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,48 +0,0 @@
-%%
-%% This is file `block-tagging-latex-lab-testphase.ltx',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% latex-lab-block-tagging.dtx (with options: `latex-lab')
-%%
-%% This is a generated file.
-%%
-%% Copyright 2021-2023 LaTeX Project
-%%
-%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
-%% ------------------------------------------------------------------------------------
-%%
-%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3c
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2008 or later.
-%%
-%% This file may only be distributed together with a copy of the LaTeX
-%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
-%% without such generated files.
-%%
-%% The newest sources can be found below
-%%
-%% https://github.com/latex3/latex2e/required/latex-lab
-%%
-%% where one can also log issues in case there are any.
-%%
-%%
-%% File: latex-lab-block-tagging.dtx (C) Copyright 2021-2023 LaTeX Project
-
-\def\ltblocksversion{v0.8d}
-\def\ltblocksdate{2023/06/07}
-
-\ProvidesFile{block-tagging-latex-lab-testphase.ltx}
- [\ltblocksdate\space \ltblocksversion\space
- blockenv implementation]
-\RequirePackage{latex-lab-testphase-block-tagging}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\endinput
-%%
-%% End of file `block-tagging-latex-lab-testphase.ltx'.
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/documentmetadata-support.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/documentmetadata-support.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/documentmetadata-support.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,8 +33,8 @@
%%
%%
%% File: documentmetadata-support.dtx
-\def\documentmetadatasupportversion{1.0d}
-\def\documentmetadatasupportdate{2023-06-07}
+\def\documentmetadatasupportversion{1.0f}
+\def\documentmetadatasupportdate{2023-09-01}
\RequirePackage{pdfmanagement-testphase}
\ExplSyntaxOn\makeatletter
@@ -180,6 +180,16 @@
\tagpdfsetup{log=#1}
}
}
+ ,debug / tagpdf .code:n =
+ {
+ \AddToHook
+ {
+ package/tagpdf/after
+ }
+ {
+ \RequirePackage{tagpdf-debug}
+ }
+ }
,debug / uncompress .code:n =
{
\pdf_uncompress:
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/firstaid-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/firstaid-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/firstaid-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,9 +33,12 @@
%%
%%
%% File: latex-lab-firstaid.dtx (C) Copyright 2023 LaTeX Project
+\def\ltlabfirstaiddate{2023-07-20}
+\def\ltlabfirstaidversion{0.85a}
\ProvidesFile{firstaid-latex-lab-testphase.ltx}
- [2023-06-04 v0.8 Temporary patches to external packages need for the tagging project]
+ [\ltlabfirstaiddate\space v\ltlabfirstaidversion\space
+ latex-lab wrapper firstaid]
\RequirePackage{latex-lab-testphase-firstaid}
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/float-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/float-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/float-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,9 +33,11 @@
%%
%%
%% File: latex-lab-float.dtx (C) Copyright 2023 LaTeX Project
+\def\ltlabfloatdate{2023-07-20}
+\def\ltlabfloatversion{0.81a}
\ProvidesFile{float-latex-lab-testphase.ltx}
- [2023-04-30 v0.8 code related to the tagging of floats]
+ [\ltlabfloatdate\space v\ltlabfloatversion\space latex-lab wrapper float]
\RequirePackage{latex-lab-testphase-float}
\endinput
%%
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/graphic-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/graphic-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/graphic-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,9 +33,11 @@
%%
%%
%% File: latex-lab-graphic.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabgraphicdate{2023-07-20}
+\def\ltlabgraphicversion{0.80a}
\ProvidesFile{graphic-latex-lab-testphase.ltx}
- [2023-04-07 v0.8 code related to the tagging included graphics]
+ [\ltlabgraphicdate\space v\ltlabgraphicversion\space latex-lab wrapper graphic]
\RequirePackage{latex-lab-testphase-graphic}
\endinput
%%
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footmisc.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footmisc.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footmisc.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,9 +33,12 @@
%%
%%
%% File: latex-lab-footnotes.dtx
+\def\ltlabfootnotedate{2023-09-04}
+\def\ltlabfootnoteversion{0.8c}
+
%%
%% Copyright (c) 1995-2011 Robin Fairbairns
-%% Copyright (c) 2018-2022 Robin Fairbairns, Frank Mittelbach
+%% Copyright (c) 2018-2023 Robin Fairbairns, Frank Mittelbach
%%
%% This file is part of the `latex-lab Bundle'.
%% --------------------------------------------
@@ -50,9 +53,6 @@
%%
%% This work has the LPPL maintenance status 'maintained'.
%%
-%%
-%% File: footmisc.dtx (C) Copyright 1995-2011 Robin Fairbairns
-%% (C) Copyright 2018-2022 Frank Mittelbach
\NeedsTeXFormat{LaTeX2e}
\providecommand\DeclareRelease[3]{}
\providecommand\DeclareCurrentRelease[2]{}
@@ -92,14 +92,13 @@
option "para"}%
{I shall ignore "\CurrentOption"}%
\else
- \def\@footnotetext at cfgpoint {\marginpar}
\AddToHook{fntext/para}{%
\hsize\marginparwidth % correct the default \hsize
\footnotesep\z@ % don't add a default separation
}
- \def\@footnotetext at cfgpointii {\@makefntext}
- \def\@footnotetext at cfgpointiii {}
- \def\@footnotetext at cfgpointiv {}
+ \AssignSocketPlug{fntext/process}{side}
+ \AssignSocketPlug{fntext/begin}{noop}
+ \AssignSocketPlug{fntext/end}{noop}
\fi
}
\let\footnotelayout\@empty
@@ -168,9 +167,10 @@
\DeclareOption{multiple}{\FN at multiplefootnotetrue}
\ProcessOptions
\ifFN at para
- \def\@makecol at cfgpointii {%
+ \NewSocketPlug{@makecol/footnotes}{para}{%
\global\setbox\footins\vbox{\FN at makefootnoteparagraph}%
}
+ \AssignSocketPlug{@makecol/footnotes}{para}
\fi
\ifFN at fixskip
\def\@outputbox at removebskip{%
@@ -193,61 +193,27 @@
\let\@outputbox at reinsertbskip\relax
\fi
\ifcase \FN at bottomcases\relax
-\ERROR
-\or
+ \ERROR
+\or %1
\ifFN at abovefloats
- \def\@makecol at cfgpoint {%
- \@if at footnotes@TF
- {\@outputbox at append{\vfill}}%
- {\@if at bfloats@TF{\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}}%
- \@outputbox at appendfootnotes
- \@outputbox at attachfloats
- }
+ \AssignSocketPlug {@makecol/outputbox}{space-footnotes-floats}
\else
- \def\@makecol at cfgpoint {%
- \@outputbox at attachfloats
- \@if at footnotes@TF
- {\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}%
- \@outputbox at appendfootnotes
- }
+ \AssignSocketPlug {@makecol/outputbox}{floats-footnotes-space}
\fi
-\or
+\or %2
\ifFN at abovefloats
- \def\@makecol at cfgpoint {%
- \@outputbox at appendfootnotes
- \@if at bfloats@TF
- {\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}%
- \@outputbox at attachfloats
- }
+ \AssignSocketPlug {@makecol/outputbox}{footnotes-space-floats}
\else
- \def\@makecol at cfgpoint {%
- \@if at footnotes@TF
- {\@outputbox at append{\vfill}}%
- {\@if at bfloats@TF{\@outputbox at append{\vfill}}%
- {\@outputbox at reinsertbskip}}%
- \@outputbox at attachfloats
- \@outputbox at appendfootnotes
- }
+ \AssignSocketPlug {@makecol/outputbox}{space-floats-footnotes}
\fi
-\or
+\or %3
\ifFN at abovefloats
- \def\@makecol at cfgpoint {%
- \@outputbox at appendfootnotes
- \@outputbox at attachfloats
- \@outputbox at reinsertbskip
- }
+ \AssignSocketPlug {@makecol/outputbox}{footnotes-floats}
\else
- \def\@makecol at cfgpoint {%
- \@outputbox at attachfloats
- \@outputbox at appendfootnotes
- \@outputbox at reinsertbskip
-}
+ \AssignSocketPlug {@makecol/outputbox}{floats-footnotes}
\fi
\else
-\ERROR
+ \ERROR
\fi
\newif\ifFN at setspace
@@ -268,23 +234,11 @@
}
\ifFN at para
- \def\@footnotetext at cfgpoint {\insert\footins}
- \long\def\@footnotetext at cfgpointii #1{%
- \setbox\FN at tempboxa\hbox{\@makefntext{#1}}%
- \dp\FN at tempboxa\z@
- \ht\FN at tempboxa
- \dimexpr\wd\FN at tempboxa *%
- \footnotebaselineskip /\columnwidth\relax
- \box\FN at tempboxa
- }
+ \AssignSocketPlug{fntext/make}{para}
+ \AssignSocketPlug{fntext/begin}{noop}
+ \AssignSocketPlug{fntext/end}{para}
- \def\@footnotetext at cfgpointiii {}
- \def\@footnotetext at cfgpointiv {% config point
- \strut
- \penalty-10\relax
- \hskip\footglue
- }
\fi
\ifFN at para
@@ -347,7 +301,7 @@
-\AddToHook{fntext/begin}{\nobreak \hspace{.2em}}
+ \AddToHook{fntext/begin}{\nobreak \hspace{.2em}}
\else
@@ -611,7 +565,7 @@
{\mathparagraph\mathparagraph\mathparagraph}%
}
\newcommand\mpfootnotemark{%
- \@ifnextchar[%
+ \@ifnextchar[%]
\@xmpfootnotemark
{%
\stepcounter\@mpfn
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footnotes.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footnotes.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-footnotes.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,8 +33,12 @@
%%
%%
%% File: latex-lab-footnotes.dtx
+\def\ltlabfootnotedate{2023-09-04}
+\def\ltlabfootnoteversion{0.8c}
+
\ProvidesFile{latex-lab-footnotes.ltx}
- [2023-02-04 v0.7 changes to the footnote interfaces]
+ [\ltlabfootnotedate\space v\ltlabfootnoteversion\space
+ changes to the footnote interfaces]
%% alterations not covered:
\ExplSyntaxOn
@@ -54,7 +58,6 @@
\bool_set_true:N \l__fnote_autodetect_bool
\tl_new:N \l__fnote_currentstruct_tl
\tl_set:Nn \l__fnote_currentstruct_tl {1}
-\cs_generate_variant:Nn \ref_label:nn { Vn }
\cs_generate_variant:Nn \ref_value:nn { Vn }
\cs_generate_variant:Nn \prop_gput:Nnn {cxn}
\cs_generate_variant:Nn \hook_gput_code:nnn{nne}
@@ -99,11 +102,11 @@
{
\bool_if:NT \g_fnote_debug_bool
{
- \LogHook{fnmark/before}
- \LogHook{fnmark}
- \LogHook{fnmark/begin}
- \LogHook{fnmark/end}
- \LogHook{fnmark/after}
+ \hook_log:n {fnmark/before}
+ \hook_log:n {fnmark}
+ \hook_log:n {fnmark/begin}
+ \hook_log:n {fnmark/end}
+ \hook_log:n {fnmark/after}
\cs_gset_eq:NN \__fnote_debug_footnotemark: \prg_do_nothing:
}
}
@@ -111,36 +114,40 @@
{
\bool_if:NT \g_fnote_debug_bool
{
- \cs_log:N\@footnotetext at cfgpoint
- \cs_log:N\@footnotetext at cfgpointii
- \cs_log:N\@footnotetext at cfgpointiii
- \cs_log:N\@footnotetext at cfgpointiv
- \cs_log:N\@makefntext at cfgpoint
- \cs_log:N\@makefntext at cfgpointii
- \LogHook{fntext/before}
- \LogHook{fntext}
- \LogHook{fntext/para}
- \LogHook{fntext/begin}
- \LogHook{fntext/end}
- \LogHook{fntext/after}
+ \socket_log:n {fntext/process}
+ \socket_log:n {fntext/make}
+ \socket_log:n {fntext/begin}
+ \socket_log:n {fntext/end}
+ \socket_log:n {fntext/mark}
+ \socket_log:n {fntext/text}
+ \socket_log:n {tagsupport/fnmark}
+ \socket_log:n {tagsupport/fntext/begin}
+ \socket_log:n {tagsupport/fntext/end}
+ \socket_log:n {tagsupport/fntext/mark}
+ \socket_log:n {tagsupport/fntext/text}
+ \hook_log:n {fntext/before}
+ \hook_log:n {fntext}
+ \hook_log:n {fntext/para}
+ \hook_log:n {fntext/begin}
+ \hook_log:n {fntext/end}
+ \hook_log:n {fntext/after}
\cs_gset_eq:NN \__fnote_debug_footnotetext: \prg_do_nothing:
}
}
\cs_new_protected:Npn \fnote_footnotemark: {
\__fnote_debug_footnotemark:
- \UseHook{fnmark/before}
+ \hook_use:n {fnmark/before}
\leavevmode
\ifhmode
\edef\@x at sf{\the\spacefactor}
- \UseHook{fnmark}
+ \hook_use:n {fnmark}
\nobreak
\fi
- \UseHook{fnmark/begin}
- \@kernel at process@makefnmark
- \@makefnmark
+ \hook_use:n {fnmark/begin}
+ \socket_use:nn {tagsupport/fnmark} \@makefnmark
\__fnote_footnotemark_finish:
}
-\cs_new_protected:Npn \__fnote_finish: {
+\cs_new_protected:Npn \__fnote_footnotemark_default_finish: {
\UseHook{fnmark/end}
\ifhmode
\spacefactor \@x at sf \relax
@@ -147,16 +154,16 @@
\fi
\UseHook{fnmark/after}
}
-
-\cs_new_eq:NN \__fnote_footnotemark_finish: \__fnote_finish:
-\def \@kernel at process@makefnmark { }
+\cs_new_eq:NN \__fnote_footnotemark_finish: \__fnote_footnotemark_default_finish:
+\NewSocket{tagsupport/fnmark}{1}
\cs_set_eq:NN \@footnotemark \fnote_footnotemark:
\cs_new_protected:Npn \fnote_footnotetext:n #1 {
\__fnote_debug_footnotetext:
- \UseHook{fntext/before}
- \@kernel at process@footnotetext
- \@footnotetext at cfgpoint { % config point
- \UseHook{fntext}
+ \hook_use:n {fntext/before}
+ \socket_use:n {tagsupport/fntext/begin}
+ \socket_use:nn {fntext/process}
+ {
+ \hook_use:n {fntext}
\reset at font
\footnotesize
\interlinepenalty\interfootnotelinepenalty
@@ -168,27 +175,53 @@
\parindent 1em % typical default used in \@makefntext moved up here
\def\@currentcounter{footnote}
\protected at edef \@currentlabel { \p at footnote \@thefnmark }
- \UseHook{fntext/para}
+ \hook_use:n {fntext/para}
\color at begingroup
- \@footnotetext at cfgpointii % config point
+ \socket_use:nn {fntext/make}
{
- \@footnotetext at cfgpointiii % config point
- \UseHook{fntext/begin}
+ \socket_use:n {fntext/begin}%
+ \hook_use:n {fntext/begin}
\ignorespaces
#1
- \UseHook{fntext/end}
- \@footnotetext at cfgpointiv % config point
+ \hook_use:n {fntext/end}
+ \socket_use:n {fntext/end}
}
\par
\color at endgroup
}
- \UseHook{fntext/after}
+ \socket_use:n{tagsupport/fntext/end}
+ \hook_use:n {fntext/after}
}
-\cs_new_protected:Npn \@footnotetext at cfgpoint { \insert\footins }
-\cs_new_protected:Npn \@footnotetext at cfgpointii { \@makefntext }
-\cs_new_protected:Npn \@footnotetext at cfgpointiii { \rule\z@\footnotesep }
-\cs_new_protected:Npn \@footnotetext at cfgpointiv { \@finalstrut\strutbox }
-\cs_new_protected:Npn \@kernel at process@footnotetext {}
+\NewSocket {fntext/process}{1}
+\NewSocketPlug{fntext/process}{default}{ \insert\footins {#1} }
+\NewSocketPlug{fntext/process}{side} { \marginpar {#1} }
+\AssignSocketPlug{fntext/process}{default}
+\NewSocket {fntext/make}{1}
+\NewSocketPlug{fntext/make}{default}{ \@makefntext {#1} }
+\NewSocketPlug{fntext/make}{para}
+{
+ \setbox\FN at tempboxa\hbox{\@makefntext{#1}}%
+ \dp\FN at tempboxa\z@
+ \ht\FN at tempboxa
+ \dimexpr\wd\FN at tempboxa *%
+ \footnotebaselineskip /\columnwidth\relax
+ \box\FN at tempboxa
+}
+\AssignSocketPlug{fntext/make}{default}
+\NewSocket {fntext/begin}{0}
+\NewSocketPlug{fntext/begin}{default}{ \rule\z@\footnotesep }
+\AssignSocketPlug{fntext/begin}{default}
+\NewSocket {fntext/end}{0}
+\NewSocketPlug{fntext/end}{default}{ \@finalstrut\strutbox }
+\NewSocketPlug{fntext/end}{para}
+ {%
+ \strut
+ \penalty-10\relax
+ \hskip\footglue
+ }
+\AssignSocketPlug{fntext/end}{default}
+\NewSocket{tagsupport/fntext/begin}{0}
+\NewSocket{tagsupport/fntext/end}{0}
\AddToHook{begindocument}
{
\cs_set_eq:NN \@footnotetext \fnote_footnotetext:n
@@ -202,29 +235,31 @@
\setlength\footnotemargin{1.8em}
\fi
}
-
\cs_new_protected:Npn \fnote_makefntext:n #1 {
- \@makefntext at cfgpoint
- {
- \ifdim\footnotemargin>\z@
- \hb at xt@ \footnotemargin{\hss\@makefnmark}
- \else
- \ifdim\footnotemargin=\z@
- \llap{\@makefnmark}
- \else
- \ifdim\footnotemargin=-\maxdimen
- \@makefnmark
- \else
- \llap{\hb at xt@ -\footnotemargin{\@makefnmark\hss}}
- \fi
- \fi
- \fi
- }
- \@makefntext at cfgpointii
- { #1 }
+ \noindent
+ \socket_use:nn {tagsupport/fntext/mark} { \socket_use:n {fntext/mark} }
+ \socket_use:nn {tagsupport/fntext/text} { \socket_use:nn {fntext/text}{#1} }
}
-\cs_new_protected:Npn \@makefntext at cfgpoint { \noindent }
-\cs_new_protected:Npn \@makefntext at cfgpointii #1 { #1 }
+\NewSocket {fntext/mark}{0}
+\NewSocketPlug{fntext/mark}{default}{
+ \ifdim\footnotemargin>\z@
+ \hb at xt@ \footnotemargin{\hss\@makefnmark}
+ \else
+ \ifdim\footnotemargin=\z@
+ \llap{\@makefnmark}
+ \else
+ \ifdim\footnotemargin=-\maxdimen
+ \@makefnmark
+ \else
+ \llap{\hb at xt@ -\footnotemargin{\@makefnmark\hss}}
+ \fi
+ \fi
+ \fi
+}
+\AssignSocketPlug{fntext/mark}{default}
+\NewSocket {fntext/text}{1}
+\NewSocket{tagsupport/fntext/mark}{1}
+\NewSocket{tagsupport/fntext/text}{1}
\newcommand\old at std@class at makefntext[1]{%
\parindent 1em%
\noindent
@@ -234,7 +269,7 @@
\cs_new_protected:Npn \__fnote_patch:
{
- \tl_set:No \l__fnote_patch_tl { \@makefntext { \@makefntext at cfgpointii{##1} } }
+ \tl_set:No \l__fnote_patch_tl { \@makefntext { \UseSocket{tagsupport/fntext/text}{##1} } }
\tl_if_in:NnTF \l__fnote_patch_tl { \hbox }
{ \cs_set_eq:NN \__fnote_tmp:w \__fnote_patch_hbox:w }
{
@@ -258,7 +293,7 @@
{ \exp_stop_f: #1 \@makefntext at processX { \hb at xt@ #2 } }
\cs_new:Npn \__fnote_patch_ at makefnmark:w #1 \@makefnmark
{ \exp_stop_f: #1 \@makefntext at processX { \use:n } { \@makefnmark } }
-\cs_new:Npn \@makefntext at processX #1#2{\@makefntext at cfgpoint{#1{#2}}}
+\cs_new:Npn \@makefntext at processX #1#2{\UseSocket{tagsupport/fntext/mark}{#1{#2}}}
\AddToHook{begindocument}
{
@@ -281,7 +316,7 @@
\fnote_step_fnmark:nn {#1} \@mpfn
\cs_set_eq:NN \__fnote_footnotemark_finish: \prg_do_nothing:
\@footnotemark
- \cs_set_eq:NN \__fnote_footnotemark_finish: \__fnote_finish:
+ \cs_set_eq:NN \__fnote_footnotemark_finish: \__fnote_footnotemark_default_finish:
\@footnotetext {#2}
\__fnote_footnotemark_finish:
}
@@ -302,7 +337,7 @@
\@footnotemark
\bool_set_true:N \l__fnote_autodetect_bool
}
-\cs_new_protected:Npn \@mpfootnotetext at cfgpoint #1
+\NewSocketPlug{fntext/process}{mp}
{
\global\setbox\@mpfootins\vbox{%
\unvbox\@mpfootins
@@ -309,13 +344,6 @@
#1
}
}
-\RequirePackage{etoolbox}
-\ExplSyntaxOff
-\patchcmd\@iiiminipage
- {\let\@footnotetext\@mpfootnotetext}
- {\let\@footnotetext at cfgpoint\@mpfootnotetext at cfgpoint}
- {}{\ERROR}
-\ExplSyntaxOn
\AddToHook{class/memoir/before}
{ \let\new at std@class at makecol\@makecol }
\AddToHook{class/memoir/after}
@@ -344,28 +372,21 @@
}
}
\ref_attribute_gset:nnnn {fnote/struct}{1}{now}{\l__fnote_currentstruct_tl}
-\cs_new_protected:Npn \__fnote_label_hook: {}
-\AddToHook{begindocument/before}
- {
- \RequirePackage{nameref}
- \g at addto@macro\label at hook
- {
- \__fnote_label_hook:
- }
- }
+\cs_new_protected:Npn \__fnote_label_hook:n #1 {}
+\AddToHookWithArguments{label}{ \__fnote_label_hook:n{#1}}
\AddToHook{fntext/begin}
{
- \cs_set_protected:Npn \__fnote_label_hook:
+ \cs_set_protected:Npn \__fnote_label_hook:n #1
{
- \ref_label:Vn \label at name {fnote/struct}
+ \ref_label:nn {#1} {fnote/struct}
}
}
-\cs_new_protected:Npn \fnote_new:nn #1 #2 % #1 name, #2 options
+\cs_new_protected:Npn \fnote_class_new:nn #1 #2 % #1 name, #2 options
{
\prop_new:c { g__fnote_currentmarks_ #1 _prop }
}
-\fnote_new:nn {default}{}
+\fnote_class_new:nn {default}{}
\cs_new_protected:Npn \fnote_mark_gput:nn #1 #2 % #1 the representation of the mark, #2 type
{
\prop_gput:cxn { g__fnote_currentmarks_ #2 _prop }
@@ -374,7 +395,7 @@
}
\cs_generate_variant:Nn \fnote_mark_gput:nn {no,oo}
-\cs_new_protected:Npn \fnote_mark_gpop:nnN #1 #2 #3
+\cs_new_protected:Npn \fnote_mark_gpop_all:nnN #1 #2 #3
{
\seq_clear:N #3
\prop_set_eq:Nc \l__fnote_tmpa_prop { g__fnote_currentmarks_ #2 _prop }
@@ -387,9 +408,8 @@
}
}
}
-\cs_generate_variant:Nn\fnote_mark_gpop:nnN {ooN}
-
-\cs_new_protected:Npn \tag at FEMark #1 %#1 content
+\cs_generate_variant:Nn\fnote_mark_gpop_all:nnN {ooN}
+\NewSocketPlug{tagsupport/fnmark}{FEMark}
{
\tag_mc_end_push:
\tag_struct_begin:n { tag=footnotemark }
@@ -423,9 +443,8 @@
\tag_struct_end:
\tag_mc_begin_pop:n{}
}
-\cs_set_eq:NN \@kernel at process@makefnmark \tag at FEMark
+\AssignSocketPlug{tagsupport/fnmark}{FEMark}
-
\cs_new_protected:Npn \__fnote_gput_ref:nn #1 #2 %#1 the structure number receiving the ref #2
{
\tag_if_active:T
@@ -441,7 +460,7 @@
\cs_generate_variant:Nn \fnote_gput_refs:nn {ee}
\tl_new:N \l__fnote_dflt_struct_tl
\tl_set:Nn \l__fnote_dflt_struct_tl {1}
-\cs_new_protected:Npn \tag at FENote #1#2 % #1 config point, \insert\footins #2 content
+\NewSocketPlug{tagsupport/fntext/begin}{FENote}
{
\tag_mc_end_push:
\tag_check_child:nnTF {FENote}{pdf2}
@@ -455,7 +474,7 @@
\tag_struct_begin:n { tag=footnotelabel }\tag_struct_end:
\bool_if:NTF \l__fnote_autodetect_bool
{
- \fnote_mark_gpop:ooN { \@thefnmark }{ \l_fnote_type_tl } \l__fnote_currentrefs_seq
+ \fnote_mark_gpop_all:ooN { \@thefnmark }{ \l_fnote_type_tl } \l__fnote_currentrefs_seq
\seq_map_inline:Nn \l__fnote_currentrefs_seq
{
\fnote_gput_refs:ee {##1}{ \l__fnote_currentstruct_tl }
@@ -464,20 +483,18 @@
{%no auto
}
- #1 {#2}
+ }
+
+\NewSocketPlug{tagsupport/fntext/end}{FENote}
+ {
\tag_struct_end:
\tag_mc_begin_pop:n{}
}
-\cs_set_eq:NN \@kernel at process@footnotetext \tag at FENote
-\cs_set_protected:Npn \@makefntext at cfgpoint #1 %#1 code that typesets the mark.
+\AssignSocketPlug{tagsupport/fntext/begin}{FENote}
+\AssignSocketPlug{tagsupport/fntext/end}{FENote}
+\NewSocketPlug{tagsupport/fntext/mark}{FENoteLbl}
{
- \noindent
\tag_mc_end_push:
- \tag at FENoteLbl { #1 }
- \tag_mc_begin_pop:n{}
- }
-\cs_new_protected:Npn \tag at FENoteLbl #1
- {
%\seq_show:N\l__fnote_currentrefs_seq
\seq_map_inline:Nn\l__fnote_currentrefs_seq {\MakeLinkTarget*{footnote*.##1}}
\MakeLinkTarget*{footnote*.\l__fnote_currentstruct_tl}
@@ -486,19 +503,18 @@
#1
\tag_mc_end:
\tag_struct_end:
+ \tag_mc_begin_pop:n{}
}
-\cs_set_protected:Npn \@makefntext at cfgpointii #1
+\AssignSocketPlug{tagsupport/fntext/mark}{FENoteLbl}
+\NewSocketPlug{tagsupport/fntext/text}{FENotetext}
{
\tag_mc_end_push:
- \tag at FENotetext { #1 }
- \tag_mc_begin_pop:n{}
- }
-\cs_new_protected:Npn \tag at FENotetext #1
- {
\tag_mc_begin:n{}
#1
\tag_mc_end:
+ \tag_mc_begin_pop:n{}
}
+\AssignSocketPlug{tagsupport/fntext/text}{FENotetext}
\ExplSyntaxOff
\endinput
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-kernel-changes.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-kernel-changes.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-kernel-changes.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,7 +33,12 @@
%% where one can also log issues in case there are any.
%%
%%
-%% File: latex-lab-toc-kernel-functions.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabkerneldate{2023-07-20}
+\def\ltlabkernelversion{0.85a}
+\ProvidesPackage{latex-lab-kernel-changes}
+ [\ltlabkerneldate\space v\ltlabkernelversion\space
+ General kernel and class changes]
\def\hyper at nopatch@counter{}
\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname
\setcounter{#1}\z@
@@ -72,13 +77,16 @@
\def\toclevel at subparagraph{5}
\def\toclevel at figure{1}
\def\toclevel at table{1}
-
%% File: latex-lab-sec.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabsecdate{2023-07-20}
+\def\ltlabsecversion{0.84a}
\ifdefined\directlua
- \pdfvariable gentounicode =1
- \protected\def\pdfglyphtounicode {\pdfextension glyphtounicode }
- \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
- \input{glyphtounicode}
+ \ifnum\outputmode > 0
+ \pdfvariable gentounicode =1
+ \protected\def\pdfglyphtounicode {\pdfextension glyphtounicode }
+ \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
+ \input{glyphtounicode}
+ \fi
\fi
\ifdefined\pdfglyphtounicode
\input{glyphtounicode-cmex}
Added: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-math.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-math.ltx (rev 0)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-math.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,671 @@
+%%
+%% This is file `latex-lab-math.ltx',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% latex-lab-math.dtx (with options: `kernel')
+%%
+%% This is a generated file.
+%%
+%% Copyright 2021-2023 LaTeX Project
+%%
+%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
+%% ------------------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
+%% without such generated files.
+%%
+%% The newest sources can be found below
+%%
+%% https://github.com/latex3/latex2e/required/latex-lab
+%%
+%% where one can also log issues in case there are any.
+%%
+%%
+%% File: latex-lab-math.dtx
+\def\ltlabmathdate{2023-09-11}
+\def\ltlabmathversion{0.5c}
+\ProvidesFile{latex-lab-math.ltx}
+ [\ltlabmathdate\space
+ v\ltlabmathversion\space
+ Grab all the math(s) and tag it (experiments)]
+\AddToHook{begindocument/before}{\RequirePackage{latex-lab-testphase-block}}
+\ExplSyntaxOn
+\tl_gput_right:Nn \@kernel at before@begindocument
+ { \RequirePackage { amsmath } }
+\bool_new:N \l__math_collected_bool
+\tl_new:N \g__math_grabbed_env_tl
+\tl_new:N \g__math_grabbed_math_tl
+\cs_new_protected:Npn \__math_process:nn #1#2
+ {
+ \legacy_if:nF { measuring@ }
+ {
+ \tl_if_in:nnF {#2} { \m at th }
+ { \tl_trim_spaces_apply:nN {#2} \__math_process_auxi:nn {#1} }
+ }
+ }
+\cs_generate_variant:Nn \__math_process:nn { V }
+\cs_new_protected:Npn \__math_process_auxi:nn #1#2
+ {
+ \tl_gset:Nn \g__math_grabbed_env_tl {#2}
+ \tl_gset:Nn \g__math_grabbed_math_tl {#1}
+ \__math_process_auxii:nn {#2} {#1}
+ }
+\cs_new_protected:Npn \__math_process_auxii:nn #1#2 { }
+\cs_new_protected:Npn \math_processor:n #1
+ { \cs_set_protected:Npn \__math_process_auxii:nn ##1##2 {#1} }
+\cs_new_protected:Npn \__math_grab_dollar:w % $
+ #1 $
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \__math_process:nn { math } {#1} % $
+ \legacy_if:nTF { measuring@ }
+ { #1 $ }
+ {
+ \tl_if_in:nnTF {#1} { \m at th }
+ { #1 $ }
+ {
+ \tagmcend %end P-chunk, in code: \tag_mc_end_push:
+ \@kernel at math@begin
+ #1 $
+ \@kernel at math@end
+ \tagmcbegin{} % restart P-chunk (whatsits in pdftex)
+ }
+ }
+
+ }
+ }
+
+\skip_new:N \l__math_tmpa_skip
+
+\cs_new_protected:Npn \__math_grab_dollardollar:w % $$
+ #1 $$
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \__math_tag_dollardollar_display:nn { equation* }{#1}
+ #1
+ $$
+ }
+ }
+\cs_new_protected:Npn \@kernel at close@P {
+ \tag_if_active:T
+ {
+ \tagmcend %end P-chunk, should perhaps be \tag_mc_end_push: ...
+ \int_gincr:N \g__tag_para_end_int
+ \bool_if:NT \l__tag_para_show_bool
+ { \tag_mc_begin:n{artifact}
+ \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
+ \tag_mc_end:
+ }
+ \tag_struct_end:
+ }
+}
+
+\cs_new_protected:Npn \__math_tag_dollardollar_display:nn #1#2 {
+ \__math_process:nn {#1} {#2}
+ \@kernel at close@P
+ \@kernel at math@begin
+%%
+}
+
+\cs_new_protected:Npn \__math_tag_dollardollar_display_end: {
+ \tagpdfparaOff
+ \para_raw_end:
+ \tagpdfparaOn
+ \l__math_tmpa_skip \lastskip
+ \@kernel at math@end
+ \penalty \postdisplaypenalty
+ \skip_vertical:n { -\l__math_tmpa_skip * 2 }
+ \@doendpe % this has no \end{...} to take care of it
+}
+
+\cs_new_protected:Npn \__math_grab_inline:w % \(
+ #1 \)
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \__math_process:nn { math } {#1}
+ $ #1 $
+ }
+ \bool_set_false:N \l__math_collected_bool
+ }
+\cs_new_protected:Npn \__math_grab_eqn:w % \[
+ #1 \]
+ {
+ \begin { equation* } #1 \end { equation* }
+ }
+\tl_new:N \l__math_env_name_tl
+\keys_define:nn { __math }
+ {
+ arg-spec .code:n =
+ {
+ \ExpandArgs { c } \DeclareDocumentCommand
+ { __math_env \l__math_env_name_tl _aux: }
+ {#1}
+ { \__math_env_forward:w }
+ }
+ }
+\cs_new_protected:Npn \math_register_env:nn #1#2
+ {
+ \tl_set:Nn \l__math_env_name_tl {#1}
+ \keys_set:nn { __math } {#2}
+ \cs_gset_eq:cc { __math_env_ #1 _begin: } {#1}
+ \cs_gset_eq:cc { __math_env_ #1 _end: } { end #1 }
+ \ExpandArgs { nnx } \RenewDocumentEnvironment {#1} { b }
+ {
+ \exp_not:N \bool_if:NTF \exp_not:N \l__math_collected_bool
+ {
+ }
+ {
+ \cs_if_exist:cTF { __math_env #1 _aux: }
+ {
+ \exp_not:c { __math_env #1 _aux: }
+ ####1 \exp_not:N \__math_env_end: {#1}
+ }
+ { \exp_not:N \__math_process:nn {#1} {####1} }
+ \exp_not:n { \@kernel at math@registered at begin }
+ \bool_set_true:N \exp_not:N \l__math_collected_bool
+ }
+ \exp_not:c { __math_env_ #1 _begin: }
+ ####1
+ \exp_not:c { __math_env_ #1 _end: }
+ }
+ {
+ }
+ }
+
+\cs_set_protected:Npn \__cs_tmp:w #1
+ {
+ \group_begin:
+ \exp_args:No \__cs_generate_internal_variant:n
+ { \tl_to_str:n {#1} }
+ \group_end:
+ }
+\__cs_tmp:w { nnxx }
+
+\cs_new_protected:Npn \math_register_halign_env:nn #1#2
+ {
+ \tl_set:Nn \l__math_env_name_tl {#1}
+ \keys_set:nn { __math } {#2}
+ \cs_gset_eq:cc { __math_env_ #1 _begin: } {#1}
+ \cs_gset_eq:cc { __math_env_ #1 _end: } { end #1 }
+ \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
+ {
+ \exp_not:N \bool_if:NTF \exp_not:N \l__math_collected_bool
+ {
+ }
+ {
+ \cs_if_exist:cTF { __math_env #1 _aux: }
+ {
+ \exp_not:c { __math_env #1 _aux: }
+ ####1 \exp_not:N \__math_env_end: {#1}
+ }
+ { \exp_not:N \__math_process:nn {#1} {####1} }
+ \exp_not:n { \@kernel at math@registered at begin }
+ \bool_set_true:N \exp_not:N \l__math_collected_bool
+ }
+ \exp_not:c { __math_env_ #1 _begin: }
+ ####1
+ }
+ {
+ \exp_not:c { __math_env_ #1 _end: }
+ }
+ }
+
+\cs_new_protected:Npn \math_register_odd_env:nn #1#2
+ {
+ \tl_set:Nn \l__math_env_name_tl {#1}
+ \keys_set:nn { __math } {#2}
+ \cs_gset_eq:cc { __math_env_ #1 _begin: } {#1}
+ \cs_gset_eq:cc { __math_env_ #1 _end: } { end #1 }
+ \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
+ {
+ \exp_not:N \bool_if:NTF \exp_not:N \l__math_collected_bool
+ {
+ }
+ {
+ \cs_if_exist:cTF { __math_env #1 _aux: }
+ {
+ \exp_not:c { __math_env #1 _aux: }
+ ####1 \exp_not:N \__math_env_end: {#1}
+ }
+ { \exp_not:N \__math_process:nn {#1} {####1} }
+ \exp_not:n { \@kernel at math@registered at begin }
+ \bool_set_true:N \exp_not:N \l__math_collected_bool
+ }
+ \exp_not:c { __math_env_ #1 _begin: }
+ ####1
+ }
+ {
+ \exp_not:c { __math_env_ #1 _end: }
+ \exp_not:n { \@kernel at math@registered at end }
+ }
+ }
+
+
+\cs_new:Npn \@kernel at math@registered at begin {
+ \mode_if_vertical:TF
+ {
+ \exp_args:Noo\str_if_eq:nnF \g__tag_struct_tag_tl { \l__tag_para_main_tag_tl } % needs correction!
+ {
+ \__block_beginpar_vmode:
+ } % needs correction!
+ }
+ {
+ \@kernel at close@P
+ }
+ \@kernel at math@begin
+ \tagpdfparaOff
+}
+
+\cs_new:Npn \@kernel at math@registered at end {
+ \para_raw_end:
+ \tagpdfparaOn
+ \@kernel at math@end
+ \@endpetrue
+}
+
+\cs_new_protected:Npn \math_register_env:n #1
+ { \math_register_env:nn {#1} { } }
+\NewDocumentCommand \RegisterMathEnvironment { O{} m }
+ { \math_register_env:nn {#2} {#1} }
+\cs_new_protected:Npn \__math_env_forward:w #1 \__math_env_end: #2
+ { \__math_process:nn {#2} {#1} }
+\tl_gput_right:Nn \@kernel at before@begindocument
+ {
+ \math_register_env:n { equation }
+ \math_register_env:n { equation* }
+ \RenewDocumentEnvironment{math} {b}{$#1$}{}
+ \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{}
+ }
+\cs_gset_protected:Npn \( % \)
+ {
+ \bool_if:NTF \l__math_collected_bool
+ {
+ \mode_if_math:TF
+ { \@badmath }
+ { $ }
+ }
+ {
+ \bool_set_true:N \l__math_collected_bool
+ \__math_grab_inline:w
+ }
+ } % \(
+\cs_gset_protected:Npn \)
+ {
+ \mode_if_math:TF
+ { $ }
+ { \@badmath }
+ }
+\tl_gput_right:Nn \@kernel at before@begindocument
+ {
+ \cs_gset_protected:Npn \[ % \]
+ {
+ \bool_if:NTF \l__math_collected_bool
+ { \begin { equation* } }
+ { \__math_grab_eqn:w }
+ } % \[
+ \cs_gset_protected:Npn \]
+ {
+ \bool_if:NTF \l__math_collected_bool
+ { \end{ equation* } }
+ { \@badmath }
+ }
+ }
+
+\tl_new:N\tmpmathcontent
+
+\def\@kernel at math@begin {
+ \tl_gset:Nx\tmpmathcontent
+ {
+ LaTeX~ formula~ starts~
+ \exp_not:N\begin{\g__math_grabbed_env_tl}
+ \space
+ \exp_not:V\g__math_grabbed_math_tl
+ \space
+ \exp_not:N\end{\g__math_grabbed_env_tl}
+ \space LaTeX~ formula~ ends~
+ }
+ \tagstructbegin{tag=Formula,
+ AFinline-o=\tmpmathcontent,
+ title-o=\g__math_grabbed_env_tl,
+ actualtext=\tmpmathcontent
+ }
+ \grabaformulapartandstart
+}
+\def\@kernel at math@end {
+ \tagmcend
+ \if at subformulas
+ \tagstructend
+ \else
+ \fi
+ \tagstructend
+}
+
+\exp_args:No \tex_everymath:D
+ {
+ \tex_the:D \tex_everymath:D
+ \bool_if:NF \l__math_collected_bool
+ {
+ \bool_set_true:N \l__math_collected_bool
+ \__math_grab_dollar:w
+ }
+ }
+
+\exp_args:No \tex_everydisplay:D
+ {
+ \tex_the:D \tex_everydisplay:D
+ \iftrue % this may have to be a settable flag!
+ \skip_set:Nn \belowdisplayskip {-\belowdisplayskip}
+ \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip}
+ \int_set:Nn \postdisplaypenalty {10000}
+ \group_insert_after:N \__math_tag_dollardollar_display_end:
+ \fi
+ \bool_if:NF \l__math_collected_bool
+ {
+ \bool_set_true:N \l__math_collected_bool
+ \__math_grab_dollardollar:w
+ }
+ }
+\math_register_env:n { eqnarray }
+\math_register_env:n { eqnarray* }
+\clist_map_inline:nn
+ { tabular }
+ {
+ \AddToHook{ env / #1 / begin }
+ { \bool_set_true:N \l__math_collected_bool }
+ }
+\cs_new_eq:NN \__math_m at th: \m at th
+\cs_gset_protected:Npn \m at th
+ {
+ \bool_set_true:N \l__math_collected_bool
+ \__math_m at th:
+ }
+
+\tl_gput_right:Nn \@kernel at before@begindocument {
+\renewenvironment{gather*}{%
+ \start at gather\st at rredtrue
+}
+{%
+ % \endgather
+ \math at cr \black@\totwidth@ \egroup
+ $$\ignorespacesafterend
+}
+\def\common at align@ending {
+ \math at cr \black@\totwidth@
+ \egroup
+ \ifingather@
+ \restorealignstate@
+ \egroup
+ \nonumber
+ \ifnum0=`{\fi\iffalse}\fi
+ \else
+ $$%
+ \fi
+ \ignorespacesafterend
+}
+\renewenvironment{alignat}{%
+ \start at align\z@\st at rredfalse
+}{%
+ \common at align@ending
+}
+\renewenvironment{alignat*}{%
+ \start at align\z@\st at rredtrue
+}{%
+ \common at align@ending
+}
+\renewenvironment{xalignat}{%
+ \start at align\@ne\st at rredfalse
+}{%
+ \common at align@ending
+}
+\renewenvironment{xalignat*}{%
+ \start at align\@ne\st at rredtrue
+}{%
+ \common at align@ending
+}
+\renewenvironment{xxalignat}{%
+ \start at align\tw@\st at rredtrue
+}{%
+ \common at align@ending
+}
+\renewenvironment{align}{%
+ \start at align\@ne\st at rredfalse\m at ne
+}{%
+ \common at align@ending
+}
+\renewenvironment{align*}{%
+ \start at align\@ne\st at rredtrue\m at ne
+}{%
+ \common at align@ending
+}
+\renewenvironment{flalign}{%
+ \start at align\tw@\st at rredfalse\m at ne
+}{%
+ \common at align@ending
+}
+\renewenvironment{flalign*}{%
+ \start at align\tw@\st at rredtrue\m at ne
+}{%
+ \common at align@ending
+}
+\renewenvironment{multline*}{\start at multline\st at rredtrue}
+{%
+ \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi
+ \ignorespacesafterend
+}
+\def\measuring at true{\let\ifmeasuring@\iftrue\tag_stop:}
+ \math_register_halign_env:nn {align}{}
+ \math_register_halign_env:nn {align*}{}
+ \math_register_halign_env:nn {flalign}{}
+ \math_register_halign_env:nn {flalign*}{}
+ \math_register_halign_env:nn {gather}{}
+ \math_register_halign_env:nn {gather*}{}
+ \math_register_halign_env:nn {multline}{}
+ \math_register_halign_env:nn {multline*}{}
+ \math_register_halign_env:nn {xalignat}{}
+ \math_register_halign_env:nn {xalignat*}{}
+ \math_register_halign_env:nn {xxalignat}{}
+ %
+ \@namedef{maketag @ @ @} #1{%
+ \ifmeasuring@
+ \hbox{\m at th\normalfont#1}%
+ \else
+ \tagmcend \tagstructbegin{tag=Lbl}%
+ \tagmcbegin{tag=Lbl}%
+ \hbox{\m at th\normalfont#1}%
+ \tagmcend \tagstructend \tagmcbegin{}%
+ \fi
+ }
+ \def\intertext@{%
+ \def\intertext##1{%
+ \ifvmode\else\\\@empty\fi
+ \noalign{%
+ \penalty\postdisplaypenalty\vskip-\belowdisplayskip
+ \vbox{
+ \ifmeasuring@\tag_stop:\fi
+ \normalbaselines
+ \ifdim\linewidth=\columnwidth
+ \else \parshape\@ne \@totalleftmargin \linewidth
+ \fi
+ \tag_mc_end_push:
+ \tagpdfsetup{paratag=P}%
+ \tagpdfparaOn
+ \noindent\ignorespaces##1\par
+ \tag_mc_begin_pop:n{}}%
+ \penalty\predisplaypenalty\vskip\abovedisplayskip%
+ }%
+ }
+ }
+\@namedef{math at cr @ @ @ gather}{%
+ \ifst at rred\nonumber\fi
+ &\relax
+ \make at display@tag
+ \maybestartnewformulatag
+ \ifst at rred\else\global\@eqnswtrue\fi
+ \global\advance\row@\@ne
+ \cr
+}
+\@namedef{math at cr @ @ @ align}{%
+ \ifst at rred\nonumber\fi
+ \if at eqnsw \global\tag at true \fi
+ \global\advance\row@\@ne
+ \add at amps\maxfields@
+ \omit
+ \kern-\alignsep@
+ \iftag@
+ \setboxz at h{\@lign\strut@{\make at display@tag}}%
+ \place at tag
+ \fi
+ \maybestartnewformulatag
+ \ifst at rred\else\global\@eqnswtrue\fi
+ \global\lineht@\z@
+ \cr
+}
+\def\restore at math@cr{\@namedef{math at cr @ @ @}{
+ \maybestartnewformulatag
+ \cr}}
+\restore at math@cr
+}
+
+\cs_new:Npn \__math_split_at_nl_first:w #1 \\ #2 \\ #3 \s_stop
+ {
+ \quark_if_nil:nTF {#2}
+ { {#1} { } }
+ {
+ \__math_split_chk_if_begin:ww #1 \begin \q_nil \s_mark
+ #2 \\ #3 \s_stop
+ }
+ }
+\cs_new:Npn \__math_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark
+ #4 \\ \q_nil \\ \s_stop
+ {
+ \quark_if_nil:nTF {#2}
+ { {#1} {#4} }
+ {
+ \exp_after:wN \__math_split_collect_one_end:w
+ \__math_split_cleanup_begin_q_nil:w #1 \begin{#2} #3 \\ #4 \s_stop
+ { } { 1 }
+ }
+ }
+\cs_new:Npn \__math_split_cleanup_begin_q_nil:w #1 \begin \q_nil {#1}
+\cs_new:Npn \__math_split_collect_one_end:w #1 \end #2 #3 \s_stop #4 #5
+ {
+ \exp_args:Nf \__math_split_check_count_begins:nnnn
+ { \__math_split_count_begins:n { #4 #1 } } {#5}
+ { #4 #1 \end{#2} } {#3}
+ }
+\cs_new:Npn \__math_split_count_begins:n #1
+ { \int_eval:n { 0 \__math_split_count_begins:w #1 \begin \q_nil } }
+\cs_new:Npn \__math_split_count_begins:w #1 \begin #2
+ { \quark_if_nil:nF {#2} { +1 \__math_split_count_begins:w } }
+\cs_new:Npn \__math_split_check_count_begins:nnnn #1 #2 #3 #4
+ {
+ \int_compare:nNnTF {#1} = {#2}
+ {
+ \exp_last_unbraced:Nf \__math_split_final_cleanup:nn
+ { \split:n { \__math_split_guard:n {#3} #4 } }
+ }
+ {
+ \exp_args:No \use_ii_i:nn
+ { \exp_after:wN { \int_value:w \int_eval:n { #2 + 1 } } }
+ { \__math_split_collect_one_end:w #4 \s_stop {#3} }
+ }
+ }
+\cs_new:Npn \__math_split_final_cleanup:nn #1 #2
+ {
+ \exp:w \__math_split_final_cleanup:w #1
+ \__math_split_guard:n \q_nil \s_mark { }
+ {#2}
+ }
+\cs_new:Npn \__math_split_final_cleanup:w #1 \__math_split_guard:n #2 #3 \s_mark #4
+ {
+ \quark_if_nil:nTF {#2}
+ { \exp_end: { #4 #1 } }
+ { \__math_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } }
+ }
+\NewDocumentCommand \splitnl { mm +m }
+ {
+ \tl_set:Nf \l_tmpa_tl { \split:n {#3} }
+ \show \l_tmpa_tl
+ \exp_after:wN \__splitnl_aux:nnNN \l_tmpa_tl #1 #2
+ }
+
+\cs_new:Npn \split:n #1 {
+ \__math_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
+
+\cs_new:Npn \__math_split_at_nl:NN #1#2 {
+ \tl_set:Nf \l_tmpa_tl {
+ \exp_after:wN \__math_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
+ \exp_after:wN \__math_split_at_nl_aux:nnNN \l_tmpa_tl #1 #2
+}
+
+\cs_new_protected:Npn \__math_split_at_nl_aux:nnNN #1 #2 #3 #4
+ {
+ \tl_gset:Nn #4 {#1}
+ \tl_gset:Nn #3 {#2}
+}
+
+
+\newif\if at subformulas
+\tl_new:N \result
+
+\cs_new_protected:Npn\grabaformulapartandstart {
+ \__math_split_at_nl:NN \g__math_grabbed_math_tl \result
+ \typeout{====>first-result=\meaning\result}
+ \typeout{====>first-tmpmathcontent=\meaning\g__math_grabbed_math_tl}
+ \tl_if_empty:NTF \g__math_grabbed_math_tl
+ {
+ \typeout{====>formula~ has~ no~ subparts}
+ \global\@subformulasfalse
+ }
+ {
+ \typeout{====>formula~ has~ subparts}
+ \global\@subformulastrue
+ \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
+ \tagstructbegin{tag=Formula,
+ title-o=\resulttitle
+ }
+ }
+ \tagmcbegin{}
+}
+
+\cs_new_protected:Npn\grabaformulapartandmayberestart {
+ \__math_split_at_nl:NN \g__math_grabbed_math_tl \result
+ \typeout{====>result=\meaning\result}
+ \typeout{====>tmpmathcontent=\meaning\g__math_grabbed_math_tl}
+ \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
+ \tagstructbegin{tag=Formula,
+ alt=\result,
+ title-o=\resulttitle
+ }
+ \tagmcbegin{}
+}
+\def\maybestartnewformulatag {
+\if at subformulas
+ \ifmeasuring@\else
+ \tl_if_empty:NF \g__math_grabbed_math_tl
+ {
+ \tagmcend
+ \tagstructend
+ \grabaformulapartandmayberestart
+ }
+ \fi
+\fi
+}
+\ExplSyntaxOff
+\endinput
+%%
+%% End of file `latex-lab-math.ltx'.
Property changes on: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-math.ltx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-mathtagging.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-mathtagging.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-mathtagging.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,660 +0,0 @@
-%%
-%% This is file `latex-lab-mathtagging.ltx',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% latex-lab-mathtagging.dtx (with options: `kernel')
-%%
-%% This is a generated file.
-%%
-%% Copyright 2021-2023 LaTeX Project
-%%
-%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
-%% ------------------------------------------------------------------------------------
-%%
-%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3c
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2008 or later.
-%%
-%% This file may only be distributed together with a copy of the LaTeX
-%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
-%% without such generated files.
-%%
-%% The newest sources can be found below
-%%
-%% https://github.com/latex3/latex2e/required/latex-lab
-%%
-%% where one can also log issues in case there are any.
-%%
-%%
-%% File: latex-lab-mathtagging.dtx
-\def\ltmathtaggingdate{2023-03-08}
-\def\ltmathtaggingversion{v0.5a}
-\ProvidesFile{latex-lab-mathtagging.ltx}
- [\ltmathtaggingdate\space
- \ltmathtaggingversion\space
- Grab all the math(s) and tag it (experiments)]
-\AddToHook{begindocument/before}{\RequirePackage{latex-lab-testphase-block-tagging}}
-\ExplSyntaxOn
-\tl_gput_right:Nn \@kernel at before@begindocument
- { \RequirePackage { amsmath } }
-\bool_new:N \l__math_collected_bool
-\tl_new:N \g__math_grabbed_env_tl
-\tl_new:N \g__math_grabbed_math_tl
-\cs_new_protected:Npn \__math_process:nn #1#2
- {
- \legacy_if:nF { measuring@ }
- {
- \tl_if_in:nnF {#2} { \m at th }
- { \tl_trim_spaces_apply:nN {#2} \__math_process_auxi:nn {#1} }
- }
- }
-\cs_generate_variant:Nn \__math_process:nn { V }
-\cs_new_protected:Npn \__math_process_auxi:nn #1#2
- {
- \tl_gset:Nn \g__math_grabbed_env_tl {#2}
- \tl_gset:Nn \g__math_grabbed_math_tl {#1}
- \__math_process_auxii:nn {#2} {#1}
- }
-\cs_new_protected:Npn \__math_process_auxii:nn #1#2 { }
-\cs_new_protected:Npn \math_processor:n #1
- { \cs_set_protected:Npn \__math_process_auxii:nn ##1##2 {#1} }
-\cs_new_protected:Npn \__math_grab_dollar:w % $
- #1 $
- {
- \tl_if_blank:nF {#1}
- {
- \__math_process:nn { math } {#1} % $
- \tagmcend %end P-chunk, in code: \tag_mc_end_push:
- \@kernel at math@begin
- #1 $
- \@kernel at math@end
- \tagmcbegin{} % restart P-chunk (whatsits in pdftex)
- }
- }
-
-\skip_new:N \l__math_tmpa_skip
-
-\cs_new_protected:Npn \__math_grab_dollardollar:w % $$
- #1 $$
- {
- \tl_if_blank:nF {#1}
- {
- \__math_tag_dollardollar_display:nn { equation* }{#1}
- #1
- $$
- }
- }
-
-\cs_new_protected:Npn \@kernel at close@P {
- \tagmcend %end P-chunk, in code: \tag_mc_end_push:
- \int_gincr:N \g__tag_para_end_int
- \bool_if:NT \l__tag_para_show_bool
- { \tag_mc_begin:n{artifact}
- \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
- \tag_mc_end:
- }
- \tag_struct_end:
-}
-
-\cs_new_protected:Npn \__math_tag_dollardollar_display:nn #1#2 {
- \__math_process:nn {#1} {#2}
- \@kernel at close@P
- \@kernel at math@begin
-%%
-}
-
-\cs_new_protected:Npn \__math_tag_dollardollar_display_end: {
- \tagpdfparaOff
- \para_raw_end:
- \tagpdfparaOn
- \l__math_tmpa_skip \lastskip
- \@kernel at math@end
- \penalty \postdisplaypenalty
- \skip_vertical:n { -\l__math_tmpa_skip }
- \@doendpe % this has no \end{...} to take care of it
-}
-
-\cs_new_protected:Npn \__math_grab_inline:w % \(
- #1 \)
- {
- \tl_if_blank:nF {#1}
- {
- \__math_process:nn { math } {#1}
- $ #1 $
- }
- \bool_set_false:N \l__math_collected_bool
- }
-\cs_new_protected:Npn \__math_grab_eqn:w % \[
- #1 \]
- {
- \begin { equation* } #1 \end { equation* }
- }
-\tl_new:N \l__math_env_name_tl
-\keys_define:nn { __math }
- {
- arg-spec .code:n =
- {
- \ExpandArgs { c } \DeclareDocumentCommand
- { __math_env \l__math_env_name_tl _aux: }
- {#1}
- { \__math_env_forward:w }
- }
- }
-\cs_new_protected:Npn \math_register_env:nn #1#2
- {
- \tl_set:Nn \l__math_env_name_tl {#1}
- \keys_set:nn { __math } {#2}
- \cs_gset_eq:cc { __math_env_ #1 _begin: } {#1}
- \cs_gset_eq:cc { __math_env_ #1 _end: } { end #1 }
- \ExpandArgs { nnx } \RenewDocumentEnvironment {#1} { b }
- {
- \exp_not:N \bool_if:NTF \exp_not:N \l__math_collected_bool
- {
- }
- {
- \cs_if_exist:cTF { __math_env #1 _aux: }
- {
- \exp_not:c { __math_env #1 _aux: }
- ####1 \exp_not:N \__math_env_end: {#1}
- }
- { \exp_not:N \__math_process:nn {#1} {####1} }
- \exp_not:n { \@kernel at math@registered at begin }
- \bool_set_true:N \exp_not:N \l__math_collected_bool
- }
- \exp_not:c { __math_env_ #1 _begin: }
- ####1
- \exp_not:c { __math_env_ #1 _end: }
- }
- {
- }
- }
-
-\cs_set_protected:Npn \__cs_tmp:w #1
- {
- \group_begin:
- \exp_args:No \__cs_generate_internal_variant:n
- { \tl_to_str:n {#1} }
- \group_end:
- }
-\__cs_tmp:w { nnxx }
-
-\cs_new_protected:Npn \math_register_halign_env:nn #1#2
- {
- \tl_set:Nn \l__math_env_name_tl {#1}
- \keys_set:nn { __math } {#2}
- \cs_gset_eq:cc { __math_env_ #1 _begin: } {#1}
- \cs_gset_eq:cc { __math_env_ #1 _end: } { end #1 }
- \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
- {
- \exp_not:N \bool_if:NTF \exp_not:N \l__math_collected_bool
- {
- }
- {
- \cs_if_exist:cTF { __math_env #1 _aux: }
- {
- \exp_not:c { __math_env #1 _aux: }
- ####1 \exp_not:N \__math_env_end: {#1}
- }
- { \exp_not:N \__math_process:nn {#1} {####1} }
- \exp_not:n { \@kernel at math@registered at begin }
- \bool_set_true:N \exp_not:N \l__math_collected_bool
- }
- \exp_not:c { __math_env_ #1 _begin: }
- ####1
- }
- {
- \exp_not:c { __math_env_ #1 _end: }
- }
- }
-
-\cs_new_protected:Npn \math_register_odd_env:nn #1#2
- {
- \tl_set:Nn \l__math_env_name_tl {#1}
- \keys_set:nn { __math } {#2}
- \cs_gset_eq:cc { __math_env_ #1 _begin: } {#1}
- \cs_gset_eq:cc { __math_env_ #1 _end: } { end #1 }
- \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
- {
- \exp_not:N \bool_if:NTF \exp_not:N \l__math_collected_bool
- {
- }
- {
- \cs_if_exist:cTF { __math_env #1 _aux: }
- {
- \exp_not:c { __math_env #1 _aux: }
- ####1 \exp_not:N \__math_env_end: {#1}
- }
- { \exp_not:N \__math_process:nn {#1} {####1} }
- \exp_not:n { \@kernel at math@registered at begin }
- \bool_set_true:N \exp_not:N \l__math_collected_bool
- }
- \exp_not:c { __math_env_ #1 _begin: }
- ####1
- }
- {
- \exp_not:c { __math_env_ #1 _end: }
- \exp_not:n { \@kernel at math@registered at end }
- }
- }
-
-
-\cs_new:Npn \@kernel at math@registered at begin {
- \mode_if_vertical:TF
- {
- \exp_args:Noo\str_if_eq:nnF \g__tag_struct_tag_tl { \l__tag_para_main_tag_tl } % needs correction!
- {
- \__block_beginpar_vmode:
- } % needs correction!
- }
- {
- \@kernel at close@P
- }
- \@kernel at math@begin
- \tagpdfparaOff
-}
-
-\cs_new:Npn \@kernel at math@registered at end {
- \para_raw_end:
- \tagpdfparaOn
- \@kernel at math@end
- \@endpetrue
-}
-
-\cs_new_protected:Npn \math_register_env:n #1
- { \math_register_env:nn {#1} { } }
-\NewDocumentCommand \RegisterMathEnvironment { O{} m }
- { \math_register_env:nn {#2} {#1} }
-\cs_new_protected:Npn \__math_env_forward:w #1 \__math_env_end: #2
- { \__math_process:nn {#2} {#1} }
-\tl_gput_right:Nn \@kernel at before@begindocument
- {
- \math_register_env:n { equation }
- \math_register_env:n { equation* }
- \RenewDocumentEnvironment{math} {b}{$#1$}{}
- \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{}
- }
-\cs_gset_protected:Npn \( % \)
- {
- \bool_if:NTF \l__math_collected_bool
- {
- \mode_if_math:TF
- { \@badmath }
- { $ }
- }
- {
- \bool_set_true:N \l__math_collected_bool
- \__math_grab_inline:w
- }
- } % \(
-\cs_gset_protected:Npn \)
- {
- \mode_if_math:TF
- { $ }
- { \@badmath }
- }
-\tl_gput_right:Nn \@kernel at before@begindocument
- {
- \cs_gset_protected:Npn \[ % \]
- {
- \bool_if:NTF \l__math_collected_bool
- { \begin { equation* } }
- { \__math_grab_eqn:w }
- } % \[
- \cs_gset_protected:Npn \]
- {
- \bool_if:NTF \l__math_collected_bool
- { \end{ equation* } }
- { \@badmath }
- }
- }
-
-\tl_new:N\tmpmathcontent
-
-\def\@kernel at math@begin {
- \tl_gset:Nx\tmpmathcontent
- {
- LaTeX~ formula~ starts~
- \exp_not:N\begin{\g__math_grabbed_env_tl}
- \space
- \exp_not:V\g__math_grabbed_math_tl
- \space
- \exp_not:N\end{\g__math_grabbed_env_tl}
- \space LaTeX~ formula~ ends~
- }
- \tagstructbegin{tag=Formula,
- AFinline-o=\tmpmathcontent,
- title-o=\g__math_grabbed_env_tl,
- actualtext=\tmpmathcontent
- }
- \grabaformulapartandstart
-}
-\def\@kernel at math@end {
- \tagmcend
- \if at subformulas
- \tagstructend
- \else
- \fi
- \tagstructend
-}
-
-\exp_args:No \tex_everymath:D
- {
- \tex_the:D \tex_everymath:D
- \bool_if:NF \l__math_collected_bool
- {
- \bool_set_true:N \l__math_collected_bool
- \__math_grab_dollar:w
- }
- }
-\exp_args:No \tex_everydisplay:D
- {
- \tex_the:D \tex_everydisplay:D
- \iftrue % this may have to be a settable flag!
- \skip_set:Nn \belowdisplayskip {-\belowdisplayskip}
- \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip}
- \int_set:Nn \postdisplaypenalty {10000}
- \group_insert_after:N \__math_tag_dollardollar_display_end:
- \fi
- \bool_if:NF \l__math_collected_bool
- {
- \bool_set_true:N \l__math_collected_bool
- \__math_grab_dollardollar:w
- }
- }
-\math_register_env:n { eqnarray }
-\math_register_env:n { eqnarray* }
-\clist_map_inline:nn
- { tabular }
- {
- \AddToHook{ env / #1 / begin }
- { \bool_set_true:N \l__math_collected_bool }
- }
-\cs_new_eq:NN \__math_m at th: \m at th
-\cs_gset_protected:Npn \m at th
- {
- \bool_set_true:N \l__math_collected_bool
- \__math_m at th:
- }
-
-\tl_gput_right:Nn \@kernel at before@begindocument {
-\renewenvironment{gather*}{%
- \start at gather\st at rredtrue
-}
-{%
- % \endgather
- \math at cr \black@\totwidth@ \egroup
- $$\ignorespacesafterend
-}
-\def\common at align@ending {
- \math at cr \black@\totwidth@
- \egroup
- \ifingather@
- \restorealignstate@
- \egroup
- \nonumber
- \ifnum0=`{\fi\iffalse}\fi
- \else
- $$%
- \fi
- \ignorespacesafterend
-}
-\renewenvironment{alignat}{%
- \start at align\z@\st at rredfalse
-}{%
- \common at align@ending
-}
-\renewenvironment{alignat*}{%
- \start at align\z@\st at rredtrue
-}{%
- \common at align@ending
-}
-\renewenvironment{xalignat}{%
- \start at align\@ne\st at rredfalse
-}{%
- \common at align@ending
-}
-\renewenvironment{xalignat*}{%
- \start at align\@ne\st at rredtrue
-}{%
- \common at align@ending
-}
-\renewenvironment{xxalignat}{%
- \start at align\tw@\st at rredtrue
-}{%
- \common at align@ending
-}
-\renewenvironment{align}{%
- \start at align\@ne\st at rredfalse\m at ne
-}{%
- \common at align@ending
-}
-\renewenvironment{align*}{%
- \start at align\@ne\st at rredtrue\m at ne
-}{%
- \common at align@ending
-}
-\renewenvironment{flalign}{%
- \start at align\tw@\st at rredfalse\m at ne
-}{%
- \common at align@ending
-}
-\renewenvironment{flalign*}{%
- \start at align\tw@\st at rredtrue\m at ne
-}{%
- \common at align@ending
-}
-\renewenvironment{multline*}{\start at multline\st at rredtrue}
-{%
- \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi
- \ignorespacesafterend
-}
-\def\measuring at true{\let\ifmeasuring@\iftrue\tag_stop:}
- \math_register_halign_env:nn {align}{}
- \math_register_halign_env:nn {align*}{}
- \math_register_halign_env:nn {flalign}{}
- \math_register_halign_env:nn {flalign*}{}
- \math_register_halign_env:nn {gather}{}
- \math_register_halign_env:nn {gather*}{}
- \math_register_halign_env:nn {multline}{}
- \math_register_halign_env:nn {multline*}{}
- \math_register_halign_env:nn {xalignat}{}
- \math_register_halign_env:nn {xalignat*}{}
- \math_register_halign_env:nn {xxalignat}{}
- %
- \@namedef{maketag @ @ @} #1{%
- \ifmeasuring@
- \hbox{\m at th\normalfont#1}%
- \else
- \tagmcend \tagstructbegin{tag=Lbl}%
- \tagmcbegin{tag=Lbl}%
- \hbox{\m at th\normalfont#1}%
- \tagmcend \tagstructend \tagmcbegin{}%
- \fi
- }
- \def\intertext@{%
- \def\intertext##1{%
- \ifvmode\else\\\@empty\fi
- \noalign{%
- \penalty\postdisplaypenalty\vskip-\belowdisplayskip
- \vbox{
- \ifmeasuring@\tag_stop:\fi
- \normalbaselines
- \ifdim\linewidth=\columnwidth
- \else \parshape\@ne \@totalleftmargin \linewidth
- \fi
- \tag_mc_end_push:
- \tagpdfsetup{paratag=P}%
- \tagpdfparaOn
- \noindent\ignorespaces##1\par
- \tag_mc_begin_pop:n{}}%
- \penalty\predisplaypenalty\vskip\abovedisplayskip%
- }%
- }
- }
-\@namedef{math at cr @ @ @ gather}{%
- \ifst at rred\nonumber\fi
- &\relax
- \make at display@tag
- \maybestartnewformulatag
- \ifst at rred\else\global\@eqnswtrue\fi
- \global\advance\row@\@ne
- \cr
-}
-\@namedef{math at cr @ @ @ align}{%
- \ifst at rred\nonumber\fi
- \if at eqnsw \global\tag at true \fi
- \global\advance\row@\@ne
- \add at amps\maxfields@
- \omit
- \kern-\alignsep@
- \iftag@
- \setboxz at h{\@lign\strut@{\make at display@tag}}%
- \place at tag
- \fi
- \maybestartnewformulatag
- \ifst at rred\else\global\@eqnswtrue\fi
- \global\lineht@\z@
- \cr
-}
-\def\restore at math@cr{\@namedef{math at cr @ @ @}{
- \maybestartnewformulatag
- \cr}}
-\restore at math@cr
-}
-
-\cs_new:Npn \__math_split_at_nl_first:w #1 \\ #2 \\ #3 \s_stop
- {
- \quark_if_nil:nTF {#2}
- { {#1} { } }
- {
- \__math_split_chk_if_begin:ww #1 \begin \q_nil \s_mark
- #2 \\ #3 \s_stop
- }
- }
-\cs_new:Npn \__math_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark
- #4 \\ \q_nil \\ \s_stop
- {
- \quark_if_nil:nTF {#2}
- { {#1} {#4} }
- {
- \exp_after:wN \__math_split_collect_one_end:w
- \__math_split_cleanup_begin_q_nil:w #1 \begin{#2} #3 \\ #4 \s_stop
- { } { 1 }
- }
- }
-\cs_new:Npn \__math_split_cleanup_begin_q_nil:w #1 \begin \q_nil {#1}
-\cs_new:Npn \__math_split_collect_one_end:w #1 \end #2 #3 \s_stop #4 #5
- {
- \exp_args:Nf \__math_split_check_count_begins:nnnn
- { \__math_split_count_begins:n { #4 #1 } } {#5}
- { #4 #1 \end{#2} } {#3}
- }
-\cs_new:Npn \__math_split_count_begins:n #1
- { \int_eval:n { 0 \__math_split_count_begins:w #1 \begin \q_nil } }
-\cs_new:Npn \__math_split_count_begins:w #1 \begin #2
- { \quark_if_nil:nF {#2} { +1 \__math_split_count_begins:w } }
-\cs_new:Npn \__math_split_check_count_begins:nnnn #1 #2 #3 #4
- {
- \int_compare:nNnTF {#1} = {#2}
- {
- \exp_last_unbraced:Nf \__math_split_final_cleanup:nn
- { \split:n { \__math_split_guard:n {#3} #4 } }
- }
- {
- \exp_args:No \use_ii_i:nn
- { \exp_after:wN { \int_value:w \int_eval:n { #2 + 1 } } }
- { \__math_split_collect_one_end:w #4 \s_stop {#3} }
- }
- }
-\cs_new:Npn \__math_split_final_cleanup:nn #1 #2
- {
- \exp:w \__math_split_final_cleanup:w #1
- \__math_split_guard:n \q_nil \s_mark { }
- {#2}
- }
-\cs_new:Npn \__math_split_final_cleanup:w #1 \__math_split_guard:n #2 #3 \s_mark #4
- {
- \quark_if_nil:nTF {#2}
- { \exp_end: { #4 #1 } }
- { \__math_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } }
- }
-\NewDocumentCommand \splitnl { mm +m }
- {
- \tl_set:Nf \l_tmpa_tl { \split:n {#3} }
- \show \l_tmpa_tl
- \exp_after:wN \__splitnl_aux:nnNN \l_tmpa_tl #1 #2
- }
-
-\cs_new:Npn \split:n #1 {
- \__math_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
-
-\cs_new:Npn \__math_split_at_nl:NN #1#2 {
- \tl_set:Nf \l_tmpa_tl {
- \exp_after:wN \__math_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop }
- \exp_after:wN \__math_split_at_nl_aux:nnNN \l_tmpa_tl #1 #2
-}
-
-\cs_new_protected:Npn \__math_split_at_nl_aux:nnNN #1 #2 #3 #4
- {
- \tl_gset:Nn #4 {#1}
- \tl_gset:Nn #3 {#2}
-}
-
-
-\newif\if at subformulas
-\tl_new:N \result
-
-\cs_new_protected:Npn\grabaformulapartandstart {
- \__math_split_at_nl:NN \g__math_grabbed_math_tl \result
- \typeout{====>first-result=\meaning\result}
- \typeout{====>first-tmpmathcontent=\meaning\g__math_grabbed_math_tl}
- \tl_if_empty:NTF \g__math_grabbed_math_tl
- {
- \typeout{====>formula~ has~ no~ subparts}
- \global\@subformulasfalse
- }
- {
- \typeout{====>formula~ has~ subparts}
- \global\@subformulastrue
- \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
- \tagstructbegin{tag=Formula,
- title-o=\resulttitle
- }
- }
- \tagmcbegin{}
-}
-
-\cs_new_protected:Npn\grabaformulapartandmayberestart {
- \__math_split_at_nl:NN \g__math_grabbed_math_tl \result
- \typeout{====>result=\meaning\result}
- \typeout{====>tmpmathcontent=\meaning\g__math_grabbed_math_tl}
- \edef\resulttitle{\g__math_grabbed_env_tl\space (part)}
- \tagstructbegin{tag=Formula,
- alt=\result,
- title-o=\resulttitle
- }
- \tagmcbegin{}
-}
-\def\maybestartnewformulatag {
-\if at subformulas
- \ifmeasuring@\else
- \tl_if_empty:NF \g__math_grabbed_math_tl
- {
- \tagmcend
- \tagstructend
- \grabaformulapartandmayberestart
- }
- \fi
-\fi
-}
-\ExplSyntaxOff
-
-\endinput
-%%
-%% End of file `latex-lab-mathtagging.ltx'.
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-bib.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-bib.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-bib.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,9 +33,11 @@
%%
%%
%% File: latex-lab-bib.dtx (C) Copyright 2023 LaTeX Project
-\ProvidesExplPackage {latex-lab-testphase-bib} {2023-05-18} {0.8}
+\def\ltlabbibdate{2023-07-20}
+\def\ltlabbibversion{0.81a}
+\ProvidesExplPackage {latex-lab-testphase-bib} {\ltlabbibdate} {\ltlabbibversion}
{Code related to the tagging of bibliography and cite command}
-\RequirePackage{latex-lab-testphase-block-tagging}
+\RequirePackage{latex-lab-testphase-block}
\def\hyper at nopatch@bib{}
\providecommand*\@extra at binfo{}%
Deleted: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block-tagging.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block-tagging.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block-tagging.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,1426 +0,0 @@
-%%
-%% This is file `latex-lab-testphase-block-tagging.sty',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% latex-lab-block-tagging.dtx (with options: `package')
-%%
-%% This is a generated file.
-%%
-%% Copyright 2021-2023 LaTeX Project
-%%
-%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
-%% ------------------------------------------------------------------------------------
-%%
-%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3c
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2008 or later.
-%%
-%% This file may only be distributed together with a copy of the LaTeX
-%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
-%% without such generated files.
-%%
-%% The newest sources can be found below
-%%
-%% https://github.com/latex3/latex2e/required/latex-lab
-%%
-%% where one can also log issues in case there are any.
-%%
-%%
-%% File: latex-lab-block-tagging.dtx (C) Copyright 2021-2023 LaTeX Project
-
-\def\ltblocksversion{v0.8d}
-\def\ltblocksdate{2023/06/07}
-
-\ProvidesPackage {latex-lab-testphase-block-tagging}
- [\ltblocksdate\space \ltblocksversion\space
- blockenv implementation]
-\RequirePackage{xtemplate}
-\RequirePackage{latex-lab-kernel-changes}
-\ExplSyntaxOn
-\tl_new:N \l__block_item_align_tl
-\tl_new:N\l__block_legacy_env_params_tl
-
-\def\@doendpe{\@endpetrue
- \def\par
- {
- \@restorepar
- \clubpenalty\@clubpenalty
- \__kernel_displayblock_doendpe:
- \@endpefalse
- \everypar{}
- \par
- }
- \everypar{{\setbox\z@\lastbox}
- \everypar{}
- \@endpefalse
- }
-}
-\cs_new_eq:NN \__kernel_displayblock_doendpe: \prg_do_nothing:
-\def\@endpetrue {\global\let\if at endpe\iftrue}
-\def\@endpefalse{\global\let\if at endpe\iffalse}
-\DeclareObjectType{blockenv}{1}
-\DeclareObjectType{block}{1}
-\DeclareObjectType{para}{1}
-\DeclareObjectType{list}{1}
-\DeclareObjectType{item}{1}
-\DeclareTemplateInterface{blockenv}{display}{1}
-{
- env-name : tokenlist ,
- tag-name : tokenlist ,
- tag-class : tokenlist ,
- tagging-recipe : tokenlist = standard,
- level-increase : boolean = true ,
- setup-code : tokenlist ,
- block-instance : tokenlist = displayblock ,
- para-instance : tokenlist ,
- inner-level-counter : tokenlist,
- max-inner-levels : tokenlist = 4,
- inner-instance-type : tokenlist = list ,
- inner-instance : tokenlist ,
- para-flattened : boolean = false ,
- final-code : tokenlist = \ignorespaces ,
-}
-\DeclareTemplateInterface{block}{display}{1}
-{
- heading : tokenlist = , %??
- beginsep : skip = \topsep ,
- begin-par-skip : skip = \partopsep ,
- par-skip : skip = \parsep ,
- end-skip : skip = \KeyValue{beginsep} , % conflict with name below
- end-par-skip : skip = \KeyValue{begin-par-skip} ,
- beginpenalty : integer = \UseName{@beginparpenalty} ,
- endpenalty : integer = \UseName{@endparpenalty} ,
- leftmargin : length = \leftmargin ,
- rightmargin : length = \rightmargin ,
- parindent : length = \listparindent ,
-}
-\DeclareTemplateInterface{para}{std}{1}
-{
- indent-width : length = \parindent ,
- start-skip : skip = 0pt ,
- left-skip : skip = 0pt ,
- right-skip : skip = 0pt ,
- end-skip : skip = \@flushglue ,
- fixed-word-spaces : boolean = false ,
- final-hyphen-demerits : integer = 5000 ,
- cr-cmd : tokenlist = \@normalcr ,
- para-class : tokenlist = justify ,
-}
-\DeclareTemplateInterface{list}{std}{1} % optional
-{
- counter : tokenlist = ,
- item-label : tokenlist = ,
- start : integer = 1 ,
- resume : boolean = false ,
- item-instance : instance{item} = basic ,
- item-skip : skip = \itemsep ,
- item-penalty : integer = \UseName{@itempenalty} ,
- item-indent : length = 0pt , % was \itemindent
- label-width : length = \labelwidth ,
- label-sep : length = \labelsep ,
- legacy-support : boolean = false ,
-}
-\DeclareTemplateInterface{item}{std}{1}
- {
- counter-label : function{1} = \arabic{#1} ,
- counter-ref : function{1} = \KeyValue{counter-label} ,
- label-ref : function{1} = #1 ,
- label-autoref : function{1} = item~#1 ,
- label-format : function{1} = #1 ,
- label-strut : boolean = false ,
- label-align : choice {left,center,right,parleft} = right ,
- label-boxed : boolean = true ,
- next-line : boolean = false ,
- text-font : tokenlist ,
- compatibility : boolean = true ,
- }
-\cs_new_protected:Npn \__block_skip_set_to_last:N #1 {
- \skip_set:Nn #1 { \tex_lastskip:D }
-}
-\cs_new_eq:NN \__block_skip_remove_last: \tex_unskip:D
-\cs_generate_variant:Nn \tl_if_novalue:nTF { o }
-\cs_if_exist:NF \tag_if_active:T
- { \cs_new_eq:NN \tag_if_active:T \use_none:n }
-\bool_new:N \g__block_debug_bool
-\cs_new_eq:NN \__block_debug:n \use_none:n
-\cs_new_eq:NN \__block_debug_typeout:n \use_none:n
-\cs_new_protected:Npn \block_debug_on:
- {
- \bool_gset_true:N \g__block_debug_bool
- \__block_debug_gset:
- }
-\cs_new_protected:Npn \block_debug_off:
- {
- \bool_gset_false:N \g__block_debug_bool
- \__block_debug_gset:
- }
-\cs_new_protected:Npn \__block_debug_gset:
- {
- \cs_gset_protected:Npx \__block_debug:n ##1
- { \bool_if:NT \g__block_debug_bool {##1} }
- \cs_gset_protected:Npx \__block_debug_typeout:n ##1
- { \bool_if:NT \g__block_debug_bool { \typeout{==>~ ##1} } }
- }
-\cs_new_protected:Npn \DebugBlocksOn { \block_debug_on: }
-\cs_new_protected:Npn \DebugBlocksOff { \block_debug_off: }
-\DebugBlocksOff
-\NewDocumentEnvironment{displayblock}{ !O{} }
- { \UseInstance{blockenv}{displayblock} {#1} }
- { \endblockenv }
-\NewDocumentEnvironment{displayblockflattened}{ !O{} }
- { \UseInstance{blockenv}{displayblockflattened} {#1} }
- { \endblockenv }
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{center} { !O{} }
- { \UseInstance{blockenv}{center}{#1} }
- { \endblockenv }
- \RenewDocumentEnvironment{flushright} { !O{} }
- { \UseInstance{blockenv}{flushright}{#1} }
- { \endblockenv }
- \RenewDocumentEnvironment{flushleft} { !O{} }
- { \UseInstance{blockenv}{flushleft}{#1} }
- { \endblockenv }
-}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{quote}{ !O{} }
- { \UseInstance{blockenv}{quote} {#1} }
- { \endblockenv }
- \RenewDocumentEnvironment{quotation}{ !O{} }
- { \UseInstance{blockenv}{quotation} {#1} }
- { \endblockenv }
-}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{verbatim}{ !O{} }
- { \UseInstance{blockenv}{verbatim} {#1}
- \@setupverbinvisiblespace\frenchspacing\@vobeyspaces
- \@xverbatim
- }
- { \endblockenv }
- \RenewDocumentEnvironment{verbatim*}{ !O{} }
- { \UseInstance{blockenv}{verbatim} {#1}
- \@setupverbvisiblespace\frenchspacing\@vobeyspaces
- \@sxverbatim
- }
- { \endblockenv }
-}
-\def\legacyverbatimsetup{%
- \language\l at nohyphenation
- \@tempswafalse
- \def\par{%
- \if at tempswa
- \leavevmode \null {\@@par}\penalty\interlinepenalty
- \else
- \@tempswatrue
- \ifhmode{\@@par}\penalty\interlinepenalty\fi
- \fi}%
- \let\do\@makeother \dospecials
- \obeylines \verbatim at font \@noligs
- \everypar \expandafter{\the\everypar \unpenalty}%
- \tl_set:Nn \l__tag_para_main_tag_tl {codeline}
- \tagtool{paratag=Code}% oder faster: \tl_set:Nn\l__tag_para_tag_tl{Code}
-}
-\newcommand\@setupverbinvisiblespace{}
-\tag_if_active:T {
- \bool_if:NF\g__tag_mode_lua_bool
- {
- \renewcommand\@setupverbinvisiblespace{\def\@xobeysp{\nobreakspace\pdffakespace}}
- }
-}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{itemize}{!O{}}
- { \UseInstance{blockenv}{itemize} {#1} }
- { \endblockenv }
- \RenewDocumentEnvironment{enumerate}{!O{}}
- { \UseInstance{blockenv}{enumerate} {#1} }
- { \endblockenv }
- \RenewDocumentEnvironment{description}{!O{}}
- { \UseInstance{blockenv}{description} {#1} }
- { \endblockenv }
-}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{list}{O{} m m }
- {
- \tl_set:Nn \@itemlabel {#2}
- \tl_set:Nn \l__block_legacy_env_params_tl {#3}
- \UseInstance{blockenv}{list} {#1}
- }
- { \endblockenv }
-}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=list,role=L}}
-}
-\tl_new:N \l__block_env_params_tl
-\cs_new:Npn \legacylistsetupcode {
- \dim_zero:N \listparindent
- \dim_zero:N \rightmargin
- \dim_zero:N \itemindent
- \tl_set:Nn \@listctr {}
- \legacy_if_set_false:n { @nmbrlist } % needed if lists are nested
- \let\makelabel\@mklab % TODO: customize
- \l__block_legacy_env_params_tl
- \legacy_if:nTF { @nmbrlist }
- { \tl_set:Nn \l__tag_L_attr_class_tl {enumerate} } % numbered list
- { \tl_if_empty:NTF \@itemlabel
- { \tl_set:Nn \l__tag_L_attr_class_tl {list} } % no label
- { \tl_set:Nn \l__tag_L_attr_class_tl {itemize} } % unnumbered, unordered
- }
-}
-\AddToHook{begindocument/before}{
- \RenewDocumentEnvironment{trivlist}{ !O{} }
- { \list[#1]{}
- {
- \dim_zero:N \leftmargin
- \dim_zero:N \labelwidth
- \cs_set_eq:NN \makelabel \use:n
- }
- }
- { \endblockenv }
-}
-\RenewDocumentCommand \newtheorem { m O{#1} m o }
-{
- \expandafter\@ifdefinable\csname #1\endcsname
- {
- \str_if_eq:nnTF{#1}{#2}
- {
- \@definecounter {#2}
- \IfNoValueTF {#4}
- { % @ynthm
- \tl_gset:cx { the #2 }
- {
- \@thmcounter{#2}
- }
- }
- { % @xnthm
- \@newctr{#1}[#4]
- \tl_gset:cx { the #2 }
- {
- \expandafter\noexpand\csname the#4\endcsname
- \@thmcountersep
- \@thmcounter{#2}
- }
- }
- }
- { % @othm
- \@ifundefined{c@#2}
- { \@nocounterr{#2} }
- {
- \tl_gset:cn { the #1 }
- { \UseName { the #2 } }
- }
- }
- \global\@namedef{#1} { \@thm{#2}{#3} }
- \global\@namedef{end#1}{ \@endtheorem }
- }
-}
-\def\@begintheorem#1#2{
- \UseInstance{blockenv}{theorem}{}
- \tagpdfparaOff
- \mode_leave_vertical:
- \tag_struct_begin:n{tag=Caption}
- \group_begin:
- \bfseries
- \tag_mc_begin:n {}
- #1\
- \tag_mc_end:
- \tag_struct_begin:n{tag=Lbl}
- \tag_mc_begin:n {}
- #2
- \tag_mc_end:
- \tag_struct_end:
- \group_end:
- \tag_struct_end:
- \tagpdfparaOn
- \__block_start_para_structure_unconditionally:n { \PARALABEL }
- \itshape
- \hskip\labelsep
- \ignorespaces
-}
-\def\@opargbegintheorem#1#2#3{
- \UseInstance{blockenv}{theorem}{}
- \tagpdfparaOff
- \mode_leave_vertical:
- \tag_struct_begin:n{tag=Caption}
- \group_begin:
- \bfseries
- \tag_mc_begin:n {}
- #1\
- \tag_mc_end:
- \tag_struct_begin:n{tag=Lbl}
- \tag_mc_begin:n {}
- #2
- \tag_mc_end:
- \tag_struct_end:
- \tag_mc_begin:n {}
- \ (#3)
- \tag_mc_end:
- \group_end:
- \tag_struct_end:
- \tagpdfparaOn
- \__block_start_para_structure_unconditionally:n { \PARALABEL }
- \itshape
- \hskip\labelsep
- \ignorespaces
-}
-\def\@endtheorem{\endblockenv}
-\cs_new:Npn \g_block_nesting_depth_int { \@listdepth } % a fake int
- % for now
-\DeclareTemplateCode{blockenv}{display}{1}
-{
- env-name = \l__block_env_name_tl ,
- tag-name = \l__block_tag_name_tl ,
- tag-class = \l__block_tag_class_tl ,
- tagging-recipe = \l__block_tagging_recipe_tl ,
- level-increase = \l__block_level_incr_bool ,
- setup-code = \l__block_setup_code_tl ,
- block-instance = \l__block_block_instance_tl ,
- para-instance = \l__block_para_instance_tl ,
- inner-level-counter = \l__block_inner_level_counter_tl ,
- max-inner-levels = \l__block_max_inner_levels_tl ,
- inner-instance-type = \l__block_inner_instance_type_tl ,
- inner-instance = \l__block_inner_instance_tl ,
- para-flattened = \l__tag_para_flattened_bool ,
- final-code = \l__block_final_code_tl ,
-}
-{
- \__block_debug_typeout:n{\l__block_env_name_tl -env-start}
- \tl_if_empty:nF {#1} { \SetTemplateKeys{blockenv}{display}{#1} }
- % \begin{macrocode}
- \int_compare:nNnTF \l__block_flattened_level_int > 0
- {
- \int_incr:N \l__block_flattened_level_int
- }
- {
- \bool_if:NT \l__tag_para_flattened_bool
- {
- \int_incr:N \l__block_flattened_level_int
- }
- }
- \tl_if_empty:NF \l__block_inner_level_counter_tl
- {
- \int_compare:nNnTF \l__block_inner_level_counter_tl >
- { \l__block_max_inner_levels_tl - 1 }
- { \@toodeep }
- { \int_incr:N \l__block_inner_level_counter_tl } % not clean "o"?
- }
- \bool_if:NT \l__block_level_incr_bool
- {
- \int_compare:nNnTF \g_block_nesting_depth_int >
- { \c at maxblocklevels - 1 }
- { \@toodeep }
- {
- \int_gincr:N \g_block_nesting_depth_int
- \use:c { @list \int_to_roman:n { \g_block_nesting_depth_int } }
- }
- }
- \tag_if_active:T { \use:c { __block_recipe_ \l__block_tagging_recipe_tl : } }
- \l__block_setup_code_tl
- \__block_debug_typeout:n{use~ instance:~
- \l__block_block_instance_tl - \int_use:N \g_block_nesting_depth_int }
- \UseInstance{block}
- { \l__block_block_instance_tl - \int_use:N
- \g_block_nesting_depth_int }
- {#1}
- \tl_if_empty:NF \l__block_para_instance_tl
- {
- \__block_debug_typeout:n{use~ para~ instance:~ \l__block_para_instance_tl }
- \UseInstance{para}{ \l__block_para_instance_tl } {}
- }
- \tl_if_empty:NF \l__block_inner_instance_tl
- {
- \__block_debug_typeout:n{use~ instance:~ \l__block_inner_instance_tl
- \tl_if_empty:NF \l__block_inner_level_counter_tl
- { - \int_use:N \l__block_inner_level_counter_tl }}
- \UseInstance{ \l__block_inner_instance_type_tl }
- { \l__block_inner_instance_tl
- \tl_if_empty:NF \l__block_inner_level_counter_tl
- { - \int_use:N \l__block_inner_level_counter_tl } % not clean
- % use "o"?
- }
- {#1}
- }
- \l__block_final_code_tl
-}
-\int_new:N \l__block_flattened_level_int
-\newcounter{maxblocklevels}
-\setcounter{maxblocklevels}{6}
-\cs_new:Npn \endblockenv {
- \__block_debug_typeout:n{blockenv~ common~ ending \on at line}
- \bool_if:NT \l__block_level_incr_bool
- { \int_gdecr:N \g_block_nesting_depth_int }
- \legacy_if:nT { @inlabel }
- {
- \mode_leave_vertical:
- \legacy_if_gset_false:n { @inlabel }
- }
- \legacy_if:nT { @newlist }
- {
- \@noitemerr
- \legacy_if_gset_false:n { @newlist }
- }
- \mode_if_horizontal:TF
- { \__block_skip_remove_last: \__block_skip_remove_last: \par }
- { \@inmatherr{\end{\@currenvir}} }
- \__kernel_displayblock_end:
- \legacy_if:nF { @noparlist }
- {
- \__block_skip_set_to_last:N \l_tmpa_skip
- \dim_compare:nNnT \l_tmpa_skip > \c_zero_dim
- {
- \skip_vertical:n { - \l_tmpa_skip }
- \skip_vertical:n { \l_tmpa_skip + \parskip - \@outerparskip }
- }
- \addpenalty \@endparpenalty
- \addvspace \l__block_topsepadd_skip
- }
- % \begin{macrocode}
- \bool_if:NTF \l__block_standalone_bool
- { \legacy_if_gset_false:n { @endpe } }
- { \legacy_if_gset_true:n { @endpe } }
-}
-\cs_new:Npn \__kernel_displayblock_end: {
- \__block_debug_typeout:n{\detokenize{__kernel_displayblock_end:}}
-}
-\bool_new:N \l__block_standalone_bool
-\bool_set_false:N \l__block_standalone_bool
-\DeclareTemplateCode{para}{std}{1}
-{
- indent-width = \parindent ,
- start-skip = \l__par_start_skip , % name??
- left-skip = \leftskip ,
- right-skip = \rightskip ,
- end-skip = \parfillskip ,
- fixed-word-spaces = \l__par_fixed_word_spaces_bool , % name??
- final-hyphen-demerits = \finalhyphendemerits ,
- cr-cmd = \\ ,
- para-class = \l_tag_para_attr_class_tl ,
-}
-{
- \tl_if_empty:nF {#1} { \SetTemplateKeys{para}{std}{#1} }
- \skip_set:Nn \@rightskip \rightskip
-}
-\DeclareTemplateCode{block}{display}{1}
-{
- heading = \l__block_heading_tl ,
- beginsep = \topsep ,
- begin-par-skip = \partopsep ,
- par-skip = \parsep ,
- end-skip = \l__block_botsep_skip ,
- end-par-skip = \l__block_parbotsep_skip ,
- beginpenalty = \@beginparpenalty ,
- endpenalty = \@endparpenalty ,
- rightmargin = \rightmargin ,
- leftmargin = \leftmargin ,
- parindent = \listparindent ,
-}
-{
- \tl_if_empty:nF {#1} { \SetTemplateKeys{block}{display}{#1} }
- \tl_if_blank:oF \l__block_heading_tl
- { \mode_leave_vertical: \textbf{\l__block_heading_tl} } % TODO customize
- \legacy_if:nT { @noskipsec } { \mode_leave_vertical: }
- \skip_set:Nn \l__block_topsepadd_skip { \topsep }
- \mode_if_vertical:TF
- {
- \skip_add:Nn \l__block_topsepadd_skip { \partopsep }
- \__kernel_displayblock_beginpar_vmode:
- }
- {
- \__block_skip_remove_last: \__block_skip_remove_last:
- \__kernel_displayblock_beginpar_hmode:w \par
- }
- \legacy_if:nTF { @inlabel }
- {
- \legacy_if_set_true:n { @noparitem }
- \legacy_if_set_true:n { @noparlist }
- }
- {
- \legacy_if:nT { @newlist } { \@noitemerr }
- \legacy_if_set_false:n { @noparlist }
- \skip_set_eq:NN \l__block_effective_top_skip \l__block_topsepadd_skip
- }
- \skip_add:Nn \l__block_effective_top_skip { \parskip }
- \skip_zero:N \leftskip
- \skip_set_eq:NN \rightskip \@rightskip
- \skip_set_eq:NN \parfillskip \@flushglue
- \int_zero:N \par at deathcycles
- \@setpar
- {
- \legacy_if:nTF { @newlist }
- {
- \int_incr:N \par at deathcycles
- \int_compare:nNnTF \par at deathcycles > { 1000 }
- { \@noitemerr
- { \para_end: }
- }
- }
- {
- { \para_end: }
- }
- }
- \skip_set_eq:NN \@outerparskip \parskip
- \skip_set_eq:NN \parskip \parsep
- \dim_set_eq:NN \parindent \listparindent
- \dim_add:Nn \linewidth { - \rightmargin - \leftmargin }
- \dim_add:Nn \@totalleftmargin { \leftmargin }
- \tex_parshape:D 1 ~ \@totalleftmargin \linewidth
- \__kernel_displayblock_begin:
- \legacy_if:nTF { @noparitem }
- {
- \legacy_if_set_false:n { @noparitem }
- \hbox_gset:Nn \g__block_labels_box
- {
- \skip_horizontal:n { - \leftmargin }
- \hbox_unpack_drop:N \g__block_labels_box
- \skip_horizontal:n { \leftmargin }
- }
- \legacy_if:nF { @minipage } % Why this chunk of code?
- {
- \__block_skip_set_to_last:N \l__block_tmpa_skip
- \skip_vertical:n { - \l__block_tmpa_skip }
- \skip_vertical:n { \l__block_tmpa_skip + \@outerparskip - \parskip }
- }
- }
- {
- \legacy_if:nTF { @nobreak }
- { \addvspace{\skip_eval:n{\@outerparskip-\parskip}} }
- {
- \addpenalty \@beginparpenalty
- \addvspace \l__block_effective_top_skip
- \addvspace{-\parskip}
- }
- }
-}
-\keys_define:nn { template/block/display }
-{
- ,topsep .skip_set:N = \topsep
- ,partopsep .skip_set:N = \partopsep
- ,listparindent .skip_set:N = \listparindent
-}
-\cs_new:Npn \__kernel_displayblock_begin: {
- \__block_debug_typeout:n{\detokenize{__kernel_displayblock_begin:}}
-}
-\cs_new:Npn \__kernel_displayblock_beginpar_hmode:w {
- \__block_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_hmode:w}}
-}
-\cs_new:Npn \__kernel_displayblock_beginpar_vmode: {
- \__block_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_vmode:}}
-}
-\tl_new:N \@itemlabel % should have a top-level definition
-\tl_new:N \@listctr % should have a top-level definition
-\DeclareTemplateCode{list}{std}{1}
-{
- counter = \l__block_counter_tl,
- item-label = \l__block_item_label_tl,
- start = \l__block_counter_start_int ,
- resume = \l__block_resume_bool ,
- item-instance = \__block_item_instance:n ,
- item-skip = \itemsep ,
- item-penalty = \@itempenalty ,
- item-indent = \itemindent ,
- label-width = \labelwidth ,
- label-sep = \labelsep ,
- legacy-support = \l__block_legacy_support_bool , % FMi questionable
-}
-{
- \__block_debug_typeout:n{template:list:std}
- \tl_if_empty:nF {#1} { \SetTemplateKeys{list}{std}{#1} }
- \tl_if_empty:NTF \l__block_counter_tl
- {
- \tl_if_blank:oF \@listctr
- {
- \bool_if:NF \l__block_resume_bool
- {
- \int_gset:cn{ c@ \@listctr }
- { \l__block_counter_start_int - 1 }
- }
- }
- { \@nmbrlistfalse }
- }
- {
- \@nmbrlisttrue
- \tl_set_eq:NN \@listctr \l__block_counter_tl
- \bool_if:NF \l__block_resume_bool
- {
- \int_gset:cn{ c@ \@listctr }
- { \l__block_counter_start_int - 1 }
- }
- }
- \tl_if_empty:NF \l__block_item_label_tl
- {
- \tl_set_eq:NN \@itemlabel \l__block_item_label_tl
- }
- \legacy_if_gset_true:n { @newlist }
- \__block_debug_typeout:n{template:list:std~end}
-}
-\keys_define:nn { template/list/std }
-{
- ,nosep .code:n =
- \dim_zero:N \itemsep
- \dim_zero:N \parsep
- \dim_zero:N \topsep
- \dim_zero:N \l__block_botsep_skip
- \dim_zero:N \l__block_parbotsep_skip
- ,midsep .skip_set:N = \topsep
-}
-\keys_define:nn { template/item/std }
- { label .tl_set:N = \l__block_label_given_tl }
-\DeclareTemplateCode{item}{std}{1}
- {
- counter-label = \__block_counter_label:n ,
- counter-ref = \__block_counter_ref:n ,
- label-ref = \__block_label_ref:n ,
- label-autoref = \__block_label_autoref:n ,
- label-format = \__block_label_format:n ,
- label-strut = \l__block_label_strut_bool ,
- label-boxed = \l__block_label_boxed_bool ,
- next-line = \l__block_next_line_bool ,
- text-font = \l__block_text_font_tl ,
- compatibility = \l__block_item_compatibility_bool ,
- label-align = {
- left = \tl_set:Nn \l__block_item_align_tl { \relax \hss } ,
- center = \tl_set:Nn \l__block_item_align_tl { \hss \hss } ,
- right = \tl_set:Nn \l__block_item_align_tl { \hss \relax } ,
- parleft = \NOT_IMPLEMENTED ,
- } ,
- }
- {
- \__block_debug_typeout:n{template:item:std}
- \tl_set_eq:NN \l__block_label_given_tl \c_novalue_tl
- \tl_if_empty:nF{#1}{ \SetTemplateKeys{item}{std}{#1} }
- \tl_if_novalue:oTF \l__block_label_given_tl
- {
- \tl_if_blank:oF \@listctr { \@kernel at refstepcounter \@listctr }
- \bool_if:NTF \l__block_item_compatibility_bool % not sure that conditional
- % makes sense
- { \__block_make_label_box:n { \MakeLinkTarget[\@listctr]{}\@itemlabel } } % TODO ?
- { \__block_make_label_box:n { \MakeLinkTarget[\@listctr]{}\__block_counter_label:n { \@listctr } } }
- }
- {
- \__block_debug_typeout:n{item~ with~ optional}
- \__block_make_label_box:n { \l__block_label_given_tl } }
- \bool_if:nT
- {
- \l__block_label_boxed_bool
- && \dim_compare_p:n { \box_wd:N \l__block_one_label_box <= \linewidth } % TODO: is \linewidth correct?
- }
- {
- \dim_compare:nNnT
- { \box_wd:N \l__block_one_label_box } < \labelwidth
- {
- \hbox_set_to_wd:Nnn \l__block_one_label_box { \labelwidth }
- {
- \exp_after:wN \use_i:nn \l__block_item_align_tl
- \box_use_drop:N \l__block_one_label_box
- \exp_after:wN \use_ii:nn \l__block_item_align_tl
- }
- }
- \hbox_set:Nn \l__block_one_label_box
- { \box_use_drop:N \l__block_one_label_box }
- }
- \dim_compare:nNnTF { \box_wd:N \l__block_one_label_box } > \labelwidth
- { \bool_set_true:N \l__block_long_label_bool }
- { \bool_set_false:N \l__block_long_label_bool }
- \hbox_gset:Nn \g__block_labels_box
- {
- \hbox_unpack_drop:N \g__block_labels_box
- \skip_horizontal:n { \itemindent - \labelsep - \labelwidth }
- \hbox_unpack_drop:N \l__block_one_label_box
- \skip_horizontal:n { \labelsep }
- \bool_if:NT \l__block_next_line_bool
- { \bool_if:NT \l__block_long_label_bool { \nobreak \hfil \break } }
- % version of \newline inside an hbox that will be unpacked
- }
- % \skip_set_eq:NN \parsep \l__block_item_parsep_skip TODO??? FMi
- % what's that?
- \dim_set_eq:NN \parindent \listparindent
- \cs_set_eq:NN \__block_item_everypar: \__block_item_everypar_std:
- }
-\box_new:N \l__block_one_label_box
-\box_new:N \g__block_labels_box
-\bool_new:N \l__block_long_label_bool
-\cs_new_protected:Npn \__block_make_label_box:n #1
- {
- \hbox_set:Nn \l__block_one_label_box
- {
- \__kernel_list_label_begin:
- \__block_label_format:n
- {
- \bool_if:NT \l__block_label_strut_bool { \strut }
- \bool_if:NTF \l__block_legacy_support_bool
- \makelabel
- \use:n
- {#1}
- }
- \__kernel_list_label_end:
- }
- }
-\cs_new_eq:NN \__kernel_list_label_begin: \prg_do_nothing:
-\cs_new_eq:NN \__kernel_list_label_end: \prg_do_nothing:
-\cs_new_eq:NN \__block_item_everypar: \prg_do_nothing:
-\AddToHook{para/begin}[lists]{\__block_item_everypar:}
-\DeclareHookRule{para/begin}{lists}{after}{tagpdf}
-\cs_new_protected:Npn \__block_item_everypar_std: {
- \__block_debug_typeout:n{item~ everypar \on at line }
- \legacy_if_set_false:n { @minipage }
- \legacy_if_gset_false:n { @newlist }
- \legacy_if:nT { @inlabel }
- {
- \legacy_if_gset_false:n { @inlabel }
- \box_if_empty:NT \g_para_indent_box { \kern - \itemindent }
- \para_omit_indent:
- \box_use_drop:N \g__block_labels_box
- \__kernel_list_label_after:
- \penalty \c_zero_int
- }
- \legacy_if:nTF { @nobreak }
- {
- \legacy_if_gset_false:n { @nobreak }
- \int_set:Nn \clubpenalty { 10000 }
- }
- {
- \int_set_eq:NN \clubpenalty \@clubpenalty
- \cs_set_eq:NN \__block_item_everypar: \prg_do_nothing:
- }
-}
-\cs_new_eq:NN \__kernel_list_label_after: \prg_do_nothing:
-\skip_new:N \l__block_tmpa_skip
-\skip_new:N \l__block_topsepadd_skip
-\skip_new:N \l__block_effective_top_skip
-\AddToHook{begindocument/before}{
- \RenewDocumentCommand{\item}{ ={label}o }
- {
- \@inmatherr \item
- \tl_if_empty:oTF \__block_item_instance:n %%FMi?
- { \msg_error:nnn { __block } { item-in-nonlist } { \item[{#1}] } }
- {
- \legacy_if:nTF { @newlist }
- { \__kernel_list_item_begin: }
- { \__block_inter_item: }
- \tl_if_novalue:nTF {#1} % avoids reparsing label={}
- { \__block_item_instance:n { } }
- { \__block_item_instance:n {#1} }
- \legacy_if_gset_true:n { @inlabel }
- \ignorespaces
- }
- }
-}
-\cs_new_protected:Npn \__block_inter_item: {
- \legacy_if:nT { @inlabel }
- { \indent \par } % case of \item\item
- \mode_if_horizontal:T { \__block_skip_remove_last:
- \__block_skip_remove_last: \par }
- \__kernel_list_item_end:
- \__kernel_list_item_begin:
- \addpenalty \@itempenalty
- \addvspace \itemsep
-}
-\cs_new_eq:NN \__kernel_list_item_begin: \prg_do_nothing:
-\cs_new_eq:NN \__kernel_list_item_end: \prg_do_nothing:
-\cs_new:Npn \__block_recipe_basic: {
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \__block_beginpar_hmode:N
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \__block_beginpar_vmode:
- \let \__kernel_displayblock_begin: \prg_do_nothing:
- \let \__kernel_displayblock_end: \prg_do_nothing:
-}
-\cs_new:Npn \__block_recipe_standalone: {
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \prg_do_nothing:
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \prg_do_nothing:
- \cs_set_eq:NN \__kernel_displayblock_begin: \__block_inner_begin:
- \cs_set_eq:NN \__kernel_displayblock_end: \__block_inner_end:
- \bool_set_true:N \l__block_standalone_bool
- \tl_if_empty:NTF \l__block_tag_name_tl
- { \tl_set:Nn \l__block_tag_inner_tag_tl {Sect} }
- { \tl_set_eq:NN \l__block_tag_inner_tag_tl \l__block_tag_name_tl }
-}
-\cs_new:Npn \__block_recipe_standard:
-{
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \__block_beginpar_hmode:N
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \__block_beginpar_vmode:
- \cs_set_eq:NN \__kernel_displayblock_begin: \__block_inner_begin:
- \cs_set_eq:NN \__kernel_displayblock_end: \__block_inner_end:
- \tl_if_empty:NTF \l__block_tag_name_tl
- { \tl_set:Nn \l__block_tag_inner_tag_tl {Figure} }
- { \tl_set_eq:NN \l__block_tag_inner_tag_tl \l__block_tag_name_tl }
-}
-\tl_new:N \l__block_tag_inner_tag_tl
-\cs_new:Npn \__block_recipe_list:
-{
- \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
- \__block_beginpar_hmode:N
- \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
- \__block_beginpar_vmode:
- \cs_set_eq:NN \__kernel_displayblock_begin: \__block_list_begin:
- \cs_set_eq:NN \__kernel_displayblock_end: \__block_list_end:
- \cs_set_eq:NN \__kernel_list_item_begin: \__block_list_item_begin:
- \cs_set_eq:NN \__kernel_list_item_end: \__block_list_item_end:
- \tl_if_empty:NTF \l__block_tag_name_tl
- { \tl_set:Nn \l__tag_L_tag_tl {L} }
- { \tl_set_eq:NN \l__tag_L_tag_tl \l__block_tag_name_tl }
- \tl_if_empty:NTF \l__block_tag_class_tl
- { \tl_set:Nn \l__tag_L_attr_class_tl {} }
- { \tl_set_eq:NN \l__tag_L_attr_class_tl \l__block_tag_class_tl }
-}
-
-\DeclareInstance{blockenv}{displayblock}{display}
-{
- env-name = displayblock,
- tag-name = ,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- inner-instance = ,
-}
-\DeclareInstance{blockenv}{displayblockflattened}{display}
-{
- env-name = displayblockflattened,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- inner-instance = ,
-}
-\DeclareInstance{blockenv}{center}{display}
-{
- env-name = center,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- para-instance = center ,
- inner-instance = ,
-}
-\DeclareInstance{blockenv}{flushleft}{display}
-{
- env-name = flushleft,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- para-instance = raggedright ,
- inner-instance = ,
-}
-\DeclareInstance{blockenv}{flushright}{display}
-{
- env-name = flushleft,
- tag-name = ,
- tag-class = ,
- tagging-recipe = basic,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
- para-flattened = true ,
- para-instance = raggedleft ,
- inner-instance = ,
-}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=quote,role=BlockQuote}}
- \tagpdfsetup{add-new-tag={tag=quotation,role=BlockQuote}}
-}
-\DeclareInstance{blockenv}{quotation}{display}
-{
- env-name = quotation,
- tag-name = quotation,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = true,
- setup-code = ,
- block-instance = quotationblock ,
- inner-instance = ,
-}
-\DeclareInstance{blockenv}{quote}{display}
-{
- env-name = quote,
- tag-name = quote,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = true,
- setup-code = ,
- block-instance = quoteblock ,
- inner-instance = ,
-}
-
-\DeclareInstance{blockenv}{theorem}{display}
-{
- env-name = theorem-like,
- tag-name = theorem-like,
- tag-class = ,
- tagging-recipe = standalone,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = displayblock ,
-}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=theorem-like,role=Sect}}
-}
-\tag_if_active:T {
- \tagpdfsetup{add-new-tag={tag=verbatim,role=P}}
- \tagpdfsetup{add-new-tag={tag=codeline,role=Sub}}
-}
-\DeclareInstance{blockenv}{verbatim}{display}
-{
- env-name = verbatim,
- tag-name = verbatim,
- tag-class = ,
- tagging-recipe = standard,
- inner-level-counter = ,
- level-increase = false,
- setup-code = ,
- block-instance = verbatimblock ,
- inner-instance = ,
- final-code = \legacyverbatimsetup ,
-}
-\DeclareInstance{blockenv}{itemize}{display}
-{
- env-name = itemize,
- tag-name = itemize,
- tag-class = itemize,
- tagging-recipe = list,
- inner-level-counter = \@itemdepth,
- level-increase = true,
- max-inner-levels = 4,
- setup-code = ,
- block-instance = list ,
- inner-instance = itemize ,
-}
-\DeclareInstance{blockenv}{enumerate}{display}
-{
- env-name = enumerate,
- tag-name = enumerate,
- tag-class = enumerate,
- tagging-recipe = list,
- level-increase = true,
- setup-code = ,
- block-instance = list ,
- inner-level-counter = \@enumdepth,
- max-inner-levels = 4,
- inner-instance = enum ,
-}
-
-\DeclareInstance{blockenv}{description}{display}
-{
- env-name = description,
- tag-name = description,
- tag-class = description,
- tagging-recipe = list,
- inner-level-counter = ,
- level-increase = true,
- setup-code = ,
- block-instance = list ,
- inner-instance = description ,
-}
-\DeclareInstance{blockenv}{list}{display}
-{
- env-name = list,
- tag-name = list,
- tag-class = ,
- tagging-recipe = list,
- level-increase = true,
- setup-code = \legacylistsetupcode ,
- block-instance = list ,
- inner-level-counter = ,
- inner-instance = legacy ,
-}
-\setcounter{maxblocklevels}{6}
-\DeclareInstance{block}{displayblock-0}{display}
- {
- leftmargin = 0pt ,
- parindent = 0pt ,
- }
-\DeclareInstanceCopy{block}{displayblock-1}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-2}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-3}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-4}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-5}{displayblock-0}
-\DeclareInstanceCopy{block}{displayblock-6}{displayblock-0}
-\DeclareInstance{block}{verbatimblock-0}{display}
- {
- leftmargin = 0pt ,
- parindent = 0pt ,
- par-skip = 0pt ,
- }
-\DeclareInstanceCopy{block}{verbatimblock-1}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-2}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-3}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-4}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-5}{verbatimblock-0}
-\DeclareInstanceCopy{block}{verbatimblock-6}{verbatimblock-0}
-\DeclareInstance{block}{quoteblock-1}{display}
- { rightmargin = \KeyValue{leftmargin} }
-\DeclareInstanceCopy{block}{quoteblock-2}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-3}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-4}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-5}{quoteblock-1}
-\DeclareInstanceCopy{block}{quoteblock-6}{quoteblock-1}
-\DeclareInstance{block}{quotationblock-1}{display}
- { parindent = 1.5em , rightmargin = \KeyValue{leftmargin} }
-\DeclareInstanceCopy{block}{quotationblock-2}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-3}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-4}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-5}{quotationblock-1}
-\DeclareInstanceCopy{block}{quotationblock-6}{quotationblock-1}
-\DeclareInstance{block}{list-1}{display}{
-}
-\DeclareInstance{block}{list-2}{display}{}
-\DeclareInstance{block}{list-3}{display}{}
-\DeclareInstance{block}{list-4}{display}{}
-\DeclareInstance{block}{list-5}{display}{}
-\DeclareInstance{block}{list-6}{display}{}
-\DeclareInstance{list}{itemize-1}{std}{ item-label = \labelitemi }
-\DeclareInstance{list}{itemize-2}{std}{ item-label = \labelitemii }
-\DeclareInstance{list}{itemize-3}{std}{ item-label = \labelitemiii }
-\DeclareInstance{list}{itemize-4}{std}{ item-label = \labelitemiv }
-\DeclareInstance{list}{enum-1}{std}
- { item-label = \labelenumi , counter = enumi }
-\DeclareInstance{list}{enum-2}{std}
- { item-label = \labelenumii , counter = enumii }
-\DeclareInstance{list}{enum-3}{std}
- { item-label = \labelenumiii , counter = enumiii }
-\DeclareInstance{list}{enum-4}{std}
- { item-label = \labelenumiv , counter = enumiv }
-\DeclareInstance{list}{legacy}{std} {
- item-instance = basic ,
- legacy-support = true ,
-}
-\DeclareInstance{list}{description}{std} { item-instance = description }
-\DeclareInstance{item}{basic}{std}
- {
- label-align = right ,
- }
-\DeclareInstance{item}{description}{std}
- {
- label-format = \normalfont\bfseries #1 ,
- }
-\tag_if_active:T
-{
- \tagpdfsetup
- {
- newattribute = {justify} {/O /Layout /TextAlign/Justify},
- newattribute = {center} {/O /Layout /TextAlign/Center},
- newattribute = {raggedright}{/O /Layout /TextAlign/Start},
- newattribute = {raggedleft} {/O /Layout /TextAlign/End},
- }
-}
-\DeclareInstance{para}{center}{std}
-{
- indent-width = 0pt ,
- start-skip = 0pt ,
- left-skip = \@flushglue ,
- right-skip = \@flushglue ,
- end-skip = \z at skip ,
- final-hyphen-demerits = 0 ,
- cr-cmd = \@centercr ,
- para-class = center ,
-}
-\DeclareInstance{para}{raggedright}{std}
-{
- indent-width = 0pt ,
- start-skip = 0pt ,
- left-skip = \z at skip ,
- right-skip = \@flushglue ,
- end-skip = \z at skip ,
- final-hyphen-demerits = 0 ,
- cr-cmd = \@centercr ,
- para-class = raggedright ,
-}
-\DeclareInstance{para}{raggedleft}{std}
-{
- indent-width = 0pt ,
- start-skip = 0pt ,
- left-skip = \@flushglue ,
- right-skip = \z at skip ,
- end-skip = \z at skip ,
- final-hyphen-demerits = 0 ,
- cr-cmd = \@centercr ,
- para-class = raggedleft ,
-}
-\DeclareInstance{para}{justify}{std}
-{
- start-skip = 0pt ,
- left-skip = \z at skip ,
- right-skip = \z at skip ,
- end-skip = \@flushglue ,
- final-hyphen-demerits = 5000 ,
- cr-cmd = \@normalcr ,
- para-class = justify ,
-}
-\DeclareRobustCommand\centering {\UseInstance{para}{center}{}}
-\DeclareRobustCommand\raggedleft {\UseInstance{para}{raggedleft}{}}
-\DeclareRobustCommand\raggedright{\UseInstance{para}{raggedright}{}}
-\DeclareRobustCommand\justifying {\UseInstance{para}{justify}{}}
-
-\justifying
-\tag_if_active:T {
- \cs_set:Npn \__block_beginpar_vmode: {
- \__block_debug_typeout:n
- { @endpe = \legacy_if:nTF { @endpe }{true}{false}
- \on at line }
- \legacy_if:nTF { @endpe }
- {
- \legacy_if_gset_false:n { @endpe }
- }
- {
- \int_compare:nNnT \l__block_flattened_level_int < 2
- {
- \int_gincr:N \g__tag_para_main_begin_int
- \tagstructbegin{tag=\l__tag_para_main_tag_tl}
- }
- }
- }
- \cs_set:Npn \__block_beginpar_hmode:N #1
- {
- \tag_mc_end:
- \int_gincr:N \g__tag_para_end_int
- \__block_debug_typeout:n{increment~ /P \on at line }
- \bool_if:NT \l__tag_para_show_bool
- { \tag_mc_begin:n{artifact}
- \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
- \tag_mc_end:
- }
- \tag_struct_end:
- \tagpdfparaOff \par \tagpdfparaOn
- }
-\cs_set:Npn \__kernel_displayblock_doendpe: {
- \bool_if:NT \l__tag_para_bool
- {
- \legacy_if:nT { @endpe }
- {
- \__block_debug_typeout:n
- { flattened= \bool_if:NTF
- \l__tag_para_flattened_bool {true}{false}
- \on at line }
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \__block_debug_typeout:n{Structure-end~
- \l__tag_para_main_tag_tl\space after~ displayblock \on at line }
- \int_gincr:N \g__tag_para_main_end_int
- \tag_struct_end: %text-unit
- }
- }
- }
-}
-\RemoveFromHook{para/begin}[tagpdf]
-\AddToHook{para/begin}[tagpdf]{
- \bool_if:NT \l__tag_para_bool {
- \legacy_if:nF { @inlabel }
- {
- \__block_start_para_structure:n { \PARALABEL }
- }
- }
-}
-\cs_new_protected:Npn \__block_start_para_structure:n #1 {
- \__block_debug_typeout:n
- { @endpe = \legacy_if:nTF { @endpe }{true}{false}
- \on at line }
- \legacy_if:nF { @endpe }
- {
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_begin_int
- \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
- }
- }
- \int_gincr:N \g__tag_para_begin_int
- \__block_debug_typeout:n{increment~ P \on at line }
- \tag_struct_begin:n
- {
- tag=\l__tag_para_tag_tl
- ,attribute-class=\l_tag_para_attr_class_tl
- }
- \__tag_check_para_begin_show:nn {green}{#1}
- \tag_mc_begin:n {}
-}
-\cs_new_protected:Npn \__block_start_para_structure_unconditionally:n #1 {
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_begin_int
- \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
- }
- \int_gincr:N \g__tag_para_begin_int
- \__block_debug_typeout:n{increment~ P \on at line }
- \tag_struct_begin:n
- {
- tag=\l__tag_para_tag_tl
- ,attribute-class=\l_tag_para_attr_class_tl
- }
- \__tag_check_para_begin_show:nn {green}{#1}
- \tag_mc_begin:n {}
-}
-\tag_if_active:T {
-}
-\RemoveFromHook{para/end}[tagpdf]
-\AddToHook{para/end}
- {
- \bool_if:NT \l__tag_para_bool
- {
- \int_gincr:N \g__tag_para_end_int
- \__block_debug_typeout:n{increment~ /P \on at line }
- \tag_mc_end:
- \__tag_check_para_end_show:nn {red}{}
- \tag_struct_end:
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tag_struct_end:
- }
- }
- }
-\def\PARALABEL{NP-}
-\cs_set_protected:Npn \para_end: {
- \scan_stop:
- \mode_if_horizontal:TF {
- \mode_if_inner:F {
- \tex_unskip:D
- \hook_use:n{para/end}
- \@kernel at after@para at end
- \mode_if_horizontal:TF {
- \if_int_compare:w 11 = \tex_lastnodetype:D
- \tex_hskip:D \c_zero_dim
- \fi:
- \tex_par:D
- \hook_use:n{para/after}
- \@kernel at after@para at after
- }
- { \msg_error:nnnn { hooks }{ para-mode }{end}{horizontal} }
- }
- }
- {
- \__kernel_endpe_vmode: % should do nothing if no tagging
- \tex_par:D
- }
-}
-\cs_set_eq:NN \par \para_end:
-\cs_set_eq:NN \__blockpar \para_end:
-\cs_set_eq:NN \endgraf \para_end:
-\DeclareRobustCommand*\begin[1]{%
- \UseHook{env/#1/before}%
- \@ifundefined{#1}%
- {\def\reserved at a{\@latex at error{Environment #1 undefined}\@eha}}%
- {\def\reserved at a{\def\@currenvir{#1}%
- \edef\@currenvline{\on at line}%
- \@execute at begin@hook{#1}%
- \csname #1\endcsname}}%
- \@ignorefalse
- \begingroup
- \__kernel_endpe_vmode:
- \reserved at a}
-\cs_new:Npn \__kernel_endpe_vmode: {
- \if at endpe \ifvmode
- \bool_if:NT \l__tag_para_bool
-{
- \bool_if:NF \l__tag_para_flattened_bool
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tag_struct_end:
- }
- \@endpefalse
-}
- \fi \fi
-}
-\cs_set:Npn \__kernel_list_label_after: {
- \bool_if:NT \l__tag_para_bool
- {
- \__block_start_para_structure_unconditionally:n { LI- }
- }
-}
-\cs_new:Npn \__block_inner_begin: {
- \tagstructbegin{tag=\l__block_tag_inner_tag_tl}
-}
-\cs_new:Npn \__block_inner_end: {
- \__block_debug_typeout:n{block-end \on at line}
- \legacy_if:nT { @endpe }
- {
- \int_gincr:N \g__tag_para_main_end_int
- \__block_debug_typeout:n{close~ /text-unit \on at line}
- \tagstructend
- }
- \tagstructend % end inner structure
-}
-\tl_new:N \l__tag_L_tag_tl
-\tl_set:Nn \l__tag_L_tag_tl {L}
-
-\tl_new:N\l__tag_L_attr_class_tl
-\tl_set:Nn \l__tag_L_attr_class_tl {list}
-\tag_if_active:T
-{
- \tagpdfsetup
- {
- % default if unknown
- newattribute = {list}{/O /List /ListNumbering/None},
- newattribute = {itemize}{/O /List /ListNumbering/Unordered},
- newattribute = {enumerate}{/O /List /ListNumbering/Ordered},
- newattribute = {description}{/O /List /ListNumbering/Description},
- }
-}
-\def\LItag{LI}
-\cs_set:Npn \__block_list_begin: {
- \tagstructbegin
- {
- tag=\l__tag_L_tag_tl
- ,attribute-class=\l__tag_L_attr_class_tl
- }
-}
-\cs_set:Npn \__block_list_item_begin: { \tagstructbegin{tag=\LItag} }
-\cs_set:Npn \__kernel_list_label_begin: {
- \tagstructbegin{tag=Lbl}
- \tagmcbegin{tag=Lbl}
-}
-\cs_set:Npn \__kernel_list_label_end: {
- \tagmcend % end mc-Lbl or artifact
- \tagstructend % end Lbl
- \tagstructbegin{tag=\LBody}
-}
-\def\LBody{LBody}
-\cs_set:Npn \__block_list_item_end: {
- \legacy_if:nT { @endpe }
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tagstructend % text-unit
- }
- \tagstructend \tagstructend % end LBody, LI
-}
-\cs_set:Npn \__block_list_end: {
- \legacy_if:nT { @endpe }
- {
- \int_gincr:N \g__tag_para_main_end_int
- \tagstructend % text-unit
- \__block_debug_typeout:n{Structure-end~ P~ at~ list-end \on at line }
- }
- \tagstructend\tagstructend % end LBody, LI
- \tagstructend % end L
-}
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\endinput
-%%
-%% End of file `latex-lab-testphase-block-tagging.sty'.
Added: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block.sty (rev 0)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,1439 @@
+%%
+%% This is file `latex-lab-testphase-block.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% latex-lab-block.dtx (with options: `package')
+%%
+%% This is a generated file.
+%%
+%% Copyright 2021-2023 LaTeX Project
+%%
+%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
+%% ------------------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
+%% without such generated files.
+%%
+%% The newest sources can be found below
+%%
+%% https://github.com/latex3/latex2e/required/latex-lab
+%%
+%% where one can also log issues in case there are any.
+%%
+%%
+%% File: latex-lab-block.dtx (C) Copyright 2021-2023 LaTeX Project
+\def\ltlabblockdate{2023-09-01}
+\def\ltlabblockversion{0.8h}
+\ProvidesPackage {latex-lab-testphase-block}
+ [\ltlabblockdate\space v\ltlabblockversion\space
+ blockenv implementation]
+\RequirePackage{xtemplate}
+\RequirePackage{latex-lab-kernel-changes}
+\ExplSyntaxOn
+\tl_new:N \l__block_item_align_tl
+\tl_new:N\l__block_legacy_env_params_tl
+
+\def\@doendpe{\@endpetrue
+ \def\par
+ {
+ \@restorepar
+ \clubpenalty\@clubpenalty
+ \__kernel_displayblock_doendpe:
+ \@endpefalse
+ \everypar{}
+ \par
+ }
+ \everypar{{\setbox\z@\lastbox}
+ \everypar{}
+ \@endpefalse
+ }
+}
+\cs_new_eq:NN \__kernel_displayblock_doendpe: \prg_do_nothing:
+\def\@endpetrue {\global\let\if at endpe\iftrue}
+\def\@endpefalse{\global\let\if at endpe\iffalse}
+\DeclareObjectType{blockenv}{1}
+\DeclareObjectType{block}{1}
+\DeclareObjectType{para}{1}
+\DeclareObjectType{list}{1}
+\DeclareObjectType{item}{1}
+\DeclareTemplateInterface{blockenv}{display}{1}
+{
+ env-name : tokenlist ,
+ tag-name : tokenlist ,
+ tag-class : tokenlist ,
+ tagging-recipe : tokenlist = standard,
+ level-increase : boolean = true ,
+ setup-code : tokenlist ,
+ block-instance : tokenlist = displayblock ,
+ para-instance : tokenlist ,
+ inner-level-counter : tokenlist,
+ max-inner-levels : tokenlist = 4,
+ inner-instance-type : tokenlist = list ,
+ inner-instance : tokenlist ,
+ para-flattened : boolean = false ,
+ final-code : tokenlist = \ignorespaces ,
+}
+\DeclareTemplateInterface{block}{display}{1}
+{
+ heading : tokenlist = , %??
+ beginsep : skip = \topsep ,
+ begin-par-skip : skip = \partopsep ,
+ par-skip : skip = \parsep ,
+ end-skip : skip = \KeyValue{beginsep} , % conflict with name below
+ end-par-skip : skip = \KeyValue{begin-par-skip} ,
+ beginpenalty : integer = \UseName{@beginparpenalty} ,
+ endpenalty : integer = \UseName{@endparpenalty} ,
+ leftmargin : length = \leftmargin ,
+ rightmargin : length = \rightmargin ,
+ parindent : length = \listparindent ,
+}
+\DeclareTemplateInterface{para}{std}{1}
+{
+ indent-width : length = \parindent ,
+ start-skip : skip = 0pt ,
+ left-skip : skip = 0pt ,
+ right-skip : skip = 0pt ,
+ end-skip : skip = \@flushglue ,
+ fixed-word-spaces : boolean = false ,
+ final-hyphen-demerits : integer = 5000 ,
+ cr-cmd : tokenlist = \@normalcr ,
+ para-class : tokenlist = justify ,
+}
+\DeclareTemplateInterface{list}{std}{1} % optional
+{
+ counter : tokenlist = ,
+ item-label : tokenlist = ,
+ start : integer = 1 ,
+ resume : boolean = false ,
+ item-instance : instance{item} = basic ,
+ item-skip : skip = \itemsep ,
+ item-penalty : integer = \UseName{@itempenalty} ,
+ item-indent : length = 0pt , % was \itemindent
+ label-width : length = \labelwidth ,
+ label-sep : length = \labelsep ,
+ legacy-support : boolean = false ,
+}
+\DeclareTemplateInterface{item}{std}{1}
+ {
+ counter-label : function{1} = \arabic{#1} ,
+ counter-ref : function{1} = \KeyValue{counter-label} ,
+ label-ref : function{1} = #1 ,
+ label-autoref : function{1} = item~#1 ,
+ label-format : function{1} = #1 ,
+ label-strut : boolean = false ,
+ label-align : choice {left,center,right,parleft} = right ,
+ label-boxed : boolean = true ,
+ next-line : boolean = false ,
+ text-font : tokenlist ,
+ compatibility : boolean = true ,
+ }
+\cs_new_protected:Npn \__block_skip_set_to_last:N #1 {
+ \skip_set:Nn #1 { \tex_lastskip:D }
+}
+\cs_new_eq:NN \__block_skip_remove_last: \tex_unskip:D
+\cs_generate_variant:Nn \tl_if_novalue:nTF { o }
+\bool_new:N \g__block_debug_bool
+\cs_new_eq:NN \__block_debug:n \use_none:n
+\cs_new_eq:NN \__block_debug_typeout:n \use_none:n
+\cs_new_protected:Npn \block_debug_on:
+ {
+ \bool_gset_true:N \g__block_debug_bool
+ \__block_debug_gset:
+ }
+\cs_new_protected:Npn \block_debug_off:
+ {
+ \bool_gset_false:N \g__block_debug_bool
+ \__block_debug_gset:
+ }
+\cs_new_protected:Npn \__block_debug_gset:
+ {
+ \cs_gset_protected:Npx \__block_debug:n ##1
+ { \bool_if:NT \g__block_debug_bool {##1} }
+ \cs_gset_protected:Npx \__block_debug_typeout:n ##1
+ { \bool_if:NT \g__block_debug_bool { \typeout{==>~ ##1} } }
+ }
+\cs_new_protected:Npn \DebugBlocksOn { \block_debug_on: }
+\cs_new_protected:Npn \DebugBlocksOff { \block_debug_off: }
+\DebugBlocksOff
+\NewDocumentEnvironment{displayblock}{ !O{} }
+ { \UseInstance{blockenv}{displayblock} {#1} }
+ { \endblockenv }
+\NewDocumentEnvironment{displayblockflattened}{ !O{} }
+ { \UseInstance{blockenv}{displayblockflattened} {#1} }
+ { \endblockenv }
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{center} { !O{} }
+ { \UseInstance{blockenv}{center}{#1} }
+ { \endblockenv }
+ \RenewDocumentEnvironment{flushright} { !O{} }
+ { \UseInstance{blockenv}{flushright}{#1} }
+ { \endblockenv }
+ \RenewDocumentEnvironment{flushleft} { !O{} }
+ { \UseInstance{blockenv}{flushleft}{#1} }
+ { \endblockenv }
+}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{quote}{ !O{} }
+ { \UseInstance{blockenv}{quote} {#1} }
+ { \endblockenv }
+ \RenewDocumentEnvironment{quotation}{ !O{} }
+ { \UseInstance{blockenv}{quotation} {#1} }
+ { \endblockenv }
+}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{verbatim}{ !O{} }
+ { \UseInstance{blockenv}{verbatim} {#1}
+ \@setupverbinvisiblespace\frenchspacing\@vobeyspaces
+ \@xverbatim
+ }
+ { \endblockenv }
+ \RenewDocumentEnvironment{verbatim*}{ !O{} }
+ { \UseInstance{blockenv}{verbatim} {#1}
+ \@setupverbvisiblespace\frenchspacing\@vobeyspaces
+ \@sxverbatim
+ }
+ { \endblockenv }
+}
+\def\legacyverbatimsetup{%
+ \language\l at nohyphenation
+ \@tempswafalse
+ \def\par{%
+ \if at tempswa
+ \leavevmode \null {\@@par}\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode{\@@par}\penalty\interlinepenalty\fi
+ \fi}%
+ \let\do\@makeother \dospecials
+ \obeylines \verbatim at font \@noligs
+ \everypar \expandafter{\the\everypar \unpenalty}%
+ \tl_set:Nn \l__tag_para_main_tag_tl {codeline}
+ \tagtool{paratag=Code}% oder faster: \tl_set:Nn\l__tag_para_tag_tl{Code}
+}
+\newcommand\@setupverbinvisiblespace{}
+\tag_if_active:T {
+ \bool_if:NF\g__tag_mode_lua_bool
+ {
+ \renewcommand\@setupverbinvisiblespace{\def\@xobeysp{\nobreakspace\pdffakespace}}
+ }
+}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{itemize}{!O{}}
+ { \UseInstance{blockenv}{itemize} {#1} }
+ { \endblockenv }
+ \RenewDocumentEnvironment{enumerate}{!O{}}
+ { \UseInstance{blockenv}{enumerate} {#1} }
+ { \endblockenv }
+ \RenewDocumentEnvironment{description}{!O{}}
+ { \UseInstance{blockenv}{description} {#1} }
+ { \endblockenv }
+}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{verse}{ !O{} }
+ {
+ \let\\\@centercr
+ \UseInstance{blockenv}{list}
+ {
+ item-indent=-1.5em,
+ parindent=-1.5em,
+ item-skip=0pt,
+ rightmargin=\leftmargin,
+ leftmargin=\leftmargin+1.5em,
+ #1
+ }
+ \item\relax
+ }
+ { \endblockenv }
+ }
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{list}{O{} m m }
+ {
+ \tl_set:Nn \@itemlabel {#2}
+ \tl_set:Nn \l__block_legacy_env_params_tl {#3}
+ \UseInstance{blockenv}{list} {#1}
+ }
+ { \endblockenv }
+}
+\tl_new:N \l__block_env_params_tl
+\cs_new:Npn \legacylistsetupcode {
+ \dim_zero:N \listparindent
+ \dim_zero:N \rightmargin
+ \dim_zero:N \itemindent
+ \tl_set:Nn \@listctr {}
+ \legacy_if_set_false:n { @nmbrlist } % needed if lists are nested
+ \let\makelabel\@mklab % TODO: customize
+ \l__block_legacy_env_params_tl
+ \legacy_if:nTF { @nmbrlist }
+ { \tl_set:Nn \l__tag_L_attr_class_tl {enumerate} } % numbered list
+ { \tl_if_empty:NTF \@itemlabel
+ { \tl_set:Nn \l__tag_L_attr_class_tl {list} } % no label
+ { \tl_set:Nn \l__tag_L_attr_class_tl {itemize} } % unnumbered, unordered
+ }
+}
+\AddToHook{begindocument/before}{
+ \RenewDocumentEnvironment{trivlist}{ !O{} }
+ { \list[#1]{}
+ {
+ \dim_zero:N \leftmargin
+ \dim_zero:N \labelwidth
+ \cs_set_eq:NN \makelabel \use:n
+ }
+ }
+ { \endblockenv }
+}
+\RenewDocumentCommand \newtheorem { m O{#1} m o }
+{
+ \expandafter\@ifdefinable\csname #1\endcsname
+ {
+ \str_if_eq:nnTF{#1}{#2}
+ {
+ \@definecounter {#2}
+ \IfNoValueTF {#4}
+ { % @ynthm
+ \tl_gset:cx { the #2 }
+ {
+ \@thmcounter{#2}
+ }
+ }
+ { % @xnthm
+ \@newctr{#1}[#4]
+ \tl_gset:cx { the #2 }
+ {
+ \expandafter\noexpand\csname the#4\endcsname
+ \@thmcountersep
+ \@thmcounter{#2}
+ }
+ }
+ }
+ { % @othm
+ \@ifundefined{c@#2}
+ { \@nocounterr{#2} }
+ {
+ \tl_gset:cn { the #1 }
+ { \UseName { the #2 } }
+ }
+ }
+ \global\@namedef{#1} { \@thm{#2}{#3} }
+ \global\@namedef{end#1}{ \@endtheorem }
+ }
+}
+\tl_new:N \l__block_thm_current_counter_tl
+\def\@thm#1#2{%
+ \@kernel at refstepcounter{#1}
+ \tl_set:Nn \l__block_thm_current_counter_tl{#1}
+ \@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}}
+\def\hyper at nopatch@thm{}
+\def\@begintheorem#1#2{
+ \UseInstance{blockenv}{theorem}{}
+ \tagpdfparaOff
+ \mode_leave_vertical:
+ \MakeLinkTarget{\l__block_thm_current_counter_tl}
+ \tag_struct_begin:n{tag=Caption}
+ \group_begin:
+ \bfseries
+ \tag_mc_begin:n {}
+ #1\
+ \tag_mc_end:
+ \tag_struct_begin:n{tag=Lbl}
+ \tag_mc_begin:n {}
+ #2
+ \tag_mc_end:
+ \tag_struct_end:
+ \group_end:
+ \tag_struct_end:
+ \tagpdfparaOn
+ \__block_start_para_structure_unconditionally:n { \PARALABEL }
+ \itshape
+ \hskip\labelsep
+ \ignorespaces
+}
+\def\@opargbegintheorem#1#2#3{
+ \UseInstance{blockenv}{theorem}{}
+ \tagpdfparaOff
+ \mode_leave_vertical:
+ \MakeLinkTarget{\l__block_thm_current_counter_tl}
+ \tag_struct_begin:n{tag=Caption}
+ \group_begin:
+ \bfseries
+ \tag_mc_begin:n {}
+ #1\
+ \tag_mc_end:
+ \tag_struct_begin:n{tag=Lbl}
+ \tag_mc_begin:n {}
+ #2
+ \tag_mc_end:
+ \tag_struct_end:
+ \tag_mc_begin:n {}
+ \ (#3)
+ \tag_mc_end:
+ \group_end:
+ \tag_struct_end:
+ \tagpdfparaOn
+ \__block_start_para_structure_unconditionally:n { \PARALABEL }
+ \itshape
+ \hskip\labelsep
+ \ignorespaces
+}
+\def\@endtheorem{\endblockenv}
+\cs_new:Npn \g_block_nesting_depth_int { \@listdepth } % a fake int
+ % for now
+\DeclareTemplateCode{blockenv}{display}{1}
+{
+ env-name = \l__block_env_name_tl ,
+ tag-name = \l__block_tag_name_tl ,
+ tag-class = \l__block_tag_class_tl ,
+ tagging-recipe = \l__block_tagging_recipe_tl ,
+ level-increase = \l__block_level_incr_bool ,
+ setup-code = \l__block_setup_code_tl ,
+ block-instance = \l__block_block_instance_tl ,
+ para-instance = \l__block_para_instance_tl ,
+ inner-level-counter = \l__block_inner_level_counter_tl ,
+ max-inner-levels = \l__block_max_inner_levels_tl ,
+ inner-instance-type = \l__block_inner_instance_type_tl ,
+ inner-instance = \l__block_inner_instance_tl ,
+ para-flattened = \l__tag_para_flattened_bool ,
+ final-code = \l__block_final_code_tl ,
+}
+{
+ \__block_debug_typeout:n{\l__block_env_name_tl -env-start}
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{blockenv}{display}{#1} }
+ % \begin{macrocode}
+ \int_compare:nNnTF \l__block_flattened_level_int > 0
+ {
+ \int_incr:N \l__block_flattened_level_int
+ }
+ {
+ \bool_if:NT \l__tag_para_flattened_bool
+ {
+ \int_incr:N \l__block_flattened_level_int
+ }
+ }
+ \tl_if_empty:NF \l__block_inner_level_counter_tl
+ {
+ \int_compare:nNnTF \l__block_inner_level_counter_tl >
+ { \l__block_max_inner_levels_tl - 1 }
+ { \@toodeep }
+ { \int_incr:N \l__block_inner_level_counter_tl } % not clean "o"?
+ }
+ \bool_if:NT \l__block_level_incr_bool
+ {
+ \int_compare:nNnTF \g_block_nesting_depth_int >
+ { \c at maxblocklevels - 1 }
+ { \@toodeep }
+ {
+ \int_gincr:N \g_block_nesting_depth_int
+ \use:c { @list \int_to_roman:n { \g_block_nesting_depth_int } }
+ }
+ }
+ \tag_if_active:T { \use:c { __block_recipe_ \l__block_tagging_recipe_tl : } }
+ \l__block_setup_code_tl
+ \__block_debug_typeout:n{use~ instance:~
+ \l__block_block_instance_tl - \int_use:N \g_block_nesting_depth_int }
+ \UseInstance{block}
+ { \l__block_block_instance_tl - \int_use:N
+ \g_block_nesting_depth_int }
+ {#1}
+ \tl_if_empty:NF \l__block_para_instance_tl
+ {
+ \__block_debug_typeout:n{use~ para~ instance:~ \l__block_para_instance_tl }
+ \UseInstance{para}{ \l__block_para_instance_tl } {}
+ }
+ \tl_if_empty:NF \l__block_inner_instance_tl
+ {
+ \__block_debug_typeout:n{use~ instance:~ \l__block_inner_instance_tl
+ \tl_if_empty:NF \l__block_inner_level_counter_tl
+ { - \int_use:N \l__block_inner_level_counter_tl }}
+ \UseInstance{ \l__block_inner_instance_type_tl }
+ { \l__block_inner_instance_tl
+ \tl_if_empty:NF \l__block_inner_level_counter_tl
+ { - \int_use:N \l__block_inner_level_counter_tl } % not clean
+ % use "o"?
+ }
+ {#1}
+ }
+ \l__block_final_code_tl
+}
+\int_new:N \l__block_flattened_level_int
+\newcounter{maxblocklevels}
+\setcounter{maxblocklevels}{6}
+\cs_new:Npn \endblockenv {
+ \__block_debug_typeout:n{blockenv~ common~ ending \on at line}
+ \bool_if:NT \l__block_level_incr_bool
+ { \int_gdecr:N \g_block_nesting_depth_int }
+ \legacy_if:nT { @inlabel }
+ {
+ \mode_leave_vertical:
+ \legacy_if_gset_false:n { @inlabel }
+ }
+ \legacy_if:nT { @newlist }
+ {
+ \@noitemerr
+ \legacy_if_gset_false:n { @newlist }
+ }
+ \mode_if_horizontal:TF
+ { \__block_skip_remove_last: \__block_skip_remove_last: \par }
+ { \@inmatherr{\end{\@currenvir}} }
+ \__kernel_displayblock_end:
+ \legacy_if:nF { @noparlist }
+ {
+ \__block_skip_set_to_last:N \l_tmpa_skip
+ \dim_compare:nNnT \l_tmpa_skip > \c_zero_dim
+ {
+ \skip_vertical:n { - \l_tmpa_skip }
+ \skip_vertical:n { \l_tmpa_skip + \parskip - \@outerparskip }
+ }
+ \addpenalty \@endparpenalty
+ \addvspace \l__block_topsepadd_skip
+ }
+ \socket_use:n {tagsupport/block-endpe}
+}
+\cs_new:Npn \__kernel_displayblock_end: {
+ \__block_debug_typeout:n{\detokenize{__kernel_displayblock_end:}}
+}
+\socket_new:nn {tagsupport/block-endpe}{0}
+\socket_new_plug:nnn{tagsupport/block-endpe}{on}
+ { \legacy_if_gset_true:n { @endpe } }
+\socket_new_plug:nnn{tagsupport/block-endpe}{off}
+ { \legacy_if_gset_false:n { @endpe } }
+\socket_assign_plug:nn{tagsupport/block-endpe}{on}
+\DeclareTemplateCode{para}{std}{1}
+{
+ indent-width = \parindent ,
+ start-skip = \l__par_start_skip , % name??
+ left-skip = \leftskip ,
+ right-skip = \rightskip ,
+ end-skip = \parfillskip ,
+ fixed-word-spaces = \l__par_fixed_word_spaces_bool , % name??
+ final-hyphen-demerits = \finalhyphendemerits ,
+ cr-cmd = \\ ,
+ para-class = \l_tag_para_attr_class_tl ,
+}
+{
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{para}{std}{#1} }
+ \skip_set:Nn \@rightskip \rightskip
+}
+\DeclareTemplateCode{block}{display}{1}
+{
+ heading = \l__block_heading_tl ,
+ beginsep = \topsep ,
+ begin-par-skip = \partopsep ,
+ par-skip = \parsep ,
+ end-skip = \l__block_botsep_skip ,
+ end-par-skip = \l__block_parbotsep_skip ,
+ beginpenalty = \@beginparpenalty ,
+ endpenalty = \@endparpenalty ,
+ rightmargin = \rightmargin ,
+ leftmargin = \leftmargin ,
+ parindent = \listparindent ,
+}
+{
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{block}{display}{#1} }
+ \tl_if_blank:oF \l__block_heading_tl
+ { \mode_leave_vertical: \textbf{\l__block_heading_tl} } % TODO customize
+ \legacy_if:nT { @noskipsec } { \mode_leave_vertical: }
+ \skip_set:Nn \l__block_topsepadd_skip { \topsep }
+ \mode_if_vertical:TF
+ {
+ \skip_add:Nn \l__block_topsepadd_skip { \partopsep }
+ \__kernel_displayblock_beginpar_vmode:
+ }
+ {
+ \__block_skip_remove_last: \__block_skip_remove_last:
+ \__kernel_displayblock_beginpar_hmode:w \par
+ }
+ \legacy_if:nTF { @inlabel }
+ {
+ \legacy_if_set_true:n { @noparitem }
+ \legacy_if_set_true:n { @noparlist }
+ }
+ {
+ \legacy_if:nT { @newlist } { \@noitemerr }
+ \legacy_if_set_false:n { @noparlist }
+ \skip_set_eq:NN \l__block_effective_top_skip \l__block_topsepadd_skip
+ }
+ \skip_add:Nn \l__block_effective_top_skip { \parskip }
+ \skip_zero:N \leftskip
+ \skip_set_eq:NN \rightskip \@rightskip
+ \skip_set_eq:NN \parfillskip \@flushglue
+ \int_zero:N \par at deathcycles
+ \@setpar
+ {
+ \legacy_if:nTF { @newlist }
+ {
+ \int_incr:N \par at deathcycles
+ \int_compare:nNnTF \par at deathcycles > { 1000 }
+ { \@noitemerr
+ { \para_end: }
+ }
+ }
+ {
+ { \para_end: }
+ }
+ }
+ \skip_set_eq:NN \@outerparskip \parskip
+ \skip_set_eq:NN \parskip \parsep
+ \dim_set_eq:NN \parindent \listparindent
+ \dim_add:Nn \linewidth { - \rightmargin - \leftmargin }
+ \dim_add:Nn \@totalleftmargin { \leftmargin }
+ \tex_parshape:D 1 ~ \@totalleftmargin \linewidth
+ \__kernel_displayblock_begin:
+ \legacy_if:nTF { @noparitem }
+ {
+ \legacy_if_set_false:n { @noparitem }
+ \hbox_gset:Nn \g__block_labels_box
+ {
+ \skip_horizontal:n { - \leftmargin }
+ \hbox_unpack_drop:N \g__block_labels_box
+ \skip_horizontal:n { \leftmargin }
+ }
+ \legacy_if:nF { @minipage } % Why this chunk of code?
+ {
+ \__block_skip_set_to_last:N \l__block_tmpa_skip
+ \skip_vertical:n { - \l__block_tmpa_skip }
+ \skip_vertical:n { \l__block_tmpa_skip + \@outerparskip - \parskip }
+ }
+ }
+ {
+ \legacy_if:nTF { @nobreak }
+ { \addvspace{\skip_eval:n{\@outerparskip-\parskip}} }
+ {
+ \addpenalty \@beginparpenalty
+ \addvspace \l__block_effective_top_skip
+ \addvspace{-\parskip}
+ }
+ }
+}
+\keys_define:nn { template/block/display }
+{
+ ,topsep .skip_set:N = \topsep
+ ,partopsep .skip_set:N = \partopsep
+ ,listparindent .skip_set:N = \listparindent
+}
+\cs_new:Npn \__kernel_displayblock_begin: {
+ \__block_debug_typeout:n{\detokenize{__kernel_displayblock_begin:}}
+}
+\cs_new:Npn \__kernel_displayblock_beginpar_hmode:w {
+ \__block_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_hmode:w}}
+}
+\cs_new:Npn \__kernel_displayblock_beginpar_vmode: {
+ \__block_debug_typeout:n{\detokenize{__kernel_displayblock_beginpar_vmode:}}
+}
+\tl_new:N \@itemlabel % should have a top-level definition
+\tl_new:N \@listctr % should have a top-level definition
+\DeclareTemplateCode{list}{std}{1}
+{
+ counter = \l__block_counter_tl,
+ item-label = \l__block_item_label_tl,
+ start = \l__block_counter_start_int ,
+ resume = \l__block_resume_bool ,
+ item-instance = \__block_item_instance:n ,
+ item-skip = \itemsep ,
+ item-penalty = \@itempenalty ,
+ item-indent = \itemindent ,
+ label-width = \labelwidth ,
+ label-sep = \labelsep ,
+ legacy-support = \l__block_legacy_support_bool , % FMi questionable
+}
+{
+ \__block_debug_typeout:n{template:list:std}
+ \tl_if_empty:nF {#1} { \SetTemplateKeys{list}{std}{#1} }
+ \tl_if_empty:NTF \l__block_counter_tl
+ {
+ \tl_if_blank:oF \@listctr
+ {
+ \bool_if:NF \l__block_resume_bool
+ {
+ \int_gset:cn{ c@ \@listctr }
+ { \l__block_counter_start_int - 1 }
+ }
+ }
+ { \@nmbrlistfalse }
+ }
+ {
+ \@nmbrlisttrue
+ \tl_set_eq:NN \@listctr \l__block_counter_tl
+ \bool_if:NF \l__block_resume_bool
+ {
+ \int_gset:cn{ c@ \@listctr }
+ { \l__block_counter_start_int - 1 }
+ }
+ }
+ \tl_if_empty:NF \l__block_item_label_tl
+ {
+ \tl_set_eq:NN \@itemlabel \l__block_item_label_tl
+ }
+ \legacy_if_gset_true:n { @newlist }
+ \__block_debug_typeout:n{template:list:std~end}
+}
+\keys_define:nn { template/list/std }
+{
+ ,nosep .code:n =
+ \dim_zero:N \itemsep
+ \dim_zero:N \parsep
+ \dim_zero:N \topsep
+ \dim_zero:N \l__block_botsep_skip
+ \dim_zero:N \l__block_parbotsep_skip
+ ,midsep .skip_set:N = \topsep
+}
+\keys_define:nn { template/item/std }
+ { label .tl_set:N = \l__block_label_given_tl }
+\DeclareTemplateCode{item}{std}{1}
+ {
+ counter-label = \__block_counter_label:n ,
+ counter-ref = \__block_counter_ref:n ,
+ label-ref = \__block_label_ref:n ,
+ label-autoref = \__block_label_autoref:n ,
+ label-format = \__block_label_format:n ,
+ label-strut = \l__block_label_strut_bool ,
+ label-boxed = \l__block_label_boxed_bool ,
+ next-line = \l__block_next_line_bool ,
+ text-font = \l__block_text_font_tl ,
+ compatibility = \l__block_item_compatibility_bool ,
+ label-align = {
+ left = \tl_set:Nn \l__block_item_align_tl { \relax \hss } ,
+ center = \tl_set:Nn \l__block_item_align_tl { \hss \hss } ,
+ right = \tl_set:Nn \l__block_item_align_tl { \hss \relax } ,
+ parleft = \NOT_IMPLEMENTED ,
+ } ,
+ }
+ {
+ \__block_debug_typeout:n{template:item:std}
+ \tl_set_eq:NN \l__block_label_given_tl \c_novalue_tl
+ \tl_if_empty:nF{#1}{ \SetTemplateKeys{item}{std}{#1} }
+ \tl_if_novalue:oTF \l__block_label_given_tl
+ {
+ \tl_if_blank:oF \@listctr { \@kernel at refstepcounter \@listctr }
+ \bool_if:NTF \l__block_item_compatibility_bool % not sure that conditional
+ % makes sense
+ { \__block_make_label_box:n { \MakeLinkTarget[\@listctr]{}\@itemlabel } } % TODO ?
+ { \__block_make_label_box:n { \MakeLinkTarget[\@listctr]{}\__block_counter_label:n { \@listctr } } }
+ }
+ {
+ \__block_debug_typeout:n{item~ with~ optional}
+ \__block_make_label_box:n { \l__block_label_given_tl } }
+ \bool_if:nT
+ {
+ \l__block_label_boxed_bool
+ && \dim_compare_p:n { \box_wd:N \l__block_one_label_box <= \linewidth } % TODO: is \linewidth correct?
+ }
+ {
+ \dim_compare:nNnT
+ { \box_wd:N \l__block_one_label_box } < \labelwidth
+ {
+ \hbox_set_to_wd:Nnn \l__block_one_label_box { \labelwidth }
+ {
+ \exp_after:wN \use_i:nn \l__block_item_align_tl
+ \box_use_drop:N \l__block_one_label_box
+ \exp_after:wN \use_ii:nn \l__block_item_align_tl
+ }
+ }
+ \hbox_set:Nn \l__block_one_label_box
+ { \box_use_drop:N \l__block_one_label_box }
+ }
+ \dim_compare:nNnTF { \box_wd:N \l__block_one_label_box } > \labelwidth
+ { \bool_set_true:N \l__block_long_label_bool }
+ { \bool_set_false:N \l__block_long_label_bool }
+ \hbox_gset:Nn \g__block_labels_box
+ {
+ \hbox_unpack_drop:N \g__block_labels_box
+ \skip_horizontal:n { \itemindent - \labelsep - \labelwidth }
+ \hbox_unpack_drop:N \l__block_one_label_box
+ \skip_horizontal:n { \labelsep }
+ \bool_if:NT \l__block_next_line_bool
+ { \bool_if:NT \l__block_long_label_bool { \nobreak \hfil \break } }
+ % version of \newline inside an hbox that will be unpacked
+ }
+ % \skip_set_eq:NN \parsep \l__block_item_parsep_skip TODO??? FMi
+ % what's that?
+ \dim_set_eq:NN \parindent \listparindent
+ \cs_set_eq:NN \__block_item_everypar: \__block_item_everypar_std:
+ }
+\box_new:N \l__block_one_label_box
+\box_new:N \g__block_labels_box
+\bool_new:N \l__block_long_label_bool
+\cs_new_protected:Npn \__block_make_label_box:n #1
+ {
+ \hbox_set:Nn \l__block_one_label_box
+ {
+ \__kernel_list_label_begin:
+ \__block_label_format:n
+ {
+ \bool_if:NT \l__block_label_strut_bool { \strut }
+ \bool_if:NTF \l__block_legacy_support_bool
+ \makelabel
+ \use:n
+ {#1}
+ }
+ \__kernel_list_label_end:
+ }
+ }
+\cs_new_eq:NN \__kernel_list_label_begin: \prg_do_nothing:
+\cs_new_eq:NN \__kernel_list_label_end: \prg_do_nothing:
+\cs_new_eq:NN \__block_item_everypar: \prg_do_nothing:
+\AddToHook{para/begin}[lists]{\__block_item_everypar:}
+\DeclareHookRule{para/begin}{lists}{after}{tagpdf}
+\cs_new_protected:Npn \__block_item_everypar_std: {
+ \__block_debug_typeout:n{item~ everypar \on at line }
+ \legacy_if_set_false:n { @minipage }
+ \legacy_if_gset_false:n { @newlist }
+ \legacy_if:nT { @inlabel }
+ {
+ \legacy_if_gset_false:n { @inlabel }
+ \box_if_empty:NT \g_para_indent_box { \kern - \itemindent }
+ \para_omit_indent:
+ \box_use_drop:N \g__block_labels_box
+ \__kernel_list_label_after:
+ \penalty \c_zero_int
+ }
+ \legacy_if:nTF { @nobreak }
+ {
+ \legacy_if_gset_false:n { @nobreak }
+ \int_set:Nn \clubpenalty { 10000 }
+ }
+ {
+ \int_set_eq:NN \clubpenalty \@clubpenalty
+ \cs_set_eq:NN \__block_item_everypar: \prg_do_nothing:
+ }
+}
+\cs_new_eq:NN \__kernel_list_label_after: \prg_do_nothing:
+\skip_new:N \l__block_tmpa_skip
+\skip_new:N \l__block_topsepadd_skip
+\skip_new:N \l__block_effective_top_skip
+\AddToHook{begindocument/before}{
+ \RenewDocumentCommand{\item}{ ={label}o }
+ {
+ \@inmatherr \item
+ \tl_if_empty:oTF \__block_item_instance:n %%FMi?
+ { \msg_error:nnn { __block } { item-in-nonlist } { \item[{#1}] } }
+ {
+ \legacy_if:nTF { @newlist }
+ { \__kernel_list_item_begin: }
+ { \__block_inter_item: }
+ \tl_if_novalue:nTF {#1} % avoids reparsing label={}
+ { \__block_item_instance:n { } }
+ { \__block_item_instance:n {#1} }
+ \legacy_if_gset_true:n { @inlabel }
+ \ignorespaces
+ }
+ }
+}
+\cs_new_protected:Npn \__block_inter_item: {
+ \legacy_if:nT { @inlabel }
+ { \indent \par } % case of \item\item
+ \mode_if_horizontal:T { \__block_skip_remove_last:
+ \__block_skip_remove_last: \par }
+ \__kernel_list_item_end:
+ \__kernel_list_item_begin:
+ \addpenalty \@itempenalty
+ \addvspace \itemsep
+}
+\cs_new_eq:NN \__kernel_list_item_begin: \prg_do_nothing:
+\cs_new_eq:NN \__kernel_list_item_end: \prg_do_nothing:
+\cs_new:Npn \__block_recipe_basic: {
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \__block_beginpar_hmode:N
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \__block_beginpar_vmode:
+ \let \__kernel_displayblock_begin: \prg_do_nothing:
+ \let \__kernel_displayblock_end: \prg_do_nothing:
+ \socket_assign_plug:nn{tagsupport/block-endpe}{on}
+}
+\cs_new:Npn \__block_recipe_standalone: {
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \prg_do_nothing:
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \prg_do_nothing:
+ \cs_set_eq:NN \__kernel_displayblock_begin: \__block_inner_begin:
+ \cs_set_eq:NN \__kernel_displayblock_end: \__block_inner_end:
+ \socket_assign_plug:nn{tagsupport/block-endpe}{off}
+ \tl_if_empty:NTF \l__block_tag_name_tl
+ { \tl_set:Nn \l__block_tag_inner_tag_tl {Sect} }
+ { \tl_set_eq:NN \l__block_tag_inner_tag_tl \l__block_tag_name_tl }
+}
+\cs_new:Npn \__block_recipe_standard:
+{
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \__block_beginpar_hmode:N
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \__block_beginpar_vmode:
+ \cs_set_eq:NN \__kernel_displayblock_begin: \__block_inner_begin:
+ \cs_set_eq:NN \__kernel_displayblock_end: \__block_inner_end:
+ \socket_assign_plug:nn{tagsupport/block-endpe}{on}
+ \tl_if_empty:NTF \l__block_tag_name_tl
+ { \tl_set:Nn \l__block_tag_inner_tag_tl {Figure} }
+ { \tl_set_eq:NN \l__block_tag_inner_tag_tl \l__block_tag_name_tl }
+}
+\tl_new:N \l__block_tag_inner_tag_tl
+\cs_new:Npn \__block_recipe_list:
+{
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_hmode:w
+ \__block_beginpar_hmode:N
+ \cs_set_eq:NN \__kernel_displayblock_beginpar_vmode:
+ \__block_beginpar_vmode:
+ \cs_set_eq:NN \__kernel_displayblock_begin: \__block_list_begin:
+ \cs_set_eq:NN \__kernel_displayblock_end: \__block_list_end:
+ \cs_set_eq:NN \__kernel_list_item_begin: \__block_list_item_begin:
+ \cs_set_eq:NN \__kernel_list_item_end: \__block_list_item_end:
+ \socket_assign_plug:nn{tagsupport/block-endpe}{on}
+ \tl_if_empty:NTF \l__block_tag_name_tl
+ { \tl_set:Nn \l__tag_L_tag_tl {L} }
+ { \tl_set_eq:NN \l__tag_L_tag_tl \l__block_tag_name_tl }
+ \tl_if_empty:NTF \l__block_tag_class_tl
+ { \tl_set:Nn \l__tag_L_attr_class_tl {} }
+ { \tl_set_eq:NN \l__tag_L_attr_class_tl \l__block_tag_class_tl }
+}
+
+\DeclareInstance{blockenv}{displayblock}{display}
+{
+ env-name = displayblock,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ inner-instance = ,
+}
+\DeclareInstance{blockenv}{displayblockflattened}{display}
+{
+ env-name = displayblockflattened,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ inner-instance = ,
+}
+\DeclareInstance{blockenv}{center}{display}
+{
+ env-name = center,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ para-instance = center ,
+ inner-instance = ,
+}
+\DeclareInstance{blockenv}{flushleft}{display}
+{
+ env-name = flushleft,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ para-instance = raggedright ,
+ inner-instance = ,
+}
+\DeclareInstance{blockenv}{flushright}{display}
+{
+ env-name = flushleft,
+ tag-name = ,
+ tag-class = ,
+ tagging-recipe = basic,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+ para-flattened = true ,
+ para-instance = raggedleft ,
+ inner-instance = ,
+}
+ %
+\DeclareInstance{blockenv}{quotation}{display}
+{
+ env-name = quotation,
+ tag-name = quotation,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = true,
+ setup-code = ,
+ block-instance = quotationblock ,
+ inner-instance = ,
+}
+\DeclareInstance{blockenv}{quote}{display}
+{
+ env-name = quote,
+ tag-name = quote,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = true,
+ setup-code = ,
+ block-instance = quoteblock ,
+ inner-instance = ,
+}
+
+\DeclareInstance{blockenv}{theorem}{display}
+{
+ env-name = theorem-like,
+ tag-name = theorem-like,
+ tag-class = ,
+ tagging-recipe = standalone,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = displayblock ,
+}
+\DeclareInstance{blockenv}{verbatim}{display}
+{
+ env-name = verbatim,
+ tag-name = verbatim,
+ tag-class = ,
+ tagging-recipe = standard,
+ inner-level-counter = ,
+ level-increase = false,
+ setup-code = ,
+ block-instance = verbatimblock ,
+ inner-instance = ,
+ final-code = \legacyverbatimsetup ,
+}
+\DeclareInstance{blockenv}{itemize}{display}
+{
+ env-name = itemize,
+ tag-name = itemize,
+ tag-class = itemize,
+ tagging-recipe = list,
+ inner-level-counter = \@itemdepth,
+ level-increase = true,
+ max-inner-levels = 4,
+ setup-code = ,
+ block-instance = list ,
+ inner-instance = itemize ,
+}
+\DeclareInstance{blockenv}{enumerate}{display}
+{
+ env-name = enumerate,
+ tag-name = enumerate,
+ tag-class = enumerate,
+ tagging-recipe = list,
+ level-increase = true,
+ setup-code = ,
+ block-instance = list ,
+ inner-level-counter = \@enumdepth,
+ max-inner-levels = 4,
+ inner-instance = enum ,
+}
+
+\DeclareInstance{blockenv}{description}{display}
+{
+ env-name = description,
+ tag-name = description,
+ tag-class = description,
+ tagging-recipe = list,
+ inner-level-counter = ,
+ level-increase = true,
+ setup-code = ,
+ block-instance = list ,
+ inner-instance = description ,
+}
+\DeclareInstance{blockenv}{list}{display}
+{
+ env-name = list,
+ tag-name = list,
+ tag-class = ,
+ tagging-recipe = list,
+ level-increase = true,
+ setup-code = \legacylistsetupcode ,
+ block-instance = list ,
+ inner-level-counter = ,
+ inner-instance = legacy ,
+}
+\setcounter{maxblocklevels}{6}
+\DeclareInstance{block}{displayblock-0}{display}
+ {
+ leftmargin = 0pt ,
+ parindent = 0pt ,
+ }
+\DeclareInstanceCopy{block}{displayblock-1}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-2}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-3}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-4}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-5}{displayblock-0}
+\DeclareInstanceCopy{block}{displayblock-6}{displayblock-0}
+\DeclareInstance{block}{verbatimblock-0}{display}
+ {
+ leftmargin = 0pt ,
+ parindent = 0pt ,
+ par-skip = 0pt ,
+ }
+\DeclareInstanceCopy{block}{verbatimblock-1}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-2}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-3}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-4}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-5}{verbatimblock-0}
+\DeclareInstanceCopy{block}{verbatimblock-6}{verbatimblock-0}
+\DeclareInstance{block}{quoteblock-1}{display}
+ { rightmargin = \KeyValue{leftmargin} }
+\DeclareInstanceCopy{block}{quoteblock-2}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-3}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-4}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-5}{quoteblock-1}
+\DeclareInstanceCopy{block}{quoteblock-6}{quoteblock-1}
+\DeclareInstance{block}{quotationblock-1}{display}
+ { parindent = 1.5em , rightmargin = \KeyValue{leftmargin} }
+\DeclareInstanceCopy{block}{quotationblock-2}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-3}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-4}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-5}{quotationblock-1}
+\DeclareInstanceCopy{block}{quotationblock-6}{quotationblock-1}
+\DeclareInstance{block}{list-1}{display}{
+}
+\DeclareInstance{block}{list-2}{display}{}
+\DeclareInstance{block}{list-3}{display}{}
+\DeclareInstance{block}{list-4}{display}{}
+\DeclareInstance{block}{list-5}{display}{}
+\DeclareInstance{block}{list-6}{display}{}
+\DeclareInstance{list}{itemize-1}{std}{ item-label = \labelitemi }
+\DeclareInstance{list}{itemize-2}{std}{ item-label = \labelitemii }
+\DeclareInstance{list}{itemize-3}{std}{ item-label = \labelitemiii }
+\DeclareInstance{list}{itemize-4}{std}{ item-label = \labelitemiv }
+\DeclareInstance{list}{enum-1}{std}
+ { item-label = \labelenumi , counter = enumi }
+\DeclareInstance{list}{enum-2}{std}
+ { item-label = \labelenumii , counter = enumii }
+\DeclareInstance{list}{enum-3}{std}
+ { item-label = \labelenumiii , counter = enumiii }
+\DeclareInstance{list}{enum-4}{std}
+ { item-label = \labelenumiv , counter = enumiv }
+\DeclareInstance{list}{legacy}{std} {
+ item-instance = basic ,
+ legacy-support = true ,
+}
+\DeclareInstance{list}{description}{std} { item-instance = description }
+\DeclareInstance{item}{basic}{std}
+ {
+ label-align = right ,
+ }
+\DeclareInstance{item}{description}{std}
+ {
+ label-format = \normalfont\bfseries #1 ,
+ }
+\tag_if_active:T
+{
+ \tagpdfsetup
+ {
+ newattribute = {justify} {/O /Layout /TextAlign/Justify},
+ newattribute = {center} {/O /Layout /TextAlign/Center},
+ newattribute = {raggedright}{/O /Layout /TextAlign/Start},
+ newattribute = {raggedleft} {/O /Layout /TextAlign/End},
+ }
+}
+\DeclareInstance{para}{center}{std}
+{
+ indent-width = 0pt ,
+ start-skip = 0pt ,
+ left-skip = \@flushglue ,
+ right-skip = \@flushglue ,
+ end-skip = \z at skip ,
+ final-hyphen-demerits = 0 ,
+ cr-cmd = \@centercr ,
+ para-class = center ,
+}
+\DeclareInstance{para}{raggedright}{std}
+{
+ indent-width = 0pt ,
+ start-skip = 0pt ,
+ left-skip = \z at skip ,
+ right-skip = \@flushglue ,
+ end-skip = \z at skip ,
+ final-hyphen-demerits = 0 ,
+ cr-cmd = \@centercr ,
+ para-class = raggedright ,
+}
+\DeclareInstance{para}{raggedleft}{std}
+{
+ indent-width = 0pt ,
+ start-skip = 0pt ,
+ left-skip = \@flushglue ,
+ right-skip = \z at skip ,
+ end-skip = \z at skip ,
+ final-hyphen-demerits = 0 ,
+ cr-cmd = \@centercr ,
+ para-class = raggedleft ,
+}
+\DeclareInstance{para}{justify}{std}
+{
+ start-skip = 0pt ,
+ left-skip = \z at skip ,
+ right-skip = \z at skip ,
+ end-skip = \@flushglue ,
+ final-hyphen-demerits = 5000 ,
+ cr-cmd = \@normalcr ,
+ para-class = justify ,
+}
+\DeclareRobustCommand\centering {\UseInstance{para}{center}{}}
+\DeclareRobustCommand\raggedleft {\UseInstance{para}{raggedleft}{}}
+\DeclareRobustCommand\raggedright{\UseInstance{para}{raggedright}{}}
+\DeclareRobustCommand\justifying {\UseInstance{para}{justify}{}}
+
+\justifying
+\tag_if_active:TF {
+ \cs_set:Npn \__block_beginpar_vmode: {
+ \__block_debug_typeout:n
+ { @endpe = \legacy_if:nTF { @endpe }{true}{false}
+ \on at line }
+ \legacy_if:nTF { @endpe }
+ {
+ \legacy_if_gset_false:n { @endpe }
+ }
+ {
+ \int_compare:nNnT \l__block_flattened_level_int < 2
+ {
+ \int_gincr:N \g__tag_para_main_begin_int
+ \tagstructbegin{tag=\l__tag_para_main_tag_tl}
+ }
+ }
+ }
+ \cs_set:Npn \__block_beginpar_hmode:N #1
+ {
+ \tag_mc_end:
+ \int_gincr:N \g__tag_para_end_int
+ \__block_debug_typeout:n{increment~ /P \on at line }
+ \bool_if:NT \l__tag_para_show_bool
+ { \tag_mc_begin:n{artifact}
+ \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
+ \tag_mc_end:
+ }
+ \tag_struct_end:
+ \tagpdfparaOff \par \tagpdfparaOn
+ }
+\cs_set:Npn \__kernel_displayblock_doendpe: {
+ \bool_if:NT \l__tag_para_bool
+ {
+ \legacy_if:nT { @endpe }
+ {
+ \__block_debug_typeout:n
+ { flattened= \bool_if:NTF
+ \l__tag_para_flattened_bool {true}{false}
+ \on at line }
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \__block_debug_typeout:n{Structure-end~
+ \l__tag_para_main_tag_tl\space after~ displayblock \on at line }
+ \int_gincr:N \g__tag_para_main_end_int
+ \tag_struct_end: %text-unit
+ }
+ }
+ }
+}
+\RemoveFromHook{para/begin}[tagpdf]
+\AddToHook{para/begin}[tagpdf]{
+ \bool_if:NT \l__tag_para_bool {
+ \legacy_if:nF { @inlabel }
+ {
+ \__block_start_para_structure:n { \PARALABEL }
+ }
+ }
+}
+\cs_new_protected:Npn \__block_start_para_structure:n #1 {
+ \__block_debug_typeout:n
+ { @endpe = \legacy_if:nTF { @endpe }{true}{false}
+ \on at line }
+ \legacy_if:nF { @endpe }
+ {
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_begin_int
+ \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
+ }
+ }
+ \int_gincr:N \g__tag_para_begin_int
+ \__block_debug_typeout:n{increment~ P \on at line }
+ \tag_struct_begin:n
+ {
+ tag=\l__tag_para_tag_tl
+ ,attribute-class=\l_tag_para_attr_class_tl
+ }
+ \__tag_check_para_begin_show:nn {green}{#1}
+ \tag_mc_begin:n {}
+}
+\cs_new_protected:Npn \__block_start_para_structure_unconditionally:n #1 {
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_begin_int
+ \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
+ }
+ \int_gincr:N \g__tag_para_begin_int
+ \__block_debug_typeout:n{increment~ P \on at line }
+ \tag_struct_begin:n
+ {
+ tag=\l__tag_para_tag_tl
+ ,attribute-class=\l_tag_para_attr_class_tl
+ }
+ \__tag_check_para_begin_show:nn {green}{#1}
+ \tag_mc_begin:n {}
+}
+\RemoveFromHook{para/end}[tagpdf]
+\AddToHook{para/end}
+ {
+ \bool_if:NT \l__tag_para_bool
+ {
+ \int_gincr:N \g__tag_para_end_int
+ \__block_debug_typeout:n{increment~ /P \on at line }
+ \tag_mc_end:
+ \__tag_check_para_end_show:nn {red}{}
+ \tag_struct_end:
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tag_struct_end:
+ }
+ }
+ }
+\def\PARALABEL{NP-}
+\cs_set_protected:Npn \para_end: {
+ \scan_stop:
+ \mode_if_horizontal:TF {
+ \mode_if_inner:F {
+ \tex_unskip:D
+ \hook_use:n{para/end}
+ \@kernel at after@para at end
+ \mode_if_horizontal:TF {
+ \if_int_compare:w 11 = \tex_lastnodetype:D
+ \tex_hskip:D \c_zero_dim
+ \fi:
+ \tex_par:D
+ \hook_use:n{para/after}
+ \@kernel at after@para at after
+ }
+ { \msg_error:nnnn { hooks }{ para-mode }{end}{horizontal} }
+ }
+ }
+ {
+ \__kernel_endpe_vmode: % should do nothing if no tagging
+ \tex_par:D
+ }
+}
+\cs_set_eq:NN \par \para_end:
+\cs_set_eq:NN \__blockpar \para_end:
+\cs_set_eq:NN \endgraf \para_end:
+\DeclareRobustCommand*\begin[1]{%
+ \UseHook{env/#1/before}%
+ \@ifundefined{#1}%
+ {\def\reserved at a{\@latex at error{Environment #1 undefined}\@eha}}%
+ {\def\reserved at a{\def\@currenvir{#1}%
+ \edef\@currenvline{\on at line}%
+ \@execute at begin@hook{#1}%
+ \csname #1\endcsname}}%
+ \@ignorefalse
+ \begingroup
+ \__kernel_endpe_vmode:
+ \reserved at a}
+\cs_new:Npn \__kernel_endpe_vmode: {
+ \if at endpe \ifvmode
+ \bool_if:NT \l__tag_para_bool
+{
+ \bool_if:NF \l__tag_para_flattened_bool
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tag_struct_end:
+ }
+ \@endpefalse
+}
+ \fi \fi
+}
+\cs_set:Npn \__kernel_list_label_after: {
+ \bool_if:NT \l__tag_para_bool
+ {
+ \__block_start_para_structure_unconditionally:n { LI- }
+ }
+}
+\cs_new:Npn \__block_inner_begin: {
+ \tagstructbegin{tag=\l__block_tag_inner_tag_tl}
+}
+\cs_new:Npn \__block_inner_end: {
+ \__block_debug_typeout:n{block-end \on at line}
+ \legacy_if:nT { @endpe }
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \__block_debug_typeout:n{close~ /text-unit \on at line}
+ \tagstructend
+ }
+ \tagstructend % end inner structure
+}
+\tl_new:N \l__tag_L_tag_tl
+\tl_set:Nn \l__tag_L_tag_tl {L}
+
+\tl_new:N\l__tag_L_attr_class_tl
+\tl_set:Nn \l__tag_L_attr_class_tl {list}
+\tag_if_active:T
+{
+ \tagpdfsetup
+ {
+ % default if unknown
+ newattribute = {list}{/O /List /ListNumbering/None},
+ newattribute = {itemize}{/O /List /ListNumbering/Unordered},
+ newattribute = {enumerate}{/O /List /ListNumbering/Ordered},
+ newattribute = {description}{/O /List /ListNumbering/Description},
+ }
+}
+\def\LItag{LI}
+\cs_set:Npn \__block_list_begin: {
+ \tagstructbegin
+ {
+ tag=\l__tag_L_tag_tl
+ ,attribute-class=\l__tag_L_attr_class_tl
+ }
+}
+\cs_set:Npn \__block_list_item_begin: { \tagstructbegin{tag=\LItag} }
+\cs_set:Npn \__kernel_list_label_begin: {
+ \tagstructbegin{tag=Lbl}
+ \tagmcbegin{tag=Lbl}
+}
+\cs_set:Npn \__kernel_list_label_end: {
+ \tagmcend % end mc-Lbl or artifact
+ \tagstructend % end Lbl
+ \tagstructbegin{tag=\LBody}
+}
+\def\LBody{LBody}
+\cs_set:Npn \__block_list_item_end: {
+ \legacy_if:nT { @endpe }
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tagstructend % text-unit
+ }
+ \tagstructend \tagstructend % end LBody, LI
+}
+\cs_set:Npn \__block_list_end: {
+ \legacy_if:nT { @endpe }
+ {
+ \int_gincr:N \g__tag_para_main_end_int
+ \tagstructend % text-unit
+ \__block_debug_typeout:n{Structure-end~ P~ at~ list-end \on at line }
+ }
+ \tagstructend\tagstructend % end LBody, LI
+ \tagstructend % end L
+}
+}
+{
+ \cs_new:Npn \__block_start_para_structure_unconditionally:n #1 {}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%
+%% End of file `latex-lab-testphase-block.sty'.
Property changes on: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-block.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-firstaid.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-firstaid.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-firstaid.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,9 +33,12 @@
%%
%%
%% File: latex-lab-firstaid.dtx (C) Copyright 2023 LaTeX Project
+\def\ltlabfirstaiddate{2023-07-20}
+\def\ltlabfirstaidversion{0.85a}
-\ProvidesPackage {latex-lab-testphase-firstaid} [2023-06-04 v0.8
- Temporary patches to external packages need for the tagging project]
+\ProvidesPackage {latex-lab-testphase-firstaid} [%
+ \ltlabfirstaiddate\space v\ltlabfirstaiddate\space
+ Temporary patches to external packages needed for the tagging project]
\AddToHook{file/blindtext.sty/after}[latex-lab-firstaid]{%
\FirstAidNeededT{blindtext}{sty}{\blindfiledate\space\blindfileversion\space%
@@ -72,32 +75,20 @@
}
}%
}
-\AddToHook{file/ltugboat.cls/after}
+\AddToHook{package/cleveref/after}
{
- \def\l at section#1#2{\addpenalty{\@secpenalty}%
- \addvspace{\TBtocsectionspace}%
- \@tempdima 1.5em
- \begingroup
- \parindent\z@ \rightskip\z@ % article style makes \rightskip > 0
- \parfillskip\z@
- \TBtocsectionfont
- \leavevmode\advance\leftskip\@tempdima\hskip-\leftskip
- \UseHookWithArguments{contentsline/text/before}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- \csname contentsline at text@1 at format\endcsname{#1}%
- \UseHookWithArguments{contentsline/text/after}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- \nobreak\hfil
- \nobreak\hb at xt@\@pnumwidth{\hss
- \UseHookWithArguments{contentsline/page/before}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- #2%
- \UseHookWithArguments{contentsline/page/after}{4}
- {\toclevel at part}{#1}{#2}{\@contentsline at destination}%
- }\par
- \endgroup}
+ \let\@makefntext\cref at old@makefntext
+ \AddToHook{cmd/@makefntext/before}{%
+ \cref at constructprefix{footnote}{\cref at result}%
+ \protected at edef\cref at currentlabel{%
+ [footnote][\arabic{footnote}][\cref at result]%
+ \p at footnote\@thefnmark}}
+ \RenewDocumentCommand\refstepcounter{om}{%
+ \IfNoValueTF{#1}%
+ {\refstepcounter at noarg{#2}}%
+ {\refstepcounter at optarg[#1]{#2}}%
+ }%
}
-
\endinput
%%
%% End of file `latex-lab-testphase-firstaid.sty'.
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-float.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-float.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-float.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,11 +33,10 @@
%%
%%
%% File: latex-lab-float.dtx (C) Copyright 2023 LaTeX Project
-\ProvidesExplPackage {latex-lab-testphase-float} {2023-04-28} {0.8}
+\def\ltlabfloatdate{2023-07-20}
+\def\ltlabfloatversion{0.81a}
+\ProvidesExplPackage {latex-lab-testphase-float} {\ltlabfloatdate} {\ltlabfloatversion}
{Code related to the tagging of floats}
-\tagpdfsetup{add-new-tag=float/Aside}
-\tagpdfsetup{add-new-tag=figures/Sect}
-\tagpdfsetup{add-new-tag=tables/Sect}
\prop_new:N \g__tag_float_sect_prop
\seq_new:N \g__tag_float_types_seq
\seq_gput_right:Nn \g__tag_float_types_seq {figure}
@@ -219,8 +218,42 @@
\fi
\fi
}
+\def\end at dblfloat{%
+ \if at twocolumn
+ \@endfloatbox
+ \@nameuse{__tag_float_end:}%
+ \ifnum\@floatpenalty <\z@
+ \@largefloatcheck
+ \global\dp\@currbox1sp %
+ \@cons\@currlist\@currbox
+ \ifnum\@floatpenalty <-\@Mii
+ \penalty -\@Miv
+ \@tempdima\prevdepth
+ \vbox{}%
+ \prevdepth\@tempdima
+ \penalty\@floatpenalty
+ \else
+ \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack
+ \@nameuse{__tag_float_start_par:} %restart P safe here??
+ \fi
+ \fi
+ \else
+ \end at float
+ \fi
+}%
\ExplSyntaxOn
\def\hyper at nopatch@caption{}
+\let\@kernel at refstepcounter\refstepcounter %as long it is not in the kernel
+\def\caption{%
+ \ifx\@captype\@undefined
+ \@latex at error{\noexpand\caption outside float}\@ehd
+ \expandafter\@gobble
+ \else
+ \@kernel at refstepcounter\@captype
+ \expandafter\@firstofone
+ \fi
+ {\@dblarg{\@caption\@captype}}%
+}
\providecommand\theHg__tag_struct_abs_int{\int_use:N\c at g__tag_struct_abs_int}
\AddToHook{begindocument}
@@ -253,7 +286,7 @@
\tag_mc_end:
\tag_struct_end:
\tag_mc_begin:n{}
- #2\par
+ #2
\tag_mc_end:\hfil}%
\fi
\tag_struct_end: %caption
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-graphic.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-graphic.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-graphic.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,7 +33,9 @@
%%
%%
%% File: latex-lab-graphic.dtx (C) Copyright 2022-2023 LaTeX Project
-\ProvidesExplPackage {latex-lab-testphase-graphic} {2023-04-07} {0.8}
+\def\ltlabgraphicdate{2023-07-20}
+\def\ltlabgraphicversion{0.80a}
+\ProvidesExplPackage {latex-lab-testphase-graphic} {\ltlabgraphicdate} {\ltlabgraphicversion}
{Code related to the tagging of graphics}
\RequirePackage{l3opacity}
\ref_attribute_gset:nnnn{xpos}{0}{shipout}{\int_use:N\tex_lastxpos:D}
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-math.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-math.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-math.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% latex-lab-testphase.dtx (with options: `math-sty')
+%% latex-lab-testphase.dtx (with options: `math-package')
%%
%% This is a generated file.
%%
@@ -34,9 +34,10 @@
%%
%% File: latex-lab-testphase.dtx
+
\ProvidesPackage{latex-lab-testphase-math}
- [2023-01-07 v0.8 code related to the math tagging]
-\input{latex-lab-mathtagging.ltx}
+ [2023-07-20 v0.8a code related to the math tagging]
+\input{latex-lab-math.ltx}
\input{latex-lab-amsmath.ltx}
\input{latex-lab-mathtools.ltx}
\input{latex-lab-mathpkg.ltx}
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-minipage.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-minipage.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-minipage.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,12 +33,13 @@
%%
%%
%% File: latex-lab-minipage.dtx (C) Copyright 2023 LaTeX Project
-
-\def\ltlistsversion{v0.81}
-\def\ltlistsdate{2023/05/10}
-
-\ProvidesExplPackage {latex-lab-testphase-minipage} {2023-05-10} {0.81}
+\def\ltlabminipagedate{2023-08-20}
+\def\ltlabminipageversion{0.81b}
+\ProvidesExplPackage {latex-lab-testphase-minipage}
+ {\ltlabminipagedate} {\ltlabminipageversion}
{Code related to the tagging of minipages and parboxes}
+\RequirePackage{latex-lab-testphase-new-or-1}
+\RequirePackage{latex-lab-testphase-new-or-2}
\def\@kernel at init@minipage{}
\def\@kernel at init@parbox{}
@@ -59,7 +60,7 @@
\textwidth\hsize \columnwidth\hsize
\@parboxrestore
\def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c at mpfootnote\z@
- \let\@footnotetext\@mpfootnotetext
+ \AssignSocketPlug{fntext/process}{mp}%
\let\@listdepth\@mplistdepth \@mplistdepth\z@
\@minipagerestore
\@setminipage}
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-1.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-1.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-1.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% latex-lab-new-or-1.dtx (with options: `code')
+%% latex-lab-new-or-1.dtx (with options: `package')
%%
%% This is a generated file.
%%
@@ -33,8 +33,11 @@
%%
%%
%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2023 Frank Mittelbach
+\def\ltlabneworIdate{2023-07-20}
+\def\ltlabneworIversion{0.85a}
\ProvidesPackage{latex-lab-testphase-new-or-1}
- [2022-11-94 v0.1a Temporary output patches for tagging and better link support]
+ [\ltlabneworIdate\space v\ltlabneworIversion\space
+ Temporary output patches for tagging and better link support]
\RequirePackage{etoolbox}
\providecommand\@kernel at before@head{}
\providecommand\@kernel at before@foot{}
@@ -51,17 +54,36 @@
{\color at hbox\normalcolor\hb at xt@\textwidth{\@thefoot}\color at endbox}
{\@kernel at before@foot\color at hbox\normalcolor\hb at xt@\textwidth{\@thefoot}\color at endbox\@kernel at after@foot}
{\typeout{Patching footer in \string\@outputpage}}{\PATCHerror }
- \providecommand\@kernel at before@footins{}
- \providecommand\@kernel at before@cclv{}
+\providecommand\@kernel at before@footins{}
+\providecommand\@kernel at tagsupport@@makecol{}
- \patchcmd\@makecol
- {\vskip\skip\footins}
- {\vskip\skip\footins\@kernel at before@footins}
- {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
+\patchcmd\@makecol
+ {\vskip\skip\footins}
+ {\vskip\skip\footins\@kernel at before@footins}
+ {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
+\patchcmd\@makecol
+ {\let\@elt\relax}
+ {\@kernel at tagsupport@@makecol\let\@elt\relax}
+ {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
- \pretocmd\@makecol{\@kernel at before@cclv}
- {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror }
+\AddToHook{package/footmisc/after}
+ {%
+ \def\@makecol{%
+ \setbox\@outputbox \box\@cclv
+ \@outputbox at removebskip
+ \@kernel at tagsupport@@makecol
+ \let\@elt\relax
+ \xdef\@freelist{\@freelist\@midlist}%
+ \global \let \@midlist \@empty
+ \@makecol at appendblocks
+ \ifvbox\@kludgeins
+ \@makespecialcolbox
+ \else
+ \@makenormalcolbox
+ \fi
+ \global \maxdepth \@maxdepth}
+}
\AddToHook{package/multicol/after}
{% multicol needs later loading
\patchcmd\page at sofar
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-2.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-2.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-new-or-2.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% latex-lab-new-or-2.dtx (with options: `code')
+%% latex-lab-new-or-2.dtx (with options: `package')
%%
%% This is a generated file.
%%
@@ -33,25 +33,29 @@
%%
%%
%% File: latex-lab-new-or-2.dtx
+\def\ltlabneworIIdate{2023-09-04}
+\def\ltlabneworIIversion{0.85c}
+
\ProvidesPackage{latex-lab-testphase-new-or-2}
- [2022-11-04 v0.1c changes to the output routine]
+ [\ltlabneworIIdate\space v\ltlabneworIIversion\space
+ Changes to the output routine]
\def \@makecol {%
- \@kernel at before@cclv
\setbox\@outputbox \box\@cclv
\@outputbox at removebskip
+ \@kernel at tagsupport@@makecol
\let\@elt\relax
\xdef\@freelist{\@freelist\@midlist}%
\global \let \@midlist \@empty
- \@makecol at cfgpoint
+ \UseSocket{@makecol/outputbox}%
\ifvbox\@kludgeins
- \@makespecialcolbox
+ \@make at specialcolbox
\else
- \@makenormalcolbox
+ \@make at normalcolbox
\fi
\global \maxdepth \@maxdepth
}
\newdimen\@outputbox at depth
-\def \@makenormalcolbox {%
+\def \@make at normalcolbox {%
\setbox\@outputbox \vbox to\@colht {%
\@texttop
\@outputbox at depth \dp\@outputbox
@@ -60,7 +64,7 @@
\@textbottom
}%
}
-\def \@makespecialcolbox {%
+\def \@make at specialcolbox {%
\@outputbox at append {\vskip-\@outputbox at depth}%
\@tempdima \@colht
\ifdim \wd\@kludgeins>\z@
@@ -109,7 +113,7 @@
\def\@outputbox at appendfootnotes {%
\ifvoid\footins \else
\@makecol at handlesplitfootnotes
- \@makecol at cfgpointii
+ \UseSocket{@makecol/footnotes}%
\@outputbox at append{%
\vskip \skip\footins
\@kernel at before@footins
@@ -135,7 +139,7 @@
\fi
}
\let \@makecol at splitfootnotemessagehook \@empty
-\let \@makecol at cfgpointii \@empty
+\NewSocket{@makecol/footnotes}{0}
\def\@if at flushbottom@TF{%
\ifx\@textbottom\relax
\expandafter\@firstoftwo
@@ -157,11 +161,51 @@
\expandafter\@firstoftwo
\fi
}
- \def\@makecol at cfgpoint {%
- \@outputbox at appendfootnotes
- \@outputbox at attachfloats
- \@outputbox at reinsertbskip
- }
+\NewSocket{@makecol/outputbox}{0}
+\NewSocketPlug {@makecol/outputbox}{space-footnotes-floats} {%
+ \@if at footnotes@TF
+ {\@outputbox at append{\vfill}}%
+ {\@if at bfloats@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}%
+ }%
+ \@outputbox at appendfootnotes
+ \@outputbox at attachfloats
+}
+\NewSocketPlug {@makecol/outputbox}{floats-footnotes-space} {%
+ \@outputbox at attachfloats
+ \@if at footnotes@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}%
+ \@outputbox at appendfootnotes
+}
+\NewSocketPlug {@makecol/outputbox}{footnotes-space-floats} {%
+ \@outputbox at appendfootnotes
+ \@if at bfloats@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}%
+ \@outputbox at attachfloats
+}
+\NewSocketPlug {@makecol/outputbox}{space-floats-footnotes} {%
+ \@if at footnotes@TF
+ {\@outputbox at append{\vfill}}%
+ {\@if at bfloats@TF
+ {\@outputbox at append{\vfill}}%
+ {\@outputbox at reinsertbskip}}%
+ \@outputbox at attachfloats
+ \@outputbox at appendfootnotes
+}
+\NewSocketPlug {@makecol/outputbox}{floats-footnotes} {%
+ \@outputbox at attachfloats
+ \@outputbox at appendfootnotes
+ \@outputbox at reinsertbskip
+}
+\NewSocketPlug {@makecol/outputbox}{footnotes-floats} {%
+ \@outputbox at appendfootnotes
+ \@outputbox at attachfloats
+ \@outputbox at reinsertbskip
+}
+\AssignSocketPlug {@makecol/outputbox}{footnotes-floats}
\declare at file@substitution{footmisc.sty}{latex-lab-footmisc.ltx}
\input{latex-lab-footnotes.ltx}
\endinput
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-sec.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-sec.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-sec.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,7 +33,9 @@
%%
%%
%% File: latex-lab-sec.dtx (C) Copyright 2022-2023 LaTeX Project
-\ProvidesExplPackage {latex-lab-testphase-sec} {2023-05-20} {0.81}
+\def\ltlabsecdate{2023-07-20}
+\def\ltlabsecversion{0.84a}
+\ProvidesExplPackage {latex-lab-testphase-sec} {\ltlabsecdate} {\ltlabsecversion}
{Code related to the tagging of sectioning commands}
\RequirePackage{latex-lab-kernel-changes}
\seq_new:N \g__tag_sec_stack_seq
@@ -161,31 +163,34 @@
{
\@ifundefined{chapter}
{
- \RenewDocumentCommand\part{ s O{#3} m }
+ \@ifundefined{part}{}
{
- \if at noskipsec \leavevmode \fi
- \par
- \addvspace{4ex}%
- \@afterindentfalse
+ \RenewDocumentCommand\part{ s O{#3} m }
+ {
+ \if at noskipsec \leavevmode \fi
+ \par
+ \addvspace{4ex}%
+ \@afterindentfalse
% tagging start commands
- \tag_tool:n {sec-start-part=#2}
+ \tag_tool:n {sec-start-part=#2}
% end tagging start commands
- \bool_lazy_any:nT
- {
- { #1 }
+ \bool_lazy_any:nT
{
- \int_compare_p:nNn {\c at secnumdepth}<{-1}
+ { #1 }
+ {
+ \int_compare_p:nNn {\c at secnumdepth}<{-1}
+ }
}
- }
- {
- \MakeLinkTarget[part]{}
- }
- \IfBooleanTF
- {#1}
- { \@spart {#3} }
- { \@part [#2]{#3} }
- \tag_tool:n {sec-stop-part}
- }
+ {
+ \MakeLinkTarget[part]{}
+ }
+ \IfBooleanTF
+ {#1}
+ { \@spart {#3} }
+ { \@part [#2]{#3} }
+ \tag_tool:n {sec-stop-part}
+ }
+ }
}
{
\RenewDocumentCommand\chapter{ s O{#3} m }
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-text.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-text.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-text.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,9 +33,12 @@
%%
%%
%% File: latex-lab-text.dtx (C) Copyright 2023 LaTeX Project
-\ProvidesExplPackage {latex-lab-testphase-text} {2023-05-28} {0.8}
- {Code related to the tagging of inline text commands}
+\def\ltlabtextdate{2023-07-20}
+\def\ltlabtextversion{0.85a}
+\ProvidesExplPackage {latex-lab-testphase-text} {\ltlabtextdate} {\ltlabtextversion}
+ {Code related to the tagging of various small text commands}
+
\AddToHook{cmd/LaTeX/before}
{
\mode_leave_vertical:
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-toc.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-toc.sty 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/latex-lab-testphase-toc.sty 2023-09-14 20:25:56 UTC (rev 68279)
@@ -4,9 +4,9 @@
%%
%% The original source files were:
%%
-%% latex-lab-toc-tagging-functions.dtx (with options: `header')
+%% latex-lab-toc.dtx (with options: `header')
%% latex-lab-toc-kernel-changes.dtx (with options: `package')
-%% latex-lab-toc-tagging-functions.dtx (with options: `package')
+%% latex-lab-toc.dtx (with options: `package')
%% latex-lab-toc-hyperref-changes.dtx (with options: `package')
%%
%% This is a generated file.
@@ -35,10 +35,14 @@
%% where one can also log issues in case there are any.
%%
%%
-%% File: latex-lab-toc-tagging-functions.dtx (C) Copyright 2022-2023 LaTeX Project
-\ProvidesExplPackage {latex-lab-testphase-toc} {2023-05-20} {0.82}
- { commands related to the tagging of toc-like lists}
-%% File: latex-lab-toc-kernel-functions.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-toc.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabtocdate{2023-07-20}
+\def\ltlabtocversion{0.85a}
+\ProvidesExplPackage {latex-lab-testphase-toc} {\ltlabtocdate} {\ltlabtocversion}
+ { Code related to the tagging of toc-like lists}
+%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabkerneldate{2023-07-20}
+\def\ltlabkernelversion{0.85a}
\RequirePackage{latex-lab-kernel-changes}
\def\@contentsline at cfgpoint@before#1#2#3#4{}
\def\@contentsline at cfgpoint@after#1#2#3#4{}
@@ -271,8 +275,9 @@
\endgroup
\fi}
}
-
-%% File: latex-lab-toc-tagging-functions.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-toc.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabtocdate{2023-07-20}
+\def\ltlabtocversion{0.85a}
\tl_new:N \l__tag_toc_tmpa_tl
\AddToHook{cmd/refstepcounter/after}
{
@@ -440,6 +445,8 @@
\tag_mc_begin:n{artifact}\tag_stop:n{leaders}\nobreak#1\nobreak\tag_start:n{leaders}\tag_mc_end:}
%% File: latex-lab-toc-hyperref-changes.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabtochyperdate{2023-07-20}
+\def\ltlabtochyperversion{0.85a}
\def\hyper at nopatch@toc{}
\AddToHook{package/hyperref/after}
{
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/math-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/math-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/math-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% latex-lab-testphase.dtx (with options: `math-lab')
+%% latex-lab-testphase.dtx (with options: `math')
%%
%% This is a generated file.
%%
@@ -34,8 +34,9 @@
%%
%% File: latex-lab-testphase.dtx
+
\ProvidesFile{math-latex-lab-testphase.ltx}
- [2023-01-07 v0.8 code related to the math tagging]
+ [2023-07-20 v0.8a latex-lab wrapper math]
\RequirePackage{latex-lab-testphase-math}
\endinput
%%
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/minipage-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/minipage-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/minipage-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,13 +33,12 @@
%%
%%
%% File: latex-lab-minipage.dtx (C) Copyright 2023 LaTeX Project
+\def\ltlabminipagedate{2023-08-20}
+\def\ltlabminipageversion{0.81b}
-\def\ltlistsversion{v0.81}
-\def\ltlistsdate{2023/05/10}
-
-
\ProvidesFile{minipage-latex-lab-testphase.ltx}
- [2022-10-26 v0.8 code related to the tagging of sectioning commands]
+ [\ltlabminipagedate\space v\ltlabminipageversion
+ code related to the tagging of minipage and parbox]
\RequirePackage{latex-lab-testphase-minipage}
\endinput
%%
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-1-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-1-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-1-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -4,7 +4,7 @@
%%
%% The original source files were:
%%
-%% latex-lab-testphase.dtx (with options: `new-or-1')
+%% latex-lab-new-or-1.dtx (with options: `latex-lab')
%%
%% This is a generated file.
%%
@@ -32,10 +32,12 @@
%% where one can also log issues in case there are any.
%%
%%
-%% File: latex-lab-testphase.dtx
-
+%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2023 Frank Mittelbach
+\def\ltlabneworIdate{2023-07-20}
+\def\ltlabneworIversion{0.85a}
\ProvidesFile{new-or-1-latex-lab-testphase.ltx}
- [2022-11-04 v0.1a latex-lab wrapper new-or-1]
+ [\ltlabneworIdate\space v\ltlabneworIversion\space
+ latex-lab wrapper new-or-1]
\RequirePackage{latex-lab-testphase-new-or-1}
\endinput
%%
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/new-or-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -34,8 +34,9 @@
%%
%% File: latex-lab-testphase.dtx
+
\ProvidesFile{new-or-latex-lab-testphase.ltx}
- [2022-11-04 v0.1a latex-lab wrapper new-or]
+ [2023-06-15 v0.1b latex-lab wrapper new-or]
\RequirePackage{latex-lab-testphase-new-or-1}
\RequirePackage{latex-lab-testphase-new-or-2}
\endinput
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-I-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-I-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-I-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -34,6 +34,7 @@
%%
%% File: latex-lab-testphase.dtx
+
\ProvidesFile{phase-I-latex-lab-testphase.ltx}
[2023-02-04 v0.1b latex-lab wrapper phase-I]
\RequirePackage{latex-lab-testphase-new-or-1}
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-II-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-II-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-II-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -34,8 +34,9 @@
%%
%% File: latex-lab-testphase.dtx
+
\ProvidesFile{phase-II-latex-lab-testphase.ltx}
- [2022-11-04 v0.1a latex-lab wrapper phase-II]
+ [2023-06-15 v0.1b latex-lab wrapper phase-II]
\RequirePackage{latex-lab-testphase-new-or-1}
\RequirePackage{latex-lab-testphase-new-or-2}
\RequirePackage{tagpdf}
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-III-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-III-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/phase-III-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -34,12 +34,13 @@
%%
%% File: latex-lab-testphase.dtx
+
\ProvidesFile{phase-III-latex-lab-testphase.ltx}
- [2023-03-06 v0.1a latex-lab wrapper phase-III]
+ [2023-07-20 v0.1b latex-lab wrapper phase-III]
\input{phase-II-latex-lab-testphase.ltx}
\IfFormatAtLeastTF{2023-06-01}
{
- \RequirePackage{latex-lab-testphase-block-tagging}
+ \RequirePackage{latex-lab-testphase-block}
\RequirePackage{latex-lab-testphase-sec}
\RequirePackage{latex-lab-testphase-toc}
\RequirePackage{latex-lab-testphase-minipage}
Added: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-latex-lab-testphase.ltx (rev 0)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,44 @@
+%%
+%% This is file `sec-latex-lab-testphase.ltx',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% latex-lab-sec.dtx (with options: `latex-lab')
+%%
+%% This is a generated file.
+%%
+%% Copyright 2021-2023 LaTeX Project
+%%
+%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
+%% ------------------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
+%% without such generated files.
+%%
+%% The newest sources can be found below
+%%
+%% https://github.com/latex3/latex2e/required/latex-lab
+%%
+%% where one can also log issues in case there are any.
+%%
+%%
+%% File: latex-lab-sec.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabsecdate{2023-07-20}
+\def\ltlabsecversion{0.84a}
+
+\ProvidesFile{sec-latex-lab-testphase.ltx}
+ [\ltlabsecdate\space v\ltlabsecversion\space latex-lab wrapper sec]
+\RequirePackage{latex-lab-testphase-sec}
+\endinput
+%%
+%% End of file `sec-latex-lab-testphase.ltx'.
Property changes on: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-latex-lab-testphase.ltx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-tagging-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-tagging-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/sec-tagging-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,42 +0,0 @@
-%%
-%% This is file `sec-tagging-latex-lab-testphase.ltx',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% latex-lab-sec.dtx (with options: `latex-lab')
-%%
-%% This is a generated file.
-%%
-%% Copyright 2021-2023 LaTeX Project
-%%
-%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
-%% ------------------------------------------------------------------------------------
-%%
-%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3c
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2008 or later.
-%%
-%% This file may only be distributed together with a copy of the LaTeX
-%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
-%% without such generated files.
-%%
-%% The newest sources can be found below
-%%
-%% https://github.com/latex3/latex2e/required/latex-lab
-%%
-%% where one can also log issues in case there are any.
-%%
-%%
-%% File: latex-lab-sec.dtx (C) Copyright 2022-2023 LaTeX Project
-
-\ProvidesFile{sec-tagging-latex-lab-testphase.ltx}
- [2023-05-20 v0.82 code related to the tagging of sectioning commands]
-\RequirePackage{latex-lab-testphase-sec}
-\endinput
-%%
-%% End of file `sec-tagging-latex-lab-testphase.ltx'.
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -34,6 +34,7 @@
%%
%% File: latex-lab-testphase.dtx
+
\ProvidesFile{tagpdf-latex-lab-testphase.ltx}
[2022-11-04 v0.1a latex-lab wrapper tagpdf (deprecated)]
\RequirePackage{latex-lab-testphase-new-or-1}
Added: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-ns-latex-lab.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-ns-latex-lab.def (rev 0)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-ns-latex-lab.def 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,42 @@
+%%
+%% This is file `tagpdf-ns-latex-lab.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% latex-lab-namespace.dtx (with options: `ns-latex-lab')
+%%
+%% File: latex-lab-namespace.dtx (C) Copyright 2023 LaTeX Project
+%% \ProvidesExplFile {tagpdf-ns-latex-lab.def} {2023-09-04} {0.8}
+%% {latex} {https://www.latex-project.org/ns/lab/2022}{}
+title, Title, pdf2,
+part, Title, pdf2,
+section, H1, pdf2,
+subsection, H2, pdf2,
+subsubsection,H3, pdf2,
+paragraph, H4, pdf2,
+subparagraph, H5, pdf2,
+list, L, pdf2,
+itemize, L, pdf2,
+enumerate, L, pdf2,
+description, L, pdf2,
+quote, BlockQuote,pdf,
+quotation, BlockQuote,pdf,
+verbatim, Div, pdf2,
+item, LI, pdf2,
+itemlabel, Lbl, pdf2,
+itembody, LBody, pdf2,
+footnote, FENote, pdf2,
+footnotemark, Lbl, pdf2,
+footnotelabel,Lbl, pdf2,
+text-unit, Part, pdf2,
+text, P, pdf2,
+theorem-like, Sect, pdf2,
+verbatim, P, pdf2,
+codeline, Sub, pdf2,
+float, Aside, pdf2,
+figures, Sect, pdf2,
+tables, Sect, pdf2,
+%%
+%%
+%% End of file `tagpdf-ns-latex-lab.def'.
Property changes on: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/tagpdf-ns-latex-lab.def
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/text-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/text-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/text-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -33,8 +33,12 @@
%%
%%
%% File: latex-lab-text.dtx (C) Copyright 2023 LaTeX Project
+\def\ltlabtextdate{2023-07-20}
+\def\ltlabtextversion{0.85a}
+
\ProvidesFile{text-latex-lab-testphase.ltx}
- [2023-05-28 v0.8 code related to the tagging of bib and citations]
+ [\ltlabtextdate\space v\ltlabtextversion\space
+ code related to the tagging of various small text commands]
\RequirePackage{latex-lab-testphase-text}
Added: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-latex-lab-testphase.ltx (rev 0)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -0,0 +1,45 @@
+%%
+%% This is file `toc-latex-lab-testphase.ltx',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% latex-lab-toc.dtx (with options: `latex-lab')
+%%
+%% This is a generated file.
+%%
+%% Copyright 2021-2023 LaTeX Project
+%%
+%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
+%% ------------------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
+%% without such generated files.
+%%
+%% The newest sources can be found below
+%%
+%% https://github.com/latex3/latex2e/required/latex-lab
+%%
+%% where one can also log issues in case there are any.
+%%
+%%
+%% File: latex-lab-toc.dtx (C) Copyright 2022-2023 LaTeX Project
+\def\ltlabtocdate{2023-07-20}
+\def\ltlabtocversion{0.85a}
+\ProvidesFile{toc-latex-lab-testphase.ltx}
+ [\ltlabtocdate\space v\ltlabtocversion latex-lab wrapper toc]
+
+\RequirePackage{latex-lab-testphase-toc}
+
+\endinput
+%%
+%% End of file `toc-latex-lab-testphase.ltx'.
Property changes on: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-latex-lab-testphase.ltx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-tagging-latex-lab-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-tagging-latex-lab-testphase.ltx 2023-09-14 20:25:24 UTC (rev 68278)
+++ trunk/Master/texmf-dist/tex/latex-dev/latex-lab/toc-tagging-latex-lab-testphase.ltx 2023-09-14 20:25:56 UTC (rev 68279)
@@ -1,44 +0,0 @@
-%%
-%% This is file `toc-tagging-latex-lab-testphase.ltx',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% latex-lab-toc-kernel-changes.dtx (with options: `latex-lab')
-%%
-%% This is a generated file.
-%%
-%% Copyright 2021-2023 LaTeX Project
-%%
-%% This file was generated from file(s) of the `LaTeX-lab Bundle'.
-%% ------------------------------------------------------------------------------------
-%%
-%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3c
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2008 or later.
-%%
-%% This file may only be distributed together with a copy of the LaTeX
-%% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
-%% without such generated files.
-%%
-%% The newest sources can be found below
-%%
-%% https://github.com/latex3/latex2e/required/latex-lab
-%%
-%% where one can also log issues in case there are any.
-%%
-%%
-%% File: latex-lab-toc-kernel-functions.dtx (C) Copyright 2022-2023 LaTeX Project
-
-\ProvidesFile{toc-tagging-latex-lab-testphase.ltx}
- [2023-05-20 v0.81 code related to the tagging of toc and similar lists]
-
-\RequirePackage{latex-lab-testphase-toc}
-
-\endinput
-%%
-%% End of file `toc-tagging-latex-lab-testphase.ltx'.
More information about the tex-live-commits
mailing list.