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.