summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx')
-rw-r--r--Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx423
1 files changed, 216 insertions, 207 deletions
diff --git a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
index 936eee9ed21..e1aaeffc99d 100644
--- a/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
+++ b/Master/texmf-dist/source/latex-dev/latex-lab/latex-lab-sec.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-sec.dtx (C) Copyright 2022-2024 LaTeX Project
+%% File: latex-lab-sec.dtx (C) Copyright 2022-2025 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,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabsecdate{2024-10-04}
-\def\ltlabsecversion{0.84f}
+\def\ltlabsecdate{2025-02-18}
+\def\ltlabsecversion{0.84i}
%<*driver>
\documentclass[kernel]{l3doc}
\EnableCrossrefs
@@ -47,100 +47,102 @@
% \begin{abstract}
% The following code implements a first draft for the tagging of sectioning commands.
% \end{abstract}
-%
+%
% \section{Limitations}
-%
-% Sectioning commands are in not defined by the format but by the classes.
-% Their implementation vary: some are defined with the help of \cs{@startsection},
-% some are like \cs{chapter} handcrafted,
-% some build with the help of extension packages or as in the KOMA classes
+%
+% Sectioning commands are in not defined by the format but by the classes.
+% Their implementation vary: some are defined with the help of \cs{@startsection},
+% some are like \cs{chapter} handcrafted,
+% some build with the help of extension packages or as in the KOMA classes
% with class code that extends the \cs{@startsection} functionality.
-%
+%
% The following code can therefore currently be used \emph{only} with the standard classes
% or with classes which do not overwrite the changed definitions.
-%
-%
-%
+%
+%
+%
% \section{Introduction}
-%
+%
% Tagging of sectioning commands consist of two parts:
-%
+%
% \begin{itemize}
-% \item The heading/title text of the section should be surrounded by a
+% \item The heading/title text of the section should be surrounded by a
% heading tag, typically \texttt{Hn} with some value of \texttt{n}.
-% The number of the section command can optionally be put in a \texttt{Lbl}.
-% The number of the \texttt{Hn} tag should reflect the \enquote{natural} level.
+% In theory, one could put the number of the section command in an \texttt{Lbl}.
+% However, current AT doesn't handle this well, so
+% we use a tag \texttt{section-number} that is mapped to \texttt{Span}.
+% The number of the \texttt{Hn} tag should reflect the \enquote{natural} level.
% So in an article \cs{section} will use \texttt{H1}, in a book \cs{chapter} will use
-% \texttt{H1} and \cs{section} \texttt{H2}.
+% \texttt{H1} and \cs{section} \texttt{H2}.
% Titles of \cs{part} are a bit out of this system as they are normally
% not part of the hierarchy: often only some chapters are grouped under a part.
-% Their title is therefore tagged as \texttt{Title}.
-% \item
+% Their title is therefore tagged as \texttt{Title}.
+% \item
% The whole section should normally be surrounded by
-% a \texttt{Sect} tag. Parts should be surrounded by \texttt{Part}.
-% It is a bit unclear if the headings should be inside or outside of these
-% structures---the best practice guide puts them outside---but on the whole
+% a \texttt{Sect} tag. Parts should be surrounded by \texttt{Part}.
+% It is a bit unclear if the headings should be inside or outside of these
+% structures---the best practice guide puts them outside---but on the whole
% it sounds more logical to group the heading with the text inside the \texttt{Sect}.
% For the part this is actually required, as there can be only one \texttt{Title}
-% in a structure, so the part title can't be at the same level as the
+% in a structure, so the part title can't be at the same level as the
% document \texttt{Title}.
-%
-% Starting such an enclosing \texttt{Sect} structure is rather easy,
-% but closing it requires code in various place,
-% for example the commands \cs{mainmatter}, \cs{backmatter},
-% \cs{frontmatter} and \cs{appendix} should typically close everything.
-% Following sectioning commands should close all previous structures
+%
+% Starting such an enclosing \texttt{Sect} structure is rather easy,
+% but closing it requires code in various place,
+% for example the commands \cs{mainmatter}, \cs{backmatter},
+% \cs{frontmatter} and \cs{appendix} should typically close everything.
+% Following sectioning commands should close all previous structures
% with a level equal or higher than their own level.
% \end{itemize}
-%
+%
% \section{Technical details and problems}
-%
+%
% The implementation has to take care of various details.
-%
+%
% \begin{itemize}
-%
-% \item As sections in \LaTeX{} are not environments, the
+%
+% \item As sections in \LaTeX{} are not environments, the
% \texttt{<Sect>} structures can be wrongly nested with other structures. For example
-% if a document puts a sectioning command into a list or a trivlist or
+% if a document puts a sectioning command into a list or a trivlist or
% a minipage then it can no longer close previous \texttt{<Sect>} structures correctly.
-% The problem can be detected by checking the structure stack
+% The problem can be detected by checking the structure stack
% and a warning can be issued, but the author then has to close the structures
-% manually before the list or minipage.
-%
+% manually before the list or minipage.
+%
% Thus there have to be user interfaces to handle such cases.
% It should also be possible not to create all the \texttt{<Sect>} structures
% automatically but to tag only the headings so that the author can handle special
-% cases manually.
-%
+% cases manually.
+%
% \item If hyperref is used, targets for links should be inserted, either with
% \cs{refstepcounter} or manually with \cs{MakeLinkTarget}. These targets must be
% in the correct structure for the structure destinations. They replace some
% of the current patches in hyperref.
-%
-% \item With lualatex the mc-commands set attributes \emph{locally}, so the
+%
+% \item With lualatex the mc-commands set attributes \emph{locally}, so the
% commands must be at the right grouping level.
% \end{itemize}
-%
+%
% \subsection{Functions and keys}
%
% \begin{function}{\tag_tool:n,\tagtool}
-%
+%
% \end{function}
-%
+%
% \subsection{TODO}
-%
+%
% \begin{itemize}
-% \item A dedicated command to close a sectioning unit should be provided.
-%
-% \item A dedicated command to open a sectioning unit should be provided too.
-%
+% \item A dedicated command to close a sectioning unit should be provided.
+%
+% \item A dedicated command to open a sectioning unit should be provided too.
+%
% \item It should also be possible to suppress the sectioning unit in sectioning commands
% to allow e.g. to put an epigraph or similar in front.
-%
-% \item The number in \cs{part} and \cs{chapter} is currently not correctly
-% tagged as a \texttt{Lbl} as this requires to redefine the internal (class dependent)
+%
+% \item The number in \cs{part} and \cs{chapter} is currently not correctly
+% tagged as a \texttt{section-number} as this requires to redefine the internal (class dependent)
% commands too.
-%
+%
% \end{itemize}
%
% \begin{macrocode}
@@ -152,16 +154,16 @@
\ProvidesExplPackage {latex-lab-testphase-sec} {\ltlabsecdate} {\ltlabsecversion}
{Code related to the tagging of sectioning commands}
% \end{macrocode}
-%
-% \subsection{Surrounding by \texttt{Sect} structures}
+%
+% \subsection{Surrounding by \texttt{Sect} structures}
% We use a stack to record the levels of the open \texttt{Sect}. The first item
% has level -100. A sectioning command will take a record from the stack. If its level is
% greater or equal it closes this structure and takes the next record from the stack.
% If the record has a smaller level then it puts it back and stops.
-% The stack is compared with the main structure stack, if they don't match
-% it means we can't safely close the \texttt{Sect} and so we issue a warning
-% and do nothing.
-%
+% The stack is compared with the main structure stack, if they don't match
+% it means we can't safely close the \texttt{Sect} and so we issue a warning
+% and do nothing.
+%
% \subsubsection{Loading general kernel changes}
% [kernel?]
% Also loaded in the toc-tagging code.
@@ -172,23 +174,23 @@
%</package>
% \end{macrocode}
% \subsubsection{Glyphtounicode improvements}
-%
+%
% As lualatex runs with legacy encodings in the test files, we enable and
% load glyphtounicode. For the math we load additional definitions.
-%
+%
% \begin{macrocode}
%<*kernelchange>
\ifdefined\directlua
- \ifnum\outputmode > 0
+ \ifnum\outputmode > 0
\pdfvariable gentounicode =1
\protected\def\pdfglyphtounicode {\pdfextension glyphtounicode }
- \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
+ \protected\edef\pdfgentounicode {\pdfvariable gentounicode}
\input{glyphtounicode}
\fi
\fi
\ifdefined\pdfglyphtounicode
\input{glyphtounicode-cmex}
-\fi
+\fi
%</kernelchange>
% \end{macrocode}
%
@@ -197,7 +199,7 @@
%
% We must ensure that manual targets (e.g. in unnumbered sections)
% correctly update \cs{@currentHref}. For this we extend the kernel definition of
-% \cs{MakeLinkTarget}
+% \cs{MakeLinkTarget}
% TODO: remove after release 2024/11
% \begin{macrocode}
%<*kernelchange>
@@ -221,11 +223,11 @@
{
\int_gincr:N\g__kernel_target_int
\tl_gset:Ne \@currentHref {target*.\int_use:N\g__kernel_target_int}
- }
+ }
}
}
-\ExplSyntaxOff
-%</kernelchange>
+\ExplSyntaxOff
+%</kernelchange>
% \end{macrocode}
%
% \begin{macrocode}
@@ -242,7 +244,7 @@
\seq_gpush:Nn\g_@@_sec_stack_seq {{Document}{-100}{2}}
% \end{macrocode}
% \end{variable}
-%
+%
% \begin{macro}{\@@_get_data_current_Sect:}
% This allows to retrieve the number of the current Sect structure (or
% Document if we are outside any Sect) with |\tag_get:n{current_Sect}|
@@ -254,7 +256,7 @@
% \end{macrocode}
% \end{macro}
% \begin{variable}{\l_@@_sec_Sect_bool}
-% This boolean controls if a Sect structure is opened.
+% This boolean controls if a Sect structure is opened.
% \begin{macrocode}
\bool_new:N \l_@@_sec_Sect_bool
\bool_set_true:N\l_@@_sec_Sect_bool
@@ -262,23 +264,23 @@
% \end{variable}
%
% \begin{macro}{\@@_sec_begin:nn}
-% This starts a sectioning structure.
+% This starts a sectioning structure.
% Currently the tag is fix, either Sect or Part, depending on the level,
% but this will perhaps change. The second argument is currently unused.
% \begin{macrocode}
\cs_new_protected:Npn\@@_sec_begin:nn #1 #2 %#1 level #2 keyval
{
- \tag_struct_begin:n
+ \tag_struct_begin:n
{
tag= {\int_compare:nNnTF {#1}={-1}{Part}{Sect}}
,#2
- }
- \seq_gpush:Ne \g_@@_sec_stack_seq
- {{\g_@@_struct_tag_tl}{\int_eval:n{#1}}{\g_@@_struct_stack_current_tl}}
+ }
+ \seq_gpush:Ne \g_@@_sec_stack_seq
+ {{\g_@@_struct_tag_tl}{\int_eval:n{#1}}{\g_@@_struct_stack_current_tl}}
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\@@_sec_end:n}
% \begin{macrocode}
\msg_new:nnn { tag } {wrong-sect-nesting}
@@ -294,32 +296,32 @@
{
\seq_get:NN\g_@@_struct_tag_stack_seq \l_@@_tmpb_tl
\exp_args:Nee
- \tl_if_eq:nnTF
+ \tl_if_eq:nnTF
{\exp_last_unbraced:NV\use_i:nnn\l_@@_tmpa_tl}
{\exp_last_unbraced:NV\use_i:nn\l_@@_tmpb_tl}
{
\seq_gpop:NN \g_@@_sec_stack_seq \l_@@_tmpa_tl
\tag_struct_end:
- \@@_sec_end:n {#1}
+ \@@_sec_end:n {#1}
}
- {
+ {
\msg_warning:nnee {tag}{wrong-sect-nesting}
{ \exp_last_unbraced:NV\use_i:nnn \l_@@_tmpa_tl }
- { \exp_last_unbraced:NV\use_i:nn \l_@@_tmpb_tl }
+ { \exp_last_unbraced:NV\use_i:nn \l_@@_tmpb_tl }
}
- }
- }
+ }
+ }
% \end{macrocode}
% \end{macro}
% \begin{macro}{\@@_tool_para_split:}
-% Runin-sectioning command must separate the heading from the following text.
-%
+% Runin-sectioning command must separate the heading from the following text.
+%
% \begin{macrocode}
\cs_new_protected:Npn \@@_tool_para_split:
{
\tag_mc_end:
- \tag_struct_end:
+ \tag_struct_end:
\tag_struct_begin:n{tag=\l_@@_para_tag_default_tl}
\tag_mc_begin:n{}
\@@_setup_restore_para_default:
@@ -329,8 +331,8 @@
% \begin{macro}{\@@_setup_restore_para_default:}
% We change the para tagging in the sectioning code.
-% This here restores the default. Currently it only resets the
-% the tag, but perhaps more will be needed later.
+% This here restores the default. Currently it only resets the
+% the tag, but perhaps more will be needed later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_setup_restore_para_default:
{
@@ -339,7 +341,7 @@
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\@@_sec_end_display:}
% \begin{macrocode}
\cs_new_protected:Npn \@@_sec_end_display:
@@ -354,21 +356,22 @@
% be done before tagpdf closes the Document structure.
% \begin{macrocode}
\hook_gput_code:nnn{tagpdf/finish/before}{tagpdf/sec}{\@@_sec_end:n{-10}}
-\hook_gset_rule:nnnn {tagpdf/finish/before}{tagpdf/sec}{before}{tagpdf}
+\hook_gset_rule:nnnn {tagpdf/finish/before}{tagpdf/sec}{before}{tagpdf}
% \end{macrocode}
%
% The commands \cs{mainmatter}, \cs{backmatter}, \cs{frontmatter} and
% \cs{appendix} close all \texttt{Sect} and \texttt{Part} structures.
+% \changes{v0.84g}{2025/01/05}{ensure that paragraph is ended (tagging/777)}
% \begin{macrocode}
-\AddToHook{cmd/frontmatter/before}{\@@_sec_end:n{-10}}
-\AddToHook{cmd/mainmatter/before} {\@@_sec_end:n{-10}}
-\AddToHook{cmd/backmatter/before} {\@@_sec_end:n{-10}}
-\AddToHook{cmd/appendix/before} {\@@_sec_end:n{-10}}
+\AddToHook{cmd/frontmatter/before}{\par\@@_sec_end:n{-10}}
+\AddToHook{cmd/mainmatter/before} {\par\@@_sec_end:n{-10}}
+\AddToHook{cmd/backmatter/before} {\par\@@_sec_end:n{-10}}
+\AddToHook{cmd/appendix/before} {\par\@@_sec_end:n{-10}}
% \end{macrocode}
%
% \subsection{Tagging tools}
% We need to provide user and package level commands
-%
+%
% \begin{macrocode}
\cs_if_free:NT \tag_tool:n
{
@@ -376,24 +379,24 @@
{
\tag_if_active:T { \keys_set:nn {tag / tool}{#1} }
}
- \cs_set_eq:NN\tagtool\tag_tool:n
- }
-\keys_define:nn { tag / tool}
+ \cs_set_eq:NN\tagtool\tag_tool:n
+ }
+\keys_define:nn { tag / tool}
{
- ,sec-start-part .code:n =
+ ,sec-start-part .code:n =
{
\bool_if:NT\l_@@_sec_Sect_bool
{
- \@@_sec_end:n {-1}
+ \@@_sec_end:n {-1}
\@@_sec_begin:nn{-1}{tag=Part}
- }
+ }
\tag_struct_begin:n{tag=part,title=#1}
% \end{macrocode}
% We remap here the text-unit from the paragraph to NonStruct.
% It would be better to suppress it completely as with the other
% sectioning commands, but this would require to redefine \cs{@spart}
% and \cs{@part}, as there is the grouping, and these commands are
-% all slightly different in the standard classes. So this is delayed
+% all slightly different in the standard classes. So this is delayed
% to the time when sectioning commands are redefined with templates.
% \begin{macrocode}
\tl_set:Nn\l_@@_para_main_tag_tl {NonStruct}
@@ -404,9 +407,9 @@
{
\bool_if:NT\l_@@_sec_Sect_bool
{
- \@@_sec_end:n {0}
+ \@@_sec_end:n {0}
\@@_sec_begin:nn{0}{tag=Sect}
- }
+ }
\tag_struct_begin:n{tag=chapter,title=#1}
% \end{macrocode}
% similar to part we remap to NonStruct for now ...
@@ -414,35 +417,35 @@
\tl_set:Nn\l_@@_para_main_tag_tl {NonStruct}
\tl_set:Nn\l_@@_para_tag_tl {Span}
}
- ,sec-stop-chapter .meta:n = { sec-stop-part}
- ,sec-start .code:n = % #1 is a name like "section"
- {
+ ,sec-stop-chapter .meta:n = { sec-stop-part}
+ ,sec-start .code:n = % #1 is a name like "section"
+ {
\bool_if:NT\l_@@_sec_Sect_bool
- {
- \@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0}
+ {
+ \@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0}
\@@_sec_begin:nn {\cs_if_exist_use:c{toclevel@#1}+0}{tag=Sect}
- }
+ }
\tl_set:Nn\l_@@_para_tag_tl{#1}
- }
- ,sec-start .value_required:n = true
+ }
+ ,sec-start .value_required:n = true
,sec-split-para .code:n = {\@@_tool_para_split:}
,restore-para .code:n = {\@@_setup_restore_para_default:}
- ,sec-stop .code:n =
+ ,sec-stop .code:n =
{
\par\@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0}
}
- ,sec-stop .value_required:n = true
+ ,sec-stop .value_required:n = true
,sec-add-grouping .bool_set:N = \l_@@_sec_Sect_bool
- }
+ }
% \end{macrocode}
%
%
% \section{Sectioning commands}
-%
+%
% \subsection{\cs{part} and \cs{chapter}}
%
-% \cs{part} and \cs{chapter} are defined by the classes.
-% To tag them we redefine the user commands.
+% \cs{part} and \cs{chapter} are defined by the classes.
+% To tag them we redefine the user commands.
% This will probably break with various classes and with titlesec.
% The tagging inside relies on the para tagging.
% We do not yet use keyval in the optional argument, as this requires latex-dev
@@ -475,34 +478,34 @@
% This adds a manual target if the part is unnumbered or starred.
% It replaces the hyperref patches.
% \begin{macrocode}
- \bool_lazy_any:nT
+ \bool_lazy_any:nT
{
- { #1 }
- {
- \int_compare_p:nNn {\c@secnumdepth}<{-1}
- }
- }
+ { #1 }
+ {
+ \int_compare_p:nNn {\c@secnumdepth}<{-1}
+ }
+ }
{
\MakeLinkTarget[part]{}
}
% \end{macrocode}
-% The main call to the underlying commands.
+% The main call to the underlying commands.
% \begin{macrocode}
- \IfBooleanTF
+ \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
% \begin{macrocode}
- {
+ {
\RenewDocumentCommand\chapter{ s O{#3} m }
{
\if@openright\cleardoublepage\else\clearpage\fi
@@ -512,42 +515,42 @@
% \end{macrocode}
% This are the tagging commands needed at the begin. They open a Sect structure
% and the structure for the title of the heading.
-% \begin{macrocode}
- \tag_tool:n { sec-start-chapter= #2 }
+% \begin{macrocode}
+ \tag_tool:n { sec-start-chapter= #2 }
% \end{macrocode}
% This adds a manual target if the chapter is unnumbered or starred.
% It replaces the hyperref patches.
-% \begin{macrocode}
- \bool_lazy_any:nT
+% \begin{macrocode}
+ \bool_lazy_any:nT
{
- { #1 }
- {
- \int_compare_p:nNn {\c@secnumdepth}<{0}
- }
+ { #1 }
+ {
+ \int_compare_p:nNn {\c@secnumdepth}<{0}
+ }
{
%in book target also needed in frontmatter
- \bool_lazy_and_p:nn
- { \cs_if_exist_p:c { @mainmattertrue } }
+ \bool_lazy_and_p:nn
+ { \cs_if_exist_p:c { @mainmattertrue } }
{ ! \legacy_if_p:n { @mainmatter } }
}
- }
+ }
{
% \end{macrocode}
% The relation target-struct is stored internally by the MakeLinkTarget commands
% \begin{macrocode}
\MakeLinkTarget[chapter]{}
- }
+ }
% \end{macrocode}
-% The main call to the underlying commands.
-% \begin{macrocode}
- \IfBooleanTF
+% The main call to the underlying commands.
+% \begin{macrocode}
+ \IfBooleanTF
{#1}
{ \@schapter {#3} }
{ \@chapter [{#2}]{#3} }
% \end{macrocode}
% and now the closing command for the tagging of the title.
-% \begin{macrocode}
- \tag_tool:n {sec-stop-chapter}
+% \begin{macrocode}
+ \tag_tool:n {sec-stop-chapter}
}
% \end{macrocode}
% and similar for \cs{part}
@@ -570,67 +573,67 @@
% \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}
- \tag_tool:n {sec-start-part=#2}
+% \begin{macrocode}
+ \tag_tool:n {sec-start-part=#2}
% \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
+% \begin{macrocode}
+ \bool_lazy_any:nT
{
- { #1 }
- {
- \int_compare_p:nNn {\c@secnumdepth}<{-1}
- }
+ { #1 }
+ {
+ \int_compare_p:nNn {\c@secnumdepth}<{-1}
+ }
{
%in book target also needed in frontmatter
- \bool_lazy_and_p:nn
- { \cs_if_exist_p:c { @mainmattertrue } }
+ \bool_lazy_and_p:nn
+ { \cs_if_exist_p:c { @mainmattertrue } }
{ ! \legacy_if_p:n { @mainmatter } }
}
- }
+ }
{
\MakeLinkTarget[part]{}
}
% \end{macrocode}
-% The main call to the underlying commands.
-% \begin{macrocode}
- \IfBooleanTF
+% The main call to the underlying commands.
+% \begin{macrocode}
+ \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}
- }
+% \begin{macrocode}
+ \tag_tool:n{sec-stop-part}
+ }
}
- }
+ }
% \end{macrocode}
%
% \subsection{Sectioning commands based on \cs{@startsection}}
-%
-% The tagging relies again on the para tagging:
+%
+% The tagging relies again on the para tagging:
% we simply exchange the tag name by the one given as \#1.
% This assumes that a tag with the name of the sectioning type is defined.
-% We don't try to pass the title, this will be done together with
+% We don't try to pass the title, this will be done together with
% the new keyval handling in the user command.
-%
+%
% \subsubsection{Hyperref code}
-% hyperref has to insert anchors. If the sectioning is numbered this is done by
-% \cs{refstepcounter} (and so in vmode). For unnumbered section hyperref
-% injects the anchor in hmode before the text, it also inserts a
-% kern to compensate the indent.
-%
+% hyperref has to insert anchors. If the sectioning is numbered this is done by
+% \cs{refstepcounter} (and so in vmode). For unnumbered section hyperref
+% injects the anchor in hmode before the text, it also inserts a
+% kern to compensate the indent.
+%
% This means that the target of numbered and unnumbered sectioning commands
-% differ, both regarding the location and in relation to the
+% differ, both regarding the location and in relation to the
% tagging structure: The anchor from the \cs{refstepcounter} is outside of
% the structure created by the heading title if the para tags are used,
-% while the other anchors are inside and so the structure destinations are different.
-%
+% while the other anchors are inside and so the structure destinations are different.
+%
% We unify this by suppressing the anchor from the refstepcounter.
% Also we only go back if the indent is positive.
-%
+%
% At first suppress all hyperref patches related to sectioning:
% \begin{macrocode}
\def\hyper@nopatch@sectioning{}
@@ -638,13 +641,15 @@
%
% \begin{macro}{\@hyp@section@target@nnn}
% A simple internal command. There is no need for something public,
-% as packages defining their own version of \cs{@startsection} will
-% probably need something slightly different based on \cs{MakeLinkTarget}.
+% as packages defining their own version of \cs{@startsection} will
+% probably need something slightly different based on \cs{MakeLinkTarget}.
+% \changes{v0.84i}{2025/02/13}{Wrapped all use inside \cs{NoCaseChange},
+% tagging-project issue \#787}
% \begin{macrocode}
\cs_new_protected:Npn \@hyp@section@target@nnn #1 #2 #3 %#1 optarg #2 name/counter, #3 indent
{
\makebox[0pt][l]
- {
+ {
\skip_set:Nn \@tempskipa {#3}
\dim_compare:nNnF {\@tempskipa}<{0pt}{\kern-\@tempskipa}
\MakeLinkTarget#1{#2}
@@ -652,7 +657,7 @@
}
% \end{macrocode}
% \end{macro}
-%
+%
% \subsection{Adaption of the heading commands}
% We add to \cs{@startsection} the commands to open the \texttt{Sect}
% structure and to change the para tag.
@@ -674,19 +679,23 @@
\tag_tool:n { sec-start=#1}%new
\@ifstar
{\@ssect{#3}{#4}{#5}{#6}}%
- {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
+ {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
% \end{macrocode}
-% To be able to correctly tag the number we need a special
+% To be able to correctly tag the number we need a special
% \cs{@hangfrom} variant. This is a bit tricky:
-% As the paragraph starts after the \cs{setbox} luatex attributes
+% As the paragraph starts after the \cs{setbox} luatex attributes
% are not set yet and numbers are unmarked if one doesn't pay attention.
% The code assumes that we are in vmode!
+% 2025-01-20: Until the redefinition is gone from tagpdf we have to empty the hook:
+% \begin{macrocode}
+\RemoveFromHook{package/latex-lab-testphase-sec/after}[tagpdf]
+% \end{macrocode}
% \begin{macrocode}
\cs_new_protected:Npn \@kernel@tag@hangfrom #1
{
\tagstructbegin{tag=\l_@@_para_tag_tl}
\cs_if_exist_use:N \@@_gincr_para_begin_int:
- \tagstructbegin{tag=Lbl}
+ \tagstructbegin{tag=section-number}
\setbox\@tempboxa
\hbox
{
@@ -696,12 +705,12 @@
\bool_lazy_and:nnT
{\tag_if_active_p:}
{\g_@@_mode_lua_bool}
- {\tagmcbegin{tag=Lbl}}
+ {\tagmcbegin{tag=section-number}}
{#1}
}
% \end{macrocode}
% We stop tagging now, to avoid that the \cs{noindent} triggers
-% the paratagging. We do not disable paratagging completely, to
+% the paratagging. We do not disable paratagging completely, to
% avoid that the numbering goes wrong.
% \begin{macrocode}
\tag_suspend:n{hangfrom}
@@ -714,31 +723,31 @@
% \end{macrocode}
% This command is used to tag the numbers of runin. We do not try
% to avoid the empty container from the paratagging, this would require
-% more changes.
+% more changes.
% \begin{macrocode}
\cs_new_protected:Npn \@kernel@tag@svsec
{
- \tag_mc_end_push:
- \tag_struct_begin:n{tag=Lbl}
- \tag_mc_begin:n{}
+ \tag_mc_end_push:
+ \tag_struct_begin:n{tag=section-number}
+ \tag_mc_begin:n{}
\@svsec
\tag_mc_end:
\tag_struct_end:
\tag_mc_begin_pop:n{}
- }
+ }
% \end{macrocode}
% \cs{@sect} is only changed to replace the hyperref patches
% and to use the new \cs{@kernel@tag@hangfrom} and \cs{@kernel@tag@svsec}
% \begin{macrocode}
%<@@=>
-\def\@sect#1#2#3#4#5#6[#7]#8{%
+\def\@sect#1#2#3#4#5#6[#7]#8{%
\ifnum #2>\c@secnumdepth
- \def\@svsec{\@hyp@section@target@nnn{[section]}{}{#3}}
+ \def\@svsec{\NoCaseChange{\@hyp@section@target@nnn{[section]}{}{#3}}}
\else
\LinkTargetOff
\refstepcounter{#1}%
\LinkTargetOn
- \protected@edef\@svsec{\@hyp@section@target@nnn{}{#1}{#3}\@seccntformat{#1}\relax}%
+ \protected@edef\@svsec{\NoCaseChange{\@hyp@section@target@nnn{}{#1}{#3}}\@seccntformat{#1}\relax}%
\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
@@ -747,9 +756,9 @@
#6{%
\ifnum #2>\c@secnumdepth
\@hangfrom {\hskip #3\relax\@svsec}%
- \else
+ \else
\@kernel@tag@hangfrom{\hskip #3\relax\@svsec}%
- \fi
+ \fi
\interlinepenalty \@M #8\@@par}%
\endgroup
\csname #1mark\endcsname{#7}%
@@ -763,7 +772,7 @@
#6{\hskip #3\relax
\ifnum #2>\c@secnumdepth
\@svsec
- \else
+ \else
\@kernel@tag@svsec
\fi #8}%
\csname #1mark\endcsname{#7}%
@@ -783,16 +792,16 @@
\begingroup
\tagtool{para-flattened=true}
#4{%
- \@hangfrom{\hskip #1\relax\@hyp@section@target@nnn{[section]}{}{#1}}%
+ \@hangfrom{\hskip #1\relax\NoCaseChange{\@hyp@section@target@nnn{[section]}{}{#1}}}%
\interlinepenalty \@M #5\@@par}%
\endgroup
\else
- \def\@svsechd{#4{\hskip #1\relax\@hyp@section@target@nnn{[section]}{}{#3}\relax #5}}%
+ \def\@svsechd{#4{\hskip #1\relax\NoCaseChange{\@hyp@section@target@nnn{[section]}{}{#3}}\relax #5}}%
\fi
- \@xsect{#3}}
+ \@xsect{#3}}
% \end{macrocode}
% At last \cs{@xsect} needs code in two places. For display headings it has to
-% restore the default para code, for run in headings it has to separated the
+% restore the default para code, for run in headings it has to separated the
% heading from the following text.
% \begin{macrocode}
\def\@xsect#1{%
@@ -820,14 +829,14 @@
\everypar{}%
\fi}%
\fi
- \ignorespaces}
-%</package>
+ \ignorespaces}
+%</package>
% \end{macrocode}
% \begin{macrocode}
%<*latex-lab>
\ProvidesFile{sec-latex-lab-testphase.ltx}
- [\ltlabsecdate\space v\ltlabsecversion\space latex-lab wrapper sec]
+ [\ltlabsecdate\space v\ltlabsecversion\space latex-lab wrapper sec]
\RequirePackage{latex-lab-testphase-sec}
%</latex-lab>
% \end{macrocode}