diff options
Diffstat (limited to 'macros')
390 files changed, 10817 insertions, 6314 deletions
diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md index 343bb1b759..49f51d34a3 100644 --- a/macros/latex-dev/base/README.md +++ b/macros/latex-dev/base/README.md @@ -1,7 +1,7 @@ The LaTeX kernel ================ -Release 2023-06-01 pre-release 1 +Release 2023-06-01 pre-release 2 Overview -------- diff --git a/macros/latex-dev/base/alltt.dtx b/macros/latex-dev/base/alltt.dtx index 908fe92400..548b91bcea 100644 --- a/macros/latex-dev/base/alltt.dtx +++ b/macros/latex-dev/base/alltt.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/alltt.ins b/macros/latex-dev/base/alltt.ins index f46404bcf4..3f40ddc0f0 100644 --- a/macros/latex-dev/base/alltt.ins +++ b/macros/latex-dev/base/alltt.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/alltt.pdf b/macros/latex-dev/base/alltt.pdf Binary files differindex e8d8da01e4..b5a773fce8 100644 --- a/macros/latex-dev/base/alltt.pdf +++ b/macros/latex-dev/base/alltt.pdf diff --git a/macros/latex-dev/base/cfgguide.pdf b/macros/latex-dev/base/cfgguide.pdf Binary files differindex d574da1576..9199195161 100644 --- a/macros/latex-dev/base/cfgguide.pdf +++ b/macros/latex-dev/base/cfgguide.pdf diff --git a/macros/latex-dev/base/cfgguide.tex b/macros/latex-dev/base/cfgguide.tex index 53f53d90b4..e0f76b74fb 100644 --- a/macros/latex-dev/base/cfgguide.tex +++ b/macros/latex-dev/base/cfgguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -41,7 +41,7 @@ \author{\copyright~Copyright 1998, 2001, 2003 \LaTeX\ Project Team.\\ All rights reserved.% - \footnote{This file may distributed and/or modified under the + \footnote{This file 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. See the source \texttt{cfgguide.tex} for full details.}% diff --git a/macros/latex-dev/base/changes.txt b/macros/latex-dev/base/changes.txt index 468b66433b..218b2b9db7 100644 --- a/macros/latex-dev/base/changes.txt +++ b/macros/latex-dev/base/changes.txt @@ -6,10 +6,27 @@ completeness or accuracy and it contains some references to files that are not part of the distribution. ================================================================================ +2023-01-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * ltpara.dtx (subsection{Providing hooks for paragraphs}): + Backout \parskip at top of minipage if it shouldn't be there + but is due to whatsits (gh/989) + +2023-01-16 Yukai Chou <muzimuzhi@gmail.com> + + * ltnews.cls: + Added full release date yyyy-mm-dd to _all_ ltnews issues. + Added \publicationday{<day>} to specify day in a month in ltnews<n>.tex. + <day> defaults to 01. + ================================================================================ All changes above are only part of the development branch for the next release. ================================================================================ +2023-01-19 Josef Friedrich <josef@friedrich.rocks> + + * ltluatex.dtx: + Remove unused local variable tex_setattribute (gh/978) 2022-11-24 Frank Mittelbach <Frank.Mittelbach@latex-project.org> @@ -196,7 +213,7 @@ All changes above are only part of the development branch for the next release. * doc.dtx recast Package Option declarations using \DeclareKeys - + 2022-06-10 Ulrike Fischer <Ulrike.Fischer@latex-project.org> * cmfonts.fdd diff --git a/macros/latex-dev/base/classes.dtx b/macros/latex-dev/base/classes.dtx index 188679d4d9..e16dc657a1 100644 --- a/macros/latex-dev/base/classes.dtx +++ b/macros/latex-dev/base/classes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/classes.ins b/macros/latex-dev/base/classes.ins index 1f7b331691..50a51ea666 100644 --- a/macros/latex-dev/base/classes.ins +++ b/macros/latex-dev/base/classes.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/classes.pdf b/macros/latex-dev/base/classes.pdf Binary files differindex 30f8f4f5c0..39f29d0e8b 100644 --- a/macros/latex-dev/base/classes.pdf +++ b/macros/latex-dev/base/classes.pdf diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf Binary files differindex 709334dd02..ab8af60728 100644 --- a/macros/latex-dev/base/clsguide.pdf +++ b/macros/latex-dev/base/clsguide.pdf diff --git a/macros/latex-dev/base/clsguide.tex b/macros/latex-dev/base/clsguide.tex index 0ed5e60817..ce2c1dcf81 100644 --- a/macros/latex-dev/base/clsguide.tex +++ b/macros/latex-dev/base/clsguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -36,7 +36,7 @@ \author{Copyright \copyright~1995--2006 The \LaTeX\ Project\\ All rights reserved.% - \footnote{This file may distributed and/or modified under the + \footnote{This file 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. See the source \texttt{clsguide.tex} for full details.}% diff --git a/macros/latex-dev/base/cmextra.ins b/macros/latex-dev/base/cmextra.ins index a2befb3aef..0fa45183fc 100644 --- a/macros/latex-dev/base/cmextra.ins +++ b/macros/latex-dev/base/cmextra.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/cmfonts.ins b/macros/latex-dev/base/cmfonts.ins index 55af4759c5..af5ac7e5f8 100644 --- a/macros/latex-dev/base/cmfonts.ins +++ b/macros/latex-dev/base/cmfonts.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/cmfonts.pdf b/macros/latex-dev/base/cmfonts.pdf Binary files differindex 255f6af9ad..6274984a6d 100644 --- a/macros/latex-dev/base/cmfonts.pdf +++ b/macros/latex-dev/base/cmfonts.pdf diff --git a/macros/latex-dev/base/cyrguide.pdf b/macros/latex-dev/base/cyrguide.pdf Binary files differindex eb8b6a1618..1b614ae415 100644 --- a/macros/latex-dev/base/cyrguide.pdf +++ b/macros/latex-dev/base/cyrguide.pdf diff --git a/macros/latex-dev/base/cyrguide.tex b/macros/latex-dev/base/cyrguide.tex index 7304a586e4..394cd59e20 100644 --- a/macros/latex-dev/base/cyrguide.tex +++ b/macros/latex-dev/base/cyrguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -34,7 +34,7 @@ \author{\copyright~Copyright 1998--1999,\\ Vladimir Volovich, Werner Lemberg and \LaTeX\ Project Team.\\ All rights reserved.% - \footnote{This file may distributed and/or modified under the + \footnote{This file 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. See the source \texttt{cyrguide.tex} for full details.}% diff --git a/macros/latex-dev/base/doc-code.pdf b/macros/latex-dev/base/doc-code.pdf Binary files differindex 5d573b35df..93037436a6 100644 --- a/macros/latex-dev/base/doc-code.pdf +++ b/macros/latex-dev/base/doc-code.pdf diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf Binary files differindex cce65ca48d..796e6319f2 100644 --- a/macros/latex-dev/base/doc.pdf +++ b/macros/latex-dev/base/doc.pdf diff --git a/macros/latex-dev/base/docstrip.dtx b/macros/latex-dev/base/docstrip.dtx index de20073c48..be373499e6 100644 --- a/macros/latex-dev/base/docstrip.dtx +++ b/macros/latex-dev/base/docstrip.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/docstrip.ins b/macros/latex-dev/base/docstrip.ins index e2187594a4..79d4c429dd 100644 --- a/macros/latex-dev/base/docstrip.ins +++ b/macros/latex-dev/base/docstrip.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -52,7 +52,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/docstrip.pdf b/macros/latex-dev/base/docstrip.pdf Binary files differindex 661da9efd5..a489d9b28a 100644 --- a/macros/latex-dev/base/docstrip.pdf +++ b/macros/latex-dev/base/docstrip.pdf diff --git a/macros/latex-dev/base/ec.ins b/macros/latex-dev/base/ec.ins index 47823e7edf..15a7c3848c 100644 --- a/macros/latex-dev/base/ec.ins +++ b/macros/latex-dev/base/ec.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/encguide.pdf b/macros/latex-dev/base/encguide.pdf Binary files differindex 07fc3f5113..0c2ed52b02 100644 --- a/macros/latex-dev/base/encguide.pdf +++ b/macros/latex-dev/base/encguide.pdf diff --git a/macros/latex-dev/base/encguide.tex b/macros/latex-dev/base/encguide.tex index 3c95cf30cc..1a0978267e 100644 --- a/macros/latex-dev/base/encguide.tex +++ b/macros/latex-dev/base/encguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/exscale.dtx b/macros/latex-dev/base/exscale.dtx index bc884c4db0..89890a4198 100644 --- a/macros/latex-dev/base/exscale.dtx +++ b/macros/latex-dev/base/exscale.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/exscale.ins b/macros/latex-dev/base/exscale.ins index d202aad7cf..ae75460ee5 100644 --- a/macros/latex-dev/base/exscale.ins +++ b/macros/latex-dev/base/exscale.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/exscale.pdf b/macros/latex-dev/base/exscale.pdf Binary files differindex a5f1195be7..8dd6ce4286 100644 --- a/macros/latex-dev/base/exscale.pdf +++ b/macros/latex-dev/base/exscale.pdf diff --git a/macros/latex-dev/base/fix-cm.dtx b/macros/latex-dev/base/fix-cm.dtx index 5f8983ed34..9e39cd192b 100644 --- a/macros/latex-dev/base/fix-cm.dtx +++ b/macros/latex-dev/base/fix-cm.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/fix-cm.ins b/macros/latex-dev/base/fix-cm.ins index b688cd66cf..68c6792412 100644 --- a/macros/latex-dev/base/fix-cm.ins +++ b/macros/latex-dev/base/fix-cm.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/fix-cm.pdf b/macros/latex-dev/base/fix-cm.pdf Binary files differindex 0f14974f3a..f3eb096139 100644 --- a/macros/latex-dev/base/fix-cm.pdf +++ b/macros/latex-dev/base/fix-cm.pdf diff --git a/macros/latex-dev/base/fntguide.pdf b/macros/latex-dev/base/fntguide.pdf Binary files differindex b2e74d07e7..d92d3d71bb 100644 --- a/macros/latex-dev/base/fntguide.pdf +++ b/macros/latex-dev/base/fntguide.pdf diff --git a/macros/latex-dev/base/fntguide.tex b/macros/latex-dev/base/fntguide.tex index 65467339f1..33bbed3ba3 100644 --- a/macros/latex-dev/base/fntguide.tex +++ b/macros/latex-dev/base/fntguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % % The LaTeX Project and any individual authors listed elsewhere % in this file. @@ -46,7 +46,7 @@ Team.\thanks{Thanks to Arash Esbati for documenting the newer NFSS features of 2020}\\ All rights reserved.% - \footnote{This file may distributed and/or modified under the + \footnote{This file 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. See the source \texttt{fntguide.tex} for full details.}% diff --git a/macros/latex-dev/base/fontdef.dtx b/macros/latex-dev/base/fontdef.dtx index 06af8feefd..5e88e55079 100644 --- a/macros/latex-dev/base/fontdef.dtx +++ b/macros/latex-dev/base/fontdef.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/format.ins b/macros/latex-dev/base/format.ins index 369f01a7c5..74cd78ff4a 100644 --- a/macros/latex-dev/base/format.ins +++ b/macros/latex-dev/base/format.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -88,7 +88,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 2015-2022 +Copyright (C) 2015-2023 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -123,7 +123,7 @@ extension .ins) which are part of the distribution. This is a generated file. -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/graphpap.dtx b/macros/latex-dev/base/graphpap.dtx index 78bb688f83..6b7bc8b822 100644 --- a/macros/latex-dev/base/graphpap.dtx +++ b/macros/latex-dev/base/graphpap.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/graphpap.ins b/macros/latex-dev/base/graphpap.ins index d82cbd6670..43ba83aae3 100644 --- a/macros/latex-dev/base/graphpap.ins +++ b/macros/latex-dev/base/graphpap.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/graphpap.pdf b/macros/latex-dev/base/graphpap.pdf Binary files differindex 3f3b067639..c5d07452ce 100644 --- a/macros/latex-dev/base/graphpap.pdf +++ b/macros/latex-dev/base/graphpap.pdf diff --git a/macros/latex-dev/base/idx.tex b/macros/latex-dev/base/idx.tex index bc0dd71021..04c8ef6959 100644 --- a/macros/latex-dev/base/idx.tex +++ b/macros/latex-dev/base/idx.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ifthen.dtx b/macros/latex-dev/base/ifthen.dtx index d36042990d..aefc4a7666 100644 --- a/macros/latex-dev/base/ifthen.dtx +++ b/macros/latex-dev/base/ifthen.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ifthen.ins b/macros/latex-dev/base/ifthen.ins index 88047e94f0..697a4a38b3 100644 --- a/macros/latex-dev/base/ifthen.ins +++ b/macros/latex-dev/base/ifthen.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/ifthen.pdf b/macros/latex-dev/base/ifthen.pdf Binary files differindex 1702b8105b..d09c30cace 100644 --- a/macros/latex-dev/base/ifthen.pdf +++ b/macros/latex-dev/base/ifthen.pdf diff --git a/macros/latex-dev/base/inputenc.dtx b/macros/latex-dev/base/inputenc.dtx index e056f8ffd7..02956a8c07 100644 --- a/macros/latex-dev/base/inputenc.dtx +++ b/macros/latex-dev/base/inputenc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/inputenc.ins b/macros/latex-dev/base/inputenc.ins index adacf9efce..3857827070 100644 --- a/macros/latex-dev/base/inputenc.ins +++ b/macros/latex-dev/base/inputenc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/inputenc.pdf b/macros/latex-dev/base/inputenc.pdf Binary files differindex dce32355a2..4c305b8bc1 100644 --- a/macros/latex-dev/base/inputenc.pdf +++ b/macros/latex-dev/base/inputenc.pdf diff --git a/macros/latex-dev/base/lablst.tex b/macros/latex-dev/base/lablst.tex index 0821b0e4f0..b0a3ac1ab6 100644 --- a/macros/latex-dev/base/lablst.tex +++ b/macros/latex-dev/base/lablst.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/lamport-manual.pdf b/macros/latex-dev/base/lamport-manual.pdf Binary files differindex e0895befef..14ffd31d47 100644 --- a/macros/latex-dev/base/lamport-manual.pdf +++ b/macros/latex-dev/base/lamport-manual.pdf diff --git a/macros/latex-dev/base/latex209.dtx b/macros/latex-dev/base/latex209.dtx index 768f7237a5..b84564bb55 100644 --- a/macros/latex-dev/base/latex209.dtx +++ b/macros/latex-dev/base/latex209.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/latex209.ins b/macros/latex-dev/base/latex209.ins index f530347a3c..0c90fa36ea 100644 --- a/macros/latex-dev/base/latex209.ins +++ b/macros/latex-dev/base/latex209.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/latexrelease.dtx b/macros/latex-dev/base/latexrelease.dtx index 132a2548e4..4abde253e1 100644 --- a/macros/latex-dev/base/latexrelease.dtx +++ b/macros/latex-dev/base/latexrelease.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/latexrelease.ins b/macros/latex-dev/base/latexrelease.ins index b5e97a9479..61315f8e07 100644 --- a/macros/latex-dev/base/latexrelease.ins +++ b/macros/latex-dev/base/latexrelease.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf Binary files differindex a0111a19a8..ce0a066012 100644 --- a/macros/latex-dev/base/latexrelease.pdf +++ b/macros/latex-dev/base/latexrelease.pdf diff --git a/macros/latex-dev/base/latexsym.dtx b/macros/latex-dev/base/latexsym.dtx index 62fb097c0d..e4e1559e27 100644 --- a/macros/latex-dev/base/latexsym.dtx +++ b/macros/latex-dev/base/latexsym.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/latexsym.ins b/macros/latex-dev/base/latexsym.ins index 468afddd67..12d658bca9 100644 --- a/macros/latex-dev/base/latexsym.ins +++ b/macros/latex-dev/base/latexsym.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -87,7 +87,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/latexsym.pdf b/macros/latex-dev/base/latexsym.pdf Binary files differindex b9d8779f70..2b3650506a 100644 --- a/macros/latex-dev/base/latexsym.pdf +++ b/macros/latex-dev/base/latexsym.pdf diff --git a/macros/latex-dev/base/lb2.err b/macros/latex-dev/base/lb2.err index 46958ae3a5..d2ea742f82 100644 --- a/macros/latex-dev/base/lb2.err +++ b/macros/latex-dev/base/lb2.err @@ -363,10 +363,15 @@ Bafög-Ausgabe (Softcover) die inhaltlich identisch ist: ) \end{verbatim} - \begin{list}{}{\setlength\leftmargin{0cm}\setlength\rightmargin{3cm}} \item[] +Beide Ausgaben sind nur noch antiquarisch erhältlich. Das englische +Original "`The \LaTeX{} Companion"' existiert in der dritten Ausgabe +(Erscheinungsdatum Mai 2023). + +\item[] + Diese Errata-Datei (\texttt{\jobname.err}) ist Teil der \LaTeX-Distribution und die neuste Version findet man auf der \LaTeX{} Project Webseite unter diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf Binary files differindex 0c85e7c769..d5d94cd6d8 100644 --- a/macros/latex-dev/base/lb2.pdf +++ b/macros/latex-dev/base/lb2.pdf diff --git a/macros/latex-dev/base/letter.dtx b/macros/latex-dev/base/letter.dtx index 4052c260c8..3e3c36d3d0 100644 --- a/macros/latex-dev/base/letter.dtx +++ b/macros/latex-dev/base/letter.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/letter.ins b/macros/latex-dev/base/letter.ins index c078dc59ce..c522f39e59 100644 --- a/macros/latex-dev/base/letter.ins +++ b/macros/latex-dev/base/letter.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/letter.pdf b/macros/latex-dev/base/letter.pdf Binary files differindex 46adfcc798..fb5d1b851e 100644 --- a/macros/latex-dev/base/letter.pdf +++ b/macros/latex-dev/base/letter.pdf diff --git a/macros/latex-dev/base/lgc2.err b/macros/latex-dev/base/lgc2.err index 45b440a7f4..cb1a382348 100644 --- a/macros/latex-dev/base/lgc2.err +++ b/macros/latex-dev/base/lgc2.err @@ -330,6 +330,26 @@ ) \end{verbatim} +Reprinted by Lehmanns in 2022: + +\begin{verbatim} +@book(Lehmanns:GMRRV2022, + author = {Michel Goossens and Frank Mittelbach and Sebastian Rahtz + and Denis Roegel and Herbert Vo{\ss}}, + title = {The {\LaTeX} Graphics Companion}, + edition = 2, + series = {Tools and Techniques for Computer Typesetting}, + publisher = {Lehmanns Media}, + address = {Köln}, + year = {2022}, + isbn = {978-3-96543-303-8 (softcover), 978-3-96543-299-4 (ebook)}, + originalyear = {2007}, + pagenums = {976}, + bibliography = {yes}, + index = {yes}, +) +\end{verbatim} + \begin{list}{}{\setlength\leftmargin{0cm}\setlength\rightmargin{3cm}} \item[] @@ -378,7 +398,7 @@ Good luck! Contest period ends & Winner \\[4pt] 2008/05 & Milan Vujtek & 16 suggestions\\ 2010/05 & & \\ -\ldots & contest no longer open +\ldots & -- contest no longer open -- \end{tabular} \end{center} \end{list} diff --git a/macros/latex-dev/base/lgc2.pdf b/macros/latex-dev/base/lgc2.pdf Binary files differindex c60439b2de..161aa93503 100644 --- a/macros/latex-dev/base/lgc2.pdf +++ b/macros/latex-dev/base/lgc2.pdf diff --git a/macros/latex-dev/base/lppl.pdf b/macros/latex-dev/base/lppl.pdf Binary files differindex ecb66844e2..4b4c6fa326 100644 --- a/macros/latex-dev/base/lppl.pdf +++ b/macros/latex-dev/base/lppl.pdf diff --git a/macros/latex-dev/base/ltalloc.dtx b/macros/latex-dev/base/ltalloc.dtx index 4530d4b07b..c3498fb9c7 100644 --- a/macros/latex-dev/base/ltalloc.dtx +++ b/macros/latex-dev/base/ltalloc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltbibl.dtx b/macros/latex-dev/base/ltbibl.dtx index 4c219657b8..8e34ca685a 100644 --- a/macros/latex-dev/base/ltbibl.dtx +++ b/macros/latex-dev/base/ltbibl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltboxes.dtx b/macros/latex-dev/base/ltboxes.dtx index b82f5bdb8e..ff1717caa9 100644 --- a/macros/latex-dev/base/ltboxes.dtx +++ b/macros/latex-dev/base/ltboxes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltclass.dtx b/macros/latex-dev/base/ltclass.dtx index 63c42f6cd0..f6d5994d3f 100644 --- a/macros/latex-dev/base/ltclass.dtx +++ b/macros/latex-dev/base/ltclass.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltcmd.dtx b/macros/latex-dev/base/ltcmd.dtx index 30a1908c47..78a5a389ae 100644 --- a/macros/latex-dev/base/ltcmd.dtx +++ b/macros/latex-dev/base/ltcmd.dtx @@ -2,7 +2,7 @@ % % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle % Copyright (C) 2004-2008 Frank Mittelbach, The LaTeX3 Project -% Copyright (C) 2009-2022 +% Copyright (C) 2009-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltcmdhooks-code.pdf b/macros/latex-dev/base/ltcmdhooks-code.pdf Binary files differindex b324da26c9..0dc121d2ce 100644 --- a/macros/latex-dev/base/ltcmdhooks-code.pdf +++ b/macros/latex-dev/base/ltcmdhooks-code.pdf diff --git a/macros/latex-dev/base/ltcmdhooks-doc.pdf b/macros/latex-dev/base/ltcmdhooks-doc.pdf Binary files differindex 42222eb416..c67f46be25 100644 --- a/macros/latex-dev/base/ltcmdhooks-doc.pdf +++ b/macros/latex-dev/base/ltcmdhooks-doc.pdf diff --git a/macros/latex-dev/base/ltcntrl.dtx b/macros/latex-dev/base/ltcntrl.dtx index 5ebe256c75..52dcdbf983 100644 --- a/macros/latex-dev/base/ltcntrl.dtx +++ b/macros/latex-dev/base/ltcntrl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltcounts.dtx b/macros/latex-dev/base/ltcounts.dtx index ffe2265ac3..69025fa479 100644 --- a/macros/latex-dev/base/ltcounts.dtx +++ b/macros/latex-dev/base/ltcounts.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltdefns.dtx b/macros/latex-dev/base/ltdefns.dtx index c604bd9620..209c4e0fba 100644 --- a/macros/latex-dev/base/ltdefns.dtx +++ b/macros/latex-dev/base/ltdefns.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltdirchk.dtx b/macros/latex-dev/base/ltdirchk.dtx index 16a2ed9e68..6e02929754 100644 --- a/macros/latex-dev/base/ltdirchk.dtx +++ b/macros/latex-dev/base/ltdirchk.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/lterror.dtx b/macros/latex-dev/base/lterror.dtx index b302a9a74c..77672168ce 100644 --- a/macros/latex-dev/base/lterror.dtx +++ b/macros/latex-dev/base/lterror.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltexpl.dtx b/macros/latex-dev/base/ltexpl.dtx index aab189bec2..92e6de52cb 100644 --- a/macros/latex-dev/base/ltexpl.dtx +++ b/macros/latex-dev/base/ltexpl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2022 +% Copyright (C) 2019-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfilehook-code.pdf b/macros/latex-dev/base/ltfilehook-code.pdf Binary files differindex e031f84227..c0f1ed5dbe 100644 --- a/macros/latex-dev/base/ltfilehook-code.pdf +++ b/macros/latex-dev/base/ltfilehook-code.pdf diff --git a/macros/latex-dev/base/ltfilehook-doc.pdf b/macros/latex-dev/base/ltfilehook-doc.pdf Binary files differindex ddc060fcc0..c24b2321a9 100644 --- a/macros/latex-dev/base/ltfilehook-doc.pdf +++ b/macros/latex-dev/base/ltfilehook-doc.pdf diff --git a/macros/latex-dev/base/ltfilehook.dtx b/macros/latex-dev/base/ltfilehook.dtx index c8503de891..d43ffc857d 100644 --- a/macros/latex-dev/base/ltfilehook.dtx +++ b/macros/latex-dev/base/ltfilehook.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2020-2022 +% Copyright (C) 2020-2023 % Frank Mittelbach, Phelype Oleinik & LaTeX Team % % This file is part of the LaTeX base system. diff --git a/macros/latex-dev/base/ltfiles.dtx b/macros/latex-dev/base/ltfiles.dtx index d99dfdcd48..042565299a 100644 --- a/macros/latex-dev/base/ltfiles.dtx +++ b/macros/latex-dev/base/ltfiles.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{ltfiles.dtx} - [2022/05/27 v1.2r LaTeX Kernel (File Handling)] + [2023/01/05 v1.2s LaTeX Kernel (File Handling)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltfiles.dtx} @@ -417,6 +417,16 @@ \ignorespaces} % \end{macrocode} % +% Provide a global definition for \cs{do} as well, so that it is +% already defined in the preamble and not late as +% \verb=\begin{document}= overwriting some definition given by the +% unsuspecting user in the preamble. +% \changes{v1.2s}{2023/01/05}{\cs{do} now with default definition in +% the kernel (gh/975)} +% \begin{macrocode} +\let\do\noexpand +% \end{macrocode} +% % The \hook{begindocument} hook already existed in the kernel since % 1994 under the name \cs{atbegindocumenthook} the % additional ones are originally from the \pkg{etoolbox} diff --git a/macros/latex-dev/base/ltfinal.dtx b/macros/latex-dev/base/ltfinal.dtx index a19ffa8305..9fa6bbc856 100644 --- a/macros/latex-dev/base/ltfinal.dtx +++ b/macros/latex-dev/base/ltfinal.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfloat.dtx b/macros/latex-dev/base/ltfloat.dtx index 8b5b92759a..7247824548 100644 --- a/macros/latex-dev/base/ltfloat.dtx +++ b/macros/latex-dev/base/ltfloat.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfntcmd.dtx b/macros/latex-dev/base/ltfntcmd.dtx index 64064abcb5..bb6dbfe75c 100644 --- a/macros/latex-dev/base/ltfntcmd.dtx +++ b/macros/latex-dev/base/ltfntcmd.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfssaxes.dtx b/macros/latex-dev/base/ltfssaxes.dtx index 843e8b544c..9e68b38654 100644 --- a/macros/latex-dev/base/ltfssaxes.dtx +++ b/macros/latex-dev/base/ltfssaxes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2022 +% Copyright (C) 2019-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfssbas.dtx b/macros/latex-dev/base/ltfssbas.dtx index cc43622a4b..019fca9aba 100644 --- a/macros/latex-dev/base/ltfssbas.dtx +++ b/macros/latex-dev/base/ltfssbas.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfsscmp.dtx b/macros/latex-dev/base/ltfsscmp.dtx index 09f43a0d94..7bdfe2fd3e 100644 --- a/macros/latex-dev/base/ltfsscmp.dtx +++ b/macros/latex-dev/base/ltfsscmp.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfssdcl.dtx b/macros/latex-dev/base/ltfssdcl.dtx index 49041605e9..c3a743d249 100644 --- a/macros/latex-dev/base/ltfssdcl.dtx +++ b/macros/latex-dev/base/ltfssdcl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfssini.dtx b/macros/latex-dev/base/ltfssini.dtx index 12e3b6289b..7b43f0228b 100644 --- a/macros/latex-dev/base/ltfssini.dtx +++ b/macros/latex-dev/base/ltfssini.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfsstrc.dtx b/macros/latex-dev/base/ltfsstrc.dtx index 699fd2c594..be0e6c68cf 100644 --- a/macros/latex-dev/base/ltfsstrc.dtx +++ b/macros/latex-dev/base/ltfsstrc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/lthooks-code.pdf b/macros/latex-dev/base/lthooks-code.pdf Binary files differindex 4b4b85023e..d2bd8ee0a1 100644 --- a/macros/latex-dev/base/lthooks-code.pdf +++ b/macros/latex-dev/base/lthooks-code.pdf diff --git a/macros/latex-dev/base/lthooks-doc.pdf b/macros/latex-dev/base/lthooks-doc.pdf Binary files differindex 17e5d3a514..e9954e43f7 100644 --- a/macros/latex-dev/base/lthooks-doc.pdf +++ b/macros/latex-dev/base/lthooks-doc.pdf diff --git a/macros/latex-dev/base/lthooks.dtx b/macros/latex-dev/base/lthooks.dtx index cfa1454775..1255c63a8c 100644 --- a/macros/latex-dev/base/lthooks.dtx +++ b/macros/latex-dev/base/lthooks.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2020-2022 +% Copyright (C) 2020-2023 % Frank Mittelbach, Phelype Oleinik & LaTeX Team % % This file is part of the LaTeX base system. diff --git a/macros/latex-dev/base/lthyphen.dtx b/macros/latex-dev/base/lthyphen.dtx index b7cede1175..88d30c9cca 100644 --- a/macros/latex-dev/base/lthyphen.dtx +++ b/macros/latex-dev/base/lthyphen.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltidxglo.dtx b/macros/latex-dev/base/ltidxglo.dtx index 395fe83975..a2dc6b873e 100644 --- a/macros/latex-dev/base/ltidxglo.dtx +++ b/macros/latex-dev/base/ltidxglo.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltkeys.dtx b/macros/latex-dev/base/ltkeys.dtx index edf12f7cb2..80c36d5cd9 100644 --- a/macros/latex-dev/base/ltkeys.dtx +++ b/macros/latex-dev/base/ltkeys.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2021-2022 +% Copyright (C) 2021-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltlength.dtx b/macros/latex-dev/base/ltlength.dtx index f979dd4e23..10e4b671c8 100644 --- a/macros/latex-dev/base/ltlength.dtx +++ b/macros/latex-dev/base/ltlength.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltlists.dtx b/macros/latex-dev/base/ltlists.dtx index d0413dad08..afde14e070 100644 --- a/macros/latex-dev/base/ltlists.dtx +++ b/macros/latex-dev/base/ltlists.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltlogos.dtx b/macros/latex-dev/base/ltlogos.dtx index 56453f73db..7589cf36e1 100644 --- a/macros/latex-dev/base/ltlogos.dtx +++ b/macros/latex-dev/base/ltlogos.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltluatex.dtx b/macros/latex-dev/base/ltluatex.dtx index 6c66a96be0..135cb63009 100644 --- a/macros/latex-dev/base/ltluatex.dtx +++ b/macros/latex-dev/base/ltluatex.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2022 +% Copyright (C) 2015-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -28,7 +28,7 @@ \ProvidesFile{ltluatex.dtx} %</driver> %<*tex> -[2022/10/03 v1.2a +[2023/01/19 v1.2b %</tex> %<plain> LuaTeX support for plain TeX (core) %<*tex> @@ -968,10 +968,10 @@ local luatexbase = luatexbase % % Some Lua best practice: use local versions of functions where possible. % \changes{v1.1u}{2021/08/11}{Define missing local function} +% \changes{v1.2b}{2023/01/19}{Remove unused local variable tex_setattribute} % \begin{macrocode} local string_gsub = string.gsub local tex_count = tex.count -local tex_setattribute = tex.setattribute local tex_setcount = tex.setcount local texio_write_nl = texio.write_nl local flush_list = node.flush_list diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf Binary files differindex c99840f04b..855095c6ef 100644 --- a/macros/latex-dev/base/ltluatex.pdf +++ b/macros/latex-dev/base/ltluatex.pdf diff --git a/macros/latex-dev/base/ltmarks-code.pdf b/macros/latex-dev/base/ltmarks-code.pdf Binary files differindex 3204fd93a2..54c2703531 100644 --- a/macros/latex-dev/base/ltmarks-code.pdf +++ b/macros/latex-dev/base/ltmarks-code.pdf diff --git a/macros/latex-dev/base/ltmarks-doc.pdf b/macros/latex-dev/base/ltmarks-doc.pdf Binary files differindex 1203c72f0e..cf70d21cae 100644 --- a/macros/latex-dev/base/ltmarks-doc.pdf +++ b/macros/latex-dev/base/ltmarks-doc.pdf diff --git a/macros/latex-dev/base/ltmath.dtx b/macros/latex-dev/base/ltmath.dtx index 60394460f5..746a3077fb 100644 --- a/macros/latex-dev/base/ltmath.dtx +++ b/macros/latex-dev/base/ltmath.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltmiscen.dtx b/macros/latex-dev/base/ltmiscen.dtx index 69a7ac6963..801d1e6862 100644 --- a/macros/latex-dev/base/ltmiscen.dtx +++ b/macros/latex-dev/base/ltmiscen.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews.cls b/macros/latex-dev/base/ltnews.cls index 9271b56f1c..f55165d436 100644 --- a/macros/latex-dev/base/ltnews.cls +++ b/macros/latex-dev/base/ltnews.cls @@ -429,6 +429,30 @@ \newcommand{\@year}{\ClassError{ltnews} {No \protect\publicationyear~given}\@eha} +\newcommand{\publicationday}{\renewcommand{\@day}} +\newcommand{\@day}{01} % most releases happen on 1st of a month + +\newcommand{\publicationdate}{% + % support draft ltnews, \publicationyear{2023 --- DRAFT ...} + \expandafter\@gobblenonyear\@year\@nil + -\@julianmonthtonum\@month-\two@digits\@day} + +\newcommand{\@julianmonthtonum}[1]{\@nameuse{@juliantonum#1}} +\def\@juliantonumJanuary {01} +\def\@juliantonumFebruary {02} +\def\@juliantonumMarch {03} +\def\@juliantonumApril {04} +\def\@juliantonumMay {05} +\def\@juliantonumJune {06} +\def\@juliantonumJuly {07} +\def\@juliantonumAugust {08} +\def\@juliantonumSeptember{09} +\def\@juliantonumOctober {10} +\def\@juliantonumNovember {11} +\def\@juliantonumDecember {12} + +\long\def\@gobblenonyear#1#2#3#4#5\@nil{#1#2#3#4} + \newcommand{\publicationissue}{\renewcommand{\@issue}} \newcommand{\@issue}{\ClassError{ltnews} {No \protect\publicationissue~given}\@eha} @@ -449,7 +473,8 @@ \twocolumn[{% \parbox[t][7\baselineskip]{\textwidth}{% \@titlefont\@title\\[\medskipamount] - \normalfont\normalsize\issuename~\@issue, \@month~\@year + \normalfont\normalsize\issuename~\@issue, + \@month~\@year~(\publicationdate)% }% }]% \thispagestyle{titlepage} diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf Binary files differindex 3185ce2fc0..bc1b2d7b36 100644 --- a/macros/latex-dev/base/ltnews.pdf +++ b/macros/latex-dev/base/ltnews.pdf diff --git a/macros/latex-dev/base/ltnews.tex b/macros/latex-dev/base/ltnews.tex index 9a8de244c2..d239fc274f 100644 --- a/macros/latex-dev/base/ltnews.tex +++ b/macros/latex-dev/base/ltnews.tex @@ -1,7 +1,7 @@ % \iffalse meta-comment % % Copyright (C) 2006, 2009, 2011, 2014 Heiko Oberdiek -% Copyright (C) 2014-2022 +% Copyright (C) 2014-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -113,22 +113,11 @@ \renewcommand{\@evenfoot}{\@indiciafont\@indicia\hfill --\thepage}% } -\newcommand*{\MonthJanuary}{01} -\newcommand*{\MonthFebruary}{02} -\newcommand*{\MonthMarch}{03} -\newcommand*{\MonthApril}{04} -\newcommand*{\MonthMay}{05} -\newcommand*{\MonthJune}{06} -\newcommand*{\MonthJuly}{07} -\newcommand*{\MonthAugust}{08} -\newcommand*{\MonthSeptember}{09} -\newcommand*{\MonthOctober}{10} -\newcommand*{\MonthNovember}{11} -\newcommand*{\MonthDecember}{12} \newcommand*{\printissue}{% Issue % \texorpdfstring{\number\value{issue}}{\theissue}, % - \texorpdfstring{\@month\space\@year}{\@year/\@nameuse{Month\@month}}% + \texorpdfstring{\@month\space\@year\space(\publicationdate)} + {\@year/\@julianmonthtonum{\@month}}% } \let\l@part\l@section \let\l@section\l@subsection @@ -303,6 +292,7 @@ \loop \ifnum\value{issue}<\lastissue \stepcounter{issue}% + \publicationday{01}% \input{ltnews\theissue}% \repeat \stepcounter{issue}% diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf Binary files differindex 8bc64afa46..618176aa56 100644 --- a/macros/latex-dev/base/ltnews01.pdf +++ b/macros/latex-dev/base/ltnews01.pdf diff --git a/macros/latex-dev/base/ltnews01.tex b/macros/latex-dev/base/ltnews01.tex index 08ac57d27d..55c6b20dd6 100644 --- a/macros/latex-dev/base/ltnews01.tex +++ b/macros/latex-dev/base/ltnews01.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews02.pdf b/macros/latex-dev/base/ltnews02.pdf Binary files differindex 6410f6c49a..423dd7db37 100644 --- a/macros/latex-dev/base/ltnews02.pdf +++ b/macros/latex-dev/base/ltnews02.pdf diff --git a/macros/latex-dev/base/ltnews02.tex b/macros/latex-dev/base/ltnews02.tex index 1d875dcd03..58856fe97b 100644 --- a/macros/latex-dev/base/ltnews02.tex +++ b/macros/latex-dev/base/ltnews02.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews03.pdf b/macros/latex-dev/base/ltnews03.pdf Binary files differindex e6faf40788..a43f3c2ffc 100644 --- a/macros/latex-dev/base/ltnews03.pdf +++ b/macros/latex-dev/base/ltnews03.pdf diff --git a/macros/latex-dev/base/ltnews03.tex b/macros/latex-dev/base/ltnews03.tex index 93f0963426..96a5bec428 100644 --- a/macros/latex-dev/base/ltnews03.tex +++ b/macros/latex-dev/base/ltnews03.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews04.pdf b/macros/latex-dev/base/ltnews04.pdf Binary files differindex fdea7fa928..95683443c7 100644 --- a/macros/latex-dev/base/ltnews04.pdf +++ b/macros/latex-dev/base/ltnews04.pdf diff --git a/macros/latex-dev/base/ltnews04.tex b/macros/latex-dev/base/ltnews04.tex index 527024fa18..ab49d7ade3 100644 --- a/macros/latex-dev/base/ltnews04.tex +++ b/macros/latex-dev/base/ltnews04.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews05.pdf b/macros/latex-dev/base/ltnews05.pdf Binary files differindex f45d499a6a..91ba9c3669 100644 --- a/macros/latex-dev/base/ltnews05.pdf +++ b/macros/latex-dev/base/ltnews05.pdf diff --git a/macros/latex-dev/base/ltnews05.tex b/macros/latex-dev/base/ltnews05.tex index d13f469dd6..cdfe8bc072 100644 --- a/macros/latex-dev/base/ltnews05.tex +++ b/macros/latex-dev/base/ltnews05.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews06.pdf b/macros/latex-dev/base/ltnews06.pdf Binary files differindex 8fa7fd39ab..57c9abe6a9 100644 --- a/macros/latex-dev/base/ltnews06.pdf +++ b/macros/latex-dev/base/ltnews06.pdf diff --git a/macros/latex-dev/base/ltnews06.tex b/macros/latex-dev/base/ltnews06.tex index ac32eab8d1..3d5cadb745 100644 --- a/macros/latex-dev/base/ltnews06.tex +++ b/macros/latex-dev/base/ltnews06.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews07.pdf b/macros/latex-dev/base/ltnews07.pdf Binary files differindex deb8285b1d..a587a13ac7 100644 --- a/macros/latex-dev/base/ltnews07.pdf +++ b/macros/latex-dev/base/ltnews07.pdf diff --git a/macros/latex-dev/base/ltnews07.tex b/macros/latex-dev/base/ltnews07.tex index 56cfd76661..43cf204fed 100644 --- a/macros/latex-dev/base/ltnews07.tex +++ b/macros/latex-dev/base/ltnews07.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews08.pdf b/macros/latex-dev/base/ltnews08.pdf Binary files differindex 2127ebe3a2..c57077ac14 100644 --- a/macros/latex-dev/base/ltnews08.pdf +++ b/macros/latex-dev/base/ltnews08.pdf diff --git a/macros/latex-dev/base/ltnews08.tex b/macros/latex-dev/base/ltnews08.tex index 68cd1247e6..f1386a5332 100644 --- a/macros/latex-dev/base/ltnews08.tex +++ b/macros/latex-dev/base/ltnews08.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews09.pdf b/macros/latex-dev/base/ltnews09.pdf Binary files differindex d731efbd39..7dff0aaeb5 100644 --- a/macros/latex-dev/base/ltnews09.pdf +++ b/macros/latex-dev/base/ltnews09.pdf diff --git a/macros/latex-dev/base/ltnews09.tex b/macros/latex-dev/base/ltnews09.tex index af14a53e34..26eccedd1e 100644 --- a/macros/latex-dev/base/ltnews09.tex +++ b/macros/latex-dev/base/ltnews09.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews10.pdf b/macros/latex-dev/base/ltnews10.pdf Binary files differindex 5d2967891b..9911e7cc2e 100644 --- a/macros/latex-dev/base/ltnews10.pdf +++ b/macros/latex-dev/base/ltnews10.pdf diff --git a/macros/latex-dev/base/ltnews10.tex b/macros/latex-dev/base/ltnews10.tex index c6a77e6e36..b011eacf7e 100644 --- a/macros/latex-dev/base/ltnews10.tex +++ b/macros/latex-dev/base/ltnews10.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews11.pdf b/macros/latex-dev/base/ltnews11.pdf Binary files differindex 364f3ab434..9d35abb5ea 100644 --- a/macros/latex-dev/base/ltnews11.pdf +++ b/macros/latex-dev/base/ltnews11.pdf diff --git a/macros/latex-dev/base/ltnews11.tex b/macros/latex-dev/base/ltnews11.tex index b4f6d19910..07dbd64240 100644 --- a/macros/latex-dev/base/ltnews11.tex +++ b/macros/latex-dev/base/ltnews11.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews12.pdf b/macros/latex-dev/base/ltnews12.pdf Binary files differindex 7cccdcc6a4..71aa27bcfc 100644 --- a/macros/latex-dev/base/ltnews12.pdf +++ b/macros/latex-dev/base/ltnews12.pdf diff --git a/macros/latex-dev/base/ltnews12.tex b/macros/latex-dev/base/ltnews12.tex index b7a01bc208..38ea9122a0 100644 --- a/macros/latex-dev/base/ltnews12.tex +++ b/macros/latex-dev/base/ltnews12.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews13.pdf b/macros/latex-dev/base/ltnews13.pdf Binary files differindex 5aa1175b0c..1940689968 100644 --- a/macros/latex-dev/base/ltnews13.pdf +++ b/macros/latex-dev/base/ltnews13.pdf diff --git a/macros/latex-dev/base/ltnews13.tex b/macros/latex-dev/base/ltnews13.tex index 0cbbe49a5d..e489b4ff27 100644 --- a/macros/latex-dev/base/ltnews13.tex +++ b/macros/latex-dev/base/ltnews13.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews14.pdf b/macros/latex-dev/base/ltnews14.pdf Binary files differindex 02063e4e90..66821fc4d0 100644 --- a/macros/latex-dev/base/ltnews14.pdf +++ b/macros/latex-dev/base/ltnews14.pdf diff --git a/macros/latex-dev/base/ltnews14.tex b/macros/latex-dev/base/ltnews14.tex index b5fa7cb019..44cc44647e 100644 --- a/macros/latex-dev/base/ltnews14.tex +++ b/macros/latex-dev/base/ltnews14.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews15.pdf b/macros/latex-dev/base/ltnews15.pdf Binary files differindex 1ff4a5662e..0dfe862498 100644 --- a/macros/latex-dev/base/ltnews15.pdf +++ b/macros/latex-dev/base/ltnews15.pdf diff --git a/macros/latex-dev/base/ltnews15.tex b/macros/latex-dev/base/ltnews15.tex index 3b1ea3f89c..b95801dd6e 100644 --- a/macros/latex-dev/base/ltnews15.tex +++ b/macros/latex-dev/base/ltnews15.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews16.pdf b/macros/latex-dev/base/ltnews16.pdf Binary files differindex 04f5796d12..0c8934029d 100644 --- a/macros/latex-dev/base/ltnews16.pdf +++ b/macros/latex-dev/base/ltnews16.pdf diff --git a/macros/latex-dev/base/ltnews16.tex b/macros/latex-dev/base/ltnews16.tex index 7f7183ac0e..7edf8a7f53 100644 --- a/macros/latex-dev/base/ltnews16.tex +++ b/macros/latex-dev/base/ltnews16.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews17.pdf b/macros/latex-dev/base/ltnews17.pdf Binary files differindex a601da8823..2d5500ff62 100644 --- a/macros/latex-dev/base/ltnews17.pdf +++ b/macros/latex-dev/base/ltnews17.pdf diff --git a/macros/latex-dev/base/ltnews17.tex b/macros/latex-dev/base/ltnews17.tex index 4dab20f53f..e18e4660eb 100644 --- a/macros/latex-dev/base/ltnews17.tex +++ b/macros/latex-dev/base/ltnews17.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews18.pdf b/macros/latex-dev/base/ltnews18.pdf Binary files differindex 89350a011c..b88c8a5401 100644 --- a/macros/latex-dev/base/ltnews18.pdf +++ b/macros/latex-dev/base/ltnews18.pdf diff --git a/macros/latex-dev/base/ltnews18.tex b/macros/latex-dev/base/ltnews18.tex index 04491760b2..8c70621534 100644 --- a/macros/latex-dev/base/ltnews18.tex +++ b/macros/latex-dev/base/ltnews18.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews19.pdf b/macros/latex-dev/base/ltnews19.pdf Binary files differindex aa27ba08dc..b6a132732e 100644 --- a/macros/latex-dev/base/ltnews19.pdf +++ b/macros/latex-dev/base/ltnews19.pdf diff --git a/macros/latex-dev/base/ltnews19.tex b/macros/latex-dev/base/ltnews19.tex index 43d388b29b..7e9492a8f2 100644 --- a/macros/latex-dev/base/ltnews19.tex +++ b/macros/latex-dev/base/ltnews19.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -36,6 +36,7 @@ \usepackage{lmodern,url} +\publicationday{24} \publicationmonth{September} \publicationyear{2009} diff --git a/macros/latex-dev/base/ltnews20.pdf b/macros/latex-dev/base/ltnews20.pdf Binary files differindex 402394cc48..3c79e0d9be 100644 --- a/macros/latex-dev/base/ltnews20.pdf +++ b/macros/latex-dev/base/ltnews20.pdf diff --git a/macros/latex-dev/base/ltnews20.tex b/macros/latex-dev/base/ltnews20.tex index 89d166b49c..aeab3fae60 100644 --- a/macros/latex-dev/base/ltnews20.tex +++ b/macros/latex-dev/base/ltnews20.tex @@ -36,6 +36,7 @@ \usepackage{lmodern,url} +\publicationday{27} \publicationmonth{June} \publicationyear{2011} diff --git a/macros/latex-dev/base/ltnews21.pdf b/macros/latex-dev/base/ltnews21.pdf Binary files differindex e4ea9cc255..c6528cfbea 100644 --- a/macros/latex-dev/base/ltnews21.pdf +++ b/macros/latex-dev/base/ltnews21.pdf diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf Binary files differindex 5ee6bfc24d..625a3af16e 100644 --- a/macros/latex-dev/base/ltnews22.pdf +++ b/macros/latex-dev/base/ltnews22.pdf diff --git a/macros/latex-dev/base/ltnews22.tex b/macros/latex-dev/base/ltnews22.tex index 8d1c91acfa..dfc2e2326a 100644 --- a/macros/latex-dev/base/ltnews22.tex +++ b/macros/latex-dev/base/ltnews22.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2022 +% Copyright (C) 2015-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews23.pdf b/macros/latex-dev/base/ltnews23.pdf Binary files differindex c2caca4c16..2d591ff424 100644 --- a/macros/latex-dev/base/ltnews23.pdf +++ b/macros/latex-dev/base/ltnews23.pdf diff --git a/macros/latex-dev/base/ltnews23.tex b/macros/latex-dev/base/ltnews23.tex index 29241766ca..ee75a6463e 100644 --- a/macros/latex-dev/base/ltnews23.tex +++ b/macros/latex-dev/base/ltnews23.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2022 +% Copyright (C) 2015-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews24.pdf b/macros/latex-dev/base/ltnews24.pdf Binary files differindex 3c5ede15d2..bea89f1051 100644 --- a/macros/latex-dev/base/ltnews24.pdf +++ b/macros/latex-dev/base/ltnews24.pdf diff --git a/macros/latex-dev/base/ltnews24.tex b/macros/latex-dev/base/ltnews24.tex index 13d2fc8519..6a50ef902c 100644 --- a/macros/latex-dev/base/ltnews24.tex +++ b/macros/latex-dev/base/ltnews24.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2022 +% Copyright (C) 2015-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews25.pdf b/macros/latex-dev/base/ltnews25.pdf Binary files differindex 885993792d..aa027c430c 100644 --- a/macros/latex-dev/base/ltnews25.pdf +++ b/macros/latex-dev/base/ltnews25.pdf diff --git a/macros/latex-dev/base/ltnews25.tex b/macros/latex-dev/base/ltnews25.tex index 5a9f480718..0676220a2e 100644 --- a/macros/latex-dev/base/ltnews25.tex +++ b/macros/latex-dev/base/ltnews25.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2016-2022 +% Copyright (C) 2016-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews26.pdf b/macros/latex-dev/base/ltnews26.pdf Binary files differindex 299a726a8e..fe7d100e0d 100644 --- a/macros/latex-dev/base/ltnews26.pdf +++ b/macros/latex-dev/base/ltnews26.pdf diff --git a/macros/latex-dev/base/ltnews26.tex b/macros/latex-dev/base/ltnews26.tex index 94b4c4818b..9fbb6716b1 100644 --- a/macros/latex-dev/base/ltnews26.tex +++ b/macros/latex-dev/base/ltnews26.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2017-2022 +% Copyright (C) 2017-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews27.pdf b/macros/latex-dev/base/ltnews27.pdf Binary files differindex cc8f3e4896..29da354bf3 100644 --- a/macros/latex-dev/base/ltnews27.pdf +++ b/macros/latex-dev/base/ltnews27.pdf diff --git a/macros/latex-dev/base/ltnews27.tex b/macros/latex-dev/base/ltnews27.tex index 03c8c04205..917bf1cc10 100644 --- a/macros/latex-dev/base/ltnews27.tex +++ b/macros/latex-dev/base/ltnews27.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2017-2022 +% Copyright (C) 2017-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -35,6 +35,7 @@ \usepackage{lmodern,url,hologo} +\publicationday{15} \publicationmonth{April} \publicationyear{2017} diff --git a/macros/latex-dev/base/ltnews28.pdf b/macros/latex-dev/base/ltnews28.pdf Binary files differindex 9366cf0426..ee61704ae6 100644 --- a/macros/latex-dev/base/ltnews28.pdf +++ b/macros/latex-dev/base/ltnews28.pdf diff --git a/macros/latex-dev/base/ltnews28.tex b/macros/latex-dev/base/ltnews28.tex index 28bfe0577c..3c3b92da97 100644 --- a/macros/latex-dev/base/ltnews28.tex +++ b/macros/latex-dev/base/ltnews28.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2017-2022 +% Copyright (C) 2017-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews29.pdf b/macros/latex-dev/base/ltnews29.pdf Binary files differindex 8dbbb56102..807dc2f7c2 100644 --- a/macros/latex-dev/base/ltnews29.pdf +++ b/macros/latex-dev/base/ltnews29.pdf diff --git a/macros/latex-dev/base/ltnews29.tex b/macros/latex-dev/base/ltnews29.tex index c06d4de347..999836b01d 100644 --- a/macros/latex-dev/base/ltnews29.tex +++ b/macros/latex-dev/base/ltnews29.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2018-2022 +% Copyright (C) 2018-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews30.pdf b/macros/latex-dev/base/ltnews30.pdf Binary files differindex 7a217b657a..0e1203352a 100644 --- a/macros/latex-dev/base/ltnews30.pdf +++ b/macros/latex-dev/base/ltnews30.pdf diff --git a/macros/latex-dev/base/ltnews31.pdf b/macros/latex-dev/base/ltnews31.pdf Binary files differindex c4a8f385eb..878583bfb2 100644 --- a/macros/latex-dev/base/ltnews31.pdf +++ b/macros/latex-dev/base/ltnews31.pdf diff --git a/macros/latex-dev/base/ltnews31.tex b/macros/latex-dev/base/ltnews31.tex index 8bb6e638b5..1dff72986c 100644 --- a/macros/latex-dev/base/ltnews31.tex +++ b/macros/latex-dev/base/ltnews31.tex @@ -119,6 +119,7 @@ \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\publicationday{02} \publicationmonth{February} \publicationyear{2020} diff --git a/macros/latex-dev/base/ltnews32.pdf b/macros/latex-dev/base/ltnews32.pdf Binary files differindex 2e8fc1b80b..35069ceab5 100644 --- a/macros/latex-dev/base/ltnews32.pdf +++ b/macros/latex-dev/base/ltnews32.pdf diff --git a/macros/latex-dev/base/ltnews33.pdf b/macros/latex-dev/base/ltnews33.pdf Binary files differindex 05ed870d0b..e42df53c30 100644 --- a/macros/latex-dev/base/ltnews33.pdf +++ b/macros/latex-dev/base/ltnews33.pdf diff --git a/macros/latex-dev/base/ltnews34.pdf b/macros/latex-dev/base/ltnews34.pdf Binary files differindex 5648f3e89e..0707a1e9a2 100644 --- a/macros/latex-dev/base/ltnews34.pdf +++ b/macros/latex-dev/base/ltnews34.pdf diff --git a/macros/latex-dev/base/ltnews34.tex b/macros/latex-dev/base/ltnews34.tex index 04d1c25bc7..517856834a 100644 --- a/macros/latex-dev/base/ltnews34.tex +++ b/macros/latex-dev/base/ltnews34.tex @@ -116,6 +116,7 @@ \providecommand\tubcommand[1]{} \tubcommand{\input{tubltmac}} +\publicationday{15} \publicationmonth{November} \publicationyear{2021} diff --git a/macros/latex-dev/base/ltnews35.pdf b/macros/latex-dev/base/ltnews35.pdf Binary files differindex 2bab979d1a..bef895d098 100644 --- a/macros/latex-dev/base/ltnews35.pdf +++ b/macros/latex-dev/base/ltnews35.pdf diff --git a/macros/latex-dev/base/ltnews36.pdf b/macros/latex-dev/base/ltnews36.pdf Binary files differindex 575e2b9feb..acd22fa631 100644 --- a/macros/latex-dev/base/ltnews36.pdf +++ b/macros/latex-dev/base/ltnews36.pdf diff --git a/macros/latex-dev/base/ltnews37.pdf b/macros/latex-dev/base/ltnews37.pdf Binary files differindex a9216f04fd..3b13c3e619 100644 --- a/macros/latex-dev/base/ltnews37.pdf +++ b/macros/latex-dev/base/ltnews37.pdf diff --git a/macros/latex-dev/base/ltnews37.tex b/macros/latex-dev/base/ltnews37.tex index 4ce8fcccc9..a1197e1052 100644 --- a/macros/latex-dev/base/ltnews37.tex +++ b/macros/latex-dev/base/ltnews37.tex @@ -122,6 +122,7 @@ \providecommand\tubcommand[1]{} \tubcommand{\input{tubltmac}} +% \publicationday{01} % change this if it's not released on 1st of a month \publicationmonth{June} \publicationyear{2023 --- DRAFT version for upcoming release} @@ -144,6 +145,106 @@ \section{Introduction} +\section{New functionality offered as part of the + \enquote{\LaTeX{} Tagged PDF} project} + +We have now enabled new automatic tagging functionality for additional +\LaTeX{} elements, among them most display environments, standard +sectioning commands and content, figure and table listings. This can +be activated through +\begin{verbatim} +\DocumentMetadata{testphase=phase-III} +\end{verbatim} +At this point in time tagging support is only available for a +restricted set of documents, i.e., those that use one of the basic +document classes (\texttt{article}, \texttt{report}, and +\texttt{book}) and only use commands and environments described in +Lamport's \LaTeX{} manual. + +Using other document classes or adding additional packages in the +preamble may work (or may partially work) but at this stage it is not +very likely, at least not for packages or classes that excessively +alter internals of \LaTeX{}. + +Also note that there are still several environments and commands +described in the \LaTeX{} manual that do not have tagging support yet, +notably tabulars, floats, \texttt{tabbing} and the various math +environment. They will get this support as part of \texttt{phase-III} +between now and the June release. + +A prototype for math tagging (including support for the \pkg{amsmath} +environments) is already available, but it is mainly intended for +experimentation and feedback and the resulting tagging is by no means +the way we envision it to be eventually. If you like to try it out use +the following line: +\begin{verbatim} +\DocumentMetadata{testphase={phase-III,math}} +\end{verbatim} +Note that the math tagging code at this point in time will clash with +packages that redefine the \texttt{\$} (which then may lead to strange +errors) and that packages that use math mode for non-mathematical +constructs may result in surprising output as far as tagging is +concerned. Feedback on which packages fail with the code in one or the +other way would be appreciated. + +The \texttt{latex-lab} bundle contains various +(still untagged) documentation files about the new code that can +be accessed with \verb|texdoc -l latex-lab|. + +Feedback is welcome! +Please use \url{https://github.com/latex3/latex2e/discussions/1010}. + +\section{Documentation improvements} + + +\subsection{Displaying the exact release dates for \LaTeX{}} + +In some situations it is necessary to find out the exact release dates +for older version of the \LaTeX{} format, for example, when you need +to use different code in a package depending on the availablilty of a +certain feature and you therefore want to use +\cs{IfFormatAtLeastTF}\texttt\{\meta{date}\texttt\} or the +rather horrible construction \verb/\@ifl@t@r\fmtversion{/\meta{date}\texttt\}, +if you +want to cater for formats that are older than 2020. + +Or you know that your package is definitely not going to work with a +format before a certain \meta{date}, in which case you could use +\verb/\NeedsTeXFormat{LaTeX2e}[/\meta{date}\texttt] to ensure that any + user is alerted if their format is too old. + +The big problem is to know the exact \meta{date} to put into such +commands and in the past that was not that easy to find. You could have +looked in the the file \file{changes.txt}, but that is hidden somewhere +in your installation and if you try +\verb*/texdoc -l changes.txt/ you get more than thirty results and the +right file is by no means the first. + +Yukai Chou (\textsf{@muzimuzhi}) kindly provided a patch for this, so that we now have +the exact dates for each \LaTeX{} format listed in an easy to remember +place: in \file{ltnews.pdf} and that file conveniently also contains all major +features and changes to \LaTeX{} over the years\Dash one of which is +most likely the reason you need the \meta{date} date in the first +place. + +It is given in parentheses in the newsletter title, thus this +newsletter tells you that on +% +\makeatletter +\mbox{\expandafter\@gobblenonyear\@year\@nil + -\@julianmonthtonum\@month-\two@digits\@day} +\makeatother +% +the command +\cs{NewEnvironmentCopy}, a new \texttt{shipout} hook, etc.\ was made +available. And looking into \file{ltnews.pdf} you can now easily find +out that the \LaTeX3 programming layer was added on 2020-02-02 +(because the date was so nice) and not on the first of the month. +% +\githubissue{982} + + + \section{New or improved commands} @@ -190,6 +291,21 @@ following output: \githubissue{943} +\subsection{Default definition for \cs{do}} + +The command \cs{do} with its nice public name is in reality an +internal command inherited from plain \TeX{} for list +processing. However, it only got a definition when +\verb=\begin{document}= was executed, with a result that a user +definition in the preamble was unconditionally overwritten at this +point. To properly alert the user that this command is not freely +available we now already provide a definition in the format so that +\cs{newcommand} and friends produce a proper error message instead of +providing a definition that doesn't last. +% +\githubissue{975} + + \subsection{\pkg{doc}: Support the \pkg{upquote} package} The default quote and backquote characters in typewriter fonts are @@ -318,6 +434,25 @@ the previous release, but only now documented in a newletter. \githubissue{967} +\subsection{Improve spacing at top of \env{minipages}} + +A list and several other document elements add some vertical space in +front of them. However this should not happen at the beginning of a +box (such as a \env{minipage}) and normally it doesn't, because +\TeX{} automatically drops such spaces at the start of a vertical +list. However, if there is some invisible material, such as a +\cs{color} command, some \pkg{hyperref} anchor, a \cs{write} or +something else, then the list is no longer empty and \TeX{} no longer +drops spaces, hence the difference. + +With the new paragraph handling introduced in 2021 it is now finally +possible to detect and avoid this problem and apply appropriate +counter measures so that from now on the spacing will be always +correct. +% +\githubissue{989} + + \section{Changes to packages in the \pkg{amsmath} category} @@ -326,6 +461,19 @@ the previous release, but only now documented in a newletter. \section{Changes to packages in the \pkg{tools} category} +\subsection{Fix handling of nested \env{multicols}} + +If \env{multicols} environments have been nested into each other (the +inner one boxed) it could fail if the boxed environment appeared near a +page break. The problem was that the output routine was called while +the \cs{hsize} was still altered to fit the column width of the inner +\env{multicols} --- thereby messing up the placement of columns of the +page. This has now been fixed. +% +\githubissue{1002} + + + %\medskip \begin{thebibliography}{9} diff --git a/macros/latex-dev/base/ltoutenc.dtx b/macros/latex-dev/base/ltoutenc.dtx index 4dac4e1548..1d257805a4 100644 --- a/macros/latex-dev/base/ltoutenc.dtx +++ b/macros/latex-dev/base/ltoutenc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltoutenc.ins b/macros/latex-dev/base/ltoutenc.ins index 8ff0f02608..2f0c39517f 100644 --- a/macros/latex-dev/base/ltoutenc.ins +++ b/macros/latex-dev/base/ltoutenc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/ltoutput.dtx b/macros/latex-dev/base/ltoutput.dtx index 1cbc7ab0b1..29024dd4d6 100644 --- a/macros/latex-dev/base/ltoutput.dtx +++ b/macros/latex-dev/base/ltoutput.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpage.dtx b/macros/latex-dev/base/ltpage.dtx index 1d514fc7c7..1a6586d067 100644 --- a/macros/latex-dev/base/ltpage.dtx +++ b/macros/latex-dev/base/ltpage.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpageno.dtx b/macros/latex-dev/base/ltpageno.dtx index 8142639633..6c02d0fa7f 100644 --- a/macros/latex-dev/base/ltpageno.dtx +++ b/macros/latex-dev/base/ltpageno.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpar.dtx b/macros/latex-dev/base/ltpar.dtx index 50ff57183c..31d863610b 100644 --- a/macros/latex-dev/base/ltpar.dtx +++ b/macros/latex-dev/base/ltpar.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpara-code.pdf b/macros/latex-dev/base/ltpara-code.pdf Binary files differindex 0537eb4ec9..7813560129 100644 --- a/macros/latex-dev/base/ltpara-code.pdf +++ b/macros/latex-dev/base/ltpara-code.pdf diff --git a/macros/latex-dev/base/ltpara-doc.pdf b/macros/latex-dev/base/ltpara-doc.pdf Binary files differindex bbd4a35c70..fec25ce942 100644 --- a/macros/latex-dev/base/ltpara-doc.pdf +++ b/macros/latex-dev/base/ltpara-doc.pdf diff --git a/macros/latex-dev/base/ltpara.dtx b/macros/latex-dev/base/ltpara.dtx index 9296f2b2cd..7c96c72fc7 100644 --- a/macros/latex-dev/base/ltpara.dtx +++ b/macros/latex-dev/base/ltpara.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: ltpara.dtx (C) Copyright 2020-2021 +%% File: ltpara.dtx (C) Copyright 2020-2023 % Frank Mittelbach, LaTeX Team % % It may be distributed and/or modified under the conditions of the @@ -14,8 +14,8 @@ %%% From File: ltpara.dtx % % \begin{macrocode} -\def\ltparaversion{v1.0k} -\def\ltparadate{2022/05/13} +\def\ltparaversion{v1.0l} +\def\ltparadate{2023/01/30} % \end{macrocode} %<*driver> \documentclass{l3doc} @@ -729,6 +729,8 @@ % for error recovery and so altering \cs{tex_everypar:D} all the % time should be a tiny bit faster. % \begin{macrocode} +%<latexrelease>\IncludeInRelease{2023/06/01} +%<latexrelease> {\g_@@_standard_everypar_tl}{minipage~ fix} \tl_new:N \g_@@_standard_everypar_tl % \end{macrocode} % Here is now its definition: @@ -769,7 +771,28 @@ % \begin{macrocode} \group_begin: \tex_everypar:D {} - \skip_zero:N \tex_parskip:D +% \end{macrocode} +% There has been a long-standing problem with \LaTeX's minipages in +% that invisible material at the beginning of a minipage (such as a +% \cs{color} setting) would result in \cs{parskip} being added in +% front of the first paragraph---something that is not done by +% \TeX{} if a vertical list is completely empty. As this is +% happening on a very low-level in the engine it wasn't really +% possible to find out if this \cs{parskip} was added or if a space +% we see in front of the current point is legitimate. However, with +% the new paragraph handling we are in a better position: while we +% still don't know if there is such a space or not, we do know +% if we have just created an empty paragraph. Thus, if we now set +% \cs{parskip} to \texttt{-}\cs{parskip} the two will cancel each other +% if present and if the first was ignored because the vertical list +% was empty, then the second will be ignored too because it is +% still empty. Of course, we don't want to cancel always but only +% at the start of a minipage and that is signaled with the +% \texttt{@minipage} switch. +% \changes{v1.0l}{2023/01/30}{Backout \cs{parskip} at top of minipage (gh/989)} +% \begin{macrocode} + \skip_set:Nn \tex_parskip:D + { \if@minipage -\tex_parskip:D \else: \c_zero_skip \fi: } \tex_noindent:D \group_end: % \end{macrocode} @@ -800,6 +823,43 @@ \@@_handle_indent: % \the \everypar % <--- done differently below } +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{2021/06/01} +%<latexrelease> {\g_@@_standard_everypar_tl}{minipage~ fix} +%<latexrelease> +%<latexrelease>\tl_gset:Nn \g_@@_standard_everypar_tl { +%<latexrelease> \box_gset_to_last:N \g_para_indent_box +%<latexrelease> \group_begin: +%<latexrelease> \tex_par:D +%<latexrelease> \group_end: +%<latexrelease> \tex_everypar:D { \msg_error:nnnn { hooks }{ para-mode }{before}{vertical} } +%<latexrelease> \@kernel@before@para@before +%<latexrelease> \hook_use:n {para/before} +%<latexrelease> \group_begin: +%<latexrelease> \tex_everypar:D {} +%<latexrelease> \skip_zero:N \tex_parskip:D +%<latexrelease> \tex_noindent:D +%<latexrelease> \group_end: +%<latexrelease> \tex_everypar:D{\g_@@_standard_everypar_tl} +%<latexrelease> \@kernel@before@para@begin +%<latexrelease> \hook_use:n {para/begin} +%<latexrelease> \if_mode_horizontal: \else: +%<latexrelease> \msg_error:nnnn { hooks }{ para-mode }{begin}{vertical} \fi: +%<latexrelease> \@@_handle_indent: +%<latexrelease>} +% \end{macrocode} +% We also have to add the \cs{everypar} toks register at the +% end. In case of rollback this is already allocated and we have to +% find out the correct number (hope this is correctly done) +% \begin{macrocode} +%<latexrelease>\cs_set:Npn \@@_tmp:w #1#2#3#4#5 { } +%<latexrelease>\tl_gput_right:Nx \g_@@_standard_everypar_tl { +%<latexrelease> \exp_not:N \the +%<latexrelease> \exp_not:N \toks +%<latexrelease> \exp_after:wN \@@_tmp:w \token_to_meaning:N \everypar +%<latexrelease> \c_space_tl +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease % \end{macrocode} % \end{macro} % diff --git a/macros/latex-dev/base/ltpictur.dtx b/macros/latex-dev/base/ltpictur.dtx index 453ec6149e..926fd5c692 100644 --- a/macros/latex-dev/base/ltpictur.dtx +++ b/macros/latex-dev/base/ltpictur.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltplain.dtx b/macros/latex-dev/base/ltplain.dtx index ee1cf0a161..1bdff344f7 100644 --- a/macros/latex-dev/base/ltplain.dtx +++ b/macros/latex-dev/base/ltplain.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltsect.dtx b/macros/latex-dev/base/ltsect.dtx index 71ab1ee89d..5a03fd4977 100644 --- a/macros/latex-dev/base/ltsect.dtx +++ b/macros/latex-dev/base/ltsect.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltshipout-code.pdf b/macros/latex-dev/base/ltshipout-code.pdf Binary files differindex 5c4df6d628..79b27f4984 100644 --- a/macros/latex-dev/base/ltshipout-code.pdf +++ b/macros/latex-dev/base/ltshipout-code.pdf diff --git a/macros/latex-dev/base/ltshipout-doc.pdf b/macros/latex-dev/base/ltshipout-doc.pdf Binary files differindex 6d28fe7faf..131c5251a0 100644 --- a/macros/latex-dev/base/ltshipout-doc.pdf +++ b/macros/latex-dev/base/ltshipout-doc.pdf diff --git a/macros/latex-dev/base/ltshipout.dtx b/macros/latex-dev/base/ltshipout.dtx index 7aa07f754b..1b3cabcfc8 100644 --- a/macros/latex-dev/base/ltshipout.dtx +++ b/macros/latex-dev/base/ltshipout.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment %% -%% Copyright (C) 2020-2022 +%% Copyright (C) 2020-2023 %% Frank Mittelbach, LaTeX Team %% % diff --git a/macros/latex-dev/base/ltspace.dtx b/macros/latex-dev/base/ltspace.dtx index 30bda278fb..672ab92729 100644 --- a/macros/latex-dev/base/ltspace.dtx +++ b/macros/latex-dev/base/ltspace.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/lttab.dtx b/macros/latex-dev/base/lttab.dtx index e32153f31c..e76325d82b 100644 --- a/macros/latex-dev/base/lttab.dtx +++ b/macros/latex-dev/base/lttab.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/lttextcomp.dtx b/macros/latex-dev/base/lttextcomp.dtx index 8f5ec0d200..3602e0a6b0 100644 --- a/macros/latex-dev/base/lttextcomp.dtx +++ b/macros/latex-dev/base/lttextcomp.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2022 +% Copyright (C) 2019-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltthm.dtx b/macros/latex-dev/base/ltthm.dtx index d0d04d9669..b321c7ac2b 100644 --- a/macros/latex-dev/base/ltthm.dtx +++ b/macros/latex-dev/base/ltthm.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltvers.dtx b/macros/latex-dev/base/ltvers.dtx index eae29f0f01..da131765ac 100644 --- a/macros/latex-dev/base/ltvers.dtx +++ b/macros/latex-dev/base/ltvers.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -115,7 +115,7 @@ {2023-06-01} %</2ekernel|latexrelease> %<*2ekernel> -\def\patch@level{-1} +\def\patch@level{-2} % \end{macrocode} % % \begin{macro}{\development@branch@name} diff --git a/macros/latex-dev/base/ltx3info.pdf b/macros/latex-dev/base/ltx3info.pdf Binary files differindex 122feaff59..ccdd69abd9 100644 --- a/macros/latex-dev/base/ltx3info.pdf +++ b/macros/latex-dev/base/ltx3info.pdf diff --git a/macros/latex-dev/base/ltx3info.tex b/macros/latex-dev/base/ltx3info.tex index 13231da818..096fa2db9a 100644 --- a/macros/latex-dev/base/ltx3info.tex +++ b/macros/latex-dev/base/ltx3info.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltxcheck.tex b/macros/latex-dev/base/ltxcheck.tex index 7f4b925b79..d219d2ebc2 100644 --- a/macros/latex-dev/base/ltxcheck.tex +++ b/macros/latex-dev/base/ltxcheck.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltxdoc.dtx b/macros/latex-dev/base/ltxdoc.dtx index 6863349be3..78b6de4bcc 100644 --- a/macros/latex-dev/base/ltxdoc.dtx +++ b/macros/latex-dev/base/ltxdoc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltxdoc.pdf b/macros/latex-dev/base/ltxdoc.pdf Binary files differindex 0e75ce008e..188d833aeb 100644 --- a/macros/latex-dev/base/ltxdoc.pdf +++ b/macros/latex-dev/base/ltxdoc.pdf diff --git a/macros/latex-dev/base/ltxref.dtx b/macros/latex-dev/base/ltxref.dtx index 596eb2fd74..dcfebf0e7e 100644 --- a/macros/latex-dev/base/ltxref.dtx +++ b/macros/latex-dev/base/ltxref.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/makeindx.dtx b/macros/latex-dev/base/makeindx.dtx index fb6c474659..b91d3a6c44 100644 --- a/macros/latex-dev/base/makeindx.dtx +++ b/macros/latex-dev/base/makeindx.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/makeindx.ins b/macros/latex-dev/base/makeindx.ins index 0fe55ed039..1c5f6edcb9 100644 --- a/macros/latex-dev/base/makeindx.ins +++ b/macros/latex-dev/base/makeindx.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/makeindx.pdf b/macros/latex-dev/base/makeindx.pdf Binary files differindex 8ebcab2ea6..8d714a1cf1 100644 --- a/macros/latex-dev/base/makeindx.pdf +++ b/macros/latex-dev/base/makeindx.pdf diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf Binary files differindex 0778d8eb49..d484bf783b 100644 --- a/macros/latex-dev/base/modguide.pdf +++ b/macros/latex-dev/base/modguide.pdf diff --git a/macros/latex-dev/base/modguide.tex b/macros/latex-dev/base/modguide.tex index 3474d8a5fc..332b609ab3 100644 --- a/macros/latex-dev/base/modguide.tex +++ b/macros/latex-dev/base/modguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -42,7 +42,7 @@ \author{\copyright~Copyright 1995, \LaTeX\ Project Team.\\ All rights reserved.% - \footnote{This file may distributed and/or modified under the + \footnote{This file 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. See the source texttt{modguide.tex} for full details.}% diff --git a/macros/latex-dev/base/newdc.ins b/macros/latex-dev/base/newdc.ins index eeec6479eb..277e8ea21f 100644 --- a/macros/latex-dev/base/newdc.ins +++ b/macros/latex-dev/base/newdc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/newlfont.dtx b/macros/latex-dev/base/newlfont.dtx index 86c0d47ab6..0b35eddd80 100644 --- a/macros/latex-dev/base/newlfont.dtx +++ b/macros/latex-dev/base/newlfont.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/nfssfont.dtx b/macros/latex-dev/base/nfssfont.dtx index 51d7834aa3..556ce5f76d 100644 --- a/macros/latex-dev/base/nfssfont.dtx +++ b/macros/latex-dev/base/nfssfont.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/nfssfont.ins b/macros/latex-dev/base/nfssfont.ins index a181c61972..21a13f70a8 100644 --- a/macros/latex-dev/base/nfssfont.ins +++ b/macros/latex-dev/base/nfssfont.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/nfssfont.pdf b/macros/latex-dev/base/nfssfont.pdf Binary files differindex 601fa1592e..cb2d37b3c3 100644 --- a/macros/latex-dev/base/nfssfont.pdf +++ b/macros/latex-dev/base/nfssfont.pdf diff --git a/macros/latex-dev/base/olddc.ins b/macros/latex-dev/base/olddc.ins index 707fb207e6..320b3a4b0e 100644 --- a/macros/latex-dev/base/olddc.ins +++ b/macros/latex-dev/base/olddc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/oldlfont.dtx b/macros/latex-dev/base/oldlfont.dtx index b7c9abc3eb..33ae5e6fd9 100644 --- a/macros/latex-dev/base/oldlfont.dtx +++ b/macros/latex-dev/base/oldlfont.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/preload.dtx b/macros/latex-dev/base/preload.dtx index 3b75df38fd..d26bdaa9ed 100644 --- a/macros/latex-dev/base/preload.dtx +++ b/macros/latex-dev/base/preload.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/proc.dtx b/macros/latex-dev/base/proc.dtx index 135c67bc0b..bbbf71162f 100644 --- a/macros/latex-dev/base/proc.dtx +++ b/macros/latex-dev/base/proc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/proc.ins b/macros/latex-dev/base/proc.ins index 16f60195e5..056816e99e 100644 --- a/macros/latex-dev/base/proc.ins +++ b/macros/latex-dev/base/proc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/proc.pdf b/macros/latex-dev/base/proc.pdf Binary files differindex 97cc3e82c8..dc5c8e3a67 100644 --- a/macros/latex-dev/base/proc.pdf +++ b/macros/latex-dev/base/proc.pdf diff --git a/macros/latex-dev/base/slides.dtx b/macros/latex-dev/base/slides.dtx index 5ea9e58d9c..a918c337dd 100644 --- a/macros/latex-dev/base/slides.dtx +++ b/macros/latex-dev/base/slides.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/slides.ins b/macros/latex-dev/base/slides.ins index 8c9862c2d5..3acb556b96 100644 --- a/macros/latex-dev/base/slides.ins +++ b/macros/latex-dev/base/slides.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -96,7 +96,7 @@ extension .ins) which are part of the distribution. This is a generated file. -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -138,7 +138,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/slides.pdf b/macros/latex-dev/base/slides.pdf Binary files differindex c18411078c..49a2fbf7be 100644 --- a/macros/latex-dev/base/slides.pdf +++ b/macros/latex-dev/base/slides.pdf diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf Binary files differindex 8115e6ae86..4707b8a219 100644 --- a/macros/latex-dev/base/slifonts.pdf +++ b/macros/latex-dev/base/slifonts.pdf diff --git a/macros/latex-dev/base/source2e.pdf b/macros/latex-dev/base/source2e.pdf Binary files differindex d956472b5d..f84a84ea72 100644 --- a/macros/latex-dev/base/source2e.pdf +++ b/macros/latex-dev/base/source2e.pdf diff --git a/macros/latex-dev/base/source2e.tex b/macros/latex-dev/base/source2e.tex index 797304e8d6..873daebb4d 100644 --- a/macros/latex-dev/base/source2e.tex +++ b/macros/latex-dev/base/source2e.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/syntonly.dtx b/macros/latex-dev/base/syntonly.dtx index ae4d4cd1f8..2b0049b696 100644 --- a/macros/latex-dev/base/syntonly.dtx +++ b/macros/latex-dev/base/syntonly.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/syntonly.ins b/macros/latex-dev/base/syntonly.ins index 5812ef2fd6..8ccaf254d1 100644 --- a/macros/latex-dev/base/syntonly.ins +++ b/macros/latex-dev/base/syntonly.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2022 +Copyright (C) 1993-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/syntonly.pdf b/macros/latex-dev/base/syntonly.pdf Binary files differindex ef69d1da2e..24da1cf460 100644 --- a/macros/latex-dev/base/syntonly.pdf +++ b/macros/latex-dev/base/syntonly.pdf diff --git a/macros/latex-dev/base/testpage.tex b/macros/latex-dev/base/testpage.tex index e199a2bb71..7eae6c142c 100644 --- a/macros/latex-dev/base/testpage.tex +++ b/macros/latex-dev/base/testpage.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/tlc2.err b/macros/latex-dev/base/tlc2.err index 8925a8bee1..5b01ff0513 100644 --- a/macros/latex-dev/base/tlc2.err +++ b/macros/latex-dev/base/tlc2.err @@ -1,4 +1,4 @@ -\newcommand\erratafiledate{2022-01-03} +\newcommand\erratafiledate{2023-01-08} \def\comando#1{\texttt{\string#1}} @@ -359,7 +359,7 @@ you own by changing the configuration in the file \texttt{\jobname.cfg}. \end{center} Any mistake found and reported is a gain for all readers of our book. -For this reason Addison-Wesley and the authors offer a prize (for 6 +For this reason Addison-Wesley and the authors offer a prize (for 5 periods) to the eligible person who finds the largest number of bugs during that period (in case of a draw a random choice will be made between all those with the largest number of findings). @@ -385,7 +385,7 @@ Contest period ends & Winner \\[4pt] 2005/10 & Daniel Alonso i Alemany & 13 suggestions\\ 2006/04 & Michael Schutte & 2 suggestions\\ 2008/05 & Brooks Moses & 1 suggestion \\ -\ldots & -- final draw eventually -- + & -- final draw was 2008/05 -- \end{tabular} \end{center} \end{list} @@ -2185,6 +2185,8 @@ Change: ``The unaccented ASCII Latin letters and Arabic |\dag| and |\ddag| are |\mathord|s not |\mathbin| as claimed in table 8.13. + Frank: This is actually correct nowadays (maybe it wasn't in 2008) + \seriouserroronpage{529}{table 8.12, l.3}{JGr}{2004/06/10}{2} \verb=\mathring{x}= is missing its accent. @@ -2202,6 +2204,9 @@ Change: ``The unaccented ASCII Latin letters and Arabic aren't (as claimed in legend) synonyms of |\dagger| and |\ddagger| respectively. + Frank: This is actually correct nowadays (maybe it wasn't in 2008) + + \erroronpage{531}{table 8.15}{BMo/FMi}{2004/05/21}{2} The commands starting with |\var...| are only partially in blue to indicate their relationship with those commands missing the ``var'' in their @@ -2236,10 +2241,6 @@ Change: ``The unaccented ASCII Latin letters and Arabic Various deviations from alphabetical sort order of the table entries. -\erroronpage{553}{para 3, l.1}{EOl}{2022/01/02}{} - Missing letter: ``sup\u{p}ressing'' - - \iffalse % more blue align stuff \erroronpage{534}{page}{FMi}{2004/04/23}{} Printing problem: blue color not properly aligned (horizontally). @@ -2332,6 +2333,10 @@ Plural: ``Clearly, 8 bits \u{are} not sufficient\ldots'' respectively %(ref: TB 14-3-252-259) +\erroronpage{553}{para 3, l.1}{EOl}{2022/01/02}{} + Missing letter: ``sup\u{p}ressing'' + + \seriouserroronpage{553}{para 4}{UFi}{2004/06/03}{2} Replace with: ``Another popular shorthand is |"-|, which indicates a diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf Binary files differindex 067c94c0c6..e21a6fb104 100644 --- a/macros/latex-dev/base/tlc2.pdf +++ b/macros/latex-dev/base/tlc2.pdf diff --git a/macros/latex-dev/base/tulm.ins b/macros/latex-dev/base/tulm.ins index a50060b201..85970a5133 100644 --- a/macros/latex-dev/base/tulm.ins +++ b/macros/latex-dev/base/tulm.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 2016-2022 +%% Copyright (C) 2016-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 2016-2022 +Copyright (C) 2016-2023 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/tulm.pdf b/macros/latex-dev/base/tulm.pdf Binary files differindex 57ead84747..d2c4ec94d0 100644 --- a/macros/latex-dev/base/tulm.pdf +++ b/macros/latex-dev/base/tulm.pdf diff --git a/macros/latex-dev/base/unpack.ins b/macros/latex-dev/base/unpack.ins index 21ba62a33a..5baa2b5447 100644 --- a/macros/latex-dev/base/unpack.ins +++ b/macros/latex-dev/base/unpack.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2022 +%% Copyright (C) 1993-2023 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% diff --git a/macros/latex-dev/base/usrguide-historic.pdf b/macros/latex-dev/base/usrguide-historic.pdf Binary files differindex a390a49de9..3149112b43 100644 --- a/macros/latex-dev/base/usrguide-historic.pdf +++ b/macros/latex-dev/base/usrguide-historic.pdf diff --git a/macros/latex-dev/base/usrguide-historic.tex b/macros/latex-dev/base/usrguide-historic.tex index ce35aaa77c..40865a2be9 100644 --- a/macros/latex-dev/base/usrguide-historic.tex +++ b/macros/latex-dev/base/usrguide-historic.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -36,7 +36,7 @@ \author{\copyright~Copyright 1995--2022, \LaTeX\ Project Team.\\ All rights reserved.% - \footnote{This file may distributed and/or modified under the + \footnote{This file 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. See the source \texttt{usrguide.tex} for full details.}% diff --git a/macros/latex-dev/base/usrguide.pdf b/macros/latex-dev/base/usrguide.pdf Binary files differindex 263df7df63..c4953d7e33 100644 --- a/macros/latex-dev/base/usrguide.pdf +++ b/macros/latex-dev/base/usrguide.pdf diff --git a/macros/latex-dev/base/usrguide.tex b/macros/latex-dev/base/usrguide.tex index 7234ac821c..f06850afaa 100644 --- a/macros/latex-dev/base/usrguide.tex +++ b/macros/latex-dev/base/usrguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2020-2022 +% Copyright (C) 2020-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -36,7 +36,7 @@ \title{\LaTeX\ for authors --- current version} \author{\copyright~Copyright 2020-2022, \LaTeX\ Project Team.\\ All rights reserved.% - \footnote{This file may distributed and/or modified under the + \footnote{This file 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. See the source \texttt{usrguide.tex} for full details.}% diff --git a/macros/latex-dev/base/utf8ienc.dtx b/macros/latex-dev/base/utf8ienc.dtx index a2b25fd3ab..f1623ee0e6 100644 --- a/macros/latex-dev/base/utf8ienc.dtx +++ b/macros/latex-dev/base/utf8ienc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2022 +% Copyright (C) 1993-2023 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf Binary files differindex 4459986064..d211ec2de1 100644 --- a/macros/latex-dev/base/utf8ienc.pdf +++ b/macros/latex-dev/base/utf8ienc.pdf diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf Binary files differindex 1bf17cd5bd..a7e1a07aec 100644 --- a/macros/latex-dev/base/webcomp.pdf +++ b/macros/latex-dev/base/webcomp.pdf diff --git a/macros/latex-dev/required/latex-lab/README.md b/macros/latex-dev/required/latex-lab/README.md index 54e693484b..53461372a3 100644 --- a/macros/latex-dev/required/latex-lab/README.md +++ b/macros/latex-dev/required/latex-lab/README.md @@ -1,6 +1,6 @@ # LaTeX laboratory -Release 2023-05-01 pre-release 0 +Release 2023-06-01 pre-release 2 ## Overview @@ -38,5 +38,5 @@ The license is LPPL 1.3c. This README file is -Copyright (C) 2021-2022 +Copyright (C) 2021-2023 The LaTeX Project diff --git a/macros/latex-dev/required/latex-lab/blocks-code.pdf b/macros/latex-dev/required/latex-lab/blocks-code.pdf Binary files differnew file mode 100644 index 0000000000..300f15ecbf --- /dev/null +++ b/macros/latex-dev/required/latex-lab/blocks-code.pdf diff --git a/macros/latex-dev/required/latex-lab/blocks-code.tex b/macros/latex-dev/required/latex-lab/blocks-code.tex new file mode 100644 index 0000000000..f71342d6f5 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/blocks-code.tex @@ -0,0 +1,4 @@ +% this will typeset documentation + code + +\AtBeginDocument{\AlsoImplementation} +\input{latex-lab-block-tagging.dtx} diff --git a/macros/latex-dev/required/latex-lab/blocks-doc.pdf b/macros/latex-dev/required/latex-lab/blocks-doc.pdf Binary files differnew file mode 100644 index 0000000000..ccff6f95eb --- /dev/null +++ b/macros/latex-dev/required/latex-lab/blocks-doc.pdf diff --git a/macros/latex-dev/required/latex-lab/blocks-doc.tex b/macros/latex-dev/required/latex-lab/blocks-doc.tex new file mode 100644 index 0000000000..39a93479a1 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/blocks-doc.tex @@ -0,0 +1,4 @@ +% this will typeset documentation + code + +\AtBeginDocument{\OnlyDescription} +\input{latex-lab-block-tagging.dtx} diff --git a/macros/latex-dev/required/latex-lab/changes.txt b/macros/latex-dev/required/latex-lab/changes.txt index b4b4df9811..853a06dc5f 100644 --- a/macros/latex-dev/required/latex-lab/changes.txt +++ b/macros/latex-dev/required/latex-lab/changes.txt @@ -1,3 +1,41 @@ +2023-03-08 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * latex-lab-block-tagging.dtx: + Added the support for tagging display blocks and corresponding environments + such as lists, quotes, verbatim, theorem-like envs, ... + +2023-03-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + + * tagpdf updated + * improved glyphtounicode support for luatex and math + * adapted toc and sec tagging code to new two-level paragraph handling + and block tagging code + +2023-02-16 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + + * latex-lab-sec-tagging.dtx: first, simple tagging of sectioning commands + * latex-lab-toc-tagging-functions.dtx, latex-lab-toc-kernel-changes.dtx, + latex-lab-toc-kernel-changes.dtx: Tagging of table of contents and similar + lists + * tagpdf and pdfmanagement updated in texmf tree. + + +2023-02-04 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + + * latex-lab-footnotes.dtx: improve tagging of footnotes + +2022-12-11 Joseph Wright <Joseph.Wright@latex-project.org> + + * latex-lab-mathcapture.dtx + New file to implement grabbing of math mode context + +2022-04-11 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + + * documentmeta-support.dtx: + updated documentation + * moved output patches from pdfresources to latex-lab-new-or-1 + * reorganized new-or: number subfiles as new-or-1, new-or-2 and load all with new-or. + 2022-07-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org> * latex-lab-footnotes.dtx (subsection{Document-level commands}): diff --git a/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf b/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf Binary files differindex 7d3e1d002f..f088c780ad 100644 --- a/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf +++ b/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf diff --git a/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf b/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf Binary files differindex cfe8aee9a0..7f9430fe29 100644 --- a/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf +++ b/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf diff --git a/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx b/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx index 23053a484a..eb99fbd3a9 100644 --- a/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx +++ b/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: documentmetadata-support.dtx -% Copyright (C) 2021-2022 The LaTeX Project +% Copyright (C) 2021-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 @@ -18,8 +18,8 @@ % for those people who are interested or want to report an issue. % % \begin{macrocode} -\def\documentmetadatasupportversion{1.0b} -\def\documentmetadatasupportdate{2022-14-04} +\def\documentmetadatasupportversion{1.0c} +\def\documentmetadatasupportdate{2023-01-07} % \end{macrocode} % % @@ -64,13 +64,19 @@ % While the underlying functionality is still under % development (e.g., further keys will be added over time and keys % marked temporary may vanish again) the code for -% \cs{DocumentMetadata} is place in a separate bundle, so that it +% \cs{DocumentMetadata} is placed in a separate bundle, so that it % is easier to update it without the need to build a full \LaTeX{} % release. Over time the functionality will move fully into the % kernel. +% +% \cs{DocumentMetadata} also loads and activates +% the new PDF management code from \pkg{pdfmanagement-testphase}. +% As this forces the loading of the \pkg{l3backend} files, a backend +% that can't be detected automatically like |dvipdfmx|, +% must be set in the first \cs{DocumentMetadata}. % % From a process perspective \cs{DocumentMetadata} loads the -% \pkg{pdfmanagement} code the first time it is called and then +% \pkg{pdfmanagement-testphase} code the first time it is called and then % redefines itself to only manage key/value pairs in case it is % called more than once. In particular, this means that a document % without a \cs{DocumentMetadata} declaration has no code available @@ -84,10 +90,12 @@ % % % Currently the following keys are implemented for \cs{DocumentMetadata}: +% \DescribeMkey{backend} % \DescribeMkey{colorprofiles} % \DescribeMkey{debug} % \DescribeMkey{lang} % \DescribeMkey{pdfstandard} +% \DescribeMkey{xmp} % \DescribeMkey{pdfversion} % \DescribeMkey{testphase} % \DescribeMkey{uncompress} @@ -110,15 +118,34 @@ % \item[\texttt{pdfstandard}] Choice key to set the pdf standard. % Currently |A-1b|, |A-2a|, |A-2b|, |A-2u|, |A-3a|, |A-3b|, |A-3u| and |A-4| are accepted as % values. The casing is irrelevant, |a-1b| works too. -% The underlying code to ensure the requirements (as far as they -% can be ensured) is still incomplete, but a color profile is included and the -% \texttt{/OutputIntent} is set. The |u| variants for example do not force unicode, -% but they will pass the information to hyperref and hyperxmp. The |a| variants -% do \emph{not} enforce (or even test) a tagged pdf yet. The |A-4| support is -% currently incomplete. +% Note that using these +% key doesn't mean that the document actually follows the standard. \LaTeX{} +% can neither ensure nor check all requirements of a standard, and not everything +% it can do theoretically has already been implemented. +% When setting an A-standard a color profile is included and the +% \texttt{/OutputIntent} is set and javascript action in hyperref are suppressed. +% The |u| variants do not enforce unicode, +% but they will pass the information to hyperref. The |a| variants +% do \emph{not} enforce (or even test) a tagged pdf yet. +% +% Starting with version 0.95s of \pkg{pdfmanagement-testphase} +% it is also possible to use the values +% |X-4|, |X-4p|, |X-5g|, |X-5n|, |X-5pg|, |X-6|, |X-6n|, |X-6p|, |UA-1| for +% a PDF/X and PDF/UA standard. These keys currently set \emph{only} the relevant +% XMP-metadata. +% +% |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} +% the needed conformance marker for the standards are set. +% % More information can be found in the documentation -% of \pkg{l3pdfmeta}. +% of \pkg{l3pdfmeta}. % +% \item[\texttt{xmp}] A boolean, if set to false no XMP metadata are added to the PDF. +% The initial value is true. Details are described in the documentation of \pkg{l3pdfmeta}. +% % \item[\texttt{colorprofiles}] This allows to load icc-colorprofiles. Details % are described in the documentation of \pkg{l3pdfmeta}. % @@ -137,6 +164,16 @@ % additionally activate tagging of paragraphs with % |\tagpdfsetup{paratagging}|. In the upcoming months it will % also enable automatic tagging of other basic document elements. +% \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 +% to allow the PDF management to insert code which avoids that +% links happening at page breaks spills into the header and footer. +% This code is automatically loaded if the \texttt{testphase} values +% \texttt{phase-I}, \texttt{phase-II} or \texttt{new-or} are used.% +% \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. % \end{description} % The |testphase| key can only be used in the first \cs{DocumentMetadata}. % diff --git a/macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex b/macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex new file mode 100644 index 0000000000..2b5c1d979d --- /dev/null +++ b/macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex @@ -0,0 +1,141 @@ +% A subset of glyhtounicode-cmr.tex +% +% Copyright (c) 2008, Han The Thanh <thanh@river-valley.org> +% Copyright (c) 2014, Peter Selinger <selinger@mathstat.dal.ca> +% Copyright (c) 2018, Ross Moore <ross.moore@mq.edu.au> +% + +%% Glyphs from the cmex fonts: + +\pdfglyphtounicode{angbracketleftBig}{27E8 FE02} +\pdfglyphtounicode{angbracketleftBigg}{27E8 FE04} +\pdfglyphtounicode{angbracketleftbig}{27E8 FE01} +\pdfglyphtounicode{angbracketleftbigg}{27E8 FE03} +\pdfglyphtounicode{angbracketrightBig}{27E9 FE02} +\pdfglyphtounicode{angbracketrightBigg}{27E9 FE04} +\pdfglyphtounicode{angbracketrightbig}{27E9 FE01} +\pdfglyphtounicode{angbracketrightbigg}{27E9 FE03} +\pdfglyphtounicode{arrowbt}{2193} +\pdfglyphtounicode{arrowdblbt}{21D3} +\pdfglyphtounicode{arrowdbltp}{21D1} +\pdfglyphtounicode{arrowhookleft}{21AA} +\pdfglyphtounicode{arrowhookright}{21A9} +\pdfglyphtounicode{arrowtp}{2191} +\pdfglyphtounicode{arrowvertex}{23D0} +\pdfglyphtounicode{arrowvertexdbl}{20E6}% was {ED12}% PUA +\pdfglyphtounicode{backslashBig}{005C FE02} +\pdfglyphtounicode{backslashBigg}{005C FE04} +\pdfglyphtounicode{backslashbig}{005C FE01} +\pdfglyphtounicode{backslashbigg}{005C FE03} +\pdfglyphtounicode{braceex}{23AA} +\pdfglyphtounicode{bracehtipdownleft}{23DF}% was {ED17}% PUA +\pdfglyphtounicode{bracehtipdownright}{23DF}% was {ED18}% PUA +\pdfglyphtounicode{bracehtipupleft}{23DE}% was {ED19}% PUA +\pdfglyphtounicode{bracehtipupright}{23DE}% was {ED1A}% PUA +\pdfglyphtounicode{braceleftBig}{007B FE02} +\pdfglyphtounicode{braceleftBigg}{007B FE04} +\pdfglyphtounicode{braceleftbig}{007B FE01} +\pdfglyphtounicode{braceleftbigg}{007B FE03} +\pdfglyphtounicode{braceleftbt}{23A9} +\pdfglyphtounicode{braceleftmid}{23A8} +\pdfglyphtounicode{bracelefttp}{23A7} +\pdfglyphtounicode{bracerightBig}{007D FE02} +\pdfglyphtounicode{bracerightBigg}{007D FE04} +\pdfglyphtounicode{bracerightbig}{007D FE01} +\pdfglyphtounicode{bracerightbigg}{007D FE03} +\pdfglyphtounicode{bracerightbt}{23AD} +\pdfglyphtounicode{bracerightmid}{23AC} +\pdfglyphtounicode{bracerighttp}{23AB} +\pdfglyphtounicode{bracketleftBig}{005B FE02} +\pdfglyphtounicode{bracketleftBigg}{005B FE04} +\pdfglyphtounicode{bracketleftbig}{005B FE01} +\pdfglyphtounicode{bracketleftbigg}{005B FE03} +\pdfglyphtounicode{bracketleftbt}{23A3} +\pdfglyphtounicode{bracketleftex}{23A2} +\pdfglyphtounicode{bracketlefttp}{23A1} +\pdfglyphtounicode{bracketrightBig}{005D FE02} +\pdfglyphtounicode{bracketrightBigg}{005D FE04} +\pdfglyphtounicode{bracketrightbig}{005D FE01} +\pdfglyphtounicode{bracketrightbigg}{005D FE03} +\pdfglyphtounicode{bracketrightbt}{23A6} +\pdfglyphtounicode{bracketrightex}{23A5} +\pdfglyphtounicode{bracketrighttp}{23A4} +\pdfglyphtounicode{ceilingleftBig}{2308 FE02} +\pdfglyphtounicode{ceilingleftBigg}{2308 FE04} +\pdfglyphtounicode{ceilingleftbig}{2308 FE01} +\pdfglyphtounicode{ceilingleftbigg}{2308 FE03} +\pdfglyphtounicode{ceilingrightBig}{2309 FE02} +\pdfglyphtounicode{ceilingrightBigg}{2309 FE04} +\pdfglyphtounicode{ceilingrightbig}{2309 FE01} +\pdfglyphtounicode{ceilingrightbigg}{2309 FE03} +\pdfglyphtounicode{circledotdisplay}{2A00 FE02} +\pdfglyphtounicode{circledottext}{2A00 FE01} +\pdfglyphtounicode{circlemultiplydisplay}{2A02 FE02} +\pdfglyphtounicode{circlemultiplytext}{2A02 FE01} +\pdfglyphtounicode{circleplusdisplay}{2A01 FE02} +\pdfglyphtounicode{circleplustext}{2A01 FE01} +\pdfglyphtounicode{contintegraldisplay}{222E FE02} +\pdfglyphtounicode{contintegraltext}{222E FE01} +\pdfglyphtounicode{coproductdisplay}{2210 FE02} +\pdfglyphtounicode{coproducttext}{2210 FE01} +\pdfglyphtounicode{floorleftBig}{230A FE02} +\pdfglyphtounicode{floorleftBigg}{230A FE04} +\pdfglyphtounicode{floorleftbig}{230A FE01} +\pdfglyphtounicode{floorleftbigg}{230A FE03} +\pdfglyphtounicode{floorrightBig}{230B FE02} +\pdfglyphtounicode{floorrightBigg}{230B FE04} +\pdfglyphtounicode{floorrightbig}{230B FE01} +\pdfglyphtounicode{floorrightbigg}{230B FE03} +\pdfglyphtounicode{hatwide}{02C6 FE01} +\pdfglyphtounicode{hatwider}{02C6 FE02} +\pdfglyphtounicode{hatwidest}{02C6 FE03} +\pdfglyphtounicode{integraldisplay}{222B FE02} +\pdfglyphtounicode{integraltext}{222B FE01} +\pdfglyphtounicode{intersectiondisplay}{22C2 FE02} +\pdfglyphtounicode{intersectiontext}{22C2 FE01} +\pdfglyphtounicode{logicalanddisplay}{22C0 FE02} +\pdfglyphtounicode{logicalandtext}{22C0 FE01} +\pdfglyphtounicode{logicalordisplay}{22C1 FE02} +\pdfglyphtounicode{logicalortext}{22C1 FE01} +\pdfglyphtounicode{mapsto}{21A6} +\pdfglyphtounicode{parenleftBig}{0028 FE02} +\pdfglyphtounicode{parenleftBigg}{0028 FE04} +\pdfglyphtounicode{parenleftbig}{0028 FE01} +\pdfglyphtounicode{parenleftbigg}{0028 FE03} +\pdfglyphtounicode{parenleftbt}{239D} +\pdfglyphtounicode{parenleftex}{239C} +\pdfglyphtounicode{parenlefttp}{239B} +\pdfglyphtounicode{parenrightBig}{0029 FE02} +\pdfglyphtounicode{parenrightBigg}{0029 FE04} +\pdfglyphtounicode{parenrightbig}{0029 FE01} +\pdfglyphtounicode{parenrightbigg}{0029 FE03} +\pdfglyphtounicode{parenrightbt}{23A0} +\pdfglyphtounicode{parenrightex}{239F} +\pdfglyphtounicode{parenrighttp}{239E} +\pdfglyphtounicode{productdisplay}{220F FE02} +\pdfglyphtounicode{producttext}{220F FE01} +\pdfglyphtounicode{radicalBig}{221A FE02} +\pdfglyphtounicode{radicalBigg}{221A FE04} +\pdfglyphtounicode{radicalbig}{221A FE01} +\pdfglyphtounicode{radicalbigg}{221A FE03} +\pdfglyphtounicode{radicalbt}{23B7}% was {221A} +\pdfglyphtounicode{radicaltp}{231C}% was {ED6A}% PUA +\pdfglyphtounicode{radicalvertex}{20D3}% was {ED6B}% PUA +\pdfglyphtounicode{slashBig}{002F FE02} +\pdfglyphtounicode{slashBigg}{002F FE04} +\pdfglyphtounicode{slashbig}{002F FE01} +\pdfglyphtounicode{slashbigg}{002F FE03} +\pdfglyphtounicode{summationdisplay}{2211 FE02} +\pdfglyphtounicode{summationtext}{2211 FE01} +\pdfglyphtounicode{tie}{2040} +\pdfglyphtounicode{tildewide}{02DC FE01} +\pdfglyphtounicode{tildewider}{02DC FE02} +\pdfglyphtounicode{tildewidest}{02DC FE03} +\pdfglyphtounicode{uniondisplay}{22C3 FE02} +\pdfglyphtounicode{unionmultidisplay}{2A04 FE02} +\pdfglyphtounicode{unionmultitext}{2A04 FE01} +\pdfglyphtounicode{unionsqdisplay}{2A06 FE02} +\pdfglyphtounicode{unionsqtext}{2A06 FE01} +\pdfglyphtounicode{uniontext}{22C3 FE01} +\pdfglyphtounicode{vextenddouble}{20E6}% was {ED79}% PUA +\pdfglyphtounicode{vextendsingle}{20D3}%%% was {23D0} diff --git a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx new file mode 100644 index 0000000000..e1f95730fa --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx @@ -0,0 +1,131 @@ +% \iffalse meta-comment +% +%% File: latex-lab-amsmath.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. +% +%<*driver> +\documentclass{l3doc} +\EnableCrossrefs +\CodelineIndex +\begin{document} + \DocInput{latex-lab-amsmath.dtx} +\end{document} +%</driver> +% +% \fi +% +% +% \title{The \texttt{latex-lab-amsmath} code\thanks{}} +% \author{\LaTeX{} Project} +% +% \maketitle +% +% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}} +% \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}} +% +% \begin{abstract} +% \end{abstract} +% +% \tableofcontents +% +% \section{Introduction} +% +% This file implements adaptations to the \pkg{amsmath} package needed for +% the tagging project. +% +% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex } +% +% \section{The Implementation} +% +% \begin{macrocode} +%<@@=math> +% \end{macrocode} +% +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \subsection{File declaration} +% \begin{macrocode} +\ProvidesFile{latex-lab-amsmath.ltx} + [2023-01-05 v0.1a amsmath adaptions] +% \end{macrocode} +% \subsection{Tagpdf support} +% To make the code independent from tagging being loaded and active +% we load the \pkg{tagpdf-base} package: +% +% \begin{macrocode} +\RequirePackage{tagpdf-base} +% \end{macrocode} +% +% \begin{macrocode} +\ExplSyntaxOn +% \end{macrocode} +% +% \subsection{\cs{intertext}} +% The \cs{intertext} command errors with active tagging as it is processed twice +% which leads to duplicated structures. +% \begin{macrocode} +\AddToHook{package/amsmath/after} + { + \def\intertext@{% + \def\intertext##1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \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: +% \begin{macrocode} + \tag_mc_end_push: +% \end{macrocode} +% We are already in a par so we change now to Span: +% \begin{macrocode} + \tagpdfsetup{paratag=Span}% + \noindent\ignorespaces##1\par +% \end{macrocode} +% Restart the MC +% \begin{macrocode} + \tag_mc_begin_pop:n{}}% + \penalty\predisplaypenalty\vskip\abovedisplayskip% + }% + }} + } +% \end{macrocode} +% +% \begin{macrocode} +\ExplSyntaxOff +% \end{macrocode} +% +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% +% \Finale +% diff --git a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf Binary files differnew file mode 100644 index 0000000000..765870ac61 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-block-tagging.dtx b/macros/latex-dev/required/latex-lab/latex-lab-block-tagging.dtx new file mode 100644 index 0000000000..1a1dce3a64 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-block-tagging.dtx @@ -0,0 +1,3821 @@ +% \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.8a} +\def\ltblocksdate{2023/03/08} + +% +% \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@endpe\iftrue} +\def\@endpefalse{\global\let\if@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} + \@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} +% +% \begin{macrocode} +%<@@=> +\def\legacyverbatimsetup{% + \language\l@nohyphenation + \@tempswafalse + \def\par{% + \if@tempswa + \leavevmode \null \@@par\penalty\interlinepenalty + \else + \@tempswatrue + \ifhmode\@@par\penalty\interlinepenalty\fi + \fi}% + \let\do\@makeother \dospecials + \obeylines \verbatim@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} + \@setupverbinvisiblespace + \frenchspacing \@vobeyspaces +} +%<@@=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 use a list with a +% single item. For now we keep this approach and only add appropriate +% tagging support wihtin the internal commands. +% +% +% \begin{macro}{\@begintheorem,\@opargbegintheorem} +% +% We use \struct{theorem-like} as the structure name and rollmap it +% to a list (\struct{L}). +% \begin{macrocode} +\tag_if_active:T { + \tagpdfsetup{add-new-tag={tag=theorem-like,role=L}} +} +% \end{macrocode} +% +% With that done, we only have to tell the \env{trivlist} what +% \key{tag-name} it should use. +% \begin{macrocode} +\def\@begintheorem#1#2{\trivlist[tag-name=theorem-like]% + \item[\hskip \labelsep{\bfseries #1\ #2}]\itshape} +% \end{macrocode} +% +% \begin{macrocode} +\def\@opargbegintheorem#1#2#3{\trivlist[tag-name=theorem-like] + \item[\hskip \labelsep{\bfseries #1\ #2\ (#3)}]\itshape} +% \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@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@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@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} + \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} +% +% +% +% +% +% +% +% \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@deathcycles + \@setpar + { + \legacy_if:nTF { @newlist } + { + \int_incr:N \par@deathcycles + \int_compare:nNnTF \par@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@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@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_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} +% +% +% \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 = displayblock , + 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{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@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@skip , + right-skip = \@flushglue , + end-skip = \z@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@skip , + end-skip = \z@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@skip , + right-skip = \z@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@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} + { +% \typeout{-->G1~ (\int_use:N \l_@@_flattened_level_int)} + \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@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@line } + \bool_if:NF \l__tag_para_flattened_bool + { + \@@_debug_typeout:n{Structure-end~ + \l__tag_para_main_tag_tl\space after~ list \on@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. +% \begin{macrocode} + \@@_debug_typeout:n + { @endpe = \legacy_if:nTF { @endpe }{true}{false} + \on@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@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}{\PARALABEL} + \tag_mc_begin:n {} + } + } +} +% \end{macrocode} +% +% \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@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@after@para@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@after@para@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@a{\@latex@error{Environment #1 undefined}\@eha}}% + {\def\reserved@a{\def\@currenvir{#1}% + \edef\@currenvline{\on@line}% + \@execute@begin@hook{#1}% + \csname #1\endcsname}}% + \@ignorefalse + \begingroup + \__kernel_endpe_vmode: + \reserved@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@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 + { + \bool_if:NF \l__tag_para_flattened_bool + { +% \typeout{-->G3} + \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@line } + \tag_struct_begin:n { + tag=\l__tag_para_tag_tl + ,attribute-class=\l_tag_para_attr_class_tl + } + \bool_if:NT \l__tag_para_show_bool + { + \tag_mc_begin:n {artifact} + \llap {\color_select:n {blue}\tiny Li-\int_use:N \g__tag_para_begin_int \ } + \tag_mc_end: + } + \tag_mc_begin:n {tag=P} + } +} +% \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@line} + \legacy_if:nT { @endpe } + { + \int_gincr:N \g__tag_para_main_end_int + \@@_debug_typeout:n{close~ /text-unit \on@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@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@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 diff --git a/macros/latex-dev/required/latex-lab/latex-lab-block-tagging.pdf b/macros/latex-dev/required/latex-lab/latex-lab-block-tagging.pdf Binary files differnew file mode 100644 index 0000000000..92be446ea7 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-block-tagging.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx b/macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx index 6fe7ff6955..29261a594b 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: latex-lab-footnotes.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 @@ -53,19 +53,19 @@ % offering configurable methods for layout and functionality % adjustments that avoid overwriting each other when used in % classes as well as in packages (as far as possible --- obviously -% some adjustments are mutally exclusive). This is achieved by -% providing a a larger number of hooks (for areas where different +% 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 -% can write to successfully (in case of multiple changes the the +% 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 % the same time to be typeset vertically with one footnote below % each other. % % The interfaces are set up to support tagged PDF, but in order -% for this to work, all packages altering the fontnote setup should -% use the inferfaces provided here and not do it through the +% 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). % @@ -81,7 +81,7 @@ % that was used by most document classes, % but \cs{@makefntext} had to be defined in the class itself because % the format didn't provide a default. As a result you will find -% definitions for the latter in all document classes and defintions +% definitions for the latter in all document classes and definitions % for \cs{@makefnmark} only in very few. % % Furthermore, to enable special footnote layouts or provide @@ -114,7 +114,7 @@ % % In contrast the hooks are of interest to many classes to provide % their layout alterations in a way that it works smoothly with -% other packages handling aspects of foonote formatting. +% other packages handling aspects of footnote formatting. % % % \subsection{Formatting the mark in the main text} @@ -140,7 +140,7 @@ % % 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 ncessarily correctly, e.g., +% prepend material at this point (not necessarily correctly, e.g., % they do not all check that they are in horizontal mode). % % This hook is paired with hook \hook{fnmark/after}. @@ -163,15 +163,15 @@ % \item[\hook{fnmark/begin}] % % This hook is executed directly in front of the typeset mark. -% This is the place where \pkg{hyperref} adds part of its code, -% i.e., after the \cs{nobreak} mentioned above. With a closer -% integration of \pkg{hyperref} this hook may not be necessary at -% all. +% This is the place where \pkg{hyperref} would have added +% part of its code, i.e., after the \cs{nobreak} mentioned above. +% With the integration of hyperlinks in the tagging code +% this hook may not be necessary at all. % % \item[\hook{fnmark/end}] % % This hook is executed directly after the typeset mark. It is -% used by \pkg{hyperref}, \pkg{memhfixc}, \pkg{scrlttr2}, and +% used by \pkg{memhfixc}, \pkg{scrlttr2}, and % \pkg{footmisc}. Used, for example, to implement support for % multiple marks in succession. % @@ -227,9 +227,9 @@ % \item[\cs{@footnotetext@cfgpointiii} (no argument)] % % By default this configuration point adds a strut to the -% footnote material. so that consecutive footnotes are properly +% footnote material so that consecutive footnotes are properly % spaced vertically. In some use cases this is not appropriate -% (e.g., when running all footnotes s a single paragraph) and so +% (e.g., when running all footnotes as a single paragraph) and so % this configuration point can cancel the action or do something % else instead. % @@ -261,17 +261,18 @@ % % 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@FELbl}. +% marking the mark as an Lbl. It does this using the command +% \cs{tag@FENoteLbl}. % % \item[\cs{@makefntext@cfgpointii} (1 argument)] % % This configuration point manages the formatting of the footnote -% text once the mark has been typeset. +% 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@FENote}. +% the command \cs{tag@FENotetext}. % % \end{description} % @@ -335,7 +336,7 @@ % % 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{linuex}, have +% \hook{fntext/before}. Some packages, e.g., \pkg{linguex}, have % code in that position. % % \end{description} @@ -346,7 +347,7 @@ % \subsubsection{Additional configuration possibilities} % % The formatting of the footnote mark in front of the footnote -% texts is influenced by the setting of the dimen parameter +% text is influenced by the setting of the dimen parameter % \cs{footnotemargin}. By default its value is 1.8em in the current % text font (or \texttt{-}\cs{maxdimen} when the para option is % chosen). The following rules apply: @@ -381,7 +382,247 @@ % \end{itemize} % % -% \section{Tagging support} +% \section{Tagging and hyperlinking support} +% +% 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. +% The \emph{footnotetext} normally repeats at the begin the mark as a visual clue. +% +% Tagging (and hyperlinking) has to connect the mark with the note. +% For the tagging code, we assume that every mark has exactly one associated note, +% and that every note is associated to at least one mark +% and can have more associated marks. +% +% The mark doesn't need to be visible, e.g. the typesetted +% mark\textsuperscript{1--3} denotes three marks, where the second is invisible. +% Tagging should produce here probably three \texttt{Lbl} structures +% (one without content), and an artifact for the range marker. +% If such a range is used, links can only point to the notes 1 and 3 and +% one has to suppress the linking for the second mark. +% This means that links and tagging are also related +% to the actual formatting of the footnote mark. +% In the following this problem is mostly ignored for now, but +% should not be forgotten and handled later. +% +% \subsection{Technical details for the tagging} +% +% 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}. +% +% The \emph{footnotetext} should create a \texttt{/FENote}\footnote{We tag it as \texttt{/footnote} and role map it.} +% structure with a \texttt{/Ref} +% entry pointing to the structures of \emph{all} marks related to the note. +% The mark at the begin of the +% note is in a \texttt{/Lbl}\footnote{We tag it as \texttt{/footnotelabel}.} +% structure but has to fulfil no special requirements. +% +% Structure objects and the underlying properties used by the tagging +% code are initialized when the structure is opened. This means that one can not +% directly add data to a future structure +% but as structure objects are written at the end of the document it is +% possible to update \texttt{/Ref} entries in an end document hook. +% +% +% So tagging has to solve two problems: +% \begin{itemize} +% \item the mark and the footnote text must be surrounded by the correct structure +% and marked content commands. This is not trivial +% as there are various layouts (bottom, marginpar, minipage) and the tagging +% from the automatic paratagging must be taken into account if one want to avoid +% faulty nesting. +% +% \item It must detect which marks are related to which notes +% so that it can setup the \texttt{/Ref} cross-references. +% \end{itemize} +% +% +% \subsection{Requirements for links} +% +% Links should go from the mark to the note. Sometimes it has been requested +% that links go back too, but as there +% can be more than one mark connected to a note it is not clear how to decide to which mark it should go. +% Using the keys from the PDF viewer to go back is normally better. +% +% Links are closely related to the references stored in the \texttt{/Ref} +% entry of a mark and so are handled in the code together with them. +% But there are subtle technical differences to take care of +% as links and destinations are whatsits and so must be created at the correct time. +% +% It should be possible to suppress the links both globally and locally.\footnote{ +% Currently hyperref only offers the option to suppress the +% footnote links globally +% with the option \texttt{hyperfootnotes=false}. To suppress them locally +% only the \texttt{NoHyper} environment is provided.} +% +% +% \subsection{The algorithmus to connect marks and notes} +% +% +% The connection is made by comparing the value of \cs{@thefnmark}. +% +% The standard mark commands (\cs{footnotemark} and \cs{footnote}) +% store the current value of \cs{@thefnmark} +% with their own structure number as a key in a property. +% +% A following \cs{footnotetext} compares its own \cs{@thefnmark} with the values in +% the prop. If there is a match it stores the structure numbers and removes the entries +% from the properties (so in a normal document the property will never contain more than +% a few entries). +% +% This works well as long as the \cs{footnotemark} commands are issued before the \cs{footnotetext} and +% 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. +% +% The default property uses the name \texttt{default} +% +% \begin{function}{\fnote_new:nn} +% \begin{syntax} +% \cs{fnote_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. +% \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} +% \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} +% \end{function} +% +% \begin{function}{\fnote_mark_gpop:nnN} +% \begin{syntax} +% \cs{fnote_mark_gpop:nnN}\Arg{mark}\Arg{footnote type 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 +% used to create link targets and references. +% \end{function} +% +% +% \subsubsection{\cs{footref}} +% +% \cs{footref} use internally the same command to set the mark as \cs{footnotemark}, it only +% defines \cs{@thefnmark} differently. This \cs{@thefnmark} is not suitable for the method described +% 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) +% 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. +% +% The structure related to the \cs{footref} is added to the end of the \texttt{/Ref} array of the note and so the +% \texttt{/Ref} array doesn't necessarly reflect the order of the marks in the document. It would probably +% be possible to change this, but it is not clear if it actually matters and so it worth the additional coding +% and processing. +% +% \subsubsection{\cs{footnotemark} after \cs{footnotetext}} +% +% The automatic detection doesn't work if a \cs{footnotemark} is issued after +% the \cs{footnotetext} it refers to. There will be no error, but neither the link nor +% the \texttt{/Ref} will connect both. +% +% The simple way to handle this is to use a label and \cs{footref}: +% +% \begin{verbatim} +% \footnotetext{\label{fn:a}text} ... \footref{fn:a} +% \end{verbatim} +% +% An alternative would be to extend the syntax of \cs{footnotemark} and +% \cs{footnotetext} to allow to add a label which can then be used. +% For example +% +% \begin{verbatim} +% \footnotetext[label=fn:a]{text} ... \footnotemark[label=fn:a] +% \end{verbatim} +% +% As both have already an optional argument, that requires the optional argument extension. +% +% +% \subsection{Links} +% +% The structure numbers detected for the \texttt{/Ref} are also used for links: +% even if tagging is not activated the tagging commands are defined through +% the \pkg{tagpdf-base} package +% and the structure commands increase the structure counter and this info can be used. +% +% A \cs{footnotetext} creates a bunch of destinations (in most cases this sums up to +% two destinations): one for every structure number in the \texttt{/Ref} (used as target +% 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{Handling the mark} +% +% The mark in the text is handled by redefining the kernel configuration point +% \cs{@kernel@process@makefnmark} to \cs{tag@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@process@makefnmark} is issued \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@process@footnotetext}. This configuration point takes two arguments, \cs{@footnotetext@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 redefinition of \cs{@kernel@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{@makefntext}/\cs{fnote_makefntext:n}. In the new implementation this contains two configuration +% points, \cs{@makefntext@cfgpoint} and \cs{@makefntext@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 +% (small italic letters by default) and puts the +% footnote text at the bottom of the box. The \cs{footnotemark} +% command uses the standard footnote counter and marker (and so typically +% creates a superscript number). +% It is meant to be used with a \cs{footnotetext} \emph{outside} +% the minipage to create a footnote mark which refers to a footnote text +% at the bottom of the page. +% This means to repeat a footnote marker in a minipage you should use the \cs{footref} command. +% +% Tagging works quite similar to normal footnotes if the new definition is used +% and if the minipage code is changed to use the new configuration point. +% The main problem here is currently the tagging of the minipage itself. +% +% \section{TODOs} +% +% \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 +% with the relevant packages and classes. +% +% \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@cfgpoint} and \cs{@makefntext@cfgpointii}. +% +% \item \pkg{memoir} is not supported at all and errors when the code tries to patch +% \cs{@makefntext}. +% \end{itemize} % % \emph{To be documented} % @@ -403,46 +644,171 @@ % \subsection{File declaration} % \begin{macrocode} \ProvidesFile{latex-lab-footnotes.ltx} - [2022-07-22 v0.6b changes to the footnote interfaces] + [2023-02-04 v0.7 changes to the footnote interfaces] % \end{macrocode} % +% \subsection{code not fully handled yet} % \begin{macrocode} - +% % latex.ltx +% not looked at yet +% \@mpfootnotetext is probably no longer needed, or only to support other +% classes and package. See below about the minipage code. +% +% \long\def\@mpfootnotetext#1{% +% \global\setbox\@mpfootins\vbox{% +% \unvbox\@mpfootins +% \reset@font\footnotesize +% \hsize\columnwidth +% \@parboxrestore +% \def\@currentcounter{mpfootnote}% +% \protected@edef\@currentlabel +% {\csname p@mpfootnote\endcsname\@thefnmark}% +% \color@begingroup +% \@makefntext{% +% \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% +% \par +% \color@endgroup}} +% ======== +% used by the minipage footnote code. +% +% \def\@mpfn{footnote} +% \def\thempfn{\thefootnote} +% ========= +% this perhaps need some configuration options. +% +%\def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}} +% +% ========= +%% alterations not covered: +% +% ./arabtex/afoot.sty --- too different (and probably too old) +% +% ===== +% alterations of footnotetext not covered: +% +% ./revtex4-1/revtex4-1.cls ./revtex/ltxutil.sty ./revtex/revtex4-2.cls ... (need analysis) +% ./bigfoot/bigfoot.sty +% +% memoir needs checking too +% +% ===== +% +% use of kerns to mark h-mode positions (unit sp) +% +% 1 = CJK +% 2 = CJK +% 3 = multiple footnotes (footmisc, koma, eledmac, tufte, memoir, +% parnotes, sidenotes) +% 3 = outer kern in letter spacing (letterspace) +% 3 = beginning of list (examdesign.cls) +% 4 = CJK pigin +% 5 = CJK ruby - % not looked at yet - -\long\def\@mpfootnotetext#1{% - \global\setbox\@mpfootins\vbox{% - \unvbox\@mpfootins - \reset@font\footnotesize - \hsize\columnwidth - \@parboxrestore - \def\@currentcounter{mpfootnote}% - \protected@edef\@currentlabel - {\csname p@mpfootnote\endcsname\@thefnmark}% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \par - \color@endgroup}} - - -\def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}} - - - -\def\@mpfn{footnote} -\def\thempfn{\thefootnote} - - - +% 1-4 = polyglossia for korean +% +% \end{macrocode} %------------------------------------- - - +% \begin{macrocode} \ExplSyntaxOn +% \end{macrocode} +% \subsection{Temporary variables} +% \begin{macrocode} +\prop_new:N \l_@@_tmpa_prop +\tl_new:N \l_@@_tmpa_tl +% \end{macrocode} +% \subsection{Public variables} +% +% A footnote mark will store its structure number (key) and the +% expanded \cs{@thefnmark} in this prop so +% that a following note can retrieve this info +% if needed. It is possible to use more than one footnote series (type) +% if needed (if different footnotes/note use the same +% numbering system). +% If this command is changed an accompanying property must be created +% \begin{NOTE}{UF} +% TODO: interface to create the property.\\ +% TODO: check and decide about the name of the tl +% \end{NOTE} +% \begin{macro}{\l_fnote_type_tl} +% \begin{macrocode} +\tl_new:N \l_fnote_type_tl +\tl_set:Nn \l_fnote_type_tl {default} +% \end{macrocode} +% \end{macro} +% It must be possible to suppress the hyperlinking, both locally +% and globally. hyperref's hyperfootnotes option should set the boolean. +% \begin{macro}{\l_fnote_link_bool} +% \begin{macrocode} +\bool_new:N \l_fnote_link_bool +\bool_set_true:N \l_fnote_link_bool +% \end{macrocode} +% \end{macro} +% A hyperlink should have an changeable link type. This can +% be e.g. used to change the color or the border. +% \begin{macro}{\l_fnote_link_type_tl} +% \begin{macrocode} +\tl_new:N \l_fnote_link_type_tl +\tl_set:Nn \l_fnote_link_type_tl {link} +% \end{macrocode} +% \end{macro} +% +% \subsection{Internal variables} +% +% \begin{macro}{\l_@@_linktarget_tl} +% This command stores the name of a linktarget/destination +% when needed +% \begin{macrocode} +\tl_new:N \l_@@_linktarget_tl +% \end{macrocode} +% \end{macro} +% \begin{macro}{\l_@@_currentlabel_tl} +% This command is used to pass a label name around. +% \begin{macrocode} +\tl_new:N \l_@@_currentlabel_tl +% \end{macrocode} +% \end{macro} - +% \begin{macro}{\l_@@_currentrefs_seq} +% This sequence stores the list of reference of a note +% \begin{macrocode} +\seq_new:N \l_@@_currentrefs_seq +% \end{macrocode} +% \end{macro} +% +% The connection between the mark(s) in the text and the note +% is either deduced automatically or done through an label. +% The default is automatic, but we must be able to suppress it. For this we use a boolean. +% \begin{macro}{\l_@@_autodetect_bool} +% \begin{macrocode} +\bool_new:N \l_@@_autodetect_bool +\bool_set_true:N \l_@@_autodetect_bool +% \end{macrocode} +% \end{macro} +% This is used to pass the structure number of the note around, e.g. +% to a label inside the note. +% \begin{macrocode} +\tl_new:N \l_@@_currentstruct_tl +\tl_set:Nn \l_@@_currentstruct_tl {1} +% \end{macrocode} +% +% +% \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} +\cs_generate_variant:Nn \tag_struct_use:n {e} +% \end{macrocode} +% +% \subsection{Updating \cs{@thefnmark}} +% \begin{macro}{\fnote_step_fnmark:nn} +% This command updates \cs{@thefnmark}. The first argument +% is an optional integer expression, the second a counter name. +% If the optional argument is not given it steps the counter. +% \begin{macrocode} \cs_new_protected:Npn \fnote_step_fnmark:nn #1#2 { \tl_if_novalue:nTF {#1} { @@ -463,7 +829,12 @@ \group_end: } } - +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fnote_set_fnmark:nn} +% This is similar to the previous command, but it doesn't step the +% counter but use the current value. +% \begin{macrocode} \cs_new_protected:Npn \fnote_set_fnmark:nn #1#2 { \tl_if_novalue:nTF {#1} { @@ -476,25 +847,40 @@ \group_end: } } - -%------------------------------------- - -% the debugging code is just temp -\bool_new:N \g_fnote_debug_bool -\bool_gset_true:N \g_fnote_debug_bool % for now we have debugging turned on by default - -%------------------------------------- - - - +% \end{macrocode} +% \end{macro} +% +% \subsection{Hooks} +% +% Hooks in the footnotemark command. +% \begin{macrocode} \NewMirroredHookPair{fnmark/before}{fnmark/after} \NewHook{fnmark} \NewHook{fnmark/begin} \NewHook{fnmark/end} - - -\cs_new:Npn \@@_debug_footnotemark: { - \bool_if:NT \g_fnote_debug_bool +% \end{macrocode} +% Hooks in the footnotetext command +% \begin{macrocode} +\NewMirroredHookPair{fntext/before}{fntext/after} +\NewHook{fntext} +\NewHook{fntext/para} +\NewHook{fntext/begin} +\NewHook{fntext/end} +% \end{macrocode} +% +% \subsection{Debugging code} +% the debugging code is just temporary +% +% For now we have debugging turned on by default +% \begin{macrocode} +\bool_new:N \g_fnote_debug_bool +\bool_gset_true:N \g_fnote_debug_bool +% \end{macrocode} +% We log the hooks in the footnote mark command, but only once +% \begin{macrocode} +\cs_new_protected:Npn \@@_debug_footnotemark: + { + \bool_if:NT \g_fnote_debug_bool { \LogHook{fnmark/before} \LogHook{fnmark} @@ -503,9 +889,38 @@ \LogHook{fnmark/after} \cs_gset_eq:NN \@@_debug_footnotemark: \prg_do_nothing: } -} - - + } +% \end{macrocode} +% Similar for the footnotetext +% \begin{macrocode} +\cs_new_protected:Npn \@@_debug_footnotetext: + { + \bool_if:NT \g_fnote_debug_bool + { + \cs_log:N\@footnotetext@cfgpoint + \cs_log:N\@footnotetext@cfgpointii + \cs_log:N\@footnotetext@cfgpointiii + \cs_log:N\@footnotetext@cfgpointiv + \cs_log:N\@makefntext@cfgpoint + \cs_log:N\@makefntext@cfgpointii + \LogHook{fntext/before} + \LogHook{fntext} + \LogHook{fntext/para} + \LogHook{fntext/begin} + \LogHook{fntext/end} + \LogHook{fntext/after} +% \end{macrocode} +% Show the info only once (if at all). +% \begin{macrocode} + \cs_gset_eq:NN \@@_debug_footnotetext: \prg_do_nothing: + } + } +% \end{macrocode} +% +% \subsection{The new \cs{@footnotemark} command} +% \begin{macro}{\fnote_footnotemark:} +% This is the main command which will replace \cs{@footnotemark}. +% \begin{macrocode} \cs_new_protected:Npn \fnote_footnotemark: { \@@_debug_footnotemark: %------- @@ -535,17 +950,20 @@ % \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, inf a complete +% finishing with \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 +% the footnote text (e.g., by placing it into an \cs{insert}). In % such a situation \cs{_@@_footmark_finish:} below does nothing % and the action is carried out later. % \begin{macrocode} \@@_footnotemark_finish: } - - -\cs_new:Npn \@@_finish: { +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_finish:,\@@_footnotemark_finish:} +% \begin{macrocode} +\cs_new_protected:Npn \@@_finish: { % hyperref.sty % memhfixc.sty --- could move fnmark/after % scrlttr2.cls --- could vanish if footmisc uses a hook @@ -561,57 +979,30 @@ %------- } - \cs_new_eq:NN \@@_footnotemark_finish: \@@_finish: - - - +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@kernel@process@makefnmark} % Not a public config point but the kernel hook to add tagging +% \begin{macrocode} \def \@kernel@process@makefnmark { } - - -% alterations not covered: +% \end{macrocode} +% \end{macro} % -% ./arabtex/afoot.sty --- too different (and probably too old) - - -% Provide the name \LaTeXe{} is used to. - +% \begin{macro}{\@footnotemark} +% At last provide the name \LaTeXe{} is used to. +% \begin{macrocode} \cs_set_eq:NN \@footnotemark \fnote_footnotemark: - - - -%------------------------------------- - -\NewMirroredHookPair{fntext/before}{fntext/after} -\NewHook{fntext} -\NewHook{fntext/para} -\NewHook{fntext/begin} -\NewHook{fntext/end} - - -\cs_new:Npn \@@_debug_footnotetext: { - \bool_if:NT \g_fnote_debug_bool - { - \cs_log:N\@footnotetext@cfgpoint - \cs_log:N\@footnotetext@cfgpointii - \cs_log:N\@footnotetext@cfgpointiii - \cs_log:N\@footnotetext@cfgpointiv - \cs_log:N\@makefntext@cfgpoint - \cs_log:N\@makefntext@cfgpointii - \LogHook{fntext/before} - \LogHook{fntext} - \LogHook{fntext/para} - \LogHook{fntext/begin} - \LogHook{fntext/end} - \LogHook{fntext/after} % \end{macrocode} -% Show the info only once (if at all). +% \end{macro} +% +% +% \subsection{The new \cs{@footnotetext} command} +% +% +% \begin{macro}{\fnote_footnotetext:n} % \begin{macrocode} - \cs_gset_eq:NN \@@_debug_footnotetext: \prg_do_nothing: - } - } - \cs_new_protected:Npn \fnote_footnotetext:n #1 { \@@_debug_footnotetext: %------- @@ -690,55 +1081,75 @@ \UseHook{fntext/after} %------- } - +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotetext@cfgpoint} % default for config point (1 arg) +% \begin{macrocode} \cs_new_protected:Npn \@footnotetext@cfgpoint { \insert\footins } - +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@footnotetext@cfgpointii} % default for config point (1 arg) +% \begin{macrocode} \cs_new_protected:Npn \@footnotetext@cfgpointii { \@makefntext } - - +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotetext@cfgpointiii} % default for config point (0 args) +% \begin{macrocode} \cs_new_protected:Npn \@footnotetext@cfgpointiii { \rule\z@\footnotesep } - +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotetext@cfgpointiv} % default for config point (0 args) +% \begin{macrocode} \cs_new_protected:Npn \@footnotetext@cfgpointiv { \@finalstrut\strutbox } - - +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@kernel@process@footnotetext} % kernel hook for tagging (2 args) +% \begin{macrocode} \cs_new_protected:Npn \@kernel@process@footnotetext {} - +% \end{macrocode} +% \end{macro} +% % 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. - -\AddToHook{begindocument}{ - \cs_set_eq:NN \@footnotetext \fnote_footnotetext:n -} - -% alterations not covered: +% with firstaid (or updating of the class). +% \begin{macrocode} +\AddToHook{begindocument} + { + \cs_set_eq:NN \@footnotetext \fnote_footnotetext:n + } +% \end{macrocode} % -% ./revtex4-1/revtex4-1.cls ./revtex/ltxutil.sty ./revtex/revtex4-2.cls ... (need analysis) -% ./bigfoot/bigfoot.sty - - - -% \footnotemargin is the logic implemented by footmisc. Perhaps we +% \subsection{The new \cs{@makefntext} command} +% +% \cs{footnotemargin} is the logic implemented by footmisc. Perhaps we % don't want to do this like that in the kernel but for now I have % used this interface unchanged. - - +% \begin{macrocode} \newdimen\footnotemargin \footnotemargin\maxdimen % no value given -\AtBeginDocument{ - \ifdim \footnotemargin=\maxdimen - \setlength\footnotemargin{1.8em} - \fi -} - +\AtBeginDocument + { + \ifdim \footnotemargin=\maxdimen + \setlength\footnotemargin{1.8em} + \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 @@ -765,36 +1176,45 @@ \@makefntext@cfgpointii { #1 } } - - - - +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefntext@cfgpoint} % default for config point (1 arg) +% \begin{macrocode} \cs_new_protected:Npn \@makefntext@cfgpoint { \noindent } - +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefntext@cfgpointii} % default for config point (1 arg) +% \begin{macrocode} \cs_new_protected:Npn \@makefntext@cfgpointii #1 { #1 } % \end{macrocode} +% \end{macro} % +% \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. % -% 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. +% Here is the definition the way it is in +% \texttt{classes.dtx}. Notice that (for saving space) there is no +% space after \texttt{em} to terminate the assignment. We need to +% mimic that, otherwise a test would return false even if the +% definition has not been modified. % -% Here is the the definition the way it is in -% \texttt{classes.dtx}. Notice that (for saving space) there is no -% space after \texttt{em} to terminate the assignment. We need to -% mimic that, otherwise a test would return false even if the -% definition has not been modified. % +% \begin{macro}{\old@std@class@makefntext} % \begin{macrocode} \newcommand\old@std@class@makefntext[1]{% \parindent 1em% \noindent \hb@xt@1.8em{\hss\@makefnmark}#1} - % \end{macrocode} +% \end{macro} +% % 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 @@ -822,7 +1242,6 @@ % \cs{@makefnmark} without surrounding it in a box and if that % fails it gives up with an \cs{ERROR} (which needs to get a proper definition). % \begin{macrocode} - \tl_new:N \l_@@_patch_tl \cs_new_eq:NN \@@_tmp:w \ERROR @@ -853,6 +1272,7 @@ %\begin{verbatim} % AAA \@makefntext@processX { \hbox BBB } %\end{verbatim} +% % \begin{macrocode} \cs_new:Npn \@@_patch_hbox:w #1 \hbox #2 # { \exp_stop_f: #1 \@makefntext@processX { \hbox #2 } } @@ -869,25 +1289,27 @@ % different structure so this is a simple reshuffling. Would be % better if we can patch the right structure in directly, but I'm % not a patch person, so this is the simple way out for now: -% +% % \begin{macrocode} \cs_new:Npn \@makefntext@processX #1#2{\@makefntext@cfgpoint{#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 % using the approach above. % \begin{macrocode} -\AddToHook{begindocument}{ - \cs_if_eq:NNTF \@makefntext \old@std@class@makefntext - { - \cs_set_eq:NN \@makefntext \fnote_makefntext:n - } - { - \@@_patch: - } -} +\AddToHook{begindocument} + { + \cs_if_eq:NNTF \@makefntext \old@std@class@makefntext + { + \cs_set_eq:NN \@makefntext \fnote_makefntext:n + } + { + \@@_patch: + } + } % possibly add the following to check for multiple \hbox in @@ -898,63 +1320,112 @@ % % \end{macrocode} % +% \subsection{Document-level commands} % +% \begin{macro}{\footnotetext} +% \begin{macrocode} +\DeclareDocumentCommand\footnotetext {om} + { + \fnote_set_fnmark:nn {#1} \@mpfn + \@footnotetext {#2} + } +% \end{macrocode} +% \end{macro} % % -% \subsection{Document-level commands} -% -% \changes{v0.6b}{2022/07/22}{Make mandatory arguments of \cs{footnote} -% and \cs{footnotetext} long (gh863)} +% \begin{macro}{\footnote} % \begin{macrocode} +\DeclareDocumentCommand\footnote {om} + { + \fnote_step_fnmark:nn {#1} \@mpfn + \cs_set_eq:NN \@@_footnotemark_finish: \prg_do_nothing: + \@footnotemark + \cs_set_eq:NN \@@_footnotemark_finish: \@@_finish: + \@footnotetext {#2} + \@@_footnotemark_finish: + } +% \end{macrocode} +% \end{macro} +% -\DeclareDocumentCommand\footnotetext {o+m} { - \fnote_set_fnmark:nn {#1} \@mpfn - \@footnotetext {#2} -} - - -%------------------------------------- - - -\DeclareDocumentCommand\footnote {o+m} { - \fnote_step_fnmark:nn {#1} \@mpfn - \cs_set_eq:NN \@@_footnotemark_finish: \prg_do_nothing: - \@footnotemark - \cs_set_eq:NN \@@_footnotemark_finish: \@@_finish: - \@footnotetext {#2} - \@@_footnotemark_finish: -} - -%------------------------------------- - - -\DeclareDocumentCommand\footnotemark {o} { - \fnote_step_fnmark:nn {#1} { footnote } - \@footnotemark -} - - -%------------------------------------- - -\DeclareDocumentCommand\footref {m}{% - \begingroup - \unrestored@protected@xdef\@thefnmark{\ref{#1}}% - \endgroup - \@footnotemark -} - +% \begin{macro}{\footnotemark} +% \begin{macrocode} +\DeclareDocumentCommand\footnotemark {o} + { + \fnote_step_fnmark:nn {#1} { footnote } + \@footnotemark + } % \end{macrocode} -% +% \end{macro} + +% \begin{macro}{\footref} +% \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 +% note automatically but should instead use the label. +% This is passed to \cs{@footnotemark} through +% \cs{l__fnote_currentlabel_tl}. +% % \begin{macrocode} -%<@@=> +\DeclareDocumentCommand\footref {m} + { + \begingroup + \unrestored@protected@xdef\@thefnmark{\ref*{#1}}% + \endgroup + \bool_set_false:N \l_@@_autodetect_bool + \tl_set:Nn \l_@@_currentlabel_tl {#1} + \@footnotemark + \bool_set_true:N \l_@@_autodetect_bool + } % \end{macrocode} +% \end{macro} % % +% \subsection{Firstaid for packages and classes} % +% \subsection{Kernel patches} +% 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@cfgpoint #1 + { + \global\setbox\@mpfootins\vbox{% + \unvbox\@mpfootins + #1 + } + } +% \end{macrocode} +% Then we patch \cs{@iiiminipage} +% \begin{macrocode} +\RequirePackage{etoolbox} +\ExplSyntaxOff +\patchcmd\@iiiminipage + {\let\@footnotetext\@mpfootnotetext} + {\let\@footnotetext@cfgpoint\@mpfootnotetext@cfgpoint} + {}{\ERROR} +\ExplSyntaxOn +% \end{macrocode} % +% \subsubsection{\pkg{memoir}} +% The \pkg{memoir} class redefines various internal commands to inject its +% hooks and addtional code. The following reinstates the kernel command and +% so probably breaks various options of \pkg{memoir}, but without the +% changes it errors anyway. The \pkg{footmisc} package should be used to change +% for example to para footnotes. % -% \subsection{Firstaid for packages and classes} +% \begin{macrocode} +\AddToHook{class/memoir/before} + { \let\new@std@class@makecol\@makecol } +\AddToHook{class/memoir/after} + { + \cs_set_eq:NN \@footnotemark \fnote_footnotemark: + \cs_set_eq:NN \@makefntext\old@std@class@makefntext + \cs_set_eq:NN \@makecol\new@std@class@makecol + } +% \end{macrocode} % % \subsubsection{\pkg{setspace}} % @@ -967,156 +1438,410 @@ % \end{macrocode} % % -% -% % \subsubsection{\pkg{hyperref}} % -% Prevent hyperref from redefining footnote stuff --- this is a -% temp solution. +% hyperref has a hook which allows to disable its footnote +% related patches. As we will handle links directly in the code +% this is used. +% % \begin{macrocode} -\AddToHook{package/hyperref/after}{ - \let\H@@footnotetext\fnote_footnotetext:n - \let\H@@footnotemark\fnote_footnotemark: - \let \@footnotetext \fnote_footnotetext:n - \let \@footnotemark \fnote_footnotemark: -} - - - +\def\hyper@nopatch@footnote{} % \end{macrocode} -% -% \subsection{Stuff that needs cleanup and documentation} -% +% We use the hyperref commands for now for links. To avoid +% to have to test for hyperref we provide dummies. +% TODO consider to use specials to get similar spacing. % \begin{macrocode} - - -%------------------------------------- - -% use of kerns to mark h-mode positions (unit sp) +\AtBeginDocument + { + \providecommand\hyper@linkstart{\@gobbletwo} + \providecommand\hyper@linkend{\@empty} + } +% \end{macrocode} % -% 1 = CJK -% 2 = CJK -% 3 = multiple footnotes (footmisc, koma, eledmac, tufte, memoir, -% parnotes, sidenotes) -% 3 = outer kern in letter spacing (letterspace) -% 3 = beginning of list (examdesign.cls) -% 4 = CJK pigin -% 5 = CJK ruby - -% 1-4 = polyglossia for korean - -%------------------------------------- - - - -%------------------------------------- -% Tagging -%------------------------------------- - -% hyperref support only when loaded (improve integration) - -\newcounter{absfootnote} -\AddToHook{fnmark/begin}{\stepcounter{absfootnote}} % too simple (fails with opt args) - - - -% this is rubbish and should be handled better: - -\cs_new_protected:Npn \tag_if_loaded:TF { \cs_if_exist:NTF \tag_struct_begin:n } - - - -\cs_new_protected:Npn \tag@FEMark #1 { - \tag_if_loaded:TF +% It must be possible to suppress the hyperlinking, both locally +% and globally. hyperref should set the boolean \cs{l_fnote_link_bool}. +% For now we test for the hyperref boolean (so it can be suppressed only globally). +% \begin{macrocode} +\AtBeginDocument + { + \@ifpackageloaded{hyperref} { - \tag_mc_end_push: - \exp_args:Nx - \tag_struct_begin:n{tag=Lbl,ref=fn.\the\c@absfootnote} - \tag_mc_begin:n{tag=Lbl} - \IfPackageLoadedTF{hyperref}{ \hyper@linkstart - {link}{fn.\the\c@absfootnote} }{} - #1 - \IfPackageLoadedTF{hyperref}{ \hyper@linkend }{} - \tag_mc_end: - \tag_struct_end: - \tag_mc_begin_pop:n{} + \legacy_if:nF{Hy@hyperfootnotes}{\bool_set_false:N \l_fnote_link_bool} } - { #1 } -} - -% to be done next round around: + { + \bool_set_false:N \l_fnote_link_bool + } + } +% \end{macrocode} % -% \the\c@absfootnote should be replaced directly by some command with default meaning -% \the\c@absfootnote so that the actual reference can be changed from the outside. +% \subsection{Tagging and hyperlink code} +% \subsubsection{Rolemap for structure tags} +% We use role-mapping to get more speaking names +% in the PDF and so ease debugging. These names are already +% provided by tagpdf directly. +% +% \subsubsection{Extending the label system} +% 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. +% 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} +\ref_attribute_gset:nnnn {fnote/struct}{1}{now}{\l_@@_currentstruct_tl} +% \end{macrocode} % -% there are several instances that are curently hardwired. - -\cs_set_eq:NN \@kernel@process@makefnmark \tag@FEMark - - - -% kernel hook for tagging (2 args) -\cs_set:Npn \@kernel@process@footnotetext #1#2 { - \tag_if_loaded:TF +% We add a hook to the \pkg{nameref} hook. By default it does nothing +% \begin{macro}{\@@_label_hook:} +% \begin{macrocode} +\cs_new_protected:Npn \@@_label_hook: {} +\AddToHook{begindocument/before} + { + \RequirePackage{nameref} + \g@addto@macro\label@hook + { + \@@_label_hook: + } + } +% \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@name}. +% \begin{macrocode} +\AddToHook{fntext/begin} + { + \cs_set_protected:Npn \@@_label_hook: { - \tag_mc_end_push: - \tag_struct_begin:n { tag=FENote,label=fn.\the\c@absfootnote } - #1 {#2} - \tag_struct_end: - \tag_mc_begin_pop:n{} + \ref_label:Vn \label@name {fnote/struct} } - { #1 {#2} } -} - - + } +% \end{macrocode} +% +% \subsubsection{Storing and retrieving reference data} +% To establish the connection between a mark and a note +% the mark has to store its representation, and the +% note has to analyse the stored representations to get +% the structure numbers of its mark. This is done +% with the public function to allow similar systems (e.g. +% tabular notes, other footnote series) to make use of this. +% +% +% \begin{macro}{\fnote_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. +% It is not necessary to setup every footnote like +% command as its own type! +% +% \begin{macrocode} +\cs_new_protected:Npn \fnote_new:nn #1 #2 % #1 name, #2 options + { + \prop_new:c { g_@@_currentmarks_ #1 _prop } + } -\cs_set:Npn \@makefntext@cfgpoint #1 { - \noindent - \cs_if_exist:NT \tag_struct_begin:n { \tag_mc_end_push: } - \tag@FELbl { #1 } -} +\fnote_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) +% \begin{macrocode} +\cs_new_protected:Npn \fnote_mark_gput:nn #1 #2 % #1 the representation of the mark, #2 type + { + \prop_gput:cxn { g_@@_currentmarks_ #2 _prop } + { \tag_get:n{struct_num} } + { #1 } + } -\cs_set:Npn \@makefntext@cfgpointii #1 { - \tag@FENote { #1 } - \cs_if_exist:NT \tag_struct_begin:n { \tag_mc_begin_pop:n{} } -} +\cs_generate_variant:Nn \fnote_mark_gput:nn {no,oo} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fnote_mark_gpop:nnN} +% This commands takes as argument the representation of the mark +% (e.g. the content of\cs{@thefnmark}), the series (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 +% \begin{macrocode} +\cs_new_protected:Npn \fnote_mark_gpop:nnN #1 #2 #3 + { + \seq_clear:N #3 + \prop_set_eq:Nc \l_@@_tmpa_prop { g_@@_currentmarks_ #2 _prop } + \prop_map_inline:Nn \l_@@_tmpa_prop + { + \tl_if_eq:nnT {#1} { ##2 } + { +% \end{macrocode} +% store the key (the structure number) in the seq +% \begin{macrocode} + \seq_put_right:Nn #3 { ##1 } +% \end{macrocode} +% remove entry as used from the global prop +% \begin{macrocode} + \prop_gremove:cn { g_@@_currentmarks_ #2 _prop } {##1} + } + } + } +\cs_generate_variant:Nn\fnote_mark_gpop: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{macrocode} +\cs_new_protected:Npn \tag@FEMark #1 %#1 content + { +% \end{macrocode} +% end an open mc and start the structure. +% \begin{macrocode} + \tag_mc_end_push: + \tag_struct_begin:n { tag=footnotemark } +% \end{macrocode} +% The associated note is either auto detected +% or given by the user. +% \begin{macrocode} + \bool_if:NTF \l_@@_autodetect_bool + { +% \end{macrocode} +% For the auto detecting we store the structure number +% and \cs{@thefnmark} inside a prop and set +% the target name of the link to the current structure number. +% TODO: this should be usable for other footnote types +% which means the name of the prop shouldn't be fix. +% \begin{macrocode} + \fnote_mark_gput:oo {\@thefnmark}{\l_fnote_type_tl} + \tl_set:Nx \l_@@_linktarget_tl {footnote*.\tag_get:n{struct_num}} + } +% \end{macrocode} +% If there is no autodetecting we need some id, +% currently it is called \cs{l__fnote_currentlabel_tl}. +% the Ref is set by looking at the label value. +% We must also add the current structure number to the \ref of the FEnote. +% Both must be delayed as we don't know if the objects of the FEnote and the mark +% have already been created. +% \begin{macrocode} + { + \hook_gput_code:nne {tagpdf/finish/before} {tagpdf/footnote} + { + \exp_not:N\fnote_gput_refs:ee + { \tag_get:n{struct_num} } + { \ref_value:Vn\l_@@_currentlabel_tl {fnote/struct} } + } +% \end{macrocode} +% in this case we set the name of the linktarget in the note +% to the structure number of the text mark. +% \begin{macrocode} + \tl_set:Nx \l_@@_linktarget_tl {footnote*.\ref_value:Vn\l_@@_currentlabel_tl {fnote/struct}} + } +% \end{macrocode} +% And now the actual content +% \begin{macrocode} + \tag_mc_begin:n{tag=Lbl} + % + \bool_if:NTF \l_fnote_link_bool + { + \exp_args:No + \hyper@linkstart + { \l_fnote_link_type_tl } + { \l_@@_linktarget_tl } + #1 + \hyper@linkend + } + { #1 } + \tag_mc_end: + \tag_struct_end: + \tag_mc_begin_pop:n{} + } +% \end{macrocode} +% At last set the kernel command to this one +% \begin{macrocode} +\cs_set_eq:NN \@kernel@process@makefnmark \tag@FEMark +% \end{macrocode} +% \subsubsection{The footnote text} -\cs_new_protected:Npn \tag@FELbl #1 { - \tag_if_loaded:TF - { - % target should perhaps be raised ... - \IfPackageLoadedTF{hyperref}{ \hypertarget{fn.\the\c@absfootnote}{} }{} - %\tag_struct_begin:n { tag=FENote,label=fn.\the\c@absfootnote } %alternativ location for structure - \tag_struct_begin:n { tag=Lbl } - \tag_mc_begin:n { tag=Lbl } - #1 - \tag_mc_end: - \tag_struct_end: - } - { #1 } -} +% We need a public command to append values to the Ref keys +% \begin{macro}{\@@_gput_ref:nn,\fnote_gput_refs:nn,\fnote_gput_refs:ee} +% \begin{macrocode} +\cs_new_protected:Npn \@@_gput_ref:nn #1 #2 %#1 the structure number receiving the ref #2 + { + \tag_if_active:T + { + \tag_struct_gput:nne {#1}{ref}{\tag_struct_object_ref:e { #2 }} + } + } +\cs_new_protected:Npn \fnote_gput_refs:nn #1 #2 % pair of numbers + { + \@@_gput_ref:nn {#1}{#2} + \@@_gput_ref:nn {#2}{#1} + } +\cs_generate_variant:Nn \fnote_gput_refs:nn {ee} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\tl_new:N \l_@@_dflt_struct_tl +\tl_set:Nn \l_@@_dflt_struct_tl {1} +% \end{macrocode} +% kernel hook for tagging (2 args) +% this sets the structure around the whole text +% +% \begin{macrocode} +\cs_new_protected:Npn \tag@FENote #1#2 % #1 config point, \insert\footins #2 content + { + \tag_mc_end_push: +% \end{macrocode} +% test if a footnote is allowed, if not move up to the document structure. +% \begin{macrocode} + \tag_check_child:nnTF {FENote}{pdf2} + { + \tag_struct_begin:n { tag=footnote } + } + { + \tag_struct_begin:n { tag=footnote,parent=\l_@@_dflt_struct_tl } + } +% \end{macrocode} +% Store the current structure number for labels. +% \begin{macrocode} + \tl_set:Nx \l_@@_currentstruct_tl { \tag_get:n{struct_num} } +% \end{macrocode} +% We want to move the label structure here. So we provide a container +% It number is |\l__fnote_currentstruct_tl| plus 1. +% \begin{macrocode} + \tag_struct_begin:n { tag=footnotelabel }\tag_struct_end: +% \end{macrocode} +% after we have opened the structure we can use the structure number to +% try to detect the connected marks. As with the marks we assume that sometimes +% no auto detection is done. +% \begin{macrocode} + \bool_if:NTF \l_@@_autodetect_bool + { +% \end{macrocode} +% find open marks with identical \cs{@thefnmark} +% \begin{macrocode} + \fnote_mark_gpop: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: +% \begin{macrocode} + \seq_map_inline:Nn \l_@@_currentrefs_seq + { + \fnote_gput_refs:ee {##1}{ \l_@@_currentstruct_tl } + } + } +% \end{macrocode} +% If no auto detection is done +% \begin{NOTE}{UF} +% TODO: decide what to do here: some label in the optional argument? +% or refer to \cs{footref} +% \end{NOTE} +% \begin{macrocode} + {%no auto -\cs_new_protected:Npn \tag@FENote #1 { - \tag_if_loaded:TF - { - \tag_mc_begin:n{tag=FENote} - #1 + } +% \end{macrocode} +% This finish the setup of the tagging structure. +% 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} + \tag_struct_end: + \tag_mc_begin_pop:n{} + } +% \end{macrocode} +% At last set the kernel command to this one +% \begin{macrocode} +\cs_set_eq:NN \@kernel@process@footnotetext \tag@FENote +% \end{macrocode} +% +% \cs{@makefntext@cfgpoint} is the configuration point responsible for +% typesetting 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. +% If yes, what about the paragraph start and the paratagging?? +% +% \begin{macrocode} +\cs_set_protected:Npn \@makefntext@cfgpoint #1 %#1 code that typesets the mark. + { + \noindent + \tag_mc_end_push: + \tag@FENoteLbl { #1 } + \tag_mc_begin_pop:n{} + } +% \end{macrocode} +% \cs{tag@FENoteLbl} creates the label in the note on the bottom. +% It also adds link targets for the hyperlinking. +% +% \begin{macro}{\tag@FENoteLbl} +% \begin{macrocode} +\cs_new_protected:Npn \tag@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. +% \begin{NOTE}{UF} +% 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 } + \tag_mc_begin:n { tag=Lbl } + #1 \tag_mc_end: - %\tag_struct_end: %alternative location for structure end but ends inside a P - } - { #1 } -} - + \tag_struct_end: + } +% \end{macrocode} +% \end{macro} +% +% +% \cs{@makefntext@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@cfgpointii #1 + { + \tag_mc_end_push: + \tag@FENotetext { #1 } + \tag_mc_begin_pop:n{} + } +% \end{macrocode} +% \begin{macro}{\tag@FENotetext} +% +% This command currently 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@FENotetext #1 + { + \tag_mc_begin:n{} + #1 + \tag_mc_end: + } +% \end{macrocode} +% \end{macro} %------------------------------------- - +% \begin{macrocode} \ExplSyntaxOff %</kernel> % \end{macrocode} -% +% \begin{macrocode} +%<@@=> +% \end{macrocode} % % \section{Reimplementing the \pkg{footmisc} package} % @@ -1571,7 +2296,10 @@ \ifFN@multiplefootnote \providecommand*{\multiplefootnotemarker}{3sp} - \providecommand*{\multfootsep}{,} +% we tag the separator as artifact + \ExplSyntaxOn + \providecommand*{\multfootsep}{\tag_mc_end_push:\tag_mc_begin:n{artifact},\tag_mc_end:\tag_mc_begin_pop:n{}} + \ExplSyntaxOff \AddToHook{fnmark} {\FN@mf@check} \AddToHook{fnmark/end} {\FN@mf@prepare} % diff --git a/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf b/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf Binary files differindex 45ac1cce92..de5dbb1e21 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx new file mode 100644 index 0000000000..14d8e94362 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx @@ -0,0 +1,102 @@ +% \iffalse meta-comment +% +%% File: latex-lab-mathpkg.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. +% +%<*driver> +\documentclass{l3doc} +\EnableCrossrefs +\CodelineIndex +\begin{document} + \DocInput{latex-lab-mathpkg.dtx} +\end{document} +%</driver> +% +% \fi +% +% +% \title{The \texttt{latex-lab-mathpkg} code\thanks{}} +% \author{\LaTeX{} Project} +% +% \maketitle +% +% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}} +% \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}} +% +% \begin{abstract} +% \end{abstract} +% +% \tableofcontents +% +% \section{Introduction} +% +% This file implements adaptions to various math packages needed for +% the tagging project. +% +% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex } +% +% \section{The Implementation} +% +% \begin{macrocode} +%<@@=math> +% \end{macrocode} +% +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \subsection{File declaration} +% \begin{macrocode} +\ProvidesFile{latex-lab-mathpkg.ltx} + [2023-01-05 v0.1a mathpkg adaptions] +% \end{macrocode} +% \subsection{Tagpdf support} +% To make the code independent from tagging being loaded and active +% we load the \pkg{tagpdf-base} package: +% +% \begin{macrocode} +\RequirePackage{tagpdf-base} +% \end{macrocode} +% +% +% \begin{macrocode} +\AddToHook{package/breqn/after}{ + \RegisterMathEnvironment{dmath} + \RegisterMathEnvironment{dgroup*} + \AddToHook{env/dmath/begin}{\tagpdfparaOff} + \AddToHook{env/dgroup*/begin}{\tagpdfparaOff} +} +% \end{macrocode} +% +% Force loading of \pkg{amsmath} before \pkg{cases}. +% \begin{macrocode} +\AddToHook {package/cases/before}{\RequirePackage{amsmath}} +\AddToHook{package/cases/after}{ + \RegisterMathEnvironment{subnumcases} +} +% \end{macrocode} +% +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% \subsection{Wrapper files for testphase key} +% \Finale +% diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf Binary files differnew file mode 100644 index 0000000000..219b39d6cb --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathtagging.dtx b/macros/latex-dev/required/latex-lab/latex-lab-mathtagging.dtx new file mode 100644 index 0000000000..61818bde15 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtagging.dtx @@ -0,0 +1,1277 @@ +% \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@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@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@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@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@math@begin + #1 $ + \@kernel@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@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@close@P + \@kernel@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@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@math@registered@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@math@registered@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@math@registered@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@math@registered@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@math@registered@end }} + \exp_not:n { \@kernel@math@registered@end } + } + } + + +% FMi: compare with block change! +% +% \DeclareRobustCommand*\begin[1]{% +% \UseHook{env/#1/before}% +% \@ifundefined{#1}% +% {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}% +% {\def\reserved@a{\def\@currenvir{#1}% +% \edef\@currenvline{\on@line}% +% \@execute@begin@hook{#1}% +% \csname #1\endcsname}}% +% \@ignorefalse +% \begingroup +% \@endpefalse % tmp!!! is it ok to drop this here? +% \reserved@a} + + +\cs_new:Npn \@kernel@math@registered@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@close@P +% \tagmcend % needs correction! + } + \@kernel@math@begin + \tagpdfparaOff +% \typeout{==>MC1}\ShowTagging{mc-current} +} + +\cs_new:Npn \@kernel@math@registered@end { +% \typeout{==>MC2}\ShowTagging{mc-current} + \para_raw_end: + \tagpdfparaOn + \@kernel@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@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@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@math@begin { +% \typeout{==>~math~begin} +% needs different handling if we support nesting + \tl_gset:Nx\tmpmathcontent + {\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} + } + \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@math@end { +% \typeout{==>~math~end} +% \ShowTagging{struct-stack} + \tagmcend + \if@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@th:, \m@th} +% Handle non-math use of math mode. At present nesting isn't supported as +% \cs{m@th} pops up in a few places that \emph{are} math mode! +% \begin{macrocode} +\cs_new_eq:NN \@@_m@th: \m@th +\cs_gset_protected:Npn \m@th + { + \bool_set_true:N \l_@@_collected_bool + \@@_m@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@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@tag}. +% \begin{macrocode} + + + +\tl_gput_right:Nn \@kernel@before@begindocument { +% +\renewenvironment{gather*}{% + \start@gather\st@rredtrue +} +{% +% this redirection doesn't work if we alter "gather"! + % \endgather +% so replace it with its real meaning + \math@cr \black@\totwidth@ \egroup + $$\ignorespacesafterend +} +% \end{macrocode} +% +% \begin{macrocode} +\def\common@align@ending { + \math@cr \black@\totwidth@ + \egroup + \ifingather@ + \restorealignstate@ + \egroup + \nonumber + \ifnum0=`{\fi\iffalse}\fi + \else + $$% + \fi + \ignorespacesafterend +} +\renewenvironment{alignat}{% + \start@align\z@\st@rredfalse +}{% + \common@align@ending +} +\renewenvironment{alignat*}{% + \start@align\z@\st@rredtrue +}{% + \common@align@ending +} +\renewenvironment{xalignat}{% + \start@align\@ne\st@rredfalse +}{% + \common@align@ending +} +\renewenvironment{xalignat*}{% + \start@align\@ne\st@rredtrue +}{% + \common@align@ending +} +\renewenvironment{xxalignat}{% + \start@align\tw@\st@rredtrue +}{% + \common@align@ending +} +\renewenvironment{align}{% + \start@align\@ne\st@rredfalse\m@ne +}{% + \common@align@ending +} +\renewenvironment{align*}{% + \start@align\@ne\st@rredtrue\m@ne +}{% + \common@align@ending +} +\renewenvironment{flalign}{% + \start@align\tw@\st@rredfalse\m@ne +}{% + \common@align@ending +} +\renewenvironment{flalign*}{% + \start@align\tw@\st@rredtrue\m@ne +}{% + \common@align@ending +} +% +\renewenvironment{multline*}{\start@multline\st@rredtrue} +{% + \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi + \ignorespacesafterend +} +% \end{macrocode} +% Also for "false?" +% \begin{macrocode} +\def\measuring@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@th\normalfont#1}% + \else + \tagmcend \tagstructbegin{tag=Lbl}% + \tagmcbegin{tag=Lbl}% + \hbox{\m@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@cr @ @ @ gather}{% + \ifst@rred\nonumber\fi + &\relax + \make@display@tag +% + \maybestartnewformulatag +% + \ifst@rred\else\global\@eqnswtrue\fi + \global\advance\row@\@ne + \cr +} +% \end{macrocode} +% +% \begin{macrocode} +\@namedef{math@cr @ @ @ align}{% + \ifst@rred\nonumber\fi + \if@eqnsw \global\tag@true \fi + \global\advance\row@\@ne + \add@amps\maxfields@ + \omit + \kern-\alignsep@ + \iftag@ + \setboxz@h{\@lign\strut@{\make@display@tag}}% + \place@tag + \fi +% + \maybestartnewformulatag +% + \ifst@rred\else\global\@eqnswtrue\fi + \global\lineht@\z@ + \cr +} +% \end{macrocode} +% +% \begin{macrocode} +\def\restore@math@cr{\@namedef{math@cr @ @ @}{ +% + \maybestartnewformulatag +% + \cr}} +\restore@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@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@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 +% +% + diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathtagging.pdf b/macros/latex-dev/required/latex-lab/latex-lab-mathtagging.pdf Binary files differnew file mode 100644 index 0000000000..270cf6d721 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtagging.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx new file mode 100644 index 0000000000..c3f43243b1 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx @@ -0,0 +1,223 @@ +% \iffalse meta-comment +% +%% File: latex-lab-mathtools.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. +% +%<*driver> +\documentclass{l3doc} +\EnableCrossrefs +\CodelineIndex +\begin{document} + \DocInput{latex-lab-amsmath.dtx} +\end{document} +%</driver> +% +% \fi +% +% +% \title{The \texttt{latex-lab-mathtools} code\thanks{}} +% \author{\LaTeX{} Project} +% +% \maketitle +% +% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}} +% \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}} +% +% \begin{abstract} +% \end{abstract} +% +% \tableofcontents +% +% \section{Introduction} +% +% This file implements adaptions to the \pkg{mathtools} package needed for +% the tagging project. +% +% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex } +% +% \section{The Implementation} +% +% \begin{macrocode} +%<@@=math> +% \end{macrocode} +% +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \subsection{File declaration} +% \begin{macrocode} +\ProvidesFile{latex-lab-mathtools.ltx} + [2023-01-05 v0.1a mathtools adaptions] +% \end{macrocode} +% \subsection{Tagpdf support} +% To make the code independent from tagging being loaded and active +% we load the \pkg{tagpdf-base} package: +% +% \begin{macrocode} +\RequirePackage{tagpdf-base} +% \end{macrocode} +% +% \subsection{\cs{shortintertext}} +% Similar to the \cs{intertext} command from amsmath, +% \cs{shortintertext} errors with active tagging as it is processed twice +% which leads to duplicated structures. +% The fix is similar but is complicated as \pkg{mathtools} defines two version (and +% an additional \cs{intertext} version) and package options to switch between the variants. +% +% At first we redefine all the internal commands +% \begin{macrocode} +\ExplSyntaxOn +\tl_new:N\l_@@_mathtools_init_tl +\AddToHook{package/mathtools/after} + {% + \cs_if_eq:NNTF\intertext@ \MT_intertext: + { + \tl_set:Nn \l_@@_mathtools_init_tl {\MT_orig_intertext_false:} + } + { + \tl_set:Nn \l_@@_mathtools_init_tl {\MT_orig_intertext_true:} + } + \cs_if_eq:NNTF\shortintertext@ \MT_shortintertext:n + { + \tl_put_right:Nn \l_@@_mathtools_init_tl + {\MT_orig_shortintertext_false:} + } + { + \tl_put_right:Nn \l_@@_mathtools_init_tl + {\MT_orig_shortintertext_true:} + } + \def\MT_intertext: {% + \def\intertext##1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\belowdisplayskip + \vskip-\lineskiplimit % CCS + \vskip\normallineskiplimit % CCS + \vskip\l_MT_above_intertext_sep + \vbox{% +% \end{macrocode} +% Stop tagging when measuring: +% \begin{macrocode} + \ifmeasuring@\tag_stop:\fi + \normalbaselines + \ifdim + \ifdim\@totalleftmargin=\z@ + \linewidth + \else + -\maxdimen + \fi + =\columnwidth + \else \parshape\@ne \@totalleftmargin \linewidth + \fi +% \end{macrocode} +% End the previous mc: +% \begin{macrocode} + \tag_mc_end_push: +% \end{macrocode} +% We are already in a par so we change now to Span: +% \begin{macrocode} + \tagpdfsetup{paratag=Span} + \noindent\ignorespaces##1\par +% \end{macrocode} +% Restart the MC +% \begin{macrocode} + \tag_mc_begin_pop:n{}}% + \penalty\predisplaypenalty\vskip\abovedisplayskip% + \vskip-\lineskiplimit % CCS + \vskip\normallineskiplimit % CCS + \vskip\l_MT_below_intertext_sep + }% + }% + \MH_let:NwN \shortintertext \shortintertext@ + } +% \end{macrocode} +% \begin{macrocode} + \def\MT_orig_shortintertext:n #1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\abovedisplayshortskip + \vbox{% + \ifmeasuring@\tag_stop:\fi + \normalbaselines + \MH_if_dim:w + \MH_if_dim:w \@totalleftmargin=\z@ + \linewidth + \MH_else: + -\maxdimen + \MH_fi: + =\columnwidth + \MH_else: + \parshape\@ne \@totalleftmargin \linewidth + \MH_fi: + \tag_mc_end_push: + \tagpdfsetup{paratag=Span} + \noindent\ignorespaces#1\par + \tag_mc_begin_pop:n{}} + \penalty\predisplaypenalty\vskip\abovedisplayshortskip% + }% + } + + \def\MT_shortintertext:n #1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\abovedisplayshortskip + \vskip-\lineskiplimit + \vskip\normallineskiplimit + \vskip\l_MT_above_shortintertext_sep + \vbox{% + \ifmeasuring@\tag_stop:\fi + \normalbaselines + \MH_if_dim:w + \MH_if_dim:w \@totalleftmargin=\z@ + \linewidth + \MH_else: + -\maxdimen + \MH_fi: + =\columnwidth + \MH_else: + \parshape\@ne \@totalleftmargin \linewidth + \MH_fi: + \tag_mc_end_push: + \tagpdfsetup{paratag=Span} + \noindent\ignorespaces#1\par + \tag_mc_begin_pop:n{}}% + \penalty\predisplaypenalty\vskip\abovedisplayshortskip% + \vskip-\lineskiplimit + \vskip\normallineskiplimit + \vskip\l_MT_below_shortintertext_sep + }% + } + +% \end{macrocode} +% end hook +% \begin{macrocode} + \l_@@_mathtools_init_tl +} +\ExplSyntaxOff +% \end{macrocode} +% +% \begin{macrocode} +%</kernel> +% \end{macrocode} +% +% \Finale +% diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf Binary files differnew file mode 100644 index 0000000000..1272745dd9 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx new file mode 100644 index 0000000000..b3e763ffdd --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx @@ -0,0 +1,159 @@ +% \iffalse meta-comment +% +%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2022 Frank Mittelbach +% +% 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} + +\EnableCrossrefs +\CodelineIndex +\begin{document} + \DocInput{latex-lab-new-or-1.dtx} +\end{document} +%</driver> +% +% \fi +% +% \providecommand\hook[1]{\texttt{#1}} +% +% +% +% \title{Temporary output patches for tagging and better link support} +% \author{Frank Mittelbach \and Ulrike Fischer} +% +% \maketitle +% +% \section{Introduction} +% +% This file contains a few patches of internal \LaTeX{} commands +% to support paragraph tagging across +% page boundaries (in \pdfTeX) and improve the behaviour of links across page breaks. +% +% Until this get properly integrated with the kernel code this has +% to be taken as a prototype and code, interfaces as well as +% behavior may change without notice and certainly without any +% backwards compatibility! +% +% +% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex } +% +% +% \section{The Implementation} +% \begin{macrocode} +%<*code> +% \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] +\RequirePackage{etoolbox} +% \end{macrocode} +% +% +% \subsection{Patching the OR} +% This adds hooks around header and footer, in \cs{@makecol} and in multicol. +% At first initialize some of the hooks. We use providecommand to avoid problems if +% the kernel changes here and provides them directly. +% \begin{macrocode} +\providecommand\@kernel@before@head{} +\providecommand\@kernel@before@foot{} +\providecommand\@kernel@after@head{} +\providecommand\@kernel@after@foot{} +\providecommand\@mult@ptagging@hook{}% multicol +% \end{macrocode} +% +% \begin{macrocode} + +\patchcmd\@outputpage + {\vfil\color@hbox\normalcolor\hb@xt@\textwidth{\@thehead}\color@endbox} + {\vfil\@kernel@before@head\color@hbox\normalcolor\hb@xt@\textwidth{\@thehead}\color@endbox\@kernel@after@head} + {\typeout{Patching header in \string\@outputpage}}{\PATCHerror } + + +\patchcmd\@outputpage + {\color@hbox\normalcolor\hb@xt@\textwidth{\@thefoot}\color@endbox} + {\@kernel@before@foot\color@hbox\normalcolor\hb@xt@\textwidth{\@thefoot}\color@endbox\@kernel@after@foot} + {\typeout{Patching footer in \string\@outputpage}}{\PATCHerror } +% \end{macrocode} +% +% \begin{macro}{\@makecol} +% We have to patch \cs{@makecol} in two places: +% \begin{itemize} +% \item +% update 255 up front to add missing tmb/tme if necessary +% \item +% update the \cs{footins} stream if that one got split +% \end{itemize} +% +% We patch \cs{@makecol}, if new-or-2 is loaded too it will overwrite that again. +% \begin{macrocode} + \providecommand\@kernel@before@footins{} + \providecommand\@kernel@before@cclv{} + + \patchcmd\@makecol + {\vskip\skip\footins} + {\vskip\skip\footins\@kernel@before@footins} + {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror } + +%for some reason patching with etoolbox only works in this order ... + + \pretocmd\@makecol{\@kernel@before@cclv} + {\typeout{Patching \string\@makecol\space for tagging}}{\PATCHerror } +% \end{macrocode} +% \end{macro} +% +% \subsection{\pkg{multicol} adjustments} +% +% The patches for pkg{multicol} are fairly minimal: +% \begin{itemize} +% \item At the start of the environment anything already on the +% page is picked up and stored in \cs{partial@page}, we may need to add +% a TMB to that (it should have a proper TME). This has to happen +% in the \enquote{main} stream context. +% \item +% \item +% \end{itemize} +% +% \begin{macrocode} +\AddToHook{package/multicol/after} + {% multicol needs later loading +% \end{macrocode} +% +% \begin{macrocode} + \patchcmd\page@sofar + {\setbox\z@\hbox{p}\global\dimen\tw@\dp\z@}% + {% + \setbox\z@\hbox{p}\global\dimen\tw@\dp\z@ + \@mult@ptagging@hook + }% + {\typeout{Patching \string\page@sofar\space for tagging}}{\PATCHerror}% +} +% \end{macrocode} +% +% \subsection{Interrupt hooks} +% This requires the l3pdfannot module! +% We add the code here and not in hyperref, as it should also work with links +% created directly with the l3pdfannot commands. The file is only +% loaded by the pdfmanagement, so no need to test if the commands exist. +% \begin{macrocode} +\ExplSyntaxOn +\def\@kernel@before@head{\pdfannot_link_off:} +\def\@kernel@before@foot{\pdfannot_link_off:} +\def\@kernel@after@head {\pdfannot_link_on:} +\def\@kernel@after@foot {\pdfannot_link_on:} +\ExplSyntaxOff +% \end{macrocode} +% +% \begin{macrocode} +%</code> +% \end{macrocode} +% +% \Finale +% diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf Binary files differnew file mode 100644 index 0000000000..e9f69f428b --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or.dtx b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx index 08b58a7286..74d56d687f 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-new-or.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-new-or.dtx +%% File: latex-lab-new-or-2.dtx % Copyright (C) 2022 The LaTeX Project % % It may be distributed and/or modified under the conditions of the @@ -22,14 +22,14 @@ \EnableCrossrefs \CodelineIndex \begin{document} - \DocInput{latex-lab-new-or.dtx} + \DocInput{latex-lab-new-or-2.dtx} \end{document} %</driver> % % \fi % % -% \title{The \texttt{latex-lab-new-or} code\thanks{}} +% \title{The \texttt{latex-lab-testphase-new-or-2} code\thanks{}} % \author{Frank Mittelbach, \LaTeX{} Project} % % \maketitle @@ -128,8 +128,8 @@ % % \subsection{File declaration} % \begin{macrocode} -\ProvidesFile{latex-lab-new-or.ltx} - [2022-03-09 v0.1b changes to the output routine] +\ProvidesPackage{latex-lab-testphase-new-or-2} + [2022-11-04 v0.1c changes to the output routine] % \end{macrocode} % \subsection{\cs{@makecol} reimplementation} % diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or.pdf b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf Binary files differindex d12adaf15c..449f43110a 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-new-or.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.dtx b/macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.dtx new file mode 100644 index 0000000000..dc90c76e99 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.dtx @@ -0,0 +1,810 @@ +% \iffalse meta-comment +% +%% File: sec-tagging.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-sec-tagging.dtx} +\end{document} +%</driver> +% +% \fi +% +% +% \title{The \textsf{sec-tagging} package\\ +% Changes related to the tagging of sectioning commands} +% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}} +% \date{v0.81 2023-02-12} +% +% \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} +% 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 +% 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 +% 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. +% So in an article \cs{section} will use \texttt{H1}, in a book \cs{chapter} will use +% \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 +% 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 +% 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 +% 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 +% 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 +% \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 +% a minipage then it can no longer close previous \texttt{<Sect>} structures correctly. +% 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. +% +% 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. +% +% \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 +% commands must be at the right grouping level. +% \end{itemize} +% +% \subsection{Funktions 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 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 dependant) +% commands too. +% +% \end{itemize} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \section{Implementation} +% \begin{macrocode} +\ProvidesExplPackage {latex-lab-testphase-sec-tagging} {2022-10-25} {0.8} + {Code related to the tagging of sectioning commands} +% \end{macrocode} +% +% \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. +% +% \subsubsection{Loading general kernel changes} +% [kernel?] +% Also loaded in the toc-tagging code. +% \begin{macrocode} +\RequirePackage{latex-lab-kernel-changes} +% \end{macrocode} +% \begin{macrocode} +%</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 + \pdfvariable gentounicode =1 + \protected\def\pdfglyphtounicode {\pdfextension glyphtounicode } + \input{glyphtounicode} +\fi + \input{glyphtounicode-cmex} +%</kernelchange> +% \end{macrocode} +% +% \subsubsection{updating \cs{@currentHref}} +% [kernel?] +% +% 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} +% +% \begin{macrocode} +%<*kernelchange> +\ExplSyntaxOn +\int_new:N\g__kernel_target_int +\RenewDocumentCommand\MakeLinkTarget{sO{}m} + {% + \ifvmode + \special{}% + \else + \@savsf\spacefactor + \smash{}% + \spacefactor\@savsf + \fi + \int_gincr:N\g__kernel_target_int + \tl_gset:Nx \@currentHref {target*.\int_use:N\g__kernel_target_int} + } +\ExplSyntaxOff +%</kernelchange> +% \end{macrocode} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% \subsubsection{Tagging commands} +% +% +% \begin{variable}{\g__tag_sec_stack_seq} +% The stack holds the tag and the level. +% \begin{macrocode} +\seq_new:N \g__tag_sec_stack_seq +\seq_gpush:Nn\g__tag_sec_stack_seq {{Document}{-100}} +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l__tag_sec_Sect_bool} +% This boolean controls if a Sect structure is opened. +% \begin{macrocode} +\bool_new:N \l__tag_sec_Sect_bool +\bool_set_true:N\l__tag_sec_Sect_bool +% \end{macrocode} +% \end{variable} + +% +% \begin{macro}{\__tag_sec_begin:nn} +% 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\__tag_sec_begin:nn #1 #2 %#1 level #2 keyval + { + \tag_struct_begin:n + { + tag= {\int_compare:nNnTF {#1}={-1}{Part}{Sect}} + ,#2 + } + \seq_gpush:Nx \g__tag_sec_stack_seq {{\g__tag_struct_tag_tl}{#1}} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\__tag_sec_end:n} +% \begin{macrocode} +\msg_new:nnn { tag } {wrong-sect-nesting} + { + The~structure~#1~can~not~be~closed.\\ + It~is~not~equal~to~the~current~structure~#2~on~the~main~stack + } + +\cs_new_protected:Npn\__tag_sec_end:n #1 % #1 level + { + \seq_get:NN \g__tag_sec_stack_seq \l__tag_tmpa_tl + \int_compare:nNnT {#1}<{\exp_last_unbraced:NV\use_ii:nn\l__tag_tmpa_tl+1} + { + \seq_get:NN\g__tag_struct_tag_stack_seq \l__tag_tmpb_tl + \exp_args:Nee + \tl_if_eq:nnTF + {\exp_last_unbraced:NV\use_i:nn\l__tag_tmpa_tl} + {\exp_last_unbraced:NV\use_i:nn\l__tag_tmpb_tl} + { + \seq_gpop:NN \g__tag_sec_stack_seq \l__tag_tmpa_tl + \tag_struct_end: + \__tag_sec_end:n {#1} + } + { + \msg_warning:nnxx {tag}{wrong-sect-nesting} + { \exp_last_unbraced:NV\use_i:nn \l__tag_tmpa_tl } + { \exp_last_unbraced:NV\use_i:nn \l__tag_tmpb_tl } + } + } + } +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\__tag_tool_para_split:} +% Runin-sectioning command must separate the heading from the following text. +% +% \begin{macrocode} +\cs_new_protected:Npn \__tag_tool_para_split: + { + \tag_mc_end: + \tag_struct_end: + \tag_struct_begin:n{tag=\l__tag_para_tag_default_tl} + \tag_mc_begin:n{} + \__tag_setup_restore_para_default: + } +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\__tag_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. +% \begin{macrocode} +\cs_new_protected:Npn \__tag_setup_restore_para_default: + { + \tl_set:Nn \l__tag_para_main_tag_tl {text-unit} + \tl_set_eq:NN\l__tag_para_tag_tl\l__tag_para_tag_default_tl + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\__tag_sec_end_display:} +% \begin{macrocode} +\cs_new_protected:Npn \__tag_sec_end_display: + { + \tag_struct_end: %P = Hn + \__tag_setup_restore_para_default: + } +% \end{macrocode} +% \end{macro} +% +% Open sec structures should be closed at the end of the document. This should +% be done before tagpdf closes the Document structure. +% \begin{macrocode} +\hook_gput_code:nnn{tagpdf/finish/before}{tagpdf/sec}{\__tag_sec_end:n{-10}} +\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. +% \begin{macrocode} +\AddToHook{cmd/frontmatter/before}{\__tag_sec_end:n{-10}} +\AddToHook{cmd/mainmatter/before} {\__tag_sec_end:n{-10}} +\AddToHook{cmd/backmatter/before} {\__tag_sec_end:n{-10}} +\AddToHook{cmd/appendix/before} {\__tag_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 + { + \cs_new_protected:Npn \tag_tool:n #1 + { + \tag_if_active:T { \keys_set:nn {tag / tool}{#1} } + } + \cs_set_eq:NN\tagtool\tag_tool:n + } +\keys_define:nn { tag / tool} + { + ,sec-start-part .code:n = + { + \bool_if:NT\l__tag_sec_Sect_bool + { + \__tag_sec_end:n {-1} + \__tag_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 completly 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 +% to the time when sectioning commands are redefined with templates. +% \begin{macrocode} + \tl_set:Nn\l__tag_para_main_tag_tl {NonStruct} + \tl_set:Nn\l__tag_para_tag_tl {Span} + } + ,sec-stop-part .code:n = {\__tag_sec_end_display:} + ,sec-start-chapter .code:n = + { + \bool_if:NT\l__tag_sec_Sect_bool + { + \__tag_sec_end:n {0} + \__tag_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 ... +% \begin{macrocode} + \tl_set:Nn\l__tag_para_main_tag_tl {NonStruct} + \tl_set:Nn\l__tag_para_tag_tl {Span} + } + ,sec-stop-chapter .meta:n = { sec-stop-part} + ,sec-start .code:n = % #1 is a name like "section" + { + \bool_if:NT\l__tag_sec_Sect_bool + { + \__tag_sec_end:n {\use:c{toclevel@#1}+0} + \__tag_sec_begin:nn {\use:c{toclevel@#1}+0}{tag=Sect} + } + \tl_set:Nn\l__tag_para_tag_tl{#1} + } + ,sec-start .value_required:n = true + ,sec-split-para .code:n = {\__tag_tool_para_split:} + ,restore-para .code:n = {\__tag_setup_restore_para_default:} + ,sec-stop .code:n = + { + \par\__tag_sec_end:n {\use:c{toclevel@#1}+0} + } + ,sec-stop .value_required:n = true + ,sec-add-grouping .bool_set:N = \l__tag_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. +% 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 +% and the naming of the keys and their key family is unclear. +% \begin{macrocode} +\AddToHook{class/after} + { + \@ifundefined{chapter} + { +% \end{macrocode} +% This redefines \cs{part} in article class. +% \begin{macrocode} + \RenewDocumentCommand\part{ s O{#3} m } + { + \if@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} + % 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@secnumdepth}<{-1} + } + } + { + \MakeLinkTarget[part]{} + } +% \end{macrocode} +% 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} + } + } +% \end{macrocode} +% Redefinitions for book and report +% \begin{macrocode} + { + \RenewDocumentCommand\chapter{ s O{#3} m } + { + \if@openright\cleardoublepage\else\clearpage\fi + \thispagestyle{plain}% + \global\@topnum\z@ + \@afterindentfalse +% \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 } +% \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 + { + { #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 } } + { ! \legacy_if_p:n { @mainmatter } } + } + } + { + \MakeLinkTarget[chapter]{} + %todo public function for this update! + \tl_if_blank:VF \@currentHref + { + \prop_gput:Nxx \g__tag_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} + } + } +% \end{macrocode} +% 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} + } +% \end{macrocode} +% and similar for \cs{part} +% \begin{macrocode} + \RenewDocumentCommand\part{ s O{#3} m } + { + \if@openright + \cleardoublepage + \else + \clearpage + \fi + \thispagestyle{plain}% + \if@twocolumn + \onecolumn + \@tempswatrue + \else + \@tempswafalse + \fi + \null\vfil +% \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} +% \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@secnumdepth}<{-1} + } + { + %in book target also needed in frontmatter + \bool_lazy_and_p:nn + { \cs_if_exist_p:c { @mainmattertrue } } + { ! \legacy_if_p:n { @mainmatter } } + } + } + { + \MakeLinkTarget[part]{} + \tl_if_blank:VF \@currentHref + { + \prop_gput:Nxx \g__tag_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} + } + } +% \end{macrocode} +% 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} + } + } + } +% \end{macrocode} +% +% \subsection{Sectioning commands based on \cs{@startsection}} +% +% The tagging of 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 +% 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. +% +% This means that the target of numbered and unnumbered sectioning commands +% 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. +% +% 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{} +% \end{macrocode} +% +% \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}. +% \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} + } + \tl_if_blank:VF \@currentHref + { + \prop_gput:Nxx \g__tag_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} + } + } +% \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. +% +% \begin{macrocode} +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \tag_tool:n { sec-start=#1}%new + \@ifstar + {\@ssect{#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 +% \cs{@hangfrom} variant. This is a bit tricky: +% 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! +% \begin{macrocode} +\cs_new_protected:Npn \@kernel@tag@hangfrom #1 + { + \tagstructbegin{tag=\l__tag_para_tag_tl} + \tagstructbegin{tag=Lbl} + \setbox\@tempboxa + \hbox + { +% \end{macrocode} +% In lua mode we have to set the attributes inside the box! +% \begin{macrocode} + \bool_lazy_and:nnT + {\tag_if_active_p:} + {\g__tag_mode_lua_bool} + {\tagmcbegin{tag=Lbl}} + {#1} + } +% \end{macrocode} +% We stop tagging now, to avoid that the \cs{noindent} triggers +% the paratagging. We do not disable paratagging completely, to +% avoid that the numbering goes wrong. +% \begin{macrocode} + \tag_stop:n{hangfrom} + \hangindent \wd\@tempboxa\noindent +% \end{macrocode} +% Restart tagging and insert the box. +% \begin{macrocode} + \tag_start:n{hangfrom} + \tagmcbegin{}\box\@tempboxa\tagmcend\tagstructend\tagmcbegin{}} +% \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. +% \begin{macrocode} +\cs_new_protected:Npn \@kernel@tag@svsec + { + \tag_mc_end_push: + \tag_struct_begin:n{tag=Lbl} + \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{% + \ifnum #2>\c@secnumdepth + \def\@svsec{\@hyp@section@target@nnn{[section]}{}{#3}} + \else + \LinkTargetOff + \refstepcounter{#1}% + \LinkTargetOn + \protected@edef\@svsec{\@hyp@section@target@nnn{}{#1}{#3}\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + \tagtool{para-flattened=true} % or \bool_set_true\l__tag_para_flattened_bool + #6{% + \ifnum #2>\c@secnumdepth + \@hangfrom {\hskip #3\relax\@svsec}% + \else + \@kernel@tag@hangfrom{\hskip #3\relax\@svsec}% + \fi + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \ifnum #2>\c@secnumdepth + \@svsec + \else + \@kernel@tag@svsec + \fi #8}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% \end{macrocode} +% similar for \cs{@ssect} +% \begin{macrocode} +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup + \tagtool{para-flattened=true} + #4{% + \@hangfrom{\hskip #1\relax\@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}}% + \fi + \@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 +% heading from the following text. +% \begin{macrocode} +\def\@xsect#1{% + \@tempskipa #1\relax + \ifdim \@tempskipa>\z@ + \par \nobreak + \vskip \@tempskipa + \tag_tool:n {restore-para} + \@afterheading + \else + \@nobreakfalse + \global\@noskipsectrue + \everypar{% + \if@noskipsec + \global\@noskipsecfalse + {\setbox\z@\lastbox}% + \clubpenalty\@M + \begingroup \@svsechd \endgroup + \unskip + \tag_tool:n {sec-split-para} + \@tempskipa #1\relax + \hskip -\@tempskipa + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi}% + \fi + \ignorespaces} +%</package> +% \end{macrocode} + +% \begin{macrocode} +%<*latex-lab> +\ProvidesFile{sec-tagging-latex-lab-testphase.ltx} + [2023-02-12 v0.81 code related to the tagging of sectioning commands] +\RequirePackage{latex-lab-testphase-sec-tagging} +%</latex-lab> +% \end{macrocode} diff --git a/macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.pdf b/macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.pdf Binary files differnew file mode 100644 index 0000000000..09e73151bc --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx b/macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx index d8d9c671c3..217605d189 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: latex-lab-testphase.dtx -% Copyright (C) 2021-2022 The LaTeX Project +% Copyright (C) 2021-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 @@ -51,14 +51,60 @@ % % % \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] +%</new-or> +% \end{macrocode} +% \begin{macrocode} +%<*phase-I> +\ProvidesFile{phase-I-latex-lab-testphase.ltx} + [2023-02-04 v0.1b latex-lab wrapper phase-I] +%</phase-I> +% \end{macrocode} +% \begin{macrocode} +%<*phase-II> +\ProvidesFile{phase-II-latex-lab-testphase.ltx} + [2022-11-04 v0.1a 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] +\input{phase-II-latex-lab-testphase.ltx} +\RequirePackage{latex-lab-testphase-block-tagging} +\RequirePackage{latex-lab-testphase-sec-tagging} +\RequirePackage{latex-lab-testphase-toc-tagging} +%</phase-III> +% \end{macrocode} +% +% this is only provided for compatibility +% \begin{macrocode} +%<*tagpdf> +\ProvidesFile{tagpdf-latex-lab-testphase.ltx} + [2022-11-04 v0.1a latex-lab wrapper tagpdf (deprecated)] +%</tagpdf> +% \end{macrocode} +% \begin{macrocode} +%<*tagpdf|phase-I|phase-II|new-or|new-or-1> +\RequirePackage{latex-lab-testphase-new-or-1} +%</tagpdf|phase-I|phase-II|new-or|new-or-1> +% \end{macrocode} % New output routine code is loaded in phase-II and new-or: % \begin{macrocode} %<*tagpdf|phase-II|new-or> -\IfFileExists{latex-lab-testphase-new-or.sty} - { - \RequirePackage{latex-lab-testphase-new-or} - } - {} +\RequirePackage{latex-lab-testphase-new-or-2} %</tagpdf|phase-II|new-or> % \end{macrocode} % \begin{macrocode} @@ -70,15 +116,33 @@ \AddToDocumentProperties [document]{testphase/tagpdf}{loaded} %</tagpdf|phase-I|phase-II> %<tagpdf|phase-II>\tagpdfsetup{activate,paratagging,interwordspace} +%<tagpdf|phase-II>\AddToDocumentProperties [document]{tagging/para}{active} %<phase-I>\tagpdfsetup{activate,interwordspace} %<*tagpdf|phase-I|phase-II> \AddToDocumentProperties [document]{tagging}{active} -\AddToDocumentProperties [document]{tagging/para}{active} \AddToDocumentProperties [document]{tagging/interwordspace}{active} % \end{macrocode} % % \begin{macrocode} %</tagpdf|phase-I|phase-II> % \end{macrocode} +% Wrapper files for math tagging: +% \begin{macrocode} +%<*math-lab> +\ProvidesFile{math-latex-lab-testphase.ltx} + [2023-01-07 v0.8 code related to the math tagging] +\RequirePackage{latex-lab-testphase-math} +%</math-lab> +% \end{macrocode} +% \begin{macrocode} +%<*math-sty> +\ProvidesPackage{latex-lab-testphase-math} + [2023-01-07 v0.8 code related to the math tagging] +\input{latex-lab-mathtagging.ltx} +\input{latex-lab-amsmath.ltx} +\input{latex-lab-mathtools.ltx} +\input{latex-lab-mathpkg.ltx} +%</math-sty> +% \end{macrocode} % \Finale % diff --git a/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf b/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf Binary files differindex 88a563d2c9..a525ce9013 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx new file mode 100644 index 0000000000..ea39e3a6a5 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx @@ -0,0 +1,203 @@ +% \iffalse meta-comment +% +%% File: toc-hyperref-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 +% 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-hyperref-changes.dtx} +\end{document} +%</driver> +% +% \fi +% \title{The \textsf{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.81 2023-02-10} +% +% \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} +% +% \section{Introduction} +% +% The followings contains various change needed for hyperref for the new toc tagging +% code. They should be only loaded if hyperref is used! +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \section{Changes for hyperref} +% \subsection{\cs{contentsline},\cs{addcontentsline}} +% The standard \cs{contentsline} and \cs{addcontentsline} +% should also be used with hyperref (together +% with more changes below) so we have to disable the redefinition in hyperref (this +% requires hyperref version 7.00v! +% \begin{macrocode} +\def\hyper@nopatch@toc{} +\AddToHook{package/hyperref/after} + { + \@ifpackagelater{hyperref}{2023-02-07}{} + {\PackageWarning{latex-lab-testphase-toc-tagging}{hyperref too old}{}} + } +% \end{macrocode} +% +% \subsection{Add links to toc entries} +% \begin{macrocode} +\ExplSyntaxOn +\AddToHook{package/hyperref/after} + { + \AddToHook{contentsline/text/before}[hyp] + { + \tl_if_blank:VF \@contentsline@arg@two%text + { + \tl_if_blank:VF\@contentsline@arg@four%destination + { + \int_case:nnF {\Hy@linktoc} + { + {0}{} %none + {1}{\hyper@linkstart{link}{\@contentsline@arg@four}} %section + {2}{} %page + } + {\hyper@linkstart{link}{\@contentsline@arg@four}} %all + } + } + } + \AddToHook{contentsline/text/after}[hyp] + { + \tl_if_blank:VF \@contentsline@arg@two + { + \tl_if_blank:VF\@contentsline@arg@four + { + \int_case:nnF {\Hy@linktoc} + { + {0}{} %none + {1}{\hyper@linkend} %section + {2}{} %page + } + {\hyper@linkend} %all + } % none + } + } + + \AddToHook{contentsline/page/before}[hyp] + { + \tl_if_blank:VF \@contentsline@arg@three + { + \tl_if_blank:VF\@contentsline@arg@two + { + \int_case:nnF {\Hy@linktoc} + { + {0}{} %none + {1}{} %section + {2}{\hyper@linkstart{link}{\@contentsline@arg@four}} %page + } + {\hyper@linkstart{link}{\@contentsline@arg@four}} %all + } % none + } + } + \AddToHook{contentsline/page/after}[hyp] + { + \tl_if_blank:VF \@contentsline@arg@three + { + \tl_if_blank:VF\@contentsline@arg@four + { + \int_case:nnF {\Hy@linktoc} + { + {0}{} %none + {1}{} %section + {2}{\hyper@linkend} %page + } + {\hyper@linkend} %all + } % none + } + } + \AddToHook{cmd/addcontentsline/before}[hyp] + {% + \ExpandArgs{ooo} + \Hy@addcontentsline@addbookmark + {\addcontentsline@arg@one} + {\addcontentsline@arg@two} + {\addcontentsline@arg@three}% + } + } +\ExplSyntaxOff +% \end{macrocode} +% \subsection{Add bookmark code to \cs{addcontentsline}} +% +% \begin{macrocode} +\newcommand\Hy@addcontentsline@addbookmark[3]%#1 toc type, #2 level, #3 content + {% + \ifx\@currentHref\@empty + \Hy@Warning{% + No destination for bookmark of \string\addcontentsline,% + \MessageBreak destination is added% + }% + \phantomsection + \fi + \begingroup + \expandafter\ifx\csname toclevel@#2\endcsname\relax + \begingroup + \def\Hy@tempa{#1}% + \ifx\Hy@tempa\Hy@bookmarkstype + \Hy@WarningNoLine{% + bookmark level for unknown #2 defaults to 0% + }% + \else + \Hy@Info{bookmark level for unknown #2 defaults to 0}% + \fi + \endgroup + \expandafter\gdef\csname toclevel@#2\endcsname{0}% + \fi + \edef\Hy@toclevel{\csname toclevel@#2\endcsname}% + \Hy@writebookmark{\csname the#2\endcsname}% + {#3}% + {\@currentHref}% + {\Hy@toclevel}% + {#1}% + \ifHy@verbose + \begingroup + \def\Hy@tempa{#3}% + \@onelevel@sanitize\Hy@tempa + \let\temp@online\on@line + \let\on@line\@empty + \Hy@Info{% + bookmark\temp@online:\MessageBreak + thecounter {\csname the#2\endcsname}\MessageBreak + text {\Hy@tempa}\MessageBreak + reference {\@currentHref}\MessageBreak + toclevel {\Hy@toclevel}\MessageBreak + type {#1}% + }% + \endgroup + \fi + \endgroup + } +% \end{macrocode} +% \begin{macrocode} +%</package> +% \end{macrocode} diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf Binary files differnew file mode 100644 index 0000000000..444d701cdf --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx new file mode 100644 index 0000000000..7485b2c210 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx @@ -0,0 +1,443 @@ +% \iffalse meta-comment +% +%% File: toc-kernel-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-kernel-changes.dtx} +\end{document} +%</driver> +% +% \fi +% +% \title{The \textsf{toc-kernel-changes} package\\ +% Changes and additions to the kernel related to tagging and links in toc entries} +% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}} +% \date{Version 0.81 2023-02-10} +% +% \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} +% +% \section{Introduction} +% +% The followings contains various changes to kernel commands +% needed for the tagging of table of contents and similar lists. +% \section{General kernel and class changes} +% +% Some of the changes can probably could go into the kernel. +% This are marked with [kernel?], +% the other are marked with [latex-lab]. A few changes must be done in the classes. +% They are marked as [class]. They are inserted with hooks here: this will break +% if a non-standard class is used. +% +% \subsection{Providing the counter representation \cs{theHxx} generally} +% [kernel?] +% +% The \cs{theHxx} representation allows to create a unique representation of a counter +% that is for example used to create destination names. It will also be needed +% to add |/Ref| keys to various tagging structures. It makes therefore sense +% to provide it by default as soon as a counter is created. The |\@addtoreset| change +% (taken also from hyperref) tries to ensure the counter stays unique if it is reset. +% +% At first we suppress the patches from hyperref: +% \begin{macrocode} +%<*kernelchange> +\def\hyper@nopatch@counter{} +% \end{macrocode} +% +% \begin{macrocode} +\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname + \setcounter{#1}\z@ + \global\expandafter\let\csname cl@#1\endcsname\@empty + \@addtoreset{#1}{@ckpt}% + \global\expandafter\let\csname p@#1\endcsname\@empty + \expandafter\gdef\csname theH#1\endcsname{\the\value{#1}}%new + \expandafter + \gdef\csname the#1\expandafter\endcsname\expandafter + {\expandafter\@arabic\csname c@#1\endcsname}} +\def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}% + \expandafter\gdef\csname theH#1\endcsname{\csname theH#2\endcsname.\the\value{#1}}% +} +% \end{macrocode} +% The following counters are defined in the kernel +% \begin{macrocode} +\gdef\theHenumi{\the\value{enumi}} +\gdef\theHenumii{\the\value{enumii}} +\gdef\theHenumiii{\the\value{enumiii}} +\gdef\theHenumiv{\the\value{enumiv}} +\gdef\theHequation{\the\value{equation}} +\gdef\theHfootnote{\the\value{footnote}} +\gdef\theHmpfootnote{\the\value{mpfootnote}} +% \end{macrocode} +% +% \subsection{Providing and updating \cs{@currentHref}} +% [kernel?] +% +% \cs{@currentHref} contains the current unique representation of a counter. +% It is useful also without hyperref as it allows to connect with a |/Ref| +% key a toc entry with the heading it refers too. So \cs{refstepcounter} +% is extended to update the command. This is done at the begin so that the +% hyperref code can still adapt it later (using the cmd/refstepcounter/after hook +% would be too late, and could also break with cleverref.) +% +% We also provide a kernel version that hyperref doesn't touch and so will never +% set a target. +% \begin{macrocode} +\def\@currentHref{} +\def\refstepcounter#1{\stepcounter{#1}% + \edef\@currentcounter{#1}% + \xdef\@currentHref {#1.\csname theH#1\endcsname}% + \protected@edef\@currentlabel + {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}% +} +\let\@kernel@refstepcounter\refstepcounter +% \end{macrocode} +% +% \subsection{Assigning the headings level numbers} +% [kernel?] +% +% The code for the toc must be able to compare the level of |subsection| against +% |section|. So some numbers are needed. It uses for now the commands used by +% |hyperref| for the bookmark levels. While headings are more a class thing, it +% could make sense to provide a standard set already in the kernel. +% The numbers are a bit different to the one in hyperref, but imho sensible. +% +% Note for the future: +% once that heading stuff is turned into template +% instances the template should set that number. +% \begin{macrocode} +\def\toclevel@part{-1} +\def\toclevel@chapter{0} +\def\toclevel@section{1} +\def\toclevel@subsection{2} +\def\toclevel@subsubsection{3} +\def\toclevel@paragraph{4} +\def\toclevel@subparagraph{5} +\def\toclevel@figure{1} +\def\toclevel@table{1} +%</kernelchange> +% \end{macrocode} +% \subsection{load kernel changes} +% \begin{macrocode} +%<*package> +\RequirePackage{latex-lab-kernel-changes} +% \end{macrocode} +% +% \subsection{\cs{contentsline} extension} +% [latex-lab] +% The tagging code must add code at the begin and end of \cs{contentsline}. +% This code must have access to the arguments. We set it up as config point +% for now. +% \begin{macrocode} +\def\@contentsline@cfgpoint@before#1#2#3#4{} +\def\@contentsline@cfgpoint@after#1#2#3#4{} +\def\@contentsline@arg@one{}%level +\def\@contentsline@arg@two{}%text +\def\@contentsline@arg@three{}%page +\def\@contentsline@arg@four{}%destination +\def\contentsline#1#2#3#4% + {% + \def\@contentsline@arg@one{#1}%level + \def\@contentsline@arg@two{#2}%text + \def\@contentsline@arg@three{#3}%page + \def\@contentsline@arg@four{#4}%destination + \@contentsline@cfgpoint@before{#1}{#2}{#3}{#4}% + %\gdef\@contentsline@destination{#4}% + \csname l@#1\endcsname{#2}{#3}% + \@contentsline@cfgpoint@after{#1}{#2}{#3}{#4}% + } +% \end{macrocode} +% +% \subsection{\cs{addcontentsline} changes} +% [latex-lab] +% +% \cs{addcontentsline} should always write the unique counter representation +% \cs{@currentHref} so that we can create the |/Ref| key. At the same time +% we need a hook, so that hyperref can add its bookmarks code. The generic hook +% would be ok, but we need the arguments, so we store them first. +% +% \begin{macrocode} +\NewHook{cmd/addcontentsline/before} +\def\addcontentsline#1#2#3{% toc extension, type, tag + \def\addcontentsline@arg@one{#1}% name?? + \def\addcontentsline@arg@two{#2}% + \def\addcontentsline@arg@three{#3}% + \UseHook{cmd/addcontentsline/before}% + \addtocontents{#1}{% + \protect\contentsline{#2}{#3}{\thepage}{\@currentHref}\protected@file@percent + }} +% \end{macrocode} +% +% \subsection{\cs{@starttoc}} +% [kernel?] +% +% We add a configuration point before and after reading the file +% for the tagging. +% \begin{macrocode} +\def\@starttoc@cfgpoint@before#1{} +\def\@starttoc@cfgpoint@after#1{} +\def\@starttoc#1{% + \begingroup + \makeatletter + \@starttoc@cfgpoint@before{#1}% + \@input{\jobname.#1}% + \@starttoc@cfgpoint@after{#1} + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax + \fi + \@nobreakfalse + \endgroup} +% \end{macrocode} +% +% \subsection{Formatting of the toc entries} +% +% \subsubsection{Kernel commands} +% [latex-lab] or [kernel?]? +% +% We need hooks before and after the content and before and after the page number. +% The number needs some thing so that it can be tagged as label. +% The text and the page +% hooks are used in manual \cs{l@xx} commands and in \cs{l@xx} defined by +% \cs{@dottedtocline} or by other means. +% \begin{macrocode} +\NewMirroredHookPair{contentsline/number/before}{contentsline/number/after}% +\NewMirroredHookPair{contentsline/text/before}{contentsline/text/after}% +\NewMirroredHookPair{contentsline/page/before}{contentsline/page/after}% +% \end{macrocode} +% +% The dot in the leader must be set as artifact. +% But luatex requires that the mc are set outside the leaders. +% So we need a config point. +% +% \cs{@dottedtocline} needs hooks and formatting commands. +% \begin{macrocode} +\def\@dottedtocline@cfgpoint@leaders#1{#1} + +\def\@dottedtocline#1#2#3#4#5{% + \ifnum #1>\c@tocdepth \else + \vskip \z@ \@plus.2\p@ + {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@tempdima #3\relax + \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip + \UseHook{contentsline/text/before}% + \csname contentsline@text@#1@format\endcsname{#4}% + \UseHook{contentsline/text/after}% + \nobreak + \@dottedtocline@cfgpoint@leaders{% + \leaders\hbox{$\m@th + \mkern \@dotsep mu\hbox{.}\mkern \@dotsep + mu$}\hfill}% + \nobreak + \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor + \UseHook{contentsline/page/before}% + #5% + \UseHook{contentsline/page/after}% + \kern-\p@\kern\p@}% + \par}% + \fi} +% \end{macrocode} +% +% \subsubsection{\cs{numberline}} +% [kernel?] +% Inside or outside the box? +% \begin{macrocode} +\def\numberline#1{\hb@xt@\@tempdima{% + \UseHook{contentsline/number/before}% + #1\hfil + \UseHook{contentsline/number/after}% + }} +% \end{macrocode} +% +% \subsubsection{\cs{l@xx} in the classes} +% Depending on the class we have to redefine also more commands +% For other classes it should be documented what is needed. +% \begin{macrocode} +\AddToHook{class/article/after} + { + \renewcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty\@secpenalty + \addvspace{2.25em \@plus\p@}% + \setlength\@tempdima{3em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries + \UseHook{contentsline/text/before}% + \csname contentsline@text@-1@format\endcsname{#1}% + \UseHook{contentsline/text/after}% + \hfil + \hb@xt@\@pnumwidth{\hss + \UseHook{contentsline/page/before}% + #2% + \UseHook{contentsline/page/after}% + \kern-\p@\kern\p@}}\par + \nobreak + \endgroup + \fi} +\renewcommand*\l@section[2]{% + \ifnum \c@tocdepth >\z@ + \addpenalty\@secpenalty + \addvspace{1.0em \@plus\p@}% + \setlength\@tempdima{1.5em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \bfseries + \advance\leftskip\@tempdima + \hskip -\leftskip + \UseHook{contentsline/text/before}% + \csname contentsline@text@1@format\endcsname{#1}% + \UseHook{contentsline/text/after}% + \nobreak\hfil + \nobreak\hb@xt@\@pnumwidth{\hss + \UseHook{contentsline/page/before}% + #2% + \UseHook{contentsline/page/after}% + \kern-\p@\kern\p@}\par + \endgroup + \fi} + } +\AddToHook{class/report/after} + { + \renewcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty{-\@highpenalty}% + \addvspace{2.25em \@plus\p@}% + \setlength\@tempdima{3em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries + \UseHook{contentsline/text/before}% + \csname contentsline@text@-1@format\endcsname{#1}% + \UseHook{contentsline/text/after}% + \hfil + \hb@xt@\@pnumwidth{\hss + \UseHook{contentsline/page/before}% + #2% + \UseHook{contentsline/page/after}% + \kern-\p@\kern\p@}}\par + \nobreak + \endgroup + \fi} + \renewcommand*\l@chapter[2]{% + \ifnum \c@tocdepth >\m@ne + \addpenalty{-\@highpenalty}% + \vskip 1.0em \@plus\p@ + \setlength\@tempdima{1.5em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \bfseries + \advance\leftskip\@tempdima + \hskip -\leftskip + \UseHook{contentsline/text/before}% + \csname contentsline@text@0@format\endcsname + {#1}% + \UseHook{contentsline/text/after}% + \nobreak\hfil + \nobreak\hb@xt@\@pnumwidth{\hss + \UseHook{contentsline/page/before}% + #2% + \UseHook{contentsline/page/after}% + \kern-\p@\kern\p@}\par + \penalty\@highpenalty + \endgroup + \fi} + } +\AddToHook{class/book/after} + { + \renewcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty{-\@highpenalty}% + \addvspace{2.25em \@plus\p@}% + \setlength\@tempdima{3em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries + \UseHook{contentsline/text/before}% + \csname contentsline@text@-1@format\endcsname{#1}% + \UseHook{contentsline/text/after}% + \hfil + \hb@xt@\@pnumwidth{\hss + \UseHook{contentsline/page/before}% + #2% + \UseHook{contentsline/page/after}% + \kern-\p@\kern\p@}}\par + \nobreak + \endgroup + \fi} + \renewcommand*\l@chapter[2]{% + \ifnum \c@tocdepth >\m@ne + \addpenalty{-\@highpenalty}% + \vskip 1.0em \@plus\p@ + \setlength\@tempdima{1.5em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \bfseries + \advance\leftskip\@tempdima + \hskip -\leftskip + \UseHook{contentsline/text/before}% + \csname contentsline@text@0@format\endcsname + {#1}% + \UseHook{contentsline/text/after}% + \nobreak\hfil + \nobreak\hb@xt@\@pnumwidth{\hss + \UseHook{contentsline/page/before}% + #2% + \UseHook{contentsline/page/after}% + \kern-\p@\kern\p@}\par + \penalty\@highpenalty + \endgroup + \fi} + } +% \end{macrocode} +% \begin{macrocode} +%</package> +% \end{macrocode} + +% \begin{macrocode} +%<*latex-lab> +\ProvidesFile{toc-tagging-latex-lab-testphase.ltx} + [2022-10-26 v0.8 code related to the tagging of toc and similar lists] + +\RequirePackage{latex-lab-testphase-toc-tagging} + +%</latex-lab> +% \end{macrocode} diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf Binary files differnew file mode 100644 index 0000000000..1e8357e811 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.dtx b/macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.dtx new file mode 100644 index 0000000000..179e5a868e --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.dtx @@ -0,0 +1,365 @@ +% \iffalse meta-comment +% +%% File: 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{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.81 2023-02-10} +% +% \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-tagging} {2023-02-10} {0.81} + { 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@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@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@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@...| +% (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@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@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@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@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@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@cfgpoint@leaders#1{% + \tag_mc_begin:n{artifact}\nobreak#1\nobreak\tag_mc_end:} +% \end{macrocode} + +% +% \begin{macrocode} +%</package> +% \end{macrocode} diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.pdf b/macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.pdf Binary files differnew file mode 100644 index 0000000000..b0b3f531db --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab.ins b/macros/latex-dev/required/latex-lab/latex-lab.ins index bc668a71e1..ab77bbb846 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab.ins +++ b/macros/latex-dev/required/latex-lab/latex-lab.ins @@ -3,7 +3,7 @@ %% driver files from the dtx file(s) in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 2021-2022 The LaTeX Project +%% Copyright (C) 2021-2023 The LaTeX Project %% %% %% This file is part of the `LaTeX-lab Bundle' for LaTeX. @@ -35,7 +35,7 @@ This is a generated file. -Copyright 2021,2022 LaTeX Project +Copyright 2021-2023 LaTeX Project This file was generated from file(s) of the `LaTeX-lab Bundle'. ------------------------------------------------------------------------------------ @@ -68,15 +68,48 @@ where one can also log issues in case there are any. % #1-latex-lab-testphase.ltx \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}}} + \generate{\file{tagpdf-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{tagpdf}}} \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}}} % support files (the new-or code is a private package to make life easier) -\generate{\file{latex-lab-testphase-new-or.sty}{\from{latex-lab-new-or.dtx}{code}}} +\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}}} \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}}} + +\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-tagging.sty}{\from{latex-lab-sec-tagging.dtx}{package}}} +\generate{\file{sec-tagging-latex-lab-testphase.ltx}{\from{latex-lab-sec-tagging.dtx}{latex-lab}}} + + +\generate{\file{latex-lab-testphase-toc-tagging.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}}} + +\generate{\file{latex-lab-kernel-changes.sty} + {\from{latex-lab-toc-kernel-changes.dtx}{kernelchange} + \from{latex-lab-sec-tagging.dtx}{kernelchange} + }} + +\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}}} \endbatchfile diff --git a/macros/latex-dev/required/latex-lab/usage-of-@footnotemark.txt b/macros/latex-dev/required/latex-lab/usage-of-@footnotemark.txt deleted file mode 100644 index 684a695faa..0000000000 --- a/macros/latex-dev/required/latex-lab/usage-of-@footnotemark.txt +++ /dev/null @@ -1,186 +0,0 @@ -% packages that alter \@footnotemark ... - - -% bibarts - -\let\ba@footnmark=\@footnotemark -\def\@footnotemark{\ifhmode{\nobreak \hskip 0.04em plus 0.01em}\else\leavevmode\fi\ba@footnmark}% - - -% ./bxjscls/bxjsja-minimal.def - -\def\bxjs@cjk@loaded{% - \def\@footnotemark{% - \leavevmode - \ifhmode - \edef\@x@sf{\the\spacefactor}% - \ifdim\lastkern>\z@\ifdim\lastkern<5sp\relax - \unkern\unkern - \ifdim\lastskip>\z@ \unskip \fi - \fi\fi - \nobreak - \fi - \@makefnmark - \ifhmode \spacefactor\@x@sf \fi - \relax}% - \let\bxjs@cjk@loaded\relax -} - -% ./arabtex/afoot.sty - -\let \a@@footnotemark \@footnotemark - -\def \a@footnotemark {% inside Arabic environment -\iftrans \unskip \unskip \nobreak \@makefnmark \fi -\ifarab \a@spacefalse \putwordb@x \@makefnmark \a@spacetrue \fi } - -% ./hyperref/hyperref.sty - - \def\@footnotemark{% - \leavevmode - \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi - \stepcounter{Hfootnote}% - \global\let\Hy@saved@currentHref\@currentHref - \hyper@makecurrent{Hfootnote}% - \global\let\Hy@footnote@currentHref\@currentHref - \global\let\@currentHref\Hy@saved@currentHref - \hyper@linkstart{link}{\Hy@footnote@currentHref}% - \@makefnmark - \hyper@linkend - \ifhmode\spacefactor\@x@sf\fi - \relax - }% - - -% ./hypdvips/hypdvips.sty - - \def\@footnotemark{% - \leavevmode - \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi - \stepcounter{Hfootnote}% - \global\let\Hy@saved@currentHref\@currentHref - \hyper@makecurrent{Hfootnote}% - \global\let\Hy@footnote@currentHref\@currentHref - \global\let\@currentHref\Hy@saved@currentHref - \ifHy@draft% - \@makefnmark% - \else% - \pp@hyperfootnote% - \fi% - \ifhmode\spacefactor\@x@sf\fi - \relax - } - - \newcommand{\pp@hyperfootnote}{% - \ifx\pp@activerect\pp@true% - \@makefnmark% - \else% - \ifpp@smallfootnotes% - \let\pp@backup@@thefnmark\@thefnmark% - \renewcommand{\@thefnmark}{\pdf@rect{\pp@backup@@thefnmark}}% - \Hy@colorlink\@footnotecolor% - \@makefnmark% - \Hy@endcolorlink% - \pdfmark{% - pdfmark=/ANN,% - linktype=footnote,% - Subtype=/Link,% - AcroHighlight=\@pdfhighlight,% - Border=\@pdfborder,% - BorderStyle=\@pdfborderstyle,% - Color=\@footnotebordercolor,% - Dest=\Hy@footnote@currentHref,% - Raw=H.B% - }% - \let\@thefnmark\pp@backup@@thefnmark% - \else% - \pdfmark[\@makefnmark]{% - pdfmark=/ANN,% - linktype=footnote,% - Subtype=/Link,% - AcroHighlight=\@pdfhighlight,% - Border=\@pdfborder,% - BorderStyle=\@pdfborderstyle,% - Color=\@footnotebordercolor,% - Dest=\Hy@footnote@currentHref% - }% - \fi% - \fi% - } - - -% ./memoir/memhfixc.sty - -\ifHy@hyperfootnotes - \def\@footnotemark{% - \leavevmode - \ifhmode\edef\@x@sf{\the\spacefactor}% - \m@mmf@check% <--- added - \nobreak\fi - \stepcounter{Hfootnote}% - \global\let\Hy@saved@currentHref\@currentHref - \hyper@makecurrent{Hfootnote}% - \global\let\Hy@footnote@currentHref\@currentHref - \global\let\@currentHref\Hy@saved@currentHref - \hyper@linkstart{link}{\Hy@footnote@currentHref}% - \@makefnmark - \hyper@linkend - \m@mmf@prepare% <--- added - \ifhmode\spacefactor\@x@sf\fi - \relax - }% -\fi - - -% caption3.sty - -% this is altering the top-level when inside a float - - -% ./koma-script/scrlttr2.cls - -\newcommand*{\scr@footnotemark}{% - \leavevmode - \ifhmode\edef\@x@sf{\the\spacefactor}\FN@mf@check\nobreak\fi - \@makefnmark - \csname FN@mf@prepare\endcsname - \ifhmode\spacefactor\@x@sf\fi - \relax} - -% tested against this ... - -\newcommand*{\scr@saved@footnotemark}{% - \leavevmode - \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi - \@makefnmark - \ifhmode\spacefactor\@x@sf\fi - \relax} - - -% ./chextras/chextras.sty - -\ifstd@notes\else - \let\std@footnotemark\@footnotemark - \def\alt@footnotemark{\unskip\thinspace\std@footnotemark} - \let\@footnotemark\alt@footnotemark - -% footmisx.sty - - \newcommand*\@footmisxnotemark{% - \leavevmode - \ifhmode - \edef\@x@sf{\the\spacefactor}% - \FN@mf@check - \nobreak - \fi - \@footmicx@makefnmark - \ifFN@pp@towrite - \FN@pp@writetemp - \FN@pp@towritefalse - \fi - \FN@mf@prepare - \ifhmode\spacefactor\@x@sf\fi - \relax - } - - diff --git a/macros/latex-dev/required/latex-lab/usage-of-@footnotetext.txt b/macros/latex-dev/required/latex-lab/usage-of-@footnotetext.txt deleted file mode 100644 index 48a3172843..0000000000 --- a/macros/latex-dev/required/latex-lab/usage-of-@footnotetext.txt +++ /dev/null @@ -1,842 +0,0 @@ - -% ./bibarts/bibarts.sty - -\let\ba@footnotetext=\@footnotetext -\long\def\@footnotetext#1{\ba@footnotetext{% - \global\let\thisto@ba=-% - \global\let\thisti@ba=-% - \global\let\thisp@ba=-% - \global\let\thisvol@ba=-% - \global\let\thiss@ba=-% - \global\let\thisn@ba=-% - \global\let\pos@ba=0% - \kern 0.1em\nulskip@ba{\@footnotetrue\ignorespaces - #1\nulskip@ba\ba@textmode}\global\let\lastto@ba=\thisto@ba - \global\let\lastti@ba=\thisti@ba - \global\let\lastp@ba=\thisp@ba - \global\let\lastvol@ba=\thisvol@ba - \global\let\lasts@ba=\thiss@ba - \global\let\lastn@ba=\thisn@ba}}% - - -% ./fnbreak/fnbreak.sty - - \let\fnb@orig@footnotetext\@footnotetext - \long\def\@footnotetext#1{\fnb@orig@footnotetext{\fnb@fnstart#1\fnb@fnend}}% - - -% ./revtex4-1/revtex4-1.cls ./revtex/ltxutil.sty ./revtex/revtex4-2.cls ... - -\long\def\@footnotetext{% - \insert\footins\bgroup - \make@footnotetext -}% -\long\def\@mpfootnotetext{% - \minipagefootnote@pick - \make@footnotetext -}% -\long\def\make@footnotetext#1{% - \set@footnotefont - \set@footnotewidth - \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@\@mpfn\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1% - \@finalstrut\strutbox\vadjust{\vskip\z@skip}% - }% - \color@endgroup - \minipagefootnote@drop -}% - - -% ./nrc/nrc1.cls ./nrc/nrc2.cls - -% this is missing the \par at the end and \@currentcounter - -\long\def\@footnotetext#1{% - \insert\footins{% - \reset@font\smallt - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox - }% - \color@endgroup - }% -}% - -%------------------------------------- - -% ./bigfoot/bigfoot.sty - - \def\@footnotetext{\Footnotetextdefault{}}% - -%------------------------------------- - - -% ./uafthesis/uafthesis.cls - -% this is missing the \par at the end and \@currentcounter - -%% this little gem provides for single-spaced footnotes -\long\def\@footnotetext#1{\insert\footins{% - \ssp - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext - {\rule{\z@}{\footnotesep}\ignorespaces - #1\strut}}} - -%------------------------------------- - - - -% ./resphilosophica/resphilosophica.cls - -% I wonder if this \, is really intended below ... - -\long\def\@footnotetext#1{% - \insert\footins{% - \normalfont\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep \splitmaxdepth \dp\strutbox - \floatingpenalty\@MM \hsize\columnwidth - \@parboxrestore \parindent\normalparindent \sloppy - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark}% - \@makefntext{% - \,\rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}} - -%------------------------------------- - - - -% ./setspace/setspace.sty - -% this is missing the \par at the end and \@currentcounter - -\long\def\@footnotetext#1{% - \insert\footins{% -% GT: Next line added. Hook desired here! - \def\baselinestretch {\setspace@singlespace}% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth - \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \color@endgroup}} - -%------------------------------------- - - - -% ./linguex/linguex.sty - - -\let\predefinedfootnotetext=\@footnotetext -\long\def\@footnotetext#1{\@noftnotefalse\predefinedfootnotetext{#1}% - \@noftnotetrue} - - -%------------------------------------- - - -% ./fnpara/fnpara.sty - -\long\def\@footnotetext#1{\insert\footins{% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \setbox0=\hbox{% - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox - \penalty -10 - \hskip\footglue - }% - }% - \dp0=0pt \ht0=\fudgefactor\wd0 \box0 - \color@endgroup}} - -%------------------------------------- - - -% ./footmisc/footmisc.sty (para option) - -% this is missing the \par at the end and \@currentcounter - - \long\def\FN@footnotetext#1{% - \insert\footins{% - \ifFN@setspace - \let\baselinestretch\FN@baselinestretch - \fi - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox - \floatingpenalty\@MM - \hsize\columnwidth - \@parboxrestore - \protected@edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% - \color@begingroup - \setbox\FN@tempboxa\hbox{% - \@makefntext{\ignorespaces#1\strut - \penalty-10\relax - \hskip\footglue - }% end of \@makefntext parameter - }% end of \hbox - \dp\FN@tempboxa\z@ - \ht\FN@tempboxa\dimexpr\wd\FN@tempboxa *% - \footnotebaselineskip / \columnwidth\relax - \box\FN@tempboxa - \color@endgroup - }% - \FN@mf@prepare - } - -%------------------------------------- - - -% ./footmisc/footmisc.sty (normal) - -% this is missing the \par at the end and \@currentcounter - - \long\def\FN@footnotetext#1{% - \insert\footins{% - \ifFN@setspace - \let\baselinestretch\FN@baselinestretch - \fi - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox - \floatingpenalty\@MM - \hsize\columnwidth - \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep - \ignorespaces#1\@finalstrut\strutbox - }% - \color@endgroup - }% - \FN@mf@prepare - }% - - - -%------------------------------------- - - -% ./footmisc/footmisc.sty (side option) - - \long\def\FN@footnotetext#1{% - \marginpar{% - \ifFN@setspace - \let\baselinestretch\FN@baselinestretch - \fi - \reset@font\footnotesize - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \ignorespaces#1% - }% - \color@endgroup - }% - \FN@mf@prepare - }% - - - -%------------------------------------- - - - -% ./bxjscls/bxjsarticle.cls ./bxjscls/bxjsbook.cls ... - -\long\def\@footnotetext{% - \insert\footins\bgroup - \normalfont\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces}% - \futurelet\jsc@next\jsc@fo@t} -\def\jsc@fo@t{\ifcat\bgroup\noexpand\jsc@next \let\jsc@next\jsc@f@@t - \else \let\jsc@next\jsc@f@t\fi \jsc@next} -\def\jsc@f@@t{\bgroup\aftergroup\jsc@@foot\let\jsc@next} -\def\jsc@f@t#1{#1\jsc@@foot} -\def\jsc@@foot{\@finalstrut\strutbox\color@endgroup\egroup - \ifx\pltx@foot@penalty\@undefined\else - \ifhmode\null\fi - \ifnum\pltx@foot@penalty=\z@\else - \penalty\pltx@foot@penalty - \pltx@foot@penalty\z@ - \fi - \fi} - - -not covered so far supports \footnote{ catcode changes ...} but also -\foonote A --- the latter is questionable I would say - - -%------------------------------------- - - -% ./fn2end/fn2end.sty - -obsolete I guess, ignored in evaluation - - -%------------------------------------- - - -% ./hyperref/hyperref.sty - - \long\def\@footnotetext#1{% - \H@@footnotetext{% - \ifHy@nesting - \expandafter\ltx@firstoftwo - \else - \expandafter\ltx@secondoftwo - \fi - {% - \expandafter\hyper@@anchor\expandafter{% - \Hy@footnote@currentHref - }{\ignorespaces #1}% - }{% - \Hy@raisedlink{% - \expandafter\hyper@@anchor\expandafter{% - \Hy@footnote@currentHref - }{\relax}% - }% - \let\@currentHref\Hy@footnote@currentHref - \let\@currentlabelname\@empty - \ignorespaces #1% - }% - }% - }% - - -Handling of anchors (in nested context) I guess. This needs to be -married with the anchor setting that the tagging currently does and -the latter improved/adjusted - - -%------------------------------------- - -% ./biblatex-gb7714-2015/gb7714-2015ms.bbx ./biblatex-gb7714-2015/gb7714-2015mx.bbx ... - - \long\def\@footnotetext##1{\insert\footins{% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \leftskip \footbibmargin%å¢žåŠ çš„å·¦ä¾§ç¼©è¿› - \@makefntext{% - \rule\z@\footnotesep\ignorespaces##1\@finalstrut\strutbox% - }% - \color@endgroup}}% - -fits the structure -%------------------------------------- - - -% ./amscls/amsbook.cls ./amscls/amsproc.cls ./amscls/amsart.cls ... - -\long\def\@footnotetext#1{% - \insert\footins{% - \normalfont\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep \splitmaxdepth \dp\strutbox - \floatingpenalty\@MM \hsize\columnwidth - \@parboxrestore \parindent\normalparindent \sloppy - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark}% - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}} - -fits the structure -%------------------------------------- - - -% ./umich-thesis/umich-thesis.cls - -% change LaTeX's footnotes to get vertical spacing correct -\skip\footins \baselinestretch2\skip\footins -\long\def\@footnotetext#1{% - \insert\footins{% - \def\baselinestretch {\setspace@singlespace}% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth - \@parboxrestore - \vskip 1.2\baselineskip - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \color@endgroup}} - -fits the structure -%------------------------------------- - - -% ./nostarch/nostarch.cls - -\long\def\@footnotetext#1{\insert\footins{% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@{13.5pt}\ignorespaces#1}% - \color@endgroup}}% - -fixed \footsep, probably very old -fits the structure -%------------------------------------- - - - -% ./coursepaper/coursepaper.cls - -\long\def\@footnotetext#1{% - \insert\footins{% - \def\baselinestretch {1}% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth - \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \color@endgroup}} - -fits the structure -%------------------------------------- - - - -% ./ucthesis/ucthesis.cls - -% Single-space footnotes. -\long\def\@footnotetext#1{\insert\footins{\ssp\reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext - {\rule{\z@}{\footnotesep}\ignorespaces - #1\strut}}} - -fits the structure -%------------------------------------- - - - -% ./jura/jura.cls - -\long\def\@footnotetext#1{\insert\footins{% - \linespread{\J@FootnoteSpread}\reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \color@endgroup}}% - -fits the structure -%------------------------------------- - - -% ./asaetr/asaesub.sty - -2.09 - -%------------------------------------- - - -% ./lineno/fnlineno.sty - -%% |\FNLN@@text| stores the `\@footnotetext' found, -%% we might check if it is `\FNLN@ltx@fntext' ... %% TODO -\let\FNLN@@text\@footnotetext -\def\@footnotetext{% - \ifLineNumbers \expandafter \FNLN@text - \else \expandafter \FNLN@@text - \fi} - - -\def \FNLN@text {% %% 2010/12/31 arg read later - \vadjust{\penalty-\FNLN@M@swap@codepen}% -%% Standard \LaTeX's `\@footnotetext' expands `\@thefnmark' -%% to produce the footnote mark at the page bottom, -%% right after it has been determined for the mark -%% in the main text. \emph{Here} the footnote text -%% will be typeset only when \emph{other} footnote marks -%% may have been formed for typesetting the main text -%% paragraph before. -%% %%% (TODO clearer wording) -%% In the \strong{footnote list} -%% macro |\FNLN@list|, the (\dqtd{`&\protect'ed}) -%% \emph{current} expansion <mark> of `\@thefnmark' -%% is stored as an item preceding the footnote text -%% <text>. One footnote entry in `\FNLN@list' -%% thus has the form \lq`<mark>\@lt<text>\@lt'\rq. -%% \LaTeX's internal `\g@addto@macro' is used to \emph{append} -%% an entry to the list (at the right). The OTR will later -%% take the entries from the left of the list. -%% -%% The argument of the auxiliary/temporary `\@tempa' -%% will contain the footnote text and thus must be able to -%% carry `\par' tokens. We therefore need a `\long' version of -%% `\protected@edef': - \let\@@protect\protect - \let\protect\@unexpandable@protect - \afterassignment\restore@protect - \long \edef \@tempa ##1{% - \noexpand\g@addto@macro \noexpand\FNLN@list {% - \@thefnmark \noexpand\@lt ##1\noexpand \@lt}}% -%% ... issuing -%% \lq`\g@addto@macro\FNLN@list{<mark>\elt<text>\@lt}'\rq\ ... - \@tempa %% reads arg -} -%% Here we initialize |\FNLN@list|: -\let\FNLN@list\@empty - - - -probably continues working but needs separate checking - -%------------------------------------- - - - -% ./jurabib/jurabib.sty - - \long\def\@footnotetext#1{% - \Orig@tabularx@footnotetext{% - \jb@fntrue - #1% - \setcounter{jb@cites@in@footnote}{0}% - }% - }% - - \let\jbsaved@footnotetext\@footnotetext - \long\def\@footnotetext#1{% - \begingroup - \jb@fntrue - \jbsaved@footnotetext{#1}% - \setcounter{jb@cites@in@footnote}{0}% - \endgroup - }% - - -first is table notes, second -fits the structure -%------------------------------------- - - - -% ./york-thesis/york-thesis.cls - -\long\def\@footnotetext#1{% - \insert\footins{% - \def\baselinestretch {1}% - \reset@font\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth - \@parboxrestore - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark}% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \color@endgroup}} - -fits the structure -%------------------------------------- - - -% ./ucdavisthesis/ucdavisthesis.cls - -\long\def\@footnotetext#1{\insert\footins{\renewcommand\baselinestretch{1} - \footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext - {\rule{\z@}{\footnotesep}\ignorespaces - #1\strut}\renewcommand\baselinestretch{\@spacing}}} - -looks old ... -fits the structure -%------------------------------------- - - -% ./ledmac/afoot.sty - -fairly old and buggy in some aspects - -%%% Make the LaTeX \cs{footnote} catcode-safe, like in Plain TeX. - -\def \@footnotetext {% new, do not yet read footnote text - \insert \footins \bgroup - \ifx \footglue \undefined % prepare normal footnote - \interlinepenalty \interfootnotelinepenalty \floatingpenalty \@MM - \splittopskip \footnotesep \splitmaxdepth \dp \strutbox - \else - \global\long\def \@makefntext ##1{{$^{\@thefnmark }$}##1\nobreak }% - \setbox0=\hbox \bgroup % fnpara.sty is present - \floatingpenalty=20000 \footnotesize - \fi - \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% - \a@fntext } - - -%------------------------------------- - - -% ./toptesi/toptesi.sty - - -\long\def\@footnotetext#1{\insert\footins{\linespread{1}\footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth \dp\strutbox \floatingpenalty \@MM - \hsize\columnwidth \@parboxrestore - \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% - \@makefntext{\rule{\z@}{\footnotesep}\ignorespaces#1\strut}}} - - -fits the structure -%------------------------------------- - - -% ./gb4e/gb4e.sty - -\let\@gbsaved@footnotetext=\@footnotetext -\long\def\@footnotetext#1{% - \@noftnotefalse\setcounter{fnx}{0}% - \@gbsaved@footnotetext{#1}% - \@noftnotetrue} - -fits the structure -%------------------------------------- - - - -% ./koma-script/scrlttr2.cls ./koma-script/scrextend.sty ./koma-script/scrreprt.cls ... - -same bug as footmisc: the @prepare is in the wrong place - -fits the structure -%------------------------------------- - - - -% ./tabu/tabu.sty - -not checked what that does - - -%------------------------------------- - - -% ./uwthesis/uwthesis.cls - -does chapter notes -- ignore for now - -%------------------------------------- - - -% ./tools/multicol.sty - -\long\def\mult@footnotetext#1{\begingroup - \columnwidth\textwidth - \orig@footnotetext{#1}\endgroup} - - -fits the structure, but need to think what makes sense here as this a -temporary redefinition for the environment only - -%------------------------------------- - - -% ./fancyvrb/fancyvrb.sty - -\long\def\V@footnotetext{% - \afterassignment\V@@footnotetext - \let\@tempa} -\def\V@@footnotetext{% - \insert\footins\bgroup - \csname reset@font\endcsname - \footnotesize - \interlinepenalty\interfootnotelinepenalty - \splittopskip\footnotesep - \splitmaxdepth\dp\strutbox - \floatingpenalty \@MM - \hsize\columnwidth - \@parboxrestore - \def\@currentcounter{footnote}% - \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% - \@makefntext{}% - \rule{\z@}{\footnotesep}% - \bgroup - \aftergroup\V@@@footnotetext - \ignorespaces} -\def\V@@@footnotetext{\strut\egroup} - - -another one of the footnote commands that do not read they argument as an argument - -%------------------------------------- - - -% ./savefnmark/savefnmark.sty - -obsolete - -%------------------------------------- - - -% ./changebar/changebar.sty - -\let\ltx@footnotetext\@footnotetext -\long\def\cb@footnotetext#1{% - \cb@trace@stack{end footnote on page \the\c@page}% - \cb@pop\cb@currentstack - \ifnum\cb@topleft=\cb@nil - \ltx@footnotetext{#1}% - \else - \cb@push\cb@currentstack - \edef\cb@temp{\the\cb@curbarwd}% - \ltx@footnotetext{\cb@start[\cb@temp]#1\cb@end}% - \fi} -\let\@footnotetext\cb@footnotetext - - -% ./eledmac/eledmac.sty - -\apptocmd{\@footnotetext}{\m@mmf@prepare}{}{} -\pretocmd{\@footnotetext}{% - \ifnumberedpar@ - \edtext{}{\l@dbfnote{#1}}% - \else - }{}{} -\apptocmd{\@footnotetext}{\fi}{}{}% - - -% ./yafoot/dblfnote.sty - -\long\def\dfn@footnotetext#1{{\setbox\dfn@boxa\vbox{ - \let\insert\dfn@gobble - \columnwidth\DFNcolumnwidth \hbadness\c@DFNsloppiness - \def\@makefnmark{\smash{\dfn@makefnmark}} - \dfn@latex@footnotetext{#1}\par \boxmaxdepth\dfn@fnmaxdp}% - \dfn@dima\ht\dfn@boxa \advance\dfn@dima\dp\dfn@boxa - \ifdim\dfn@dima>\z@\else - \dfn@dima1sp\relax - \setbox\dfn@boxa\vbox{\vbox to1sp{\unvbox\dfn@boxa\vfil}}\fi - \global\setbox\dfn@ins\vbox{\boxmaxdepth\dfn@fnmaxdp - \ifvoid\dfn@ins\else - \unvbox\dfn@ins \allowbreak \nointerlineskip \fi - \ifdfn@allowcbreak \unvbox \else \box \fi \dfn@boxa}% - \setbox\dfn@boxa\copy\dfn@ins - \dfn@split{.5\ht\dfn@boxa}\dfn@boxa\dfn@boxb\dfn@fnmaxdp\footnotesep - \advance\@tempdima\@tempdimb \@tempdimb\@tempdima - \advance\@tempdima-\dfn@fnht \global\dfn@fnht\@tempdimb - \insert\footins{\floatingpenalty\@MM \vbox to\@tempdima{}}% - \xdef\dfn@list{\dfn@list\@elt{\number\dfn@dima}{\number\@tempdima}}}} -\let\dfn@latex@footnotetext\@footnotetext -\let\@footnotetext\dfn@footnotetext - - -% ./ftnxtra/ftnxtra.sty - -not checked what this does - - -% ./acmart/acmart.cls - -\if@ACM@sigchiamode -\long\def\@footnotetext#1{\marginpar{% - \reset@font\small - \interlinepenalty\interfootnotelinepenalty - \protected@edef\@currentlabel{% - \csname p@footnote\endcsname\@thefnmark - }% - \color@begingroup - \@makefntext{% - \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% - \color@endgroup}}% -\fi - - -% ./memoir/memoir.cls - - this needs some further analysis - diff --git a/macros/latex-dev/required/latex-lab/usage-of-kern-kern.txt b/macros/latex-dev/required/latex-lab/usage-of-kern-kern.txt deleted file mode 100644 index e119197b70..0000000000 --- a/macros/latex-dev/required/latex-lab/usage-of-kern-kern.txt +++ /dev/null @@ -1,80 +0,0 @@ - - \ifdim\lastkern>\z@\ifdim\lastkern<5sp\relax -./bxjscls/bxjsja-minimal.def - - - - \ifdim\lastkern=-3sp \unkern - \ifdim\lastkern=3sp \kern-3sp - {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}% -./microtype/letterspace.sty - - - \ifdim\lastkern=-3sp \unkern - \ifdim\lastkern=3sp \kern-3sp - {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}% -./microtype/microtype-pdftex.def - - - \ifdim\lastkern=-3sp \unkern - \ifdim\lastkern=3sp \kern-3sp - {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}% -./microtype/microtype-luatex.def - - - -\providecommand*{\multiplefootnotemarker}{3sp} -./eledmac/eledmac.sty - - - -\providecommand*{\multiplefootnotemarker}{3sp} -./reledmac/reledmac.sty - - -\edef\CJK@kern{\kern -2sp\kern 2sp} -\edef\CJK@CJK{\kern -1sp\kern 1sp} -./cjk/texinput/CJK.sty - - -\edef\ruby@kern{\kern -5sp\kern 5sp} -./cjk/texinput/ruby.sty - - -% hyphenation between pinyin syllables. Values 1sp-3sp are already used -\edef\py@sp{\kern -4sp\kern 4sp} -./cjk/texinput/pinyin.sty - - -\providecommand*{\multiplefootnotemarker}{3sp} -./tufte-latex/tufte-common.def - - - -\newcommand*{\multiplefootnotemarker}{3sp} -./memoir/memoir.cls - - -\providecommand*{\multiplefootnotemarker}{3sp} -./parnotes/parnotes.sty - - -\providecommand*{\multiplefootnotemarker}{3sp} -./lwarp/lwarp-footmisc.sty - - - \bgroup \kern-3sp\kern3sp % kerns so I can test for beginning of list -./examdesign/examdesign.cls - - - \kern-1sp \kern1sp } - \kern-2sp \kern2sp } - \kern-3sp \kern3sp } - \kern-4sp \kern4sp } -./polyglossia/gloss-korean.ldf - - - -\NewDocumentCommand \@sidenotes@multisign { } {3sp} -./sidenotes/sidenotes.sty - diff --git a/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf b/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf Binary files differindex a877bbe57c..dae1c3f742 100644 --- a/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf +++ b/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf diff --git a/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex b/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex index f944831c59..584b8b980f 100644 --- a/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex +++ b/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex @@ -121,7 +121,7 @@ \title{Mode d’emploi du module \ext{babel-french}} \author{\href{mailto:daniel.flipo@free.fr}{Daniel \textsc{Flipo}}} -\newcommand*{\latestversion}{3.5p} +\newcommand*{\latestversion}{3.5q} \date{Version {\latestversion} -- \today} \begin{document} @@ -158,8 +158,6 @@ \vspace{-\baselineskip}\noindent \descindentFB=0pt \begin{description} - \item[15 janvier 2017] La version~3.2f est compatible avec l’extension - \ext{icomma}. \item[30 janvier 2017] Le comportement par défaut de la commande |\frquote{}| sous LuaTeX est modifié, voir p.~\pageref{frquote}. \item[30 avril 2017] Utiliser |\frenchsetup{}| de préférence à @@ -182,8 +180,10 @@ \item[11 nov. 2022] Avec Lua(La)TeX le codage |«~abc~»| ne produit plus d’espace parasite. La redéfinition de |\shorthandoff{}|, |\shorthandon{}| sous LuaTeX/XeTeX est supprimée. - \item[3 janvier 2022] Modification de la commande |\DecimalMathComma|, + \item[3 janvier 2023] Modification de la commande |\DecimalMathComma|, voir p.~\pageref{decimalmathcomma}. + \item[8 mars 2023] Correction de bug dans les listes, + voir p.~\pageref{par-in-lists}. \end{description} \end{abstract} \egroup @@ -1579,6 +1579,14 @@ remarque de Fabrice Eudes : elle peut désormais être utilisée dans le préamb Voir section~\ref{decimalmathcomma} p.~\pageref{decimalmathcomma} pour plus de détails. +\vspace{\parskip} +La version 3.5q corrige un bug concernant les listes signalé par Denis Bitouzé : +les alinéas inclus dans une liste n’étaient pas distinguables. Dorénavant +|\listparindent| est défini comme |\parindent| et si|\parskip > 0|, |\parsep| +est défini comme |\parskip|. Il est possible de revenir à l’ancienne +présentation en ajoutant \emph{dans l’environnement de liste} les commandes +|\parskip=0pt| et |\parindent=0pt|.\hlabel{par-in-lists} + \subsection{Changements entre les versions 3.4d et 3.3d} \label{ssec:changes-3.4} diff --git a/macros/latex/contrib/babel-contrib/french/frenchb.dtx b/macros/latex/contrib/babel-contrib/french/frenchb.dtx index 441b411aee..fa68afd071 100644 --- a/macros/latex/contrib/babel-contrib/french/frenchb.dtx +++ b/macros/latex/contrib/babel-contrib/french/frenchb.dtx @@ -11,7 +11,7 @@ %<frenchb>\ProvidesLanguage{frenchb} %<lua>--[[ %<lua> File `frenchb.lua’ generated from frenchb.dtx - [2023/01/02 v3.5p French support from the babel system] + [2023/03/08 v3.5q French support from the babel system] %<*internal> \iffalse %</internal> @@ -40,8 +40,7 @@ %% %</dtx> %<*filedriver> -\RequirePackage{pdfmanagement-testphase} -\DeclareDocumentMetadata{pdfstandard=A-2b, lang=en-US} +\DocumentMetadata{pdfstandard=A-2b, lang=en-US} \documentclass[a4paper]{ltxdoc} \usepackage[left=38mm,right=38mm,top=30mm,bottom=50mm]{geometry} \usepackage[dvipsnames]{xcolor} @@ -828,6 +827,13 @@ % Version 3.5n introduces a new command |\bname{}| (an alternative to % |\bsc{}|). % +% Version 3.5q corrects a bug in lists layout: |\listparindent| +% (formely 0pt) is defined as |\parindent| and if |\parskip > 0pt|, +% |\parsep| is now defined as |\parskip|. This ensures that +% paragraphs included in lists are now visible. The former behaviour +% can be recovered by adding |\parskip=0pt|, |\parindent=0pt| +% \emph{inside} the list environment. +% % \subsubsection*{What’s new in version 3.4?} % % Version 3.4a adds a new command |\frenchdate| (see @@ -5250,6 +5256,8 @@ return french_punctuation % An option for backward compatibility is provided.} % % \begin{macro}{\listFB} +% \changes{v3.5q}{2023/02/15}{Bug correction: \cs{parsep} should be +% related to \cs{parskip} and \cs{listparindent} to \cs{parindent}.} % \begin{macro}{\listORI} % \begin{macro}{\FB@listVsettings} % Vertical spacing in lists should be shorter in French texts than @@ -5274,20 +5282,31 @@ return french_punctuation % \begin{macrocode} \let\listORI\list \let\endlistORI\endlist +\newdimen\FB@parskip \def\FB@listVsettings{% - \setlength{\itemsep}{0.4ex plus 0.2ex minus 0.2ex}% - \setlength{\parsep}{0.4ex plus 0.2ex minus 0.2ex}% \setlength{\topsep}{0.8ex plus 0.4ex minus 0.4ex}% \setlength{\partopsep}{0.4ex plus 0.2ex minus 0.2ex}% % \end{macrocode} % |\parskip| is of type `skip’, its mean value only (\emph{not % the glue}) should be subtracted from |\topsep| and added to % |\partopsep|, so convert |\parskip| to a `dimen’ using -% |\@tempdima|. +% |\FB@parskip|. +% \begin{macrocode} + \FB@parskip=\parskip + \addtolength{\topsep}{-\FB@parskip}% + \addtolength{\partopsep}{\FB@parskip}% + \setlength{\itemsep}{0.4ex plus 0.2ex minus 0.2ex}% + \setlength{\parsep}{0.4ex plus 0.2ex minus 0.2ex}% +% \end{macrocode} +% (v3.5q) If |\parskip| is not null, |\parsep| is set to |\parskip|, +% so paragraphs inside items will be preceeded by the same vertical +% space as paragraphs located outside lists; the vertical skip before +% items (|\itemsep| + |\parsep|) doesn’t need to be enlarged. % \begin{macrocode} - \@tempdima=\parskip - \addtolength{\topsep}{-\@tempdima}% - \addtolength{\partopsep}{\@tempdima}% + \ifdim\FB@parskip>0pt + \setlength{\parsep}{\FB@parskip}% + \addtolength{\itemsep}{-\FB@parskip}% + \fi } \def\listFB#1#2{\listORI{#1}{\FB@listVsettings #2}} \let\endlistFB\endlistORI @@ -5387,7 +5406,7 @@ return french_punctuation \labelindentFB}% \else % \end{macrocode} -% Default layout: labels hanging into the left margin. +% Default layout: labels hanging into the list left margin. % \begin{macrocode} \leftmarginFB=\labelwidthFB \advance\leftmarginFB by \labelsep @@ -5395,6 +5414,11 @@ return french_punctuation {\csname leftmargin\romannumeral\FB@dp\endcsname = \leftmarginFB}% \advance\leftmargini by \listindentFB +% \end{macrocode} +% (v3.5q) Same `parindent’ for paragraphs in lists’ items (was null +% as in standard lists). +% \begin{macrocode} + \listparindent=\parindent \fi \leftmargin=\csname leftmargin% \ifnum\@listdepth=\@ne i\else ii\fi\endcsname @@ -5419,18 +5443,22 @@ return french_punctuation % unless option \fbo{StandardListSpacing} is set, then set horizontal % indentations according to |\FB@listHsettings| unless option % \fbo{ListOldLayout} is \fbo{true} (compatibility with lists -% up to v.~2.5k). +% up to v2.5k). % \begin{macrocode} \def\FB@itemizesettings{% \ifFBStandardListSpacing \else - \setlength{\itemsep}{\z@}% - \setlength{\parsep}{\z@}% \setlength{\topsep}{\z@}% \setlength{\partopsep}{\z@}% - \@tempdima=\parskip - \addtolength{\topsep}{-\@tempdima}% - \addtolength{\partopsep}{\@tempdima}% + \FB@parskip=\parskip + \addtolength{\topsep}{-\FB@parskip}% + \addtolength{\partopsep}{\FB@parskip}% + \setlength{\itemsep}{\z@}% + \setlength{\parsep}{\z@}% + \ifdim\FB@parskip>0pt + \setlength{\parsep}{\FB@parskip}% + \addtolength{\itemsep}{-\FB@parskip}% + \fi \fi \settowidth{\labelwidth}{\csname\@itemitem\endcsname}% \ifFBListOldLayout diff --git a/macros/latex/contrib/babel-contrib/french/frenchb.pdf b/macros/latex/contrib/babel-contrib/french/frenchb.pdf Binary files differindex 11268e191f..395080ae3f 100644 --- a/macros/latex/contrib/babel-contrib/french/frenchb.pdf +++ b/macros/latex/contrib/babel-contrib/french/frenchb.pdf diff --git a/macros/latex/contrib/genealogytree/CHANGES.md b/macros/latex/contrib/genealogytree/CHANGES.md index 186d064592..efae235b48 100644 --- a/macros/latex/contrib/genealogytree/CHANGES.md +++ b/macros/latex/contrib/genealogytree/CHANGES.md @@ -17,6 +17,23 @@ and this project adheres to +## [2.3.0] - 2023-03-09 + +### Added +- Catalan translation provided by Josep Tebé i Cetó +- Chinese translation provided by Chen Yanzheng +- Value `catalan` for option `language` +- Value `chinese` for option `language` + +### Fixed +- Option `autofill parents unspecific` was broken (issue #41) +- Internal documentation macro adapted to newer interal tcolorbox syntax +- Options `fill zoom DBimage` and `fill overzoom DBimage` adapted to be + compatible to the tikzfill package (expansion problem). + `\gtrincludeDBimage` also changed accordingly. + + + ## [2.2.0] - 2022-03-17 ### Added @@ -425,7 +442,7 @@ and this project adheres to - Pre publication development. - -[v2.1.0] https://github.com/T-F-S/genealogytree/compare/v2.01...2.1.0 +[v2.2.0] https://github.com/T-F-S/genealogytree/compare/v2.1.0...v2.2.0 +[v2.1.0] https://github.com/T-F-S/genealogytree/compare/v2.01...v2.1.0 [v2.01] https://github.com/T-F-S/genealogytree/compare/v2.00...v2.01 diff --git a/macros/latex/contrib/genealogytree/README.md b/macros/latex/contrib/genealogytree/README.md index 25c4d06ef4..c441228cfc 100644 --- a/macros/latex/contrib/genealogytree/README.md +++ b/macros/latex/contrib/genealogytree/README.md @@ -1,6 +1,6 @@ -# The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +# The LaTeX package genealogytree - version 2.3.0 (2023/03/09) -> Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +> Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> > This work may be distributed and/or modified under the > conditions of the LaTeX Project Public License, either version 1.3 diff --git a/macros/latex/contrib/genealogytree/genealogytree-example-1.pdf b/macros/latex/contrib/genealogytree/genealogytree-example-1.pdf Binary files differindex 0b893c644a..ab59ba00b9 100644 --- a/macros/latex/contrib/genealogytree/genealogytree-example-1.pdf +++ b/macros/latex/contrib/genealogytree/genealogytree-example-1.pdf diff --git a/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf b/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf Binary files differindex ec8a2ea0fc..b84b9ac1eb 100644 --- a/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf +++ b/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf diff --git a/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf b/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf Binary files differindex 8fa4eb74cc..6bbe1e3096 100644 --- a/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf +++ b/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf diff --git a/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf b/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf Binary files differindex 9995cbd07a..87dd10be43 100644 --- a/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf +++ b/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf diff --git a/macros/latex/contrib/genealogytree/genealogytree-languages.pdf b/macros/latex/contrib/genealogytree/genealogytree-languages.pdf Binary files differindex 58f985e5db..7307ad730d 100644 --- a/macros/latex/contrib/genealogytree/genealogytree-languages.pdf +++ b/macros/latex/contrib/genealogytree/genealogytree-languages.pdf diff --git a/macros/latex/contrib/genealogytree/genealogytree.pdf b/macros/latex/contrib/genealogytree/genealogytree.pdf Binary files differindex 9c75dfe74e..3d110c0514 100644 --- a/macros/latex/contrib/genealogytree/genealogytree.pdf +++ b/macros/latex/contrib/genealogytree/genealogytree.pdf diff --git a/macros/latex/contrib/genealogytree/genealogytree.sty b/macros/latex/contrib/genealogytree/genealogytree.sty index 8ab1ac5fd4..6704428ff3 100644 --- a/macros/latex/contrib/genealogytree/genealogytree.sty +++ b/macros/latex/contrib/genealogytree/genealogytree.sty @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% genealogytree.sty: genealogy trees (graphs) %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -18,8 +18,8 @@ %% This work consists of all files listed in README %% \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{genealogytree}[2022/03/17 version 2.2.0 genealogy trees] -\def\gtr@version{2.2.0} +\ProvidesPackage{genealogytree}[2023/03/09 version 2.3.0 genealogy trees] +\def\gtr@version{2.3.0} \RequirePackage{expl3}[2020/02/25] \RequirePackage{xparse,xfp} @@ -134,6 +134,8 @@ \gtr@add@library{core.options}{gtrcore.options.code.tex} \gtr@add@library{core.symbols}{gtrcore.symbols.code.tex} +\gtr@add@library{lang.catalan}{gtrlang.catalan.code.tex} +\gtr@add@library{lang.chinese}{gtrlang.chinese.code.tex} \gtr@add@library{lang.danish}{gtrlang.danish.code.tex} \gtr@add@library{lang.dutch}{gtrlang.dutch.code.tex} \gtr@add@library{lang.english}{gtrlang.english.code.tex} diff --git a/macros/latex/contrib/genealogytree/gtrcore.contour.code.tex b/macros/latex/contrib/genealogytree/gtrcore.contour.code.tex index 1d2644f484..b70f50415c 100644 --- a/macros/latex/contrib/genealogytree/gtrcore.contour.code.tex +++ b/macros/latex/contrib/genealogytree/gtrcore.contour.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.contour.code.tex: Contours %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} %%%%%%%%%%%%%%%%%%%%%%% %% Contour diff --git a/macros/latex/contrib/genealogytree/gtrcore.drawing.code.tex b/macros/latex/contrib/genealogytree/gtrcore.drawing.code.tex index effbc01f08..3f750e241b 100644 --- a/macros/latex/contrib/genealogytree/gtrcore.drawing.code.tex +++ b/macros/latex/contrib/genealogytree/gtrcore.drawing.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.drawing.code.tex: Drawing %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} %%%%%%%%%%%%%%%%%%%%%%% %% Auxiliary Tools diff --git a/macros/latex/contrib/genealogytree/gtrcore.node.code.tex b/macros/latex/contrib/genealogytree/gtrcore.node.code.tex index 2b6c7081cc..a7bd386551 100644 --- a/macros/latex/contrib/genealogytree/gtrcore.node.code.tex +++ b/macros/latex/contrib/genealogytree/gtrcore.node.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.node.code.tex: Node Boxes %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} %%%%%%%%%%%%%% % Processors % @@ -1272,13 +1272,27 @@ \ifdefvoid{\gtrDBimage}{#2}{#1}% } -\def\gtrincludeDBimage#1{% - \begingroup\edef\x{\endgroup\noexpand\includegraphics[\gtrDBimageopt,#1]}\x{\gtrDBimage}% -} +\ExplSyntaxOn + +\NewDocumentCommand \gtrincludeDBimage { m } + { + \exp_last_unbraced:NNV \includegraphics [ \gtrDBimageopt, #1 ] { \gtrDBimage } + } + +\tikzset + { + fill@gtrDB@image@options/.code= + { + \tl_set:Nx \l_tmpa_tl { fill~image~options = { \exp_not:V \gtrDBimageopt } } + \pgfkeysalsofrom { \l_tmpa_tl } + } + } + +\ExplSyntaxOff \tikzset{% - fill overzoom DBimage/.style={fill image options=\gtrDBimageopt,fill overzoom image=\gtrDBimage},% - fill zoom DBimage/.style={fill image options=\gtrDBimageopt,fill zoom image=\gtrDBimage},% + fill overzoom DBimage/.style={fill@gtrDB@image@options,fill overzoom image=\gtrDBimage},% + fill zoom DBimage/.style={fill@gtrDB@image@options,fill zoom image=\gtrDBimage},% } \gtrset{% diff --git a/macros/latex/contrib/genealogytree/gtrcore.options.code.tex b/macros/latex/contrib/genealogytree/gtrcore.options.code.tex index cc06b0d245..30b96faa84 100644 --- a/macros/latex/contrib/genealogytree/gtrcore.options.code.tex +++ b/macros/latex/contrib/genealogytree/gtrcore.options.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.options.code.tex: Options %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} %%%%%%%%%%%%%%%%%%%%%%% %% General handling @@ -458,7 +458,7 @@ \let\gtr@parent@@p\gtr@parent@@p@unspecific% }, autofill parents unspecific*/.default=5, - autofill parents unspecific/.code={% + autofill parents unspecific/.style={% autofill parents unspecific*={#1}, ignore level={\the\numexpr#1+1\relax}, }, diff --git a/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex b/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex index ae6c57edce..d8e44d1468 100644 --- a/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex +++ b/macros/latex/contrib/genealogytree/gtrcore.parser.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.parser.code.tex: Parser %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} %% (local) stack implementation \def\gtrnewstack#1{% diff --git a/macros/latex/contrib/genealogytree/gtrcore.processing.code.tex b/macros/latex/contrib/genealogytree/gtrcore.processing.code.tex index e2766e6db5..b00f9a7bce 100644 --- a/macros/latex/contrib/genealogytree/gtrcore.processing.code.tex +++ b/macros/latex/contrib/genealogytree/gtrcore.processing.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.processing.code.tex: Processing %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} %%%%%%%%%%%%%%%%%%%%%%% %% Processing - common %%%%%%%%%%%%%%%%%%%%%%% diff --git a/macros/latex/contrib/genealogytree/gtrcore.symbols.code.tex b/macros/latex/contrib/genealogytree/gtrcore.symbols.code.tex index defe242cfd..526c998371 100644 --- a/macros/latex/contrib/genealogytree/gtrcore.symbols.code.tex +++ b/macros/latex/contrib/genealogytree/gtrcore.symbols.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrcore.symbols.code.tex: Symbols %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} %%%%%%%%%%%%%%%%%%%%%%% %% Symbols diff --git a/macros/latex/contrib/genealogytree/gtrlang.catalan.code.tex b/macros/latex/contrib/genealogytree/gtrlang.catalan.code.tex new file mode 100644 index 0000000000..c101559106 --- /dev/null +++ b/macros/latex/contrib/genealogytree/gtrlang.catalan.code.tex @@ -0,0 +1,87 @@ +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) +%% gtrlang.catalan.code.tex: Catalan language +%% +%% ------------------------------------------------------------------------------------------- +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Translation by Josep Tebe i Ceto <JosepTebe at proton dot me> +%% ------------------------------------------------------------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `author-maintained'. +%% +%% This work consists of all files listed in README +%% +\gtr@set@library@version{2.3.0} + +\gtrset{language@/catalan/.code={% + \gtrset{symlang/.cd, + Born=nascut, + Bornoutofwedlock=nascut fora del matrimoni, + Stillborn=nascut mort, + Diedonbirthday=mort al n\'eixer, + Baptized=batejat, + Engaged=comprom\`es, + Married=casat, + Divorced=divorciat, + Partnership=uni\'o sense matrimoni, + Floruit=per\'iode d'activitat, + Died=mort, + Killed=mort en acci\'o, + Buried=enterrat, + Funeralurn=incinerat, + Female=dona, + Male=home, + Neuter=sexe desconegut + }% + \gtrset{% + month long/.cd, + 01/.initial=gener, + 02/.initial=febrer, + 03/.initial=mar\c{c}, + 04/.initial=abril, + 05/.initial=maig, + 06/.initial=juny, + 07/.initial=juliol, + 08/.initial=agost, + 09/.initial=setembre, + 10/.initial=octubre, + 11/.initial=novembre, + 12/.initial=desembre, + }% + \gtrset{% + month short/.cd, + 01/.initial=gen\protect\dot, + 02/.initial=feb\protect\dot, + 03/.initial=mar\protect\dot, + 04/.initial=abr\protect\dot, + 05/.initial=mai\protect\dot, + 06/.initial=jun\protect\dot, + 07/.initial=jul\protect\dot, + 08/.initial=ago\protect\dot, + 09/.initial=set\protect\dot, + 10/.initial=oct\protect\dot, + 11/.initial=nov\protect\dot, + 12/.initial=des\protect\dot, + }% + \gtrset{% + set@typical@date@format=d month yyyy, + calendar text for=AD is {}{ dC}, + calendar text for=BC is {}{ aC}, + calendar text for=GR is {}{\protect\textsuperscript{greg.}}, + calendar text for=JU is {}{\protect\textsuperscript{jul.}}, + calendar text for=caAD is {ca.~}{ dC}, + calendar text for=caBC is {ca.~}{ aC}, + calendar text for=ca is {ca.~}{}, + date range full={}{ a }{}, + date range before={abans de }{}, + date range after={despr\'es de }{}, + place text={a }{}, + }% +}} diff --git a/macros/latex/contrib/genealogytree/gtrlang.chinese.code.tex b/macros/latex/contrib/genealogytree/gtrlang.chinese.code.tex new file mode 100644 index 0000000000..cd32960c32 --- /dev/null +++ b/macros/latex/contrib/genealogytree/gtrlang.chinese.code.tex @@ -0,0 +1,94 @@ +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) +%% gtrlang.chinese.code.tex: Chinese language-Simplified +%% +%% ------------------------------------------------------------------------------------------- +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Translation by Chen Yanzheng <snbcyz at mail dot ustc dot edu dot cn> +%% ------------------------------------------------------------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `author-maintained'. +%% +%% This work consists of all files listed in README +%% +\gtr@set@library@version{2.3.0} + +\gtrset{language@/chinese/.code={% + \gtrset{symlang/.cd, + Born={出生}, + Bornoutofwedlock={é?žå©šç”Ÿ}, + Stillborn={æ»äº§}, + Diedonbirthday={出生当日æ»äº¡}, + Baptized={å?—æ´—}, + Engaged={订婚}, + Married={结婚}, + Divorced={离婚}, + Partnership={未婚伴侣}, + Floruit={在世时期}, + Died={æ»äº¡}, + Killed={阵亡}, + Buried={下葬}, + Funeralurn={ç?«åŒ–}, + Female={女性}, + Male={男性}, + Neuter={性别ä¸?详/ä¸æ€§} + }% + \gtrset{% + month long/.cd, + 01/.initial=1月, + 02/.initial=2月, + 03/.initial=3月, + 04/.initial=4月, + 05/.initial=5月, + 06/.initial=6月, + 07/.initial=7月, + 08/.initial=8月, + 09/.initial=9月, + 10/.initial=10月, + 11/.initial=11月, + 12/.initial=12月, + }% + \gtrset{% + month short/.cd, + 01/.initial=1\protect\dot, + 02/.initial=2\protect\dot, + 03/.initial=3\protect\dot, + 04/.initial=4\protect\dot, + 05/.initial=5\protect\dot, + 06/.initial=6\protect\dot, + 07/.initial=7\protect\dot, + 08/.initial=8\protect\dot, + 09/.initial=9\protect\dot, + 10/.initial=10\protect\dot, + 11/.initial=11\protect\dot, + 12/.initial=12\protect\dot, + }% + \gtrset{% + set@typical@date@format=yyyy-mm-dd, + calendar text for=AD is {公元}{}, + calendar text for=BC is {公元å‰?}{}, + calendar text for=GR is {æ ¼é‡Œé«˜åˆ©åŽ†}{}, + calendar text for=JU is {儒略历}{}, + calendar text for=caAD is {约公元}{}, + calendar text for=caBC is {约公元å‰?}{}, + calendar text for=ca is {约}{}, + date range full={自}{至}{}, + date range before={}{以å‰?}, + date range after={}{以å?Ž}, + place text={于}{}, + }% +}} +%SPECIAL NOTE:\usepackage{CJK} +%\begin{document} +%\begin{CJK*}{UTF8}{gbsn} +%gbsn IS THE FONT +%CONTENT +%\end{CJK*} +%\end{document} diff --git a/macros/latex/contrib/genealogytree/gtrlang.danish.code.tex b/macros/latex/contrib/genealogytree/gtrlang.danish.code.tex index 1d9a4e52a0..2eb28a73bb 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.danish.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.danish.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.danish.code.tex: Danish language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% Translation by Mikkel Eide Eriksen <mikkel dot eriksen at gmail dot com> %% ------------------------------------------------------------------------------------------- %% @@ -18,7 +18,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/danish/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.dutch.code.tex b/macros/latex/contrib/genealogytree/gtrlang.dutch.code.tex index d38f7791f7..9050865f5e 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.dutch.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.dutch.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.dutch.code.tex: Dutch language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% Translation by Dirk Bosmans <onstrees at myonline be> %% ------------------------------------------------------------------------------------------- %% @@ -18,7 +18,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/dutch/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.english.code.tex b/macros/latex/contrib/genealogytree/gtrlang.english.code.tex index c13b2f4c69..6ab220e854 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.english.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.english.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.english.code.tex: English language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/english/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.french.code.tex b/macros/latex/contrib/genealogytree/gtrlang.french.code.tex index aceff41a25..9e8cdef2c8 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.french.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.french.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.french.code.tex: French language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% Translation by Denis Bitouze <denis dot bitouze at univ-littoral fr> %% ------------------------------------------------------------------------------------------- %% @@ -18,7 +18,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/french/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.german.code.tex b/macros/latex/contrib/genealogytree/gtrlang.german.code.tex index 4d0152a789..b43f8840a0 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.german.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.german.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.german.code.tex: German language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/german/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.italian.code.tex b/macros/latex/contrib/genealogytree/gtrlang.italian.code.tex index ed2b1def4f..9bc9f49725 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.italian.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.italian.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.italian.code.tex: Italian language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% Translation by Andrea Vaccari <ing dot andrea dot vaccari at gmail com> %% ------------------------------------------------------------------------------------------- %% @@ -18,7 +18,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/italian/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.portuguese.code.tex b/macros/latex/contrib/genealogytree/gtrlang.portuguese.code.tex index e67ffb84aa..1065f3bd9c 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.portuguese.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.portuguese.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.portuguese.code.tex: Portuguese language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% Translation by Natan de Almeida Laverde <natanlaverde at gmail dot com> %% ------------------------------------------------------------------------------------------- %% @@ -18,7 +18,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/portuguese/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.spanish.code.tex b/macros/latex/contrib/genealogytree/gtrlang.spanish.code.tex index d2a5bd45d8..358efdb818 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.spanish.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.spanish.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.spanish.code.tex: Spanish language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% Translation by Francisco G. Perez Sanchez <ozo.froid at gmail dot com> %% ------------------------------------------------------------------------------------------- %% @@ -18,7 +18,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/spanish/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlang.swedish.code.tex b/macros/latex/contrib/genealogytree/gtrlang.swedish.code.tex index 18d3e10a63..cfcd43edaa 100644 --- a/macros/latex/contrib/genealogytree/gtrlang.swedish.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlang.swedish.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlang.swedish.code.tex: Swedish language %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% Translation by Per Starbaeck <per at starback.se> %% ------------------------------------------------------------------------------------------- %% @@ -18,7 +18,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \gtrset{language@/swedish/.code={% \gtrset{symlang/.cd, diff --git a/macros/latex/contrib/genealogytree/gtrlib.debug.code.tex b/macros/latex/contrib/genealogytree/gtrlib.debug.code.tex index 80a7ee79ae..b1dfc8c329 100644 --- a/macros/latex/contrib/genealogytree/gtrlib.debug.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlib.debug.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlib.debug.code.tex: Debugger %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \RequirePackage{array,tabularx} \tcbuselibrary{breakable} diff --git a/macros/latex/contrib/genealogytree/gtrlib.fanchart.code.tex b/macros/latex/contrib/genealogytree/gtrlib.fanchart.code.tex index 8c09a9eb45..4aa2dac789 100644 --- a/macros/latex/contrib/genealogytree/gtrlib.fanchart.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlib.fanchart.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlib.fanchart.code.tex: Fancharts %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} \ExplSyntaxOn diff --git a/macros/latex/contrib/genealogytree/gtrlib.templates.code.tex b/macros/latex/contrib/genealogytree/gtrlib.templates.code.tex index b58ace1043..0bbfe4638c 100644 --- a/macros/latex/contrib/genealogytree/gtrlib.templates.code.tex +++ b/macros/latex/contrib/genealogytree/gtrlib.templates.code.tex @@ -1,8 +1,8 @@ -%% The LaTeX package genealogytree - version 2.2.0 (2022/03/17) +%% The LaTeX package genealogytree - version 2.3.0 (2023/03/09) %% gtrlib.templates.code.tex: Templates %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2013-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> +%% Copyright (c) 2013-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de> %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -17,7 +17,7 @@ %% %% This work consists of all files listed in README %% -\gtr@set@library@version{2.2.0} +\gtr@set@library@version{2.3.0} % Templates diff --git a/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md b/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md index 8d789be01c..56f51f6f0d 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md +++ b/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md @@ -5,6 +5,14 @@ first release 0.95a, 2021-02-23 will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), this project uses date-based 'snapshot' version identifiers. +## [2023-03-09] + +### Fixed + - regression data producer in xmp + +### Changed + - removed/reduced fontspec firstaid to avoid clash with new l3backend and with option parsing (issue #47) + ## [2023-02-20] ### Added diff --git a/macros/latex/contrib/pdfmanagement-testphase/README.md b/macros/latex/contrib/pdfmanagement-testphase/README.md index 427ecb77ed..4cf2155174 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/README.md +++ b/macros/latex/contrib/pdfmanagement-testphase/README.md @@ -1,6 +1,6 @@ # LaTeX PDF management testphase bundle -Version: 0.95w, 2023-02-20 +Version: 0.95x, 2023-03-09 This package is used during a test phase to load the new PDF management code of LaTeX. diff --git a/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty index a91b8a348a..dcfba47cc0 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty +++ b/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty @@ -24,7 +24,7 @@ %% This file has the LPPL maintenance status "maintained". %% \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{color-ltx}[2023-02-20 v0.95w +\ProvidesPackage{color-ltx}[2023-03-09 v0.95x Standard LaTeX Color (patched for l3color, part of pdfmanagement-testphase, original version 2022/01/06 v1.3d) (DPC)] \edef\Gin@codes{% \catcode`\noexpand\^^A\the\catcode`\^^A\relax diff --git a/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty index c60ee84fcf..2b08ae1d80 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty +++ b/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty @@ -19,7 +19,7 @@ % % for those people who are interested. \NeedsTeXFormat{LaTeX2e}[2020/10/01] -\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2023-02-20}{0.95w} +\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2023-03-09}{0.95x} {temporay patches to for the colorspace package to test pdfresource management ... UF} % colorspace can define more models, that l3color can't yet handle. diff --git a/macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty deleted file mode 100644 index 01f8530a65..0000000000 --- a/macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty +++ /dev/null @@ -1,3888 +0,0 @@ -%% -%% This is file `fontspec-luatex.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% fontspec.dtx (with options: `fontspec,LU') -%% fontspec-code-load.dtx (with options: `fontspec,LU') -%% fontspec-code-vars.dtx (with options: `fontspec,LU') -%% fontspec-code-msg.dtx (with options: `fontspec,LU') -%% fontspec-code-opening.dtx (with options: `fontspec,LU') -%% fontspec-code-fontload.dtx (with options: `fontspec,LU') -%% fontspec-code-interfaces.dtx (with options: `fontspec,LU') -%% fontspec-code-user.dtx (with options: `fontspec,LU') -%% fontspec-code-api.dtx (with options: `fontspec,LU') -%% fontspec-code-internal.dtx (with options: `fontspec,LU') -%% fontspec-code-opentype.dtx (with options: `fontspec,LU') -%% fontspec-code-graphite.dtx (with options: `fontspec,LU') -%% fontspec-code-keyval.dtx (with options: `fontspec,LU') -%% fontspec-code-feat-opentype.dtx (with options: `fontspec,LU') -%% fontspec-code-scripts.dtx (with options: `fontspec,LU') -%% fontspec-code-lang.dtx (with options: `fontspec,LU') -%% fontspec-code-feat-aat.dtx (with options: `fontspec,LU') -%% fontspec-code-enc.dtx (with options: `fontspec,LU') -%% fontspec-code-math.dtx (with options: `fontspec,LU') -%% fontspec-code-closing.dtx (with options: `fontspec,LU') -%% fontspec-code-xfss.dtx (with options: `fontspec,LU') -%% ------------------------------------------------ -%% The FONTSPEC package <wspr.io/fontspec> -%% ------------------------------------------------ -%% Copyright 2004-2017 Will Robertson, LPPL "maintainer" -%% Copyright 2009-2013 Khaled Hosny -%% ------------------------------------------------ -%% This package is free software and may be redistributed and/or modified under -%% the conditions of the LaTeX Project Public License, version 1.3c or higher -%% (your choice): <http://www.latex-project.org/lppl/>. -%% ------------------------------------------------ -%%^^A%% fontspec.dtx -- part of FONTSPEC <wspr.io/fontspec> -%%^^A%% Metadata for the package, including files and versioning - -\RequirePackage{xparse} -\ProvidesExplPackage{fontspec-luatex-tmp-ltx}% - {2022/01/15}{2023-02-20}{0.95w} - -%%^^A%% fontspec-code-load.dtx -- part of FONTSPEC <wspr.io/fontspec> -%%^^A%% fontspec-code-vars.dtx -- part of FONTSPEC <wspr.io/fontspec> -\bool_new:N \l__fontspec_firsttime_bool -\bool_new:N \l__fontspec_nobf_bool -\bool_new:N \l__fontspec_noit_bool -\bool_new:N \l__fontspec_nosc_bool -\bool_new:N \l__fontspec_check_bool -\bool_new:N \l__fontspec_tfm_bool -\bool_new:N \l__fontspec_atsui_bool -\bool_new:N \l__fontspec_ot_bool -\bool_new:N \l__fontspec_mm_bool -\bool_new:N \l__fontspec_harfbuzz_bool -\bool_new:N \l__fontspec_graphite_bool -\bool_new:N \l__fontspec_fontcfg_bool -\bool_set_true:N \l__fontspec_fontcfg_bool -\bool_new:N \g__fontspec_math_euler_bool -\bool_new:N \g__fontspec_math_lucida_bool -\bool_new:N \g__fontspec_pkg_euler_loaded_bool -\bool_new:N \g__fontspec_cfg_bool -\bool_new:N \g__fontspec_math_bool -\bool_new:N \g__fontspec_euenc_bool -\bool_new:N \l__fontspec_tmpa_bool -\bool_new:N \l__fontspec_disable_defaults_bool -\bool_new:N \l__fontspec_alias_bool -\bool_new:N \l__fontspec_external_bool -\bool_new:N \l__fontspec_defining_encoding_bool -\bool_new:N \l__fontspec_scriptlang_exist_bool -\bool_new:N \g__fontspec_em_normalise_slant_bool -\bool_new:N \l__fontspec_proceed_bool -\bool_new:N \l__fontspec_never_check_bool -\int_new:N \l__fontspec_script_int -\int_new:N \l__fontspec_language_int -\int_new:N \l__fontspec_strnum_int -\int_new:N \l__fontspec_tmp_int -\int_new:N \l__fontspec_tmpa_int -\int_new:N \l__fontspec_tmpb_int -\int_new:N \l__fontspec_tmpc_int -\int_new:N \l__fontspec_em_int -\int_new:N \l__fontspec_emdef_int -\int_new:N \l__fontspec_strong_int -\int_new:N \l__fontspec_strongdef_int -\fp_new:N \l__fontspec_tmpa_fp -\fp_new:N \l__fontspec_tmpb_fp -\dim_new:N \l__fontspec_tmpa_dim -\dim_new:N \l__fontspec_tmpb_dim -\dim_new:N \l__fontspec_tmpc_dim -\seq_new:N \l__fontspec_bf_series_seq -\clist_new:N \g__fontspec_default_fontopts_clist -\clist_new:N \g__fontspec_all_keyval_modules_clist -\clist_new:N \l__fontspec_sizefeat_clist -\clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} -\clist_new:N \l__fontspec_extensions_clist -\clist_new:N \l__fontspec_fontopts_clist -\clist_new:N \l__fontspec_family_fontopts_clist -\clist_new:N \l__fontspec_all_features_clist -\clist_new:N \l__fontspec_leftover_clist -\clist_new:N \l__fontspec_keys_leftover_clist -\clist_new:N \l__fontspec_sizing_leftover_clist -\clist_new:N \l__fontspec_fontfeat_clist -\clist_new:N \l__fontspec_fontfeat_curr_clist -\clist_new:N \l__fontspec_arg_clist -\clist_new:N \l__fontspec_this_feat_clist -\clist_new:N \l__fontspec_fontfeat_up_clist -\clist_new:N \l__fontspec_fontfeat_bf_clist -\clist_new:N \l__fontspec_fontfeat_it_clist -\clist_new:N \l__fontspec_fontfeat_bfit_clist -\clist_new:N \l__fontspec_fontfeat_sl_clist -\clist_new:N \l__fontspec_fontfeat_bfsl_clist -\clist_new:N \l__fontspec_fontfeat_sw_clist -\clist_new:N \l__fontspec_fontfeat_bfsw_clist -\clist_new:N \l__fontspec_fontfeat_sc_clist -\prop_new:N \g__fontspec_fontopts_prop -\prop_new:N \l__fontspec_nfss_prop -\prop_new:N \l__fontspec_nfssfont_prop -\prop_new:N \g__fontspec_OT_features_prop -\prop_new:N \g__fontspec_all_opentype_feature_names_prop -\prop_new:N \g__fontspec_em_prop -\prop_new:N \g__fontspec_strong_prop -\prop_new:N \g__fontspec_fontid_family_prop -\prop_new:N \g__fontspec_family_int_prop -\tl_new:N \l_fontspec_family_tl -\tl_new:N \g_fontspec_encoding_tl -\tl_new:N \l_fontspec_fontname_tl -\tl_clear_new:N \UTFencname -\tl_clear_new:N \cyrillicencoding -\tl_clear_new:N \latinencoding -\tl_new:N \l__fontspec_renderer_tl -\tl_new:N \l__fontspec_mode_tl -\tl_new:N \l__fontspec_shaper_tl -\tl_new:N \g__fontspec_defined_shapes_tl -\tl_new:N \g__fontspec_single_feat_tl -\tl_new:N \l__fontspec_basename_tl -\tl_new:N \g__fontspec_curr_series_tl -\tl_new:N \l__fontspec_curr_fontname_tl -\tl_new:N \l__fontspec_curr_bfname_tl -\tl_new:N \l__fontspec_ext_filename_tl -\tl_new:N \l__fontspec_extension_tl -\tl_new:N \l__fontspec_font_path_tl -\tl_new:N \l__fontspec_fontid_tl -\tl_new:N \l__fontspec_fontname_tl -\tl_new:N \l__fontspec_options_tl -\tl_new:N \l__fontspec_saved_fontname_tl -\tl_new:N \l__fontspec_prev_unicode_name_tl -\tl_new:N \g__fontspec_nfss_enc_tl -\tl_new:N \g__fontspec_nfss_family_tl -\tl_new:N \l__fontspec_nfss_sc_tl -\tl_new:N \l__fontspec_nfss_tl -\tl_new:N \l__fontspec_nfss_fam_tl -\tl_new:N \l__fontspec_size_tl -\tl_new:N \l__fontspec_sizedfont_tl -\tl_new:N \l__fontspec_this_font_tl -\tl_new:N \l__fontspec_ttc_index_tl -\tl_new:N \l__fontspec_smcp_shape_tl -\tl_new:N \l__fontspec_emshape_query_tl -\tl_new:N \l__fontspec_em_switch_tl -\tl_new:N \l__fontspec_strong_switch_tl -\tl_new:N \l__fontspec_tmp_tl -\tl_new:N \l__fontspec_tmpa_tl -\tl_new:N \l__fontspec_tmpb_tl -\tl_new:N \l__fontspec_em_tmp_tl -\tl_new:N \l__fontspec_strong_tmp_tl -\tl_new:N \g__fontspec_mathrm_tl -\tl_new:N \g__fontspec_bfmathrm_tl -\tl_new:N \g__fontspec_mathsf_tl -\tl_new:N \g__fontspec_mathtt_tl -\tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault} -\tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault} -\tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault} -\tl_new:N \l__fontspec_family_label_tl -\tl_new:N \l__fontspec_fake_slant_tl -\tl_new:N \l__fontspec_fake_embolden_tl -\tl_new:N \l__fontspec_fontname_up_tl -\tl_new:N \l__fontspec_fontname_bf_tl -\tl_new:N \l__fontspec_fontname_it_tl -\tl_new:N \l__fontspec_fontname_bfit_tl -\tl_new:N \l__fontspec_fontname_sl_tl -\tl_new:N \l__fontspec_fontname_bfsl_tl -\tl_new:N \l__fontspec_fontname_sw_tl -\tl_new:N \l__fontspec_fontname_bfsw_tl -\tl_new:N \l__fontspec_fontname_sc_tl -\tl_new:N \l__fontspec_script_tl -\tl_new:N \l__fontspec_script_name_tl -\tl_set:Nn \l__fontspec_script_name_tl {CustomDefault} -\tl_new:N \l__fontspec_lang_tl -\tl_new:N \l__fontspec_lang_name_tl -\tl_set:Nn \l__fontspec_lang_name_tl {Default} -\tl_new:N \l__fontspec_scale_tl -\tl_new:N \l__fontspec_hyphenchar_tl -\tl_new:N \l__fontspec_hexcol_tl -\tl_new:N \l__fontspec_opacity_tl -\tl_new:N \l__fontspec_optical_size_tl -\tl_new:N \l__fontspec_mapping_tl -\tl_new:N \l__fontspec_punctspace_adjust_tl -\tl_new:N \l__fontspec_wordspace_adjust_tl -\tl_new:N \l__fontspec_postadjust_tl -\tl_const:Nn \c__fontspec_hexcol_tl {000000} - \tl_const:Nn \c__fontspec_opacity_tl {} -\tl_const:Nn \c__fontspec_postadjust_tl { \l__fontspec_wordspace_adjust_tl \l__fontspec_punctspace_adjust_tl } -\tl_new:N \g__fontspec_rawfeatures_sclist -\tl_new:N \l__fontspec_pre_feat_sclist -\tl_new:N \l__fontspec_rmfamily_family_tl -\tl_new:N \l__fontspec_sffamily_family_tl -\tl_new:N \l__fontspec_ttfamily_family_tl -\tl_new:N \l__fontspec_rmfamily_encoding_tl -\tl_new:N \l__fontspec_sffamily_encoding_tl -\tl_new:N \l__fontspec_ttfamily_encoding_tl - -%%^^A%% fontspec-code-msg.dtx -- part of FONTSPEC <wspr.io/fontspec> -\cs_new:Npn \__fontspec_error:n { \msg_error:nn {fontspec} } -\cs_new:Npn \__fontspec_error:nn { \msg_error:nnn {fontspec} } -\cs_new:Npn \__fontspec_error:nx { \msg_error:nnx {fontspec} } -\cs_new:Npn \__fontspec_error:nxx { \msg_error:nnxx {fontspec} } -\cs_new:Npn \__fontspec_warning:n { \msg_warning:nn {fontspec} } -\cs_new:Npn \__fontspec_warning:nx { \msg_warning:nnx {fontspec} } -\cs_new:Npn \__fontspec_warning:nxx { \msg_warning:nnxx {fontspec} } -\cs_new:Npn \__fontspec_info:n { \msg_info:nn {fontspec} } -\cs_new:Npn \__fontspec_info:nx { \msg_info:nnx {fontspec} } -\cs_new:Npn \__fontspec_info:nxx { \msg_info:nnxx {fontspec} } -\cs_new:Npn \__fontspec_trace:n { \msg_trace:nn {fontspec} } -\cs_generate_variant:Nn \msg_new:nnn {nnx} -\cs_generate_variant:Nn \msg_new:nnnn {nnxx} -\cs_new:Nn \__fontspec_msg_new:nn - { \msg_new:nnx {fontspec} {#1} { \tl_trim_spaces:n {#2} } } -\cs_new:Nn \__fontspec_msg_new:nnn - { \msg_new:nnxx {fontspec} {#1} { \tl_trim_spaces:n {#2} } { \tl_trim_spaces:n {#3} } } -\char_set_catcode_space:n {32} -\__fontspec_msg_new:nn {only-inside-encdef} - { - \exp_not:N #1 can only be used in the second argument - to \string\DeclareUnicodeEncoding. - } -\__fontspec_msg_new:nn {no-size-info} - { - Size information must be supplied.\\ - For example, SizeFeatures={Size={8-12},...}. - } -\__fontspec_msg_new:nnn {font-not-found} - { - The font "#1" cannot be found. - } - { - A font might not be found for many reasons.\\ - Check the spelling, where the font is installed etc. etc.\\\\ - When in doubt, ask someone for help! - } -\__fontspec_msg_new:nnn {rename-feature-not-exist} - { - The feature #1 doesn't appear to be defined. - } - { - It looks like you're trying to rename a feature that doesn't exist. - } -\__fontspec_msg_new:nn {no-glyph} - { - '#1' does not contain glyph #2. - } -\__fontspec_msg_new:nnn {euler-too-late} - { - The euler package must be loaded BEFORE fontspec. - } - { - fontspec only overwrites euler's attempt to - define the maths text fonts if fontspec is - loaded after euler. Type <return> to proceed - with incorrect \string\mathit, \string\mathbf, etc. - } -\__fontspec_msg_new:nnn {no-xcolor} - { - Cannot load named colours without the xcolor package. - } - { - Sorry, I can't do anything to help. Instead of loading - the color package, use xcolor instead. - } -\__fontspec_msg_new:nnn {unknown-color-model} - { - Error loading colour `#1'; unknown colour model. - } - { - Sorry, I can't do anything to help. Please report this error - to my developer with a minimal example that causes the problem. - } -\__fontspec_msg_new:nnn {not-in-addfontfeatures} - { - The "#1" font feature cannot be used in \string\addfontfeatures. - } - { - This is due to how TeX loads fonts; such settings - are global so adding them mid-document within a group causes - confusion. You'll need to define multiple font families to achieve - what you want. - } -\__fontspec_msg_new:nn {tu-clash} - { - I have found the tuenc.def encoding definition file but the TU encoding is not - defined by the LaTeX2e kernel; attempting to correct but you really should update - to the latest version of LaTeX2e. - } -\__fontspec_msg_new:nn {tu-missing} - { - The TU encoding seems to be missing; please update to the latest version of LaTeX2e. - } -\__fontspec_msg_new:nn {addfontfeatures-ignored} - { - \string\addfontfeature (s) ignored \msg_line_context:; - it cannot be used with a font that wasn't selected by a fontspec command.\\ - \\ - The current font is "\use:c{font@name}".\\ - \int_compare:nTF { \clist_count:n {#1} = 1 } - { The requested feature is "#1". } - { The requested features are "#1". } - } -\__fontspec_msg_new:nn {feature-option-overwrite} - { - Option '#2' of font feature '#1' overwritten. - } -\__fontspec_msg_new:nn {ot-tag-too-long} - { - OpenType tag '#1' is too long; script, language, and feature tags must be four characters or fewer. - } -\__fontspec_msg_new:nn {aat-feature-not-exist} - { - '\l_keys_key_tl=\l_keys_value_tl' feature not supported - for AAT font '\l_fontspec_fontname_tl'. - } -\__fontspec_msg_new:nn {aat-feature-not-exist-in-font} - { - AAT feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available - in font '\l_fontspec_fontname_tl'. - } -\__fontspec_msg_new:nn {icu-feature-not-exist} - { - '\l_keys_key_tl=\l_keys_value_tl' feature not supported - for OpenType font '\l_fontspec_fontname_tl' - } -\__fontspec_msg_new:nn {icu-feature-not-exist-in-font} - { - OpenType feature '\l_keys_key_tl=\l_keys_value_tl' (#1) not available - for font '\l_fontspec_fontname_tl' - with script '\l__fontspec_script_name_tl' and language '\l__fontspec_lang_name_tl'. - } -\__fontspec_msg_new:nn {no-opticals} - { - '#1' doesn't appear to have an Optical Size axis. - } -\__fontspec_msg_new:nn {language-not-exist} - { - Language '#1' not available - for font '\l_fontspec_fontname_tl' - with script '\l__fontspec_script_name_tl'. - } -\__fontspec_msg_new:nn {only-xetex-feature} - { - Ignored XeTeX-only feature: '#1'. - } -\__fontspec_msg_new:nn {only-luatex-feature} - { - Ignored LuaTeX-only feature: '#1'. - } -\__fontspec_msg_new:nn {unknown-renderer} - { - Renderer '#1' unknown. Assuming Harfbuzz with 'shaper=#1'. - Please raise a fontspec issue to add this shaper to the interface. - } -\__fontspec_msg_new:nn {no-mapping} - { - Input mapping not supported in LuaTeX. - } -\__fontspec_msg_new:nn {no-mapping-ligtex} - { - Input mapping not supported in LuaTeX.\\ - Use "Ligatures=TeX" instead of "Mapping=tex-text". - } -\__fontspec_msg_new:nn {cm-default-obsolete} - { - The "cm-default" package option is obsolete. - } -\__fontspec_msg_new:nn {font-index-needs-ttc} - { - The "FontIndex" feature is only supported by TTC (TrueType Collection) fonts.\\ - Feature ignored. - } -\__fontspec_msg_new:nn {feat-cannot-remove} - { - The "#1" feature cannot be deactivated. Request ignored. - } -\__fontspec_msg_new:nn {defining-font} - { - Font family '\g__fontspec_nfss_family_tl' created for font '#2' - with options [\l__fontspec_all_features_clist].\\ - \\ - This font family consists of the following NFSS series/shapes:\\ - \g__fontspec_defined_shapes_tl - } -\__fontspec_msg_new:nn {no-font-shape} - { - Could not resolve font "#1" (it probably doesn't exist). - } -\__fontspec_msg_new:nn {set-scale} - { - \l_fontspec_fontname_tl\space scale = \l__fontspec_scale_tl. - } -\__fontspec_msg_new:nn {setup-math} - { - Adjusting the maths setup (use [no-math] to avoid this). - } -\__fontspec_msg_new:nn {no-script} - { - Font "#1" does not contain requested Script "#2". - } -\__fontspec_msg_new:nn {opa-twice} - { - Opacity set twice, in both Colour and Opacity.\\ - Using specification "Opacity=#1". - } -\__fontspec_msg_new:nn {opa-twice-col} - { - Opacity set twice, in both Opacity and Colour.\\ - Using an opacity specification in hex of "#1/FF". - } -\__fontspec_msg_new:nn {bad-colour} - { - Bad colour declaration "#1". - Colour must be one of:\\ - * a named xcolor colour\\ - * a six-digit hex colour RRGGBB\\ - * an eight-digit hex colour RRGGBBTT with opacity - } -\char_set_catcode_ignore:n {32} - -%%^^A%% fontspec-code-opening.dtx -- part of FONTSPEC <wspr.io/fontspec> -\DeclareOption{cm-default} - { - \__fontspec_warning:n {cm-default-obsolete} - } -\DeclareOption {math} { \bool_gset_true:N \g__fontspec_math_bool } -\DeclareOption {no-math} { \bool_gset_false:N \g__fontspec_math_bool } -\DeclareOption {config} { \bool_gset_true:N \g__fontspec_cfg_bool } -\DeclareOption {no-config}{ \bool_gset_false:N \g__fontspec_cfg_bool } -\DeclareOption {euenc} { \bool_gset_true:N \g__fontspec_euenc_bool } -\DeclareOption {tuenc} { \bool_gset_false:N \g__fontspec_euenc_bool } -\DeclareOption {quiet} - { - \msg_redirect_module:nnn { fontspec } { warning } { info } - \msg_redirect_module:nnn { fontspec } { info } { none } - } -\DeclareOption{silent} - { - \msg_redirect_module:nnn { fontspec } { warning } { none } - \msg_redirect_module:nnn { fontspec } { info } { none } - } -\ExecuteOptions{config,math,tuenc} -\ProcessOptions* -\bool_if:NF \g__fontspec_euenc_bool - { - \file_if_exist:nTF {tuenc.def} - { - \cs_if_exist:cF {T@TU} - { - \__fontspec_warning:n {tu-clash} - \DeclareFontEncoding{TU}{}{} - \DeclareFontSubstitution{TU}{lmr}{m}{n} - } - } - { - \__fontspec_warning:n {tu-missing} - \bool_gset_true:N \g__fontspec_euenc_bool - } - } -\bool_if:NTF \g__fontspec_euenc_bool - { - \tl_gset:Nn \g_fontspec_encoding_tl {EU2} - } - { \tl_gset:Nn \g_fontspec_encoding_tl { TU } } -\tl_set:Nn \rmdefault {lmr} -\tl_set:Nn \sfdefault {lmss} -\tl_set:Nn \ttdefault {lmtt} -\RequirePackage[\g_fontspec_encoding_tl]{fontenc} -\tl_set_eq:NN \UTFencname \g_fontspec_encoding_tl % for xunicode if needed -\tl_if_in:NnT \@filelist {.cls} { \normalsize } -\tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl -\tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl -\AtBeginDocument - { - \tl_set_eq:NN \cyrillicencoding \g_fontspec_encoding_tl - \tl_set_eq:NN \latinencoding \g_fontspec_encoding_tl - } -\bool_if:NT \g__fontspec_euenc_bool - { - \cs_set_eq:NN \fontspec_tmp: \XeTeXpicfile - \cs_set:Npn \XeTeXpicfile {} - \RequirePackage{xunicode} - \cs_set_eq:NN \XeTeXpicfile \fontspec_tmp: - } -\cs_new:Npn \FontspecSetCheckBoolTrue { \bool_set_true:N \l__fontspec_check_bool } -\cs_new:Npn \FontspecSetCheckBoolFalse { \bool_set_false:N \l__fontspec_check_bool } -\cs_new:Nn \__fontspec_keys_set_known:nnN - { - \keys_set_known:nnN {#1} {#2} #3 - } -\cs_generate_variant:Nn \__fontspec_keys_set_known:nnN {nx} -\cs_new:Nn \__fontspec_int_mult_truncate:Nn - { - \int_set:Nn #1 { \__dim_eval:w #2 #1 \__dim_eval_end: } - } -\cs_set:Npn \__fontspec_lua_function:ne #1#2 { \lua_now:e { fontspec.#1 ("#2") } } -\cs_set:Npn \__fontspec_lua_function:nee #1#2#3 { \lua_now:e { fontspec.#1 ("#2","#3") } } -\cs_set:Npn \__fontspec_lua_function:neee #1#2#3#4 { \lua_now:e { fontspec.#1 ("#2","#3","#4") } } -\cs_set:Npn \__fontspec_lua_function:neeee #1#2#3#4#5 { \lua_now:e { fontspec.#1 ("#2","#3","#4","#5") } } -\cs_generate_variant:Nn \int_set:Nn {Nv} -\cs_generate_variant:Nn \keys_set:nn {nx} -\cs_generate_variant:Nn \keys_set_known:nnN {nx} -\cs_generate_variant:Nn \prop_put:Nnn {Nxx} -\cs_generate_variant:Nn \prop_put:Nnn {NxV} -\cs_generate_variant:Nn \prop_gput_if_new:Nnn {NxV} -\cs_generate_variant:Nn \prop_gput:Nnn {Nxn} -\cs_generate_variant:Nn \prop_get:NnNT {NxN} -\cs_generate_variant:Nn \prop_get:NnNTF {NxN} -\cs_generate_variant:Nn \str_if_eq:nnTF {nv} -\cs_generate_variant:Nn \tl_if_empty_p:n {e} -\cs_generate_variant:Nn \tl_if_empty:nTF {x} -\cs_generate_variant:Nn \tl_if_empty:nF {x} -\cs_generate_variant:Nn \tl_if_empty:nF {f} -\cs_generate_variant:Nn \tl_if_eq:nnT {ox} -\cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx} - -%%^^A%% fontspec-code-fontload.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\cs_set:Npn \__fontspec_primitive_font_set:Nnn #1#2#3 - { - \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop: - } -\cs_set:Npn \__fontspec_primitive_font_gset:Nnn #1#2#3 - { - \global \font #1 = #2 ~at~ \dim_eval:n {#3} \scan_stop: - } -\cs_set:Npn \__fontspec_font_suppress_not_found_error: - { - \int_set:Nn \suppressfontnotfounderror {1} - } -\prg_set_conditional:Nnn \__fontspec_primitive_font_if_null:N {p,TF,T,F} - { - \ifx #1 \nullfont - \prg_return_true: - \else - \prg_return_false: - \fi - } -\prg_set_conditional:Nnn \__fontspec_primitive_font_set:Nnn {TF,T,F} - { - \__fontspec_primitive_font_set:Nnn #1 {#2} {#3} - \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:} - } -\prg_set_conditional:Nnn \__fontspec_primitive_font_gset:Nnn {TF,T,F} - { - \__fontspec_primitive_font_gset:Nnn #1 {#2} {#3} - \__fontspec_primitive_font_if_null:NTF #1 {\prg_return_false:} {\prg_return_true:} - } -\cs_set:Npn \__fontspec_primitive_font_set:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_set:Nnn } -\cs_set:Npn \__fontspec_primitive_font_set:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_set:NnnF } -\cs_set:Npn \__fontspec_primitive_font_gset:Onn { \exp_last_unbraced:No \__fontspec_primitive_font_gset:Nnn } -\cs_set:Npn \__fontspec_primitive_font_gset:OnnF { \exp_last_unbraced:No \__fontspec_primitive_font_gset:NnnF } -\prg_set_conditional:Nnn \__fontspec_primitive_font_if_exist:n {TF,T,F} - { - \group_begin: - \__fontspec_font_suppress_not_found_error: - \__fontspec_primitive_font_set:Nnn \l__fontspec_primitive_font {#1} { \f@size pt - 1sp } - \__fontspec_primitive_font_if_null:NTF \l__fontspec_primitive_font - { \group_end: \prg_return_false: } - { \group_end: \prg_return_true: } - } -\prg_new_conditional:Nnn \__fontspec_primitive_font_glyph_if_exist:Nn {p,TF,T,F} - { - \tex_iffontchar:D #1 #2 \scan_stop: - \prg_return_true: - \else: - \prg_return_false: - \fi: - } -\cs_new:Nn \__fontspec_primitive_font_set_hyphenchar:Nn - { - \tex_hyphenchar:D #1 = #2 \scan_stop: - } -\cs_new_eq:NN \__fontspec_primitive_font_get_name:N \fontname -\cs_new:Npn \__fontspec_primitive_font_current_name: - { - \__fontspec_primitive_font_get_name:N \tex_font:D - } - -%%^^A%% fontspec-code-interfaces.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\NewDocumentCommand \fontspec { O{} m O{} } - { - \__fontspec_main_fontspec:nn {#1,#3} {#2} - \ignorespaces - } -\NewDocumentCommand \setmainfont { O{} m O{} } - { - \__fontspec_main_setmainfont:nn {#1,#3} {#2} - \ignorespaces - } -\NewDocumentCommand \setsansfont { O{} m O{} } - { - \__fontspec_main_setsansfont:nn {#1,#3} {#2} - \ignorespaces - } -\NewDocumentCommand \setmonofont { O{} m O{} } - { - \__fontspec_main_setmonofont:nn {#1,#3} {#2} - \ignorespaces - } -\NewDocumentCommand \setmathrm { O{} m O{} } - { - \__fontspec_main_setmathrm:nn {#1,#3} {#2} - } -\NewDocumentCommand \setboldmathrm { O{} m O{} } - { - \__fontspec_main_setboldmathrm:nn {#1,#3} {#2} - } -\NewDocumentCommand \setmathsf { O{} m O{} } - { - \__fontspec_main_setmathsf:nn {#1,#3} {#2} - } -\NewDocumentCommand \setmathtt { O{} m O{} } - { - \__fontspec_main_setmathtt:nn {#1,#3} {#2} - } -\NewDocumentCommand \setromanfont { O{} m O{} } - { - \__fontspec_main_setmainfont:nn {#1,#3} {#2} - } -\NewDocumentCommand \newfontfamily { m O{} m O{} } - { - \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \NewDocumentCommand - } -\NewDocumentCommand \renewfontfamily { m O{} m O{} } - { - \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand - } -\NewDocumentCommand \setfontfamily { m O{} m O{} } - { - \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand - } -\NewDocumentCommand \providefontfamily { m O{} m O{} } - { - \__fontspec_main_newfontfamily:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand - } -\NewDocumentCommand \newfontface { m O{} m O{} } - { - \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \NewDocumentCommand - } -\NewDocumentCommand \renewfontface { m O{} m O{} } - { - \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \RenewDocumentCommand - } -\NewDocumentCommand \setfontface { m O{} m O{} } - { - \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \DeclareDocumentCommand - } -\NewDocumentCommand \providefontface { m O{} m O{} } - { - \__fontspec_main_newfontface:NnnN #1 {#2,#4} {#3} \ProvideDocumentCommand - } -\NewDocumentCommand \defaultfontfeatures { t+ o m } - { - \IfNoValueTF {#2} - { \__fontspec_set_default_features:nn {#1} {#3} } - { \__fontspec_set_font_default_features:nnn {#1} {#2} {#3} } - \ignorespaces - } -\NewDocumentCommand \addfontfeatures {m} - { - \__fontspec_main_addfontfeatures:n {#1} - } -\NewDocumentCommand \addfontfeature {m} - { - \__fontspec_main_addfontfeatures:n {#1} - } -\NewDocumentCommand \newfontfeature {mm} - { - \__fontspec_main_newfontfeature:nn {#1} {#2} - } -\NewDocumentCommand \newAATfeature {mmmm} - { - \__fontspec_main_newAATfeature:nnnn {#1} {#2} {#3} {#4} - } -\NewDocumentCommand \newopentypefeature {mmm} - { - \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3} - } -\NewDocumentCommand \newICUfeature {mmm} - { - \__fontspec_main_newopentypefeature:nnn {#1} {#2} {#3} - } -\NewDocumentCommand \aliasfontfeature {mm} - { - \__fontspec_main_aliasfontfeature:nn {#1} {#2} - } -\NewDocumentCommand \aliasfontfeatureoption {mmm} - { - \__fontspec_main_aliasfontfeatureoption:nnn {#1} {#2} {#3} - } -\NewDocumentCommand \newfontscript {mm} - { - \fontspec_new_script:nn {#1} {#2} - } -\NewDocumentCommand \newfontlanguage {mm} - { - \fontspec_new_lang:nn {#1} {#2} - } -\NewDocumentCommand \DeclareFontExtensions {m} - { - \__fontspec_main_DeclareFontExtensions:n {#1} - } -\NewDocumentCommand \IfFontFeatureActiveTF {mmm} - { - \__fontspec_main_IfFontFeatureActiveTF:nnn {#1} {#2} {#3} - } -\AtBeginDocument - { - \RenewDocumentCommand \oldstylenums {m} - { - \__fontspec_main_oldstylenums:n {#1} - } - } -\NewDocumentCommand \liningnums {m} - { - \__fontspec_main_liningnums:n {#1} - } - -%%^^A%% fontspec-code-user.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\cs_new:Nn \__fontspec_main_fontspec:nn - { - \fontspec_set_family:Nnn \f@family {#1} {#2} - \fontencoding { \g__fontspec_nfss_enc_tl } - \selectfont - } -\cs_if_exist:NTF \@rmfamilyhook - { - \tl_put_right:Nn \@rmfamilyhook {\fontencoding \l__fontspec_rmfamily_encoding_tl} - \tl_put_right:Nn \@sffamilyhook {\fontencoding \l__fontspec_sffamily_encoding_tl} - \tl_put_right:Nn \@ttfamilyhook {\fontencoding \l__fontspec_ttfamily_encoding_tl} - } - { - \tl_replace_all:cnn { rmfamily~ } { \fontfamily } - { \fontencoding \l__fontspec_rmfamily_encoding_tl \fontfamily } - \tl_replace_all:cnn { sffamily~ } { \fontfamily } - { \fontencoding \l__fontspec_sffamily_encoding_tl \fontfamily } - \tl_replace_all:cnn { ttfamily~ } { \fontfamily } - { \fontencoding \l__fontspec_ttfamily_encoding_tl \fontfamily } - } -\tl_set:Nn \l__fontspec_rmfamily_encoding_tl { \encodingdefault } -\tl_set:Nn \l__fontspec_sffamily_encoding_tl { \encodingdefault } -\tl_set:Nn \l__fontspec_ttfamily_encoding_tl { \encodingdefault } -\cs_new:Nn \__fontspec_main_setmainfont:nn - { - \ifdefined\DeclareFontSeriesDefault - \DeclareFontSeriesDefault[rm]{bf}{\bfdefault} - \fi - \fontspec_set_family:Nnn \l__fontspec_rmfamily_family_tl {#1} {#2} - \tl_set_eq:NN \rmdefault \l__fontspec_rmfamily_family_tl - \tl_set_eq:NN \l__fontspec_rmfamily_encoding_tl \g__fontspec_nfss_enc_tl - \str_if_eq:eeT {\familydefault} {\rmdefault} - { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } - \__fontspec_setmainfont_hook:nn {#1} {#2} % for unicode-math only - \normalfont - } -\cs_new:Nn \__fontspec_main_setsansfont:nn - { - \ifdefined\DeclareFontSeriesDefault - \DeclareFontSeriesDefault[sf]{bf}{\bfdefault} - \fi - \fontspec_set_family:Nnn \l__fontspec_sffamily_family_tl {#1} {#2} - \tl_set_eq:NN \sfdefault \l__fontspec_sffamily_family_tl - \tl_set_eq:NN \l__fontspec_sffamily_encoding_tl \g__fontspec_nfss_enc_tl - \str_if_eq:eeT {\familydefault} {\sfdefault} - { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } - \__fontspec_setsansfont_hook:nn {#1} {#2} % for unicode-math only - \normalfont - } -\cs_new:Nn \__fontspec_main_setmonofont:nn - { - \ifdefined\DeclareFontSeriesDefault - \DeclareFontSeriesDefault[tt]{bf}{\bfdefault} - \fi - \fontspec_set_family:Nnn \l__fontspec_ttfamily_family_tl {#1} {#2} - \tl_set_eq:NN \ttdefault \l__fontspec_ttfamily_family_tl - \tl_set_eq:NN \l__fontspec_ttfamily_encoding_tl \g__fontspec_nfss_enc_tl - \str_if_eq:eeT {\familydefault} {\ttdefault} - { \tl_set_eq:NN \encodingdefault \g__fontspec_nfss_enc_tl } - \__fontspec_setmonofont_hook:nn {#1} {#2} % for unicode-math only - \normalfont - } -\cs_new:Nn \__fontspec_main_setmathrm:nn - { - \fontspec_gset_family:Nnn \g__fontspec_mathrm_tl {Renderer=Basic,#1} {#2} - \__fontspec_setmathrm_hook:nn {#1} {#2} % for unicode-math only - } -\cs_new:Nn \__fontspec_main_setboldmathrm:nn - { - \fontspec_gset_family:Nnn \g__fontspec_bfmathrm_tl {Renderer=Basic,#1} {#2} - \__fontspec_setboldmathrm_hook:nn {#1} {#2} % for unicode-math only - } -\cs_new:Nn \__fontspec_main_setmathsf:nn - { - \fontspec_gset_family:Nnn \g__fontspec_mathsf_tl {Renderer=Basic,#1} {#2} - \__fontspec_setmathsf_hook:nn {#1} {#2} % for unicode-math only - } -\cs_new:Nn \__fontspec_main_setmathtt:nn - { - \fontspec_gset_family:Nnn \g__fontspec_mathtt_tl {Renderer=Basic,#1} {#2} - \__fontspec_setmathtt_hook:nn {#1} {#2} % for unicode-math only - } -\cs_set_eq:NN \__fontspec_setmainfont_hook:nn \use_none:nn -\cs_set_eq:NN \__fontspec_setsansfont_hook:nn \use_none:nn -\cs_set_eq:NN \__fontspec_setmonofont_hook:nn \use_none:nn -\cs_set_eq:NN \__fontspec_setmathrm_hook:nn \use_none:nn -\cs_set_eq:NN \__fontspec_setmathsf_hook:nn \use_none:nn -\cs_set_eq:NN \__fontspec_setmathtt_hook:nn \use_none:nn -\cs_set_eq:NN \__fontspec_setboldmathrm_hook:nn \use_none:nn -\@onlypreamble\setmathrm -\@onlypreamble\setboldmathrm -\@onlypreamble\setmathsf -\@onlypreamble\setmathtt -\tl_gset:Nn \g__fontspec_mathrm_tl {\rmdefault} -\tl_gset:Nn \g__fontspec_mathsf_tl {\sfdefault} -\tl_gset:Nn \g__fontspec_mathtt_tl {\ttdefault} -\cs_new:Nn \__fontspec_main_newfontfamily:NnnN - { - \fontspec_set_family:cnn { l__fontspec_ \cs_to_str:N #1 _family_tl } {#2} {#3} - \use:x - { - \exp_not:N #4 \exp_not:N #1 {} - { - \exp_not:N \fontfamily { \use:c { l__fontspec_ \cs_to_str:N #1 _family_tl } } - \exp_not:N \fontencoding { \g__fontspec_nfss_enc_tl } - \exp_not:N \selectfont - } - } - } -\cs_new:Nn \__fontspec_main_newfontface:NnnN - { - \__fontspec_main_newfontfamily:NnnN #1 { BoldFont={},ItalicFont={},SmallCapsFont={},#2 } {#3} #4 - } -\cs_new:Nn \__fontspec_set_default_features:nn - { - \IfBooleanTF {#1} \clist_gput_right:Nn \clist_gset:Nn - \g__fontspec_default_fontopts_clist {#2} - } -\cs_new:Nn \__fontspec_set_font_default_features:nnn - { - \clist_map_inline:nn {#2} - { - \tl_if_single:nTF {##1} - { \tl_set:No \l__fontspec_tmp_tl { \cs:w l__fontspec_ \cs_to_str:N ##1 _family_tl\cs_end: } } - { \__fontspec_sanitise_fontname:Nn \l__fontspec_tmp_tl {##1} } - - \IfBooleanTF {#1} - { - \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl - { \tl_clear:N \l__fontspec_tmpb_tl } - \tl_put_right:Nn \l__fontspec_tmpb_tl {#3,} - \prop_gput:NVV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl \l__fontspec_tmpb_tl - } - { - \tl_if_empty:nTF {#3} - { \prop_gremove:NV \g__fontspec_fontopts_prop \l__fontspec_tmp_tl } - { \prop_gput:NVn \g__fontspec_fontopts_prop \l__fontspec_tmp_tl {#3,} } - } - } - } -\cs_new:Nn \__fontspec_main_addfontfeatures:n - { - \fontspec_if_fontspec_font:TF - { - \group_begin: - \keys_set_known:nnN {fontspec-addfeatures} {#1} \l__fontspec_tmp_tl - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {options} \l__fontspec_options_tl - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {fontname} \l__fontspec_fontname_tl - \bool_set_true:N \l__fontspec_disable_defaults_bool - \use:x - { - \__fontspec_select_font_family:nn - { \l__fontspec_options_tl , #1 } {\l__fontspec_fontname_tl} - } - \group_end: - \fontfamily \g__fontspec_nfss_family_tl \selectfont - } - { - \__fontspec_warning:nx {addfontfeatures-ignored} {#1} - } - \ignorespaces - } -\cs_new:Nn \__fontspec_main_newfontfeature:nn - { - \keys_define:nn { fontspec } - { - #1 .code:n = { \__fontspec_update_featstr:n {#2} } - } - } -\cs_new:Nn \__fontspec_main_newAATfeature:nnnn - { - \keys_if_exist:nnF { fontspec } {#1} - { \__fontspec_define_aat_feature_group:n {#1} } - - \keys_if_choice_exist:nnnT {fontspec} {#1} {#2} - { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} } - - \__fontspec_define_aat_feature:nnnn {#1}{#2}{#3}{#4} - } -\cs_new:Nn \__fontspec_main_newopentypefeature:nnn - { - \keys_if_exist:nnF { fontspec / options } {#1} - { \__fontspec_define_opentype_feature_group:n {#1} } - - \keys_if_choice_exist:nnnT {fontspec} {#1} {#2} - { \__fontspec_warning:nxx {feature-option-overwrite} {#1} {#2} } - - \exp_args:Nnnx \__fontspec_define_opentype_feature:nnnnn - {#1} {#2} { \__fontspec_strip_plus_minus:n {#3} } {#3} {} - } -\cs_new:Nn \__fontspec_strip_plus_minus:n { \__fontspec_strip_plus_minus_aux:Nq #1 \q_nil } -\cs_new:Npn \__fontspec_strip_plus_minus_aux:Nq #1#2 \q_nil - { - \str_case:nnF {#1} { {+} {#2} {-} {#2} } {#1#2} - } -\cs_new:Nn \__fontspec_main_aliasfontfeature:nn - { - \bool_set_false:N \l__fontspec_alias_bool - - \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist - { - \keys_if_exist:nnT {##1} {#1} - { - \bool_set_true:N \l__fontspec_alias_bool - \keys_define:nn {##1} - { #2 .code:n = { \keys_set:nn {##1} { #1 = {####1} } } } - } - } - - \bool_if:NF \l__fontspec_alias_bool - { \__fontspec_warning:nx {rename-feature-not-exist} {#1} } - } -\cs_new:Nn \__fontspec_main_aliasfontfeatureoption:nnn - { - \bool_set_false:N \l__fontspec_alias_bool - - \clist_map_inline:Nn \g__fontspec_all_keyval_modules_clist - { - \keys_if_exist:nnT { ##1 / #1 } {#2} - { - \bool_set_true:N \l__fontspec_alias_bool - \keys_define:nn { ##1 / #1 } - { #3 .code:n = { \keys_set:nn {##1} { #1 = {#2} } } } - } - - \keys_if_exist:nnT { ##1 / #1 } {#2Reset} - { - \keys_define:nn { ##1 / #1 } - { #3Reset .code:n = { \keys_set:nn {##1} { #1 = {#2Reset} } } } - } - - \keys_if_exist:nnT { ##1 / #1 } {#2Off} - { - \keys_define:nn { ##1 / #1 } - { #3Off .code:n = { \keys_set:nn {##1} { #1 = {#2Off} } } } - } - } - - \bool_if:NF \l__fontspec_alias_bool - { \__fontspec_warning:nx {rename-feature-not-exist} {#1/#2} } - } -\cs_new:Nn \__fontspec_main_DeclareFontExtensions:n - { - \clist_set:Nn \l__fontspec_extensions_clist { #1 } - } -\__fontspec_main_DeclareFontExtensions:n {.otf,.ttf,.OTF,.TTF,.ttc,.TTC,.dfont} -\cs_new:Nn \__fontspec_main_IfFontFeatureActiveTF:nnn - { - \__fontspec_if_font_feature:nTF {#1} {#2} {#3} - } -\prg_new_conditional:Nnn \__fontspec_if_font_feature:n {TF} - { - \tl_gclear:N \g__fontspec_single_feat_tl - \group_begin: - \__fontspec_font_suppress_not_found_error: - \__fontspec_init: - \bool_set_true:N \l__fontspec_ot_bool - \bool_set_true:N \l__fontspec_never_check_bool - \bool_set_false:N \l__fontspec_firsttime_bool - \clist_clear:N \l__fontspec_fontfeat_clist - \__fontspec_get_features:n {#1} - \group_end: - - - \tl_if_empty:NTF \g__fontspec_single_feat_tl { \prg_return_false: } - { - \exp_args:NV \fontspec_if_current_feature:nTF \g__fontspec_single_feat_tl - { \prg_return_true: } { \prg_return_false: } - } - } -\cs_new_protected:Nn \__fontspec_main_oldstylenums:n - { - \group_begin: - \addfontfeature{Numbers=OldStyle} - #1 - \group_end: - } -\cs_new_protected:Nn \__fontspec_main_liningnums:n - { - \group_begin: - \addfontfeature{Numbers=Lining} - #1 - \group_end: - } - -%%^^A%% fontspec-code-api.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\prg_new_conditional:Nnn \fontspec_if_fontspec_font: {TF,T,F} - { - \cs_if_exist:cTF {g__fontspec_fontinfo_ \f@family _prop} \prg_return_true: \prg_return_false: - } -\prg_new_conditional:Nnn \fontspec_if_aat_feature:nn {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_atsui_bool - { - \__fontspec_make_AAT_feature_string:NnnTF \font {#1} {#2} - \prg_return_true: \prg_return_false: - } - { - \prg_return_false: - } - } - { - \prg_return_false: - } - } -\prg_new_conditional:Nnn \fontspec_if_opentype: {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool \prg_return_true: \prg_return_false: - } - { - \prg_return_false: - } - } -\prg_new_conditional:Nnn \fontspec_if_feature:n {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool - { - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl - \int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl} - - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-num} \l__fontspec_tmp_tl - \int_set:Nn \l__fontspec_language_int {\l__fontspec_tmp_tl} - - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_lang_tl - - \__fontspec_check_ot_feat:NnTF \font {#1} {\prg_return_true:} {\prg_return_false:} - } - { - \prg_return_false: - } - } - { - \prg_return_false: - } - } -\prg_new_conditional:Nnn \fontspec_if_feature:nnn {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool - { - \__fontspec_check_ot_feat:NnnnTF \font {#3} {#2} {#1} \prg_return_true: \prg_return_false: - } - { \prg_return_false: } - } - { \prg_return_false: } - } -\prg_new_conditional:Nnn \fontspec_if_script:n {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool - { - \__fontspec_check_script:NnTF \font {#1} \prg_return_true: \prg_return_false: - } - { \prg_return_false: } - } - { \prg_return_false: } - } -\prg_new_conditional:Nnn \fontspec_if_language:n {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool - { - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-num} \l__fontspec_tmp_tl - \int_set:Nn \l__fontspec_script_int {\l__fontspec_tmp_tl} - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_script_tl - - \__fontspec_check_lang:NnTF \font {#1} \prg_return_true: \prg_return_false: - } - { \prg_return_false: } - } - { \prg_return_false: } - } -\prg_new_conditional:Nnn \fontspec_if_language:nn {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool - { - \__fontspec_check_lang:NnnTF \font {#2} {#1} \prg_return_true: \prg_return_false: - } - { \prg_return_false: } - } - { \prg_return_false: } - } -\prg_new_conditional:Nnn \fontspec_if_current_script:n {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool - { - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {script-tag} \l__fontspec_tmp_tl - \str_if_eq:nVTF {#1} \l__fontspec_tmp_tl - {\prg_return_true:} {\prg_return_false:} - } - { \prg_return_false: } - } - { \prg_return_false: } - } -\prg_new_conditional:Nnn \fontspec_if_current_language:n {TF,T,F} - { - \fontspec_if_fontspec_font:TF - { - \__fontspec_set_font_type:N \font - \bool_if:NTF \l__fontspec_ot_bool - { - \prop_get:cnN {g__fontspec_fontinfo_ \f@family _prop} {lang-tag} \l__fontspec_tmp_tl - \str_if_eq:nVTF {#1} \l__fontspec_tmp_tl - {\prg_return_true:} {\prg_return_false:} - } - { \prg_return_false: } - } - { \prg_return_false: } - } -\cs_new:Nn \__fontspec_tl_new_if_free:N { \tl_if_exist:NF #1 { \tl_new:N #1 } } -\cs_new:Nn \__fontspec_set_family:NnnN - { - \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset - \tl_set:Nn \l__fontspec_family_label_tl {#1} - \__fontspec_select_font_family:nn {#2} {#3} - \__fontspec_tl_new_if_free:N #1 - #4 #1 \l_fontspec_family_tl - \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset - } -\cs_new:Nn \fontspec_gset_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_gset_eq:NN } -\cs_new:Nn \fontspec_set_family:Nnn { \__fontspec_set_family:NnnN #1 {#2} {#3} \tl_set_eq:NN } -\cs_generate_variant:Nn \fontspec_set_family:Nnn {c} -\tl_new:N \l__fontspec_fontface_cs_tl -\tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} -\cs_new:Nn \__fontspec_set_fontface:NNnnN - { - \tl_set:Nn \l__fontspec_fontface_cs_tl {#1} - \tl_set:Nn \l__fontspec_family_label_tl {#2} - \__fontspec_select_font_family:nn {#3} {#4} - #5 #2 \l_fontspec_family_tl - \tl_set:Nn \l__fontspec_fontface_cs_tl {\l_fontspec_font} % reset - } -\cs_new:Nn \fontspec_gset_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_gset_eq:NN } -\cs_new:Nn \fontspec_set_fontface:NNnn { \__fontspec_set_fontface:NNnnN #1 #2 {#3} {#4} \tl_set_eq:NN } -\prg_new_conditional:Nnn \fontspec_font_if_exist:n {TF,T,F} - { - \group_begin: - \__fontspec_init: - \__fontspec_if_detect_external:nT {#1} { \__fontspec_font_is_file: } - \__fontspec_primitive_font_if_exist:nTF { \__fontspec_construct_font_call:nn {#1} {} } - { \group_end: \prg_return_true: } - { \group_end: \prg_return_false: } - } -\cs_set_eq:NN \IfFontExistsTF \fontspec_font_if_exist:nTF - -\prg_new_conditional:Nnn \fontspec_if_current_feature:n {TF,T,F} - { - \exp_args:Nxx \tl_if_in:nnTF - { \__fontspec_primitive_font_current_name: } { \tl_to_str:n {#1} } - { \prg_return_true: } { \prg_return_false: } - } -\prg_new_conditional:Nnn \fontspec_if_small_caps: {TF,T,F} - { - \__fontspec_if_merge_shape:nTF {sc} - { - \tl_set_eq:Nc \l__fontspec_smcp_shape_tl { \__fontspec_shape_merge:nn {\f@shape} {sc} } - } - { - \tl_set:Nn \l__fontspec_smcp_shape_tl {sc} - } - - \cs_if_exist:cTF { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl } - { - \tl_if_eq:ccTF - { \f@encoding/\f@family/\f@series/\l__fontspec_smcp_shape_tl } - { \f@encoding/\f@family/\f@series/\shapedefault } - { \prg_return_false: } - { \prg_return_true: } - } - { \prg_return_false: } - } - -%%^^A%% fontspec-code-internal.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\cs_new_protected:Nn \__fontspec_select_font_family:nn - { - \group_begin: - \__fontspec_font_suppress_not_found_error: - \__fontspec_init: - - \__fontspec_sanitise_fontname:Nn \l_fontspec_fontname_tl {#2} - \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_up_tl {#2} - \__fontspec_sanitise_fontname:Nn \l__fontspec_basename_tl {#2} - - \__fontspec_if_detect_external:nT {#2} - { \keys_set:nn {fontspec-preparse-external} {Path} } - - \keys_set_known:nn {fontspec-preparse-cfg} {#1} - - \__fontspec_init_ttc:n {#2} - \__fontspec_load_external_fontoptions:N \l_fontspec_fontname_tl - - \__fontspec_extract_all_features:n {#1} - \tl_set:Nx \l__fontspec_fontid_tl { \tl_to_str:N \l_fontspec_fontname_tl-:-\tl_to_str:N \l__fontspec_all_features_clist } - - - \__fontspec_preparse_features: - \__fontspec_load_font: - \__fontspec_set_scriptlang: - \__fontspec_get_features:n {} - \bool_set_false:N \l__fontspec_firsttime_bool - - \__fontspec_save_family_needed:nTF {#2} - { - \__fontspec_save_family:nn {#1} {#2} - } - { - } - \group_end: - - \tl_set_eq:NN \l_fontspec_family_tl \g__fontspec_nfss_family_tl - } -\cs_set_eq:NN \fontspec_select:nn \__fontspec_select_font_family:nn %% deprecated, for compatibility only -\cs_new:Nn \__fontspec_sanitise_fontname:Nn - { - \tl_set:Nx #1 {#2} - \tl_remove_all:Nn #1 {~} - \clist_map_inline:Nn \l__fontspec_extensions_clist - { - \tl_if_in:NnT #1 {##1} - { - \tl_remove_once:Nn #1 {##1} - \tl_set:Nn \l__fontspec_extension_tl {##1} - \clist_map_break: - } - } - } -\prg_new_conditional:Nnn \__fontspec_if_detect_external:n {T} - { - \clist_map_inline:Nn \l__fontspec_extensions_clist - { - \bool_set_false:N \l__fontspec_tmpa_bool - \exp_args:Nx % <- this should be handled earlier - \tl_if_in:nnT {#1 <= end_of_string} {##1 <= end_of_string} - { \bool_set_true:N \l__fontspec_tmpa_bool \clist_map_break: } - } - \bool_if:NTF \l__fontspec_tmpa_bool \prg_return_true: \prg_return_false: - } -\cs_new:Nn \__fontspec_init_ttc:n - { - \str_if_eq:eeT { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc} - { - \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_it_tl {#1} - \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bf_tl {#1} - \__fontspec_sanitise_fontname:Nn \l__fontspec_fontname_bfit_tl {#1} - } - } -\cs_new:Nn \__fontspec_load_external_fontoptions:N - { - \bool_if:NT \l__fontspec_fontcfg_bool - { - \tl_set:Nx \l__fontspec_ext_filename_tl {#1.fontspec} - \tl_remove_all:Nn \l__fontspec_ext_filename_tl {~} - \prop_if_in:NVF \g__fontspec_fontopts_prop #1 - { - \exp_args:No \file_if_exist:nT { \l__fontspec_ext_filename_tl } - { \file_input:n { \l__fontspec_ext_filename_tl } } - } - } - } -\cs_new:Nn \__fontspec_extract_all_features:n - { - \bool_if:NTF \l__fontspec_disable_defaults_bool - { - \clist_set:Nx \l__fontspec_all_features_clist {#1} - } - { - \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist - { \clist_clear:N \l__fontspec_fontopts_clist } - - \prop_get:NVNF \g__fontspec_fontopts_prop \l__fontspec_family_label_tl \l__fontspec_family_fontopts_clist - { \clist_clear:N \l__fontspec_family_fontopts_clist } - \tl_clear:N \l__fontspec_family_label_tl - - \clist_set:Nx \l__fontspec_all_features_clist - { - \g__fontspec_default_fontopts_clist, - \l__fontspec_family_fontopts_clist, - \l__fontspec_fontopts_clist, - #1 - } - } - } -\cs_new:Nn \__fontspec_preparse_features: - { - - \__fontspec_keys_set_known:nxN {fontspec-preparse-external} - { \l__fontspec_all_features_clist } - \l__fontspec_keys_leftover_clist - - \tl_set_eq:NN \l_fontspec_fontname_tl \l__fontspec_fontname_up_tl - \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_keys_leftover_clist} - \l__fontspec_keys_leftover_clist - \__fontspec_keys_set_known:nxN {fontspec-preparse} {\l__fontspec_keys_leftover_clist} - \l__fontspec_fontfeat_clist - } -\cs_new:Nn \__fontspec_load_font: - { - - \__fontspec_primitive_font_set:NnnF \l__fontspec_test_font - { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } } - { \f@size pt - 2sp } - { \__fontspec_error:nx {font-not-found} {\l__fontspec_fontname_up_tl} } - - \__fontspec_set_font_type:N \l__fontspec_test_font - \__fontspec_primitive_font_gset:Onn \l__fontspec_fontface_cs_tl - { \__fontspec_construct_font_call:nn { \l__fontspec_fontname_up_tl } { \l__fontspec_pre_feat_sclist } } - { \f@size pt + 2sp } - - \l__fontspec_fontface_cs_tl % this is necessary for LuaLaTeX to check the scripts properly - - } -\cs_new:Nn \__fontspec_construct_font_call:nnnnnn - { - " \__fontspec_fontname_wrap:n { #1 #2 } #3 - #4 #5 - \str_if_eq:eeF {#6}{} {:#6} " - } -\cs_new:Nn \__fontspec_construct_font_call:nn - { - \__fontspec_construct_font_call:nnnnnn - {#1} - \l__fontspec_extension_tl - \l__fontspec_ttc_index_tl - \l__fontspec_renderer_tl - \l__fontspec_optical_size_tl - {#2} - } -\cs_new:Nn \__fontspec_font_is_name: - { - \cs_set_eq:NN \__fontspec_fontname_wrap:n \use:n - } -\cs_new:Nn \__fontspec_font_is_file: - { - \cs_set:Npn \__fontspec_fontname_wrap:n ##1 { [ \l__fontspec_font_path_tl ##1 ] } - } -\cs_new:Nn \__fontspec_set_scriptlang: - { - \bool_if:NT \l__fontspec_firsttime_bool - { - \tl_if_empty:NF \l__fontspec_script_name_tl - { - \keys_set:nx {fontspec-opentype} {Script=\l__fontspec_script_name_tl} - \keys_set:nx {fontspec-opentype} {Language=\l__fontspec_lang_name_tl} - } - } - } -\cs_new:Nn \__fontspec_get_features:n - { - \__fontspec_init_fontface: - \__fontspec_keys_set_known:nxN {fontspec-renderer} {\l__fontspec_fontfeat_clist,#1} - \l__fontspec_keys_leftover_clist - \__fontspec_keys_set_known:nxN {fontspec} {\l__fontspec_keys_leftover_clist} \l__fontspec_keys_leftover_clist - \keys_set:nV {fontspec-opentype} \l__fontspec_keys_leftover_clist - - \tl_if_empty:NF \l__fontspec_mapping_tl - { \__fontspec_update_featstr:n { mapping = \l__fontspec_mapping_tl } } - - \str_if_eq:eeF { \l__fontspec_hexcol_tl \l__fontspec_opacity_tl } - { \c__fontspec_hexcol_tl \c__fontspec_opacity_tl } - { \__fontspec_update_featstr:n { color = {\l__fontspec_hexcol_tl\l__fontspec_opacity_tl} } } - } -\prg_new_conditional:Nnn \__fontspec_save_family_needed:n { TF } - { - - - \tl_if_empty:NTF \l__fontspec_nfss_fam_tl - { - \prop_get:NVNTF \g__fontspec_fontid_family_prop \l__fontspec_fontid_tl \l__fontspec_tmp_tl - { - \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_tmp_tl - \prg_return_false: - } - { - \tl_set:Nx \l__fontspec_tmp_tl {#1} - \tl_remove_all:Nn \l__fontspec_tmp_tl { ~ } - \__fontspec_save_fontid_family:VV \l__fontspec_fontid_tl \l__fontspec_tmp_tl - \prg_return_true: - } - } - { - \tl_gset_eq:NN \g__fontspec_nfss_family_tl \l__fontspec_nfss_fam_tl - \cs_undefine:c { g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop } - \prg_return_true: - } - } -\cs_new:Nn \__fontspec_save_fontid_family:nn - { - \prop_get:NnNTF \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl - { - \tl_set:Nx \l__fontspec_tmp_tl - { \int_eval:n { \l__fontspec_tmp_tl + 1 } } - } - { \tl_set:Nn \l__fontspec_tmp_tl { 0 } } - \prop_gput:NnV \g__fontspec_family_int_prop {#2} \l__fontspec_tmp_tl - \tl_gset:Nx \g__fontspec_nfss_family_tl { #2 ( \l__fontspec_tmp_tl ) } - \prop_gput:NnV \g__fontspec_fontid_family_prop {#1} \g__fontspec_nfss_family_tl - } -\cs_generate_variant:Nn \__fontspec_save_fontid_family:nn { VV } -\cs_new:Nn \__fontspec_save_family:nn - { - \__fontspec_save_fontinfo:n {#2} - \__fontspec_find_autofonts: - \DeclareFontFamily{\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{} - \__fontspec_set_faces: - \__fontspec_info:nxx {defining-font} {#1} {#2} - } -\cs_new:Nn \__fontspec_save_fontinfo:n - { - \prop_new:c {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} - \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontname} { #1 } - \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {options} { \l__fontspec_all_features_clist } - \prop_gput:cnx {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {fontdef} - { - \__fontspec_construct_font_call:nn {\l_fontspec_fontname_tl} - { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist } - } - \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-num} \l__fontspec_script_int - \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-num} \l__fontspec_language_int - \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {script-tag} \l__fontspec_script_tl - \prop_gput:cnV {g__fontspec_fontinfo_ \g__fontspec_nfss_family_tl _prop} {lang-tag} \l__fontspec_lang_tl - } -\cs_new:Nn \__fontspec_find_autofonts: - { - \bool_if:nF {\l__fontspec_noit_bool || \l__fontspec_nobf_bool} - { - \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_it_tl} {/B} - \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l__fontspec_fontname_bf_tl} {/I} - \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfit_tl {\l_fontspec_fontname_tl} {/BI} - } - - \bool_if:NF \l__fontspec_nobf_bool - { - \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bf_tl {\l_fontspec_fontname_tl} {/B} - } - - \bool_if:NF \l__fontspec_noit_bool - { - \__fontspec_set_autofont:Nnn \l__fontspec_fontname_it_tl {\l_fontspec_fontname_tl} {/I} - } - - \__fontspec_set_autofont:Nnn \l__fontspec_fontname_bfsl_tl {\l__fontspec_fontname_sl_tl} {/B} - } -\cs_new:Nn \__fontspec_set_faces: - { - \__fontspec_add_nfssfont:nnnn \mddefault \shapedefault \l_fontspec_fontname_tl \l__fontspec_fontfeat_up_clist - \__fontspec_add_nfssfont:nnnn \bfdefault \shapedefault \l__fontspec_fontname_bf_tl \l__fontspec_fontfeat_bf_clist - \__fontspec_add_nfssfont:nnnn \mddefault \itdefault \l__fontspec_fontname_it_tl \l__fontspec_fontfeat_it_clist - \__fontspec_add_nfssfont:nnnn \mddefault \sldefault \l__fontspec_fontname_sl_tl \l__fontspec_fontfeat_sl_clist - \__fontspec_add_nfssfont:nnnn \mddefault \swdefault \l__fontspec_fontname_sw_tl \l__fontspec_fontfeat_sw_clist - \__fontspec_add_nfssfont:nnnn \bfdefault \itdefault \l__fontspec_fontname_bfit_tl \l__fontspec_fontfeat_bfit_clist - \__fontspec_add_nfssfont:nnnn \bfdefault \sldefault \l__fontspec_fontname_bfsl_tl \l__fontspec_fontfeat_bfsl_clist - \__fontspec_add_nfssfont:nnnn \bfdefault \swdefault \l__fontspec_fontname_bfsw_tl \l__fontspec_fontfeat_bfsw_clist - \prop_map_inline:Nn \l__fontspec_nfssfont_prop { \__fontspec_set_faces_aux:nnnnn ##2 } - } -\cs_new:Nn \__fontspec_set_faces_aux:nnnnn - { - \fontspec_complete_fontname:Nn \l__fontspec_curr_fontname_tl {#3} - \__fontspec_make_font_shapes:Nnnnn \l__fontspec_curr_fontname_tl {#1} {#2} {#4} {#5} - } -\cs_new:Nn \fontspec_complete_fontname:Nn - { - \tl_set:Nx #1 {#2} - \tl_replace_all:Nnx #1 {*} {\l__fontspec_basename_tl} - \tl_remove_all:Nn #1 {~} - } -\cs_new:Nn \__fontspec_add_nfssfont:nnnn - { - \tl_set:Nx \l__fontspec_this_font_tl {#3} - - \tl_if_empty:xTF {#4} - { \clist_set:Nn \l__fontspec_sizefeat_clist {Size={-}} } - { \__fontspec_keys_set_known:nxN {fontspec-preparse-nested} {#4} \l__fontspec_tmp_tl } - - \tl_if_empty:NF \l__fontspec_this_font_tl - { - \prop_put:Nxx \l__fontspec_nfssfont_prop {#1/#2} - { {#1}{#2}{\l__fontspec_this_font_tl}{#4}{\l__fontspec_sizefeat_clist} } - } - } -\cs_new:Nn \__fontspec_set_font_type:N - { - \bool_set_true:N \l__fontspec_ot_bool - } -\cs_new:Nn \__fontspec_set_autofont:Nnn - { - \bool_if:NF \l__fontspec_external_bool - { - \tl_if_empty:xF {#2} - { - \tl_if_empty:NT #1 - { - \__fontspec_if_autofont:nnTF {#2} {#3} - { \tl_set:Nx #1 {#2#3} } - { \__fontspec_info:nx {no-font-shape} {#2#3} } - } - } - } - } -\prg_new_conditional:Nnn \__fontspec_if_autofont:nn {T,TF} - { - \group_begin: - \__fontspec_primitive_font_set:Nnn \l__fontspec_tmpa_font { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp } - \__fontspec_primitive_font_set:Nnn \l__fontspec_tmpb_font { \__fontspec_construct_font_call:nn {#1#2} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 1sp } - \str_if_eq:eeTF { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpa_font } { \__fontspec_primitive_font_get_name:N \l__fontspec_tmpb_font } - { \group_end: \prg_return_false: } - { \group_end: \prg_return_true: } - } -\cs_new:Nn \__fontspec_make_font_shapes:Nnnnn - { - \group_begin: - \__fontspec_keys_set_known:nxN {fontspec-preparse-external} { #4 } \l__fontspec_leftover_clist - \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {#1} - \__fontspec_declare_shape:nnxx {#2} {#3} { \l__fontspec_fontopts_clist, \l__fontspec_leftover_clist } {#5} - \group_end: - } -\cs_new:Nn \__fontspec_load_fontname:Nn - { - \__fontspec_sanitise_fontname:Nn #1 {#2} - \__fontspec_load_external_fontoptions:N #1 - \prop_get:NVNF \g__fontspec_fontopts_prop #1 \l__fontspec_fontopts_clist - { \clist_clear:N \l__fontspec_fontopts_clist } - \keys_set_groups:nnV {fontspec/fontname} {getfontname} \l__fontspec_fontopts_clist - \__fontspec_primitive_font_set:OnnF \l__fontspec_fontface_cs_tl - { \__fontspec_construct_font_call:nn {#1} { \l__fontspec_pre_feat_sclist } } { \f@size pt + 2sp } - { \__fontspec_error:nx {font-not-found} {#2} } - } -\keys_define:nn {fontspec/fontname} - { - Font .tl_set:N = \l_fontspec_fontname_tl , - Font .groups:n = {getfontname} , - } -\cs_new:Nn \__fontspec_declare_shape:nnnn - { - \tl_build_begin:N \l__fontspec_nfss_tl - \tl_build_begin:N \l__fontspec_nfss_sc_tl - \tl_set_eq:NN \l__fontspec_saved_fontname_tl \l_fontspec_fontname_tl - - \exp_args:Nx \clist_map_inline:nn {#4} { \__fontspec_setup_single_size:nn {#3} {##1} } - - \tl_build_end:N \l__fontspec_nfss_tl - \tl_build_end:N \l__fontspec_nfss_sc_tl - - \__fontspec_declare_shapes_normal:nn {#1} {#2} - \__fontspec_declare_shapes_smcaps:nn {#1} {#2} - \__fontspec_declare_shape_slanted:nn {#1} {#2} - \__fontspec_declare_shapes_bx:nn {#1} {#2} - \__fontspec_declare_shape_loginfo:nn {#1} {#2} - } -\cs_generate_variant:Nn \__fontspec_declare_shape:nnnn {nnxx} -\cs_new:Nn \__fontspec_setup_single_size:nn - { - \tl_clear:N \l__fontspec_size_tl - \tl_set_eq:NN \l__fontspec_sizedfont_tl \l__fontspec_saved_fontname_tl % in case not spec'ed - - \keys_set_known:nxN {fontspec-sizing} { \exp_after:wN \use:n #2 } - \l__fontspec_sizing_leftover_clist - \tl_if_empty:NT \l__fontspec_size_tl { \__fontspec_error:n {no-size-info} } - - % "normal" - \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_sizedfont_tl} - \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_tl {#1} {\l__fontspec_sizing_leftover_clist} {} - - % small caps - \clist_set_eq:NN \l__fontspec_fontfeat_curr_clist \l__fontspec_fontfeat_sc_clist - - \bool_if:NF \l__fontspec_nosc_bool - { - \tl_if_empty:NTF \l__fontspec_fontname_sc_tl - { - \__fontspec_make_smallcaps:TF - { - \clist_put_left:Nn \l__fontspec_fontfeat_curr_clist {Letters=SmallCaps} - } - { - \bool_set_true:N \l__fontspec_nosc_bool - } - } - { \__fontspec_load_fontname:Nn \l_fontspec_fontname_tl {\l__fontspec_fontname_sc_tl} }% local for each size - } - - \bool_if:NF \l__fontspec_nosc_bool - { - \__fontspec_setup_nfss:Nnnn \l__fontspec_nfss_sc_tl - {#1} {\l__fontspec_sizing_leftover_clist} {\l__fontspec_fontfeat_curr_clist} - } - } -\cs_new:Nn \__fontspec_setup_nfss:Nnnn - { - - \__fontspec_get_features:n { #2 , #3 , #4 } - - \tl_if_empty:NF \l__fontspec_scale_tl - { - \tl_set:Nx \l__fontspec_scale_tl { s*[\l__fontspec_scale_tl] } - } - - \tl_build_put_right:Nx #1 - { - <\l__fontspec_size_tl> \l__fontspec_scale_tl - \__fontspec_construct_font_call:nn { \l_fontspec_fontname_tl } - { \l__fontspec_pre_feat_sclist \g__fontspec_rawfeatures_sclist } - } - } -\cs_new:Nn \__fontspec_declare_shapes_normal:nn - { - \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} - {#1} {#2} {\l__fontspec_nfss_tl}{\l__fontspec_postadjust_tl} - } -\cs_new:Nn \__fontspec_declare_shapes_smcaps:nn - { - \tl_if_empty:NF \l__fontspec_nfss_sc_tl - { - \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} {#1} - { \__fontspec_combo_sc_shape:n {#2} } {\l__fontspec_nfss_sc_tl} {\l__fontspec_postadjust_tl} - } - } -\cs_new:Nn \__fontspec_combo_sc_shape:n - { - \tl_if_exist:cTF { \__fontspec_shape_merge:nn {#1} {\scdefault} } - { \tl_use:c { \__fontspec_shape_merge:nn {#1} {\scdefault} } } - { \scdefault#1 } - } -\cs_new:Nn \__fontspec_DeclareFontShape:nnnnnn - { -\group_begin: -\normalsize -\cs_undefine:c {#1/#2/#3/#4/\f@size} -\group_end: -\DeclareFontShape{#1}{#2}{#3}{#4}{#5}{#6} - } -\cs_generate_variant:Nn \__fontspec_DeclareFontShape:nnnnnn {xxxxxx} -\cs_new:Nn \__fontspec_declare_shape_slanted:nn - { - \bool_if:nT - { - \str_if_eq_p:ee {#2} {\itdefault} && - !(\str_if_eq_p:ee {\itdefault} {\sldefault}) - } - { - \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl}{\g__fontspec_nfss_family_tl}{#1}{\sldefault} - {<->ssub*\g__fontspec_nfss_family_tl/#1/\itdefault}{\l__fontspec_postadjust_tl} - } - } -\cs_new:Nn \__fontspec_declare_shapes_bx:nn - { - \bool_if:nT - { - \str_if_eq_p:ee {#1} {\bfdefault} && - !(\str_if_eq_p:ee {\bfdefault} {bx}) - } - { - % bx/? - \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} - {bx} {#2} - { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 } - { \l__fontspec_postadjust_tl } - - % bx/sc -> b/sc - \tl_if_empty:NF \l__fontspec_nfss_sc_tl - { - \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} - {bx} { \__fontspec_combo_sc_shape:n {#2} } - { <->ssub*\g__fontspec_nfss_family_tl/\bfdefault/#2 } - { \l__fontspec_postadjust_tl } - } - - % bx/sl -> bx/it - \bool_if:nT - { - \str_if_eq_p:ee {#2} {\itdefault} && - !(\str_if_eq_p:ee {\itdefault} {\sldefault}) - } - { - \__fontspec_DeclareFontShape:xxxxxx {\g__fontspec_nfss_enc_tl} {\g__fontspec_nfss_family_tl} - {bx} {\sldefault} - { <->ssub*\g__fontspec_nfss_family_tl/bx/\itdefault } - { \l__fontspec_postadjust_tl } - } - - } - } -\cs_new:Nn \__fontspec_declare_shape_loginfo:nn - { - \tl_gput_right:Nx \g__fontspec_defined_shapes_tl - { - \exp_not:n { \\ } - -~ \exp_not:N \str_case:nn {#1/#2} - { - {\mddefault/\shapedefault} {'normal'~} - {\bfdefault/\shapedefault} {'bold'~} - {\mddefault/\itdefault} {'italic'~} - {\mddefault/\sldefault} {'slanted'~} - {\mddefault/\swdefault} {'swash'~} - {\bfdefault/\itdefault} {'bold~ italic'~} - {\bfdefault/\sldefault} {'bold~ slanted'~} - {\bfdefault/\swdefault} {'bold~ swash'~} - } (#1/#2)~ - with~ NFSS~ spec.:~ - \l__fontspec_nfss_tl - \exp_not:n { \\ } - -~ \exp_not:N \str_case:nn { #1 / \__fontspec_combo_sc_shape:n {#2} } - { - {\mddefault/\scdefault} {'small~ caps'~} - {\bfdefault/\scdefault} {'bold~ small~ caps'~} - {\mddefault/\scitdefault} {'italic~ small~ caps'~} - {\bfdefault/\scitdefault} {'bold~ italic~ small~ caps'~} - {\mddefault/\scsldefault} {'slanted~ small~ caps'~} - {\bfdefault/\scsldefault} {'bold~ slanted~ small~ caps'~} - }~( #1 / \__fontspec_combo_sc_shape:n {#2} )~ - with~ NFSS~ spec.:~ - \l__fontspec_nfss_sc_tl - \tl_if_empty:fF {\l__fontspec_postadjust_tl} - { - \exp_not:N \\ and~ font~ adjustment~ code: - \exp_not:N \\ \l__fontspec_postadjust_tl - } - } - } -\tl_set:Nn \l__fontspec_pre_feat_sclist - { - mode = \l__fontspec_mode_tl ; - \tl_if_empty:NF \l__fontspec_shaper_tl { shaper = \l__fontspec_shaper_tl ; } - \tl_if_empty:NF \l__fontspec_script_tl { script = \l__fontspec_script_tl ; } - \tl_if_empty:NF \l__fontspec_lang_tl { language = \l__fontspec_lang_tl ; } - } -\cs_new:Nn \__fontspec_make_smallcaps:TF - { - \exp_args:No \__fontspec_check_ot_feat:NnTF \l__fontspec_fontface_cs_tl {smcp} {#1} {#2} - } -\cs_new:Nn \__fontspec_update_featstr:n - { - \bool_if:NF \l__fontspec_firsttime_bool - { - \tl_gset:Nx \g__fontspec_single_feat_tl { #1 } - \tl_gput_right:Nx \g__fontspec_rawfeatures_sclist {#1;} - } - } -\cs_new:Nn \__fontspec_remove_clashing_featstr:n - { - \clist_map_inline:nn {#1} - { - \tl_gremove_all:Nn \g__fontspec_rawfeatures_sclist {##1;} - } - } -\cs_generate_variant:Nn \__fontspec_remove_clashing_featstr:n {x} -\cs_set:Npn \__fontspec_init: - { - \bool_set_false:N \l__fontspec_ot_bool - \bool_set_true:N \l__fontspec_firsttime_bool - \__fontspec_font_is_name: - \tl_clear:N \l__fontspec_font_path_tl - \tl_clear:N \l__fontspec_optical_size_tl - \tl_clear:N \l__fontspec_ttc_index_tl - \tl_clear:N \l__fontspec_renderer_tl - \tl_gclear:N \g__fontspec_defined_shapes_tl - \tl_gclear:N \g__fontspec_curr_series_tl - \tl_gset_eq:NN \g__fontspec_nfss_enc_tl \g_fontspec_encoding_tl - \tl_set:Nn \l__fontspec_mode_tl {node} - \int_set:Nn \prehyphenchar { `\- } % fixme - \int_zero:N \posthyphenchar % fixme - \int_zero:N \preexhyphenchar % fixme - \int_zero:N \postexhyphenchar % fixme - } -\cs_new:Nn \__fontspec_init_fontface: - { - \tl_gclear:N \g__fontspec_rawfeatures_sclist - \tl_clear:N \l__fontspec_scale_tl - \tl_set_eq:NN \l__fontspec_opacity_tl \c__fontspec_opacity_tl - \tl_set_eq:NN \l__fontspec_hexcol_tl \c__fontspec_hexcol_tl - \tl_set_eq:NN \l__fontspec_postadjust_tl \c__fontspec_postadjust_tl - \tl_clear:N \l__fontspec_wordspace_adjust_tl - \tl_clear:N \l__fontspec_punctspace_adjust_tl - } -\cs_new_protected:Nn \__fontspec_ot_validate_tag:n - { - \__fontspec_ot_validate_tag:w #1 \q_nil - } -\cs_generate_variant:Nn \__fontspec_ot_validate_tag:n {x} -\cs_set:Npn \__fontspec_ot_validate_tag:w #1 #2 \q_nil - { - \bool_if:nTF { \str_if_eq_p:nn {#1} {+} || \str_if_eq_p:nn {#1} {-} } - { \__fontspec_ot_validate_tag_aux:w #2 \c_empty_tl \c_empty_tl \q_nil } - { \__fontspec_ot_validate_tag_aux:w #1#2 \c_empty_tl \c_empty_tl \q_nil } - } -\cs_set:Npn \__fontspec_ot_validate_tag_aux:w #1#2#3#4#5 \q_nil - { - \int_compare:nT { \tl_count:n {#5} > 2 } - { \__fontspec_error:nx {ot-tag-too-long} {#1#2#3#4#5} } - } - -%%^^A%% fontspec-code-opentype.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\cs_new:Nn \__fontspec_define_opentype_feature_group:n - { - \keys_define:nn {fontspec-opentype} { #1 .multichoice: , .groups:n = {opentype} } - } -\cs_new:Nn \__fontspec_feat_prop_add:nn - { - \tl_if_empty:nF {#1} - { - \prop_if_in:NnF \g__fontspec_OT_features_prop {#1} - { - \prop_gput:Nnn \g__fontspec_OT_features_prop {#1} {#2} - } - } - } -\cs_new:Nn \__fontspec_define_opentype_feature:nnnnn - { - \__fontspec_feat_prop_add:nn {#3} {#1\,=\,#2} - \tl_if_empty:nTF {#4} - { - \keys_define:nn {fontspec-opentype} - { - #1/#2 .code:n = - { \__fontspec_remove_clashing_featstr:n {#5} } , - #1/#2 .groups:n = {opentype} - } - } - { - \keys_define:nn {fontspec-opentype} - { - #1/#2 .code:n = - { - \__fontspec_make_OT_feature:nnn {#3} {#4} {#5} - } , - #1/#2 .groups:n = {opentype} - } - } - } -\cs_new:Nn \__fontspec_feat_off:n {#1Off} -\cs_new:Nn \__fontspec_feat_reset:n {#1Reset} -\cs_new:Nn \__fontspec_define_opentype_onoffreset:nnnnn - { - \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {+#4} {#5} - \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_off:n {#2} } {#3} {-#4} {} - \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {+#4,-#4} - } -\cs_new:Nn \__fontspec_define_opentype_onreset:nnnnn - { - \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} {#2} {#3} {#4} {#5} - \exp_args:Nnx \__fontspec_define_opentype_feature:nnnnn {#1} { \__fontspec_feat_reset:n {#2} } {} {} {#4} - } -\cs_new:Nn \__fontspec_make_OT_feature:nnn - { - - \bool_set_true:N \l__fontspec_proceed_bool - - \tl_if_empty:nF {#1} - { - \exp_args:No \__fontspec_check_ot_feat:NnF \l__fontspec_fontface_cs_tl {#1} - { - \__fontspec_warning:nx {icu-feature-not-exist-in-font} {#1} - \bool_set_false:N \l__fontspec_proceed_bool - } - } - - \__fontspec_remove_clashing_featstr:x { #2 , \__fontspec_swap_plus_minus:n {#2} , #3 } - - \bool_if:NT \l__fontspec_proceed_bool { \__fontspec_update_featstr:n {#2} } - } -\cs_generate_variant:Nn \__fontspec_make_OT_feature:nnn {xxx} -\cs_new:Nn \__fontspec_swap_plus_minus:n { \__fontspec_swap_plus_minus_aux:Nq #1 \q_nil } -\cs_new:Npn \__fontspec_swap_plus_minus_aux:Nq #1#2 \q_nil - { \str_case:nn {#1} { {+} {-#2} {-} {+#2} } } -\prg_new_conditional:Nnn \__fontspec_check_script:Nn {TF,T} - { - \bool_if:NTF \l__fontspec_never_check_bool - { \prg_return_true: } - { - \bool_if:nTF { \tl_if_empty_p:e {#2} } - { \prg_return_false: } - { - \__fontspec_ot_validate_tag:x {#2} - \cs_if_eq:NNTF #1 \font - { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} } - { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} } - \lua_now:e { fontspec.check_ot_script("\l__fontspec_tmp_tl", "#2") } - \bool_if:NTF \l__fontspec_check_bool - { - \prg_return_true: - } - { - \prg_return_false: - } - } - } - } -\prg_new_conditional:Nnn \__fontspec_check_lang:Nn {TF} - { - \__fontspec_check_lang:NnnTF #1 {#2} {\l__fontspec_script_tl} {\prg_return_true:} {\prg_return_false:} - } -\prg_new_conditional:Nnn \__fontspec_check_lang:Nnn {TF} - { - \bool_if:NTF \l__fontspec_never_check_bool - { \prg_return_true: } - { - \bool_if:nTF { \tl_if_empty_p:e {#3} } - { \prg_return_false: } - { - \__fontspec_ot_validate_tag:x {#2} - \__fontspec_ot_validate_tag:x {#3} - \cs_if_eq:NNTF #1 \font - { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} } - { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} } - \__fontspec_lua_function:neee {check_ot_lang} {\l__fontspec_tmp_tl} {#2} {#3} - \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: - } - } - } -\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nn {TF,F} - { - \__fontspec_check_ot_feat:NnnnTF #1 {#2} {\l__fontspec_lang_tl} {\l__fontspec_script_tl} - {\prg_return_true:} {\prg_return_false:} - } -\prg_new_conditional:Nnn \__fontspec_check_ot_feat:Nnnn {TF,F} - { - \bool_if:NTF \l__fontspec_never_check_bool - { \prg_return_true: } - { - \bool_if:nTF { \tl_if_empty_p:e {#3} || \tl_if_empty_p:e {#4} } - { \prg_return_false: } - { - \__fontspec_ot_validate_tag:x {#2} - \__fontspec_ot_validate_tag:x {#3} - \__fontspec_ot_validate_tag:x {#4} - \cs_if_eq:NNTF #1 \font - { \tl_set:Nx \l__fontspec_tmp_tl {\curr@fontshape/\f@size} } - { \tl_set:Nx \l__fontspec_tmp_tl {\cs_to_str:N #1} } - \__fontspec_lua_function:neeee {check_ot_feat} {\l__fontspec_tmp_tl} {#2} {#3} {#4} - \bool_if:NTF \l__fontspec_check_bool \prg_return_true: \prg_return_false: - } - } - } -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {aalt}{Access~All~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvf}{Above-base~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvm}{Above-base~Mark~Positioning} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {abvs}{Above-base~Substitutions} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {afrc}{Alternative~Fractions} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {akhn}{Akhands} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwf}{Below-base~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blwm}{Below-base~Mark~Positioning} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {blws}{Below-base~Substitutions} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {calt}{Contextual~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {case}{Case-Sensitive~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ccmp}{Glyph~Composition~/~Decomposition} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cfar}{Conjunct~Form~After~Ro} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cjct}{Conjunct~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {clig}{Contextual~Ligatures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpct}{Centered~CJK~Punctuation} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cpsp}{Capital~Spacing} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cswh}{Contextual~Swash} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {curs}{Cursive~Positioning} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {cvNN}{Character~Variant~$N$} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2pc}{Petite~Capitals~From~Capitals} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {c2sc}{Small~Capitals~From~Capitals} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dist}{Distances} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dlig}{Discretionary~Ligatures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dnom}{Denominators} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {dtls}{Dotless~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {expt}{Expert~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {falt}{Final~Glyph~on~Line~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin2}{Terminal~Forms~\#2} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fin3}{Terminal~Forms~\#3} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fina}{Terminal~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {flac}{Flattened~accent~forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {frac}{Fractions} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {fwid}{Full~Widths} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {half}{Half~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {haln}{Halant~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {halt}{Alternate~Half~Widths} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hist}{Historical~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hkna}{Horizontal~Kana~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hlig}{Historical~Ligatures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hngl}{Hangul} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hojo}{Hojo~Kanji~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {hwid}{Half~Widths} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {init}{Initial~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {isol}{Isolated~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ital}{Italics} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jalt}{Justification~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp78}{JIS78~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp83}{JIS83~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp90}{JIS90~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {jp04}{JIS2004~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {kern}{Kerning} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lfbd}{Left~Bounds} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {liga}{Standard~Ligatures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ljmo}{Leading~Jamo~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {lnum}{Lining~Figures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {locl}{Localized~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltra}{Left-to-right~alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ltrm}{Left-to-right~mirrored~forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mark}{Mark~Positioning} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {med2}{Medial~Forms~\#2} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {medi}{Medial~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mgrk}{Mathematical~Greek} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mkmk}{Mark~to~Mark~Positioning} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {mset}{Mark~Positioning~via~Substitution} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nalt}{Alternate~Annotation~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nlck}{NLC~Kanji~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {nukt}{Nukta~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {numr}{Numerators} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {onum}{Oldstyle~Figures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {opbd}{Optical~Bounds} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ordn}{Ordinals} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ornm}{Ornaments} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {palt}{Proportional~Alternate~Widths} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pcap}{Petite~Capitals} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pkna}{Proportional~Kana} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pnum}{Proportional~Figures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pref}{Pre-Base~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pres}{Pre-base~Substitutions} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pstf}{Post-base~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {psts}{Post-base~Substitutions} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {pwid}{Proportional~Widths} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {qwid}{Quarter~Widths} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rand}{Randomize} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rclt}{Required~Contextual~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rkrf}{Rakar~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rlig}{Required~Ligatures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rphf}{Reph~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtbd}{Right~Bounds} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtla}{Right-to-left~alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rtlm}{Right-to-left~mirrored~forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ruby}{Ruby~Notation~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {rvrn}{Required~Variation~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {salt}{Stylistic~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sinf}{Scientific~Inferiors} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {size}{Optical~size} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smcp}{Small~Capitals} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {smpl}{Simplified~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssNN}{Stylistic~Set~$N$} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {ssty}{Math~script~style~alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {stch}{Stretching~Glyph~Decomposition} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {subs}{Subscript} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {sups}{Superscript} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {swsh}{Swash} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {titl}{Titling} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tjmo}{Trailing~Jamo~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnam}{Traditional~Name~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {tnum}{Tabular~Figures} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {trad}{Traditional~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {twid}{Third~Widths} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {unic}{Unicase} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {valt}{Alternate~Vertical~Metrics} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vatu}{Vattu~Variants} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vert}{Vertical~Writing} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vhal}{Alternate~Vertical~Half~Metrics} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vjmo}{Vowel~Jamo~Forms} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkna}{Vertical~Kana~Alternates} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vkrn}{Vertical~Kerning} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vpal}{Proportional~Alternate~Vertical~Metrics} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrt2}{Vertical~Alternates~and~Rotation} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {vrtr}{Vertical~Alternates~for~Rotation} -\prop_gput:Nnn \g__fontspec_all_opentype_feature_names_prop {zero}{Slashed~Zero} - -%%^^A%% fontspec-code-graphite.dtx -- part of FONTSPEC <wspr.io/fontspec> - - -%%^^A%% fontspec-code-keyval.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\clist_gset:Nn \g__fontspec_all_keyval_modules_clist - { - fontspec, fontspec-opentype, fontspec-aat, - fontspec-preparse, fontspec-preparse-cfg, fontspec-preparse-external, fontspec-preparse-nested, - fontspec-renderer - } -\cs_new:Nn \__fontspec_keys_define_code:nnn - { - \keys_define:nn {#1} { #2 .code:n = {#3} } - } -\cs_new:Nn \__fontspec_aff_error:n - { - \__fontspec_keys_define_code:nnn {fontspec-addfeatures} {#1} - { \__fontspec_error:nx {not-in-addfontfeatures} {#1} } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-cfg} {IgnoreFontspecFile} - { - \bool_set_false:N \l__fontspec_fontcfg_bool - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {IgnoreFontspecFile} - { - \bool_set_false:N \l__fontspec_fontcfg_bool - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Path} - { - \bool_set_true:N \l__fontspec_nobf_bool - \bool_set_true:N \l__fontspec_noit_bool - \bool_set_true:N \l__fontspec_external_bool - \tl_set:Nn \l__fontspec_font_path_tl {#1} - \__fontspec_font_is_file: - } -\aliasfontfeature{Path}{ExternalLocation} -\__fontspec_keys_define_code:nnn {fontspec} {Path} {} -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {Extension} - { - \tl_set:Nn \l__fontspec_extension_tl {#1} - \bool_if:NF \l__fontspec_external_bool - { - \keys_set:nn {fontspec-preparse-external} {Path} - } - } -\tl_clear:N \l__fontspec_extension_tl -\__fontspec_keys_define_code:nnn {fontspec} {Extension} {} -\keys_define:nn {fontspec-renderer} - { - Renderer .choices:nn = - {Full,Node,Basic,Base,HarfBuzz,Harfbuzz,OpenType,AAT,Graphite} - { - \int_compare:nT {\l_keys_choice_int >= 5} { \bool_set_true:N \l__fontspec_harfbuzz_bool } - - \tl_set:Nx \l__fontspec_mode_tl - { - \int_case:nn \l_keys_choice_int { 1 {node} 2 {node} 3 {base} 4 {base} 5 {harf} 6 {harf} 7 {harf} 8 {harf} 9 {harf}} - } - - \tl_set:Nx \l__fontspec_shaper_tl - { - \int_case:nn \l_keys_choice_int { 1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {ot} 8 {coretext_aat} 9 {graphite2} } - } - - - \tl_gset:Nx \g__fontspec_single_feat_tl - { - mode=\l__fontspec_mode_tl ; - \tl_if_empty:NF \l__fontspec_shaper_tl { shaper=\l__fontspec_shaper_tl} - } - } , - - Renderer unknown .code:n = - { - \bool_set_true:N \l__fontspec_harfbuzz_bool - \__fontspec_warning:nx {unknown-renderer} {#1} - \tl_set:Nn \l__fontspec_mode_tl {harf} - \tl_set:Nn \l__fontspec_shaper_tl {#1} - } , - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {Script} - { - \tl_set:Nn \l__fontspec_script_name_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {Language} - { - \tl_set:Nn \l__fontspec_lang_name_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontIndex} - { - \str_if_eq:eeF { \str_lowercase:f {\l__fontspec_extension_tl} } {.ttc} - { \__fontspec_warning:n {font-index-needs-ttc} } - \tl_set:Nn \l__fontspec_ttc_index_tl {(#1)} - } -\__fontspec_keys_define_code:nnn {fontspec} {FontIndex} - { - \tl_set:Nn \l__fontspec_ttc_index_tl {(#1)} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {UprightFont} - { - \fontspec_complete_fontname:Nn \l__fontspec_fontname_up_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {ItalicFont} - { - \tl_if_empty:nTF {#1} - { - \bool_set_true:N \l__fontspec_noit_bool - } - { - \bool_set_false:N \l__fontspec_noit_bool - \fontspec_complete_fontname:Nn \l__fontspec_fontname_it_tl {#1} - } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SlantedFont} - { - \fontspec_complete_fontname:Nn \l__fontspec_fontname_sl_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {SwashFont} - { - \fontspec_complete_fontname:Nn \l__fontspec_fontname_sw_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldFont} - { - \tl_if_empty:nTF {#1} - { - \bool_set_true:N \l__fontspec_nobf_bool - } - { - \bool_set_false:N \l__fontspec_nobf_bool - \fontspec_complete_fontname:Nn \l__fontspec_curr_bfname_tl {#1} - - \seq_if_empty:NT \l__fontspec_bf_series_seq - { - \tl_gset:Nx \g__fontspec_curr_series_tl {\bfdefault} - \seq_put_right:Nx \l__fontspec_bf_series_seq {\bfdefault} - } - - \tl_if_eq:oxT \g__fontspec_curr_series_tl {\bfdefault} - { - \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l__fontspec_curr_bfname_tl - } - - \prop_put:NxV \l__fontspec_nfss_prop {BoldFont-\g__fontspec_curr_series_tl} \l__fontspec_curr_bfname_tl - - - } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldItalicFont} - { - \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfit_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSlantedFont} - { - \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsl_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-external} {BoldSwashFont} - { - \fontspec_complete_fontname:Nn \l__fontspec_fontname_bfsw_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFont} - { - \tl_if_empty:nTF {#1} - { - \bool_set_true:N \l__fontspec_nosc_bool - } - { - \bool_set_false:N \l__fontspec_nosc_bool - \fontspec_complete_fontname:Nn \l__fontspec_fontname_sc_tl {#1} - } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {UprightFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_up_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {ItalicFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldItalicFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_bfit_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {SlantedFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_sl_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSlantedFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_bfsl_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {SwashFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_sw_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {BoldSwashFeatures} - { - \clist_put_right:Nn \l__fontspec_fontfeat_bfsw_clist {#1} - } -\__fontspec_keys_define_code:nnn {fontspec} {SmallCapsFeatures} - { - \bool_if:NF \l__fontspec_firsttime_bool - { - \clist_put_right:Nn \l__fontspec_fontfeat_sc_clist {#1} - } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {SizeFeatures} - { - \clist_set:Nn \l__fontspec_sizefeat_clist {#1} - \clist_put_right:Nn \l__fontspec_fontfeat_up_clist { SizeFeatures = {#1} } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {SizeFeatures} - { - \clist_set:Nn \l__fontspec_sizefeat_clist {#1} - \tl_if_empty:NT \l__fontspec_this_font_tl - { \tl_set:Nn \l__fontspec_this_font_tl { -- } } % needs to be non-empty as a flag - } -\__fontspec_keys_define_code:nnn {fontspec-preparse-nested} {Font} - { - \tl_set:Nn \l__fontspec_this_font_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec} {SizeFeatures} - { - % dummy - } -\__fontspec_keys_define_code:nnn {fontspec} {Font} - { - % dummy - } -\__fontspec_keys_define_code:nnn {fontspec-sizing} {Size} - { - \tl_set:Nn \l__fontspec_size_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-sizing} {Font} - { - \fontspec_complete_fontname:Nn \l__fontspec_sizedfont_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-opentype} {UprightFont} {} -\__fontspec_keys_define_code:nnn {fontspec-opentype} {ItalicFont} {} -\__fontspec_keys_define_code:nnn {fontspec-opentype} {SlantedFont} {} -\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldFont} {} -\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldItalicFont} {} -\__fontspec_keys_define_code:nnn {fontspec-opentype} {BoldSlantedFont} {} -\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSEncoding} - { - \tl_gset:Nx \g__fontspec_nfss_enc_tl { #1 } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {NFSSFamily} - { - \tl_set:Nx \l__fontspec_nfss_fam_tl { #1 } - } -\__fontspec_keys_define_code:nnn {fontspec-preparse} {FontFace} - { - \tl_clear:N \l__fontspec_this_font_tl - \clist_set:No \l__fontspec_arg_clist { \use_iii:nnn #1 } - \clist_set_eq:NN \l__fontspec_this_feat_clist \l__fontspec_arg_clist - \int_compare:nT { \clist_count:N \l__fontspec_arg_clist = 1 } - { - \tl_if_in:NnF \l__fontspec_arg_clist {=} - { - \tl_set_eq:NN \l__fontspec_this_font_tl \l__fontspec_arg_clist - \tl_clear:N \l__fontspec_this_feat_clist - } - } - - \__fontspec_add_nfssfont:nnnn - {\use_i:nnn #1} {\use_ii:nnn #1} {\l__fontspec_this_font_tl} {\l__fontspec_this_feat_clist} - } -\__fontspec_keys_define_code:nnn {fontspec} {Scale} - { - \str_case:nnF {#1} - { - {MatchLowercase} { \__fontspec_calc_scale:n {5} } - {MatchUppercase} { \__fontspec_calc_scale:n {8} } - } - { \tl_set:Nx \l__fontspec_scale_tl {#1} } - } -\__fontspec_keys_define_code:nnn {fontspec} {ScaleAgain} - { - \tl_if_empty:NT \l__fontspec_scale_tl { \tl_set:Nn \l__fontspec_scale_tl {1} } - \tl_set:Nx \l__fontspec_scale_tl { \fp_eval:n { #1 * \l__fontspec_scale_tl } } - \__fontspec_info:n {set-scale} - } -\cs_new:Nn \__fontspec_calc_scale:n - { - \group_begin: - - \fontencoding { \encodingdefault } - \fontfamily { \familydefault } - \selectfont - - \__fontspec_set_font_dimen:NnN \l__fontspec_tmpa_dim {#1} \font - \__fontspec_set_font_dimen:NnN \l__fontspec_tmpb_dim {#1} \l__fontspec_fontface_cs_tl - - \tl_set:Nx \l__fontspec_scale_tl - { - \fp_eval:n { \dim_to_fp:n {\l__fontspec_tmpa_dim} / - \dim_to_fp:n {\l__fontspec_tmpb_dim} } - } - - \__fontspec_info:n {set-scale} - \exp_args:NNNx - \group_end: - \tl_set:Nx \l__fontspec_scale_tl { \l__fontspec_scale_tl } - } -\cs_new:Nn \__fontspec_set_font_dimen:NnN - { - \dim_set:Nn #1 { \fontdimen #2 #3 } - \dim_compare:nNnT #1 = {0pt} - { - \settoheight #1 - { - \str_if_eq:nnTF {#3} {\font} \rmfamily #3 - \int_case:nnF #2 - { - {5} {x} % x-height - {8} {X} % cap-height - } {?} % "else" clause; never reached. - } - } - } -\__fontspec_keys_define_code:nnn {fontspec} {WordSpace} - { - \bool_if:NF \l__fontspec_firsttime_bool - { \_fontspec_parse_wordspace:w #1,,,\q_stop } - } -\__fontspec_aff_error:n {WordSpace} -\cs_set:Npn \_fontspec_parse_wordspace:w #1,#2,#3,#4 \q_stop - { - \tl_if_empty:nTF {#4} - { - \tl_set:Nn \l__fontspec_wordspace_adjust_tl - { - \fontdimen 2 \font = #1 \fontdimen 2 \font - \fontdimen 3 \font = #1 \fontdimen 3 \font - \fontdimen 4 \font = #1 \fontdimen 4 \font - } - } - { - \tl_set:Nn \l__fontspec_wordspace_adjust_tl - { - \fontdimen 2 \font = #1 \fontdimen 2 \font - \fontdimen 3 \font = #2 \fontdimen 3 \font - \fontdimen 4 \font = #3 \fontdimen 4 \font - } - } - } -\__fontspec_keys_define_code:nnn {fontspec} {PunctuationSpace} - { - \str_case_e:nnF {#1} - { - {WordSpace} - { - \tl_set:Nn \l__fontspec_punctspace_adjust_tl - { \fontdimen 7 \font = 0 \fontdimen 2 \font } - } - {TwiceWordSpace} - { - \tl_set:Nn \l__fontspec_punctspace_adjust_tl - { \fontdimen 7 \font = 1 \fontdimen 2 \font } - } - } - { - \tl_set:Nn \l__fontspec_punctspace_adjust_tl - { \fontdimen 7 \font = #1 \fontdimen 7 \font } - } - } -\__fontspec_aff_error:n {PunctuationSpace} -\__fontspec_keys_define_code:nnn {fontspec} {FontAdjustment} - { - \tl_put_right:Nx \l__fontspec_postadjust_tl {#1} - } -\__fontspec_keys_define_code:nnn {fontspec} {LetterSpace} - { - \__fontspec_update_featstr:n {letterspace=#1} - } -\__fontspec_keys_define_code:nnn {fontspec} {HyphenChar} - { - \str_if_eq:nnTF {#1} {None} - { - \tl_put_right:Nn \l__fontspec_postadjust_tl - { \__fontspec_primitive_font_set_hyphenchar:Nn \font {-1} } - } - { - \__fontspec_warning:nx {only-xetex-feature} {HyphenChar} - - \tl_if_single:nTF {#1} - { \tl_set:Nn \l__fontspec_hyphenchar_tl {`#1} } - { \tl_set:Nn \l__fontspec_hyphenchar_tl { #1} } - - \exp_args:No \__fontspec_primitive_font_glyph_if_exist:NnTF \l__fontspec_fontface_cs_tl {\l__fontspec_hyphenchar_tl} - { - \tl_put_right:Nn \l__fontspec_postadjust_tl - { \__fontspec_primitive_font_set_hyphenchar:Nn \font { \l__fontspec_hyphenchar_tl } } - } - { \__fontspec_error:nxx {no-glyph}{\l_fontspec_fontname_tl}{#1} } - - } - } -\__fontspec_aff_error:n {HyphenChar} -\__fontspec_keys_define_code:nnn {fontspec} {Color} - { - \tl_set:Nn \l__fontspec_hexcol_tl {#1} - } -\cs_set:Npn \fontspec_parse_colour:viii #1#2#3#4#5#6#7#8 - { - \tl_set:Nn \l__fontspec_hexcol_tl {#1#2#3#4#5#6} - \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl - { - \bool_if:NF \l__fontspec_firsttime_bool - { \__fontspec_warning:nx {opa-twice-col} {#7#8} } - } - \tl_set:Nn \l__fontspec_opacity_tl {#7#8} - } -\aliasfontfeature{Color}{Colour} -\__fontspec_keys_define_code:nnn {fontspec} {Opacity} - { - \int_set:Nn \l__fontspec_tmp_int {255} - \__fontspec_int_mult_truncate:Nn \l__fontspec_tmp_int { #1 } - \tl_if_eq:NNF \l__fontspec_opacity_tl \c__fontspec_opacity_tl - { - \bool_if:NF \l__fontspec_firsttime_bool - { \__fontspec_warning:nx {opa-twice} {#1} } - } - \tl_set:Nx \l__fontspec_opacity_tl - { - , - \int_compare:nT { \l__fontspec_tmp_int <= "F } {0} % zero pad - \int_to_hex:n { \l__fontspec_tmp_int } - } - } -\__fontspec_keys_define_code:nnn {fontspec-opentype} {Mapping} - { - \str_if_eq:nnTF {#1} {tex-text} - { - \__fontspec_warning:n {no-mapping-ligtex} - \msg_redirect_name:nnn {fontspec} {no-mapping-ligtex} {none} - \keys_set:nn {fontspec-opentype} { Ligatures=TeX } - } - { \__fontspec_warning:n {no-mapping} } - } -\__fontspec_keys_define_code:nnn {fontspec} {Weight} - { - \__fontspec_update_featstr:n{weight=#1} - } -\__fontspec_keys_define_code:nnn {fontspec} {Width} - { - \__fontspec_update_featstr:n{width=#1} - } -\__fontspec_keys_define_code:nnn {fontspec} {OpticalSize} - { - \tl_set:Nn \l__fontspec_optical_size_tl {/ S = #1} - } -\keys_define:nn {fontspec} - { - FakeSlant .code:n = - { - \__fontspec_update_featstr:n {slant=#1} - }, - FakeSlant .default:n = {0.2} - } -\keys_define:nn {fontspec} - { - FakeStretch .code:n = - { - \__fontspec_update_featstr:n {extend=#1} - }, - FakeStretch .default:n = {1.2} - } -\keys_define:nn {fontspec} - { - FakeBold .code:n = - { - \__fontspec_update_featstr:n {embolden=#1} - }, - FakeBold .default:n = {1.5} - } -\keys_define:nn {fontspec} - { - AutoFakeSlant .code:n = - { - \bool_if:NT \l__fontspec_firsttime_bool - { - \tl_set:Nn \l__fontspec_fake_slant_tl {#1} - \clist_put_right:Nn \l__fontspec_fontfeat_it_clist {FakeSlant=#1} - \tl_set_eq:NN \l__fontspec_fontname_it_tl \l_fontspec_fontname_tl - \bool_set_false:N \l__fontspec_noit_bool - - \tl_if_empty:NF \l__fontspec_fake_embolden_tl - { - \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist - {FakeBold=\l__fontspec_fake_embolden_tl} - \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeSlant=#1} - \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl - } - } - }, - AutoFakeSlant .default:n = {0.2} - } -\keys_define:nn {fontspec} - { - AutoFakeBold .code:n = - { - \bool_if:NT \l__fontspec_firsttime_bool - { - \tl_set:Nn \l__fontspec_fake_embolden_tl {#1} - \clist_put_right:Nn \l__fontspec_fontfeat_bf_clist {FakeBold=#1} - \tl_set_eq:NN \l__fontspec_fontname_bf_tl \l_fontspec_fontname_tl - \bool_set_false:N \l__fontspec_nobf_bool - - \tl_if_empty:NF \l__fontspec_fake_slant_tl - { - \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist - {FakeSlant=\l__fontspec_fake_slant_tl} - \clist_put_right:Nx \l__fontspec_fontfeat_bfit_clist {FakeBold=#1} - \tl_set_eq:NN \l__fontspec_fontname_bfit_tl \l_fontspec_fontname_tl - } - } - }, - AutoFakeBold .default:n = {1.5} - } -\__fontspec_keys_define_code:nnn {fontspec-opentype} {RawFeature} - { - \__fontspec_update_featstr:n {#1} - } -\__fontspec_keys_define_code:nnn {fontspec-aat} {RawFeature} - { - \__fontspec_update_featstr:n {#1} - } - -%%^^A%% fontspec-code-feat-opentype.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\__fontspec_feat_prop_add:nn {salt} { Alternate\,=\,$N$ } -\__fontspec_feat_prop_add:nn {nalt} { Annotation\,=\,$N$ } -\__fontspec_feat_prop_add:nn {ornm} { Ornament\,=\,$N$ } -\__fontspec_feat_prop_add:nn {cvNN} { CharacterVariant\,=\,$N$:$M$ } -\__fontspec_feat_prop_add:nn {ssNN} { StylisticSet\,=\,$N$ } -\__fontspec_define_opentype_feature_group:n {Ligatures} -\__fontspec_define_opentype_feature:nnnnn {Ligatures} {ResetAll} {} {} - { - +dlig,-dlig,+rlig,-rlig,+liga,-liga,+dlig,-dlig,+clig,-clig,+hlig,-hlig, - +tlig,-tlig - } -\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Required} {rlig} {rlig} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Common} {liga} {liga} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Rare} {dlig} {dlig} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Discretionary} {dlig} {dlig} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Contextual} {clig} {clig} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {Historic} {hlig} {hlig} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Ligatures} {TeX} {} {tlig} {} -\__fontspec_define_opentype_feature_group:n {Letters} -\__fontspec_define_opentype_feature:nnnnn {Letters} {ResetAll} {} {} - { - +case,+smcp,+pcap,+c2sc,+c2pc,+unic,+rand, - -case,-smcp,-pcap,-c2sc,-c2pc,-unic,-rand - } -\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Uppercase} {case} {case} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {SmallCaps} {smcp} {smcp} {+pcap,+unic} -\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {PetiteCaps} {pcap} {pcap} {+smcp,+unic} -\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercaseSmallCaps} {c2sc} {c2sc} {+c2pc,+unic} -\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {UppercasePetiteCaps} {c2pc} {c2pc} {+c2sc,+unic} -\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Unicase} {unic} {unic} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Letters} {Random} {rand} {rand} {} -\__fontspec_define_opentype_feature_group:n {Numbers} -\__fontspec_define_opentype_feature:nnnnn {Numbers} {ResetAll} {} {} - { - +tnum,-tnum, - +pnum,-pnum, - +onum,-onum, - +lnum,-lnum, - +zero,-zero, - +anum,-anum, - } -\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Monospaced} {tnum} {tnum} {+pnum,-pnum} -\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Proportional} {pnum} {pnum} {+tnum,-tnum} -\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Lowercase} {onum} {onum} {+lnum,-lnum} -\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Uppercase} {lnum} {lnum} {+onum,-onum} -\__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {SlashedZero} {zero} {zero} {} -\aliasfontfeatureoption {Numbers} {Monospaced} {Tabular} -\aliasfontfeatureoption {Numbers} {Lowercase} {OldStyle} -\aliasfontfeatureoption {Numbers} {Uppercase} {Lining} - \__fontspec_define_opentype_onoffreset:nnnnn {Numbers} {Arabic} {anum} {anum} {} -\__fontspec_define_opentype_feature_group:n {VerticalPosition} -\__fontspec_define_opentype_feature:nnnnn {VerticalPosition} {ResetAll} {} {} - { - +sups,-sups, - +subs,-subs, - +ordn,-ordn, - +numr,-numr, - +dnom,-dnom, - +sinf,-sinf, - } -\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Superior} {sups} {sups} {+subs,+ordn,+numr,+dnom,+sinf} -\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Inferior} {subs} {subs} {+sups,+ordn,+numr,+dnom,+sinf} -\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Ordinal} {ordn} {ordn} {+sups,+subs,+numr,+dnom,+sinf} -\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Numerator} {numr} {numr} {+sups,+subs,+ordn,+dnom,+sinf} -\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {Denominator} {dnom} {dnom} {+sups,+subs,+ordn,+numr,+sinf} -\__fontspec_define_opentype_onoffreset:nnnnn {VerticalPosition} {ScientificInferior} {sinf} {sinf} {+sups,+subs,+ordn,+numr,+dnom} -\__fontspec_define_opentype_feature_group:n {Contextuals} -\__fontspec_define_opentype_feature:nnnnn {Contextuals} {ResetAll} {} {} - { - +cswh,-cswh, - +calt,-calt, - +init,-init, - +fina,-fina, - +falt,-falt, - +medi,-medi, - } -\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Swash} {cswh} {cswh} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Alternate} {calt} {calt} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordInitial} {init} {init} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {WordFinal} {fina} {fina} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {LineFinal} {falt} {falt} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Contextuals} {Inner} {medi} {medi} {} -\__fontspec_define_opentype_feature_group:n {Diacritics} -\__fontspec_define_opentype_feature:nnnnn {Diacritics} {ResetAll} {} {} - { - +mark,-mark, - +mkmk,-mkmk, - +abvm,-abvm, - +blwm,-blwm, - } -\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToBase} {mark} {mark} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {MarkToMark} {mkmk} {mkmk} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {AboveBase} {abvm} {abvm} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Diacritics} {BelowBase} {blwm} {blwm} {} -\__fontspec_define_opentype_feature_group:n {Kerning} -\__fontspec_define_opentype_feature:nnnnn {Kerning} {ResetAll} {} {} - { - +cpsp,-cpsp, - +kern,-kern, - } -\__fontspec_define_opentype_onoffreset:nnnnn {Kerning} {Uppercase} {cpsp} {cpsp} {} -\__fontspec_define_opentype_feature:nnnnn {Kerning} {On} {kern} {+kern} {-kern} -\__fontspec_define_opentype_feature:nnnnn {Kerning} {Off} {kern} {-kern} {+kern} -\__fontspec_define_opentype_feature:nnnnn {Kerning} {Reset} {} {} {+kern,-kern} -\__fontspec_define_opentype_feature_group:n {Fractions} -\__fontspec_define_opentype_feature:nnnnn {Fractions} {ResetAll} {} {} - { - +frac,-frac, - +afrc,-afrc, - } -\__fontspec_define_opentype_feature:nnnnn {Fractions} {On} {frac} {+frac} {} -\__fontspec_define_opentype_feature:nnnnn {Fractions} {Off} {frac} {-frac} {} -\__fontspec_define_opentype_feature:nnnnn {Fractions} {Reset} {} {} {+frac,-frac} -\__fontspec_define_opentype_onoffreset:nnnnn {Fractions} {Alternate} {afrc} {afrc} {-frac} -\__fontspec_define_opentype_feature_group:n {LocalForms} -\__fontspec_define_opentype_feature:nnnnn {LocalForms} {On} {locl} {+locl} {} -\__fontspec_define_opentype_feature:nnnnn {LocalForms} {Off} {locl} {-locl} {} -\__fontspec_define_opentype_feature:nnnnn {LocalForms} {Reset} {} {} {+locl,-locl} - -\__fontspec_define_opentype_feature_group:n {Style} -\__fontspec_define_opentype_feature:nnnnn {Style} {ResetAll} {} {} - { - +salt,-salt, - +ital,-ital, - +ruby,-ruby, - +swsh,-swsh, - +hist,-hist, - +titl,-titl, - +hkna,-hkna, - +vkna,-vkna, - +ssty=0,-ssty=0, - +ssty=1,-ssty=1, - } -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Alternate} {salt} {salt} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Italic} {ital} {ital} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Ruby} {ruby} {ruby} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Swash} {swsh} {swsh} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Cursive} {swsh} {curs} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Historic} {hist} {hist} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Titling} {titl} {titl} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {TitlingCaps} {titl} {titl} {} % backwards compat -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {HorizontalKana} {hkna} {hkna} {+vkna,+pkna} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {VerticalKana} {vkna} {vkna} {+hkna,+pkna} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {ProportionalKana} {pkna} {pkna} {+vkna,+hkna} -\__fontspec_define_opentype_feature:nnnnn {Style} {MathScript} {ssty} {+ssty=0} {+ssty=1} -\__fontspec_define_opentype_feature:nnnnn {Style} {MathScriptScript} {ssty} {+ssty=1} {+ssty=0} -\__fontspec_define_opentype_onoffreset:nnnnn {Style} {Uppercase} {case} {case} {} -\__fontspec_define_opentype_feature_group:n {CJKShape} -\__fontspec_define_opentype_feature:nnnnn {CJKShape} {ResetAll} {} {} - { - +trad,-trad, - +smpl,-smpl, - +jp78,-jp78, - +jp83,-jp83, - +jp90,-jp90, - +jp04,-jp04, - +expt,-expt, - +nlck,-nlck, - } -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Traditional} {trad} {trad} {+smpl,+jp78,+jp83,+jp90,+jp04,+expt,+nlck} -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Simplified} {smpl} {smpl} {+trad,+jp78,+jp83,+jp90,+jp04,+expt,+nlck} -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1978} {jp78} {jp78} {+trad,+smpl,+jp83,+jp90,+jp04,+expt,+nlck} -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1983} {jp83} {jp83} {+trad,+smpl,+jp78,+jp90,+jp04,+expt,+nlck} -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS1990} {jp90} {jp90} {+trad,+smpl,+jp78,+jp83,+jp04,+expt,+nlck} -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {JIS2004} {jp04} {jp04} {+trad,+smpl,+jp78,+jp83,+jp90,+expt,+nlck} -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {Expert} {expt} {expt} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+nlck} -\__fontspec_define_opentype_onoffreset:nnnnn {CJKShape} {NLC} {nlck} {nlck} {+trad,+smpl,+jp78,+jp83,+jp90,+jp04,+expt} -\__fontspec_define_opentype_feature_group:n {CharacterWidth} -\__fontspec_define_opentype_feature:nnnnn {CharacterWidth} {ResetAll} {} {} - { - +pwid,-pwid, - +fwid,-fwid, - +hwid,-hwid, - +twid,-twid, - +qwid,-qwid, - +palt,-palt, - +halt,-halt, - } -\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Proportional} {pwid} {pwid} {+fwid,+hwid,+twid,+qwid,+palt,+halt} -\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Full} {fwid} {fwid} {+pwid,+hwid,+twid,+qwid,+palt,+halt} -\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Half} {hwid} {hwid} {+pwid,+fwid,+twid,+qwid,+palt,+halt} -\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Third} {twid} {twid} {+pwid,+fwid,+hwid,+qwid,+palt,+halt} -\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {Quarter} {qwid} {qwid} {+pwid,+fwid,+hwid,+twid,+palt,+halt} -\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateProportional} {palt} {palt} {+pwid,+fwid,+hwid,+twid,+qwid,+halt} -\__fontspec_define_opentype_onoffreset:nnnnn {CharacterWidth} {AlternateHalf} {halt} {halt} {+pwid,+fwid,+hwid,+twid,+qwid,+palt} -\__fontspec_define_opentype_feature_group:n {Vertical} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {RotatedGlyphs} {vrt2} {vrt2} {+vrtr,+vert} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternatesForRotation} {vrtr} {vrtr} {+vrt2} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Alternates} {vert} {vert} {+vrt2} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {KanaAlternates} {vkna} {vkna} {+hkna} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {Kerning} {vkrn} {vkrn} {} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {AlternateMetrics} {valt} {valt} {+vhal,+vpal,+kern} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {HalfMetrics} {vhal} {vhal} {+valt,+vpal,+kern} -\__fontspec_define_opentype_onoffreset:nnnnn {Vertical} {ProportionalMetrics} {vpal} {vpal} {+valt,+vhal} -\__fontspec_define_opentype_feature_group:n {Alternate} -\keys_define:nn {fontspec-opentype} - { - Alternate .default:n = {0} , - Alternate .groups:n = {opentype}, - Alternate / unknown .code:n = - { - \clist_map_inline:nn {#1} - { \__fontspec_make_OT_feature:nnn {salt}{ +salt = ##1 }{} } - } - } -\keys_define:nn {fontspec-opentype} - { - Alternate / Random .code:n = - { \__fontspec_make_OT_feature:nnn {salt}{ +salt = random }{} } , - } -\aliasfontfeature{Alternate}{StylisticAlternates} -\__fontspec_define_opentype_feature_group:n {Variant} -\keys_define:nn {fontspec-opentype} - { - Variant .default:n = {0} , - Variant .groups:n = {opentype} , - Variant / unknown .code:n = - { - \clist_map_inline:nn {#1} - { - \__fontspec_make_OT_feature:xxx { ss \two@digits {##1} } { +ss \two@digits {##1} } {} - } - } - } -\aliasfontfeature{Variant}{StylisticSet} -\__fontspec_define_opentype_feature_group:n {CharacterVariant} -\use:x - { - \cs_new:Npn \exp_not:N \fontspec_parse_cv:w - ##1 \c_colon_str ##2 \c_colon_str ##3 \exp_not:N \q_nil - { - \__fontspec_make_OT_feature:xxx - { cv \exp_not:N \two@digits {##1} } - { +cv \exp_not:N \two@digits {##1} = ##2 } {} - } - \keys_define:nn {fontspec-opentype} - { - CharacterVariant / unknown .code:n = - { - \clist_map_inline:nn {##1} - { - \exp_not:N \fontspec_parse_cv:w - ####1 \c_colon_str 0 \c_colon_str \exp_not:N \q_nil - } - } - } - } -\__fontspec_define_opentype_feature_group:n {Annotation} -\keys_define:nn {fontspec-opentype} - { - Annotation .default:n = {0} , - Annotation .groups:n = {opentype}, - Annotation / unknown .code:n = - { - \__fontspec_make_OT_feature:nnn {nalt} {+nalt=#1} {} - } - } -\__fontspec_define_opentype_feature_group:n {Ornament} -\keys_define:nn {fontspec-opentype} - { - Ornament .default:n = {0} , - Ornament .groups:n = {opentype}, - Ornament / unknown .code:n = - { - \__fontspec_make_OT_feature:nnn {ornm} { +ornm=#1 } {} - } - } -\keys_define:nn {fontspec-opentype} - { - Script .choice: , - Script .groups:n = {opentype} , - } -\cs_new:Nn \fontspec_new_script:nn - { - \keys_define:nn {fontspec-opentype} { Script / #1 .code:n = - { - \bool_set_false:N \l__fontspec_scriptlang_exist_bool - \clist_map_inline:nn {#2} - { - \exp_args:No \__fontspec_check_script:NnT \l__fontspec_fontface_cs_tl {####1} - { - \tl_set:Nn \l__fontspec_script_name_tl {#1} - \tl_set:Nn \l__fontspec_script_tl {####1} - \int_set:Nn \l__fontspec_script_int {\l__fontspec_strnum_int} - \bool_set_true:N \l__fontspec_scriptlang_exist_bool - \tl_gset:Nx \g__fontspec_single_feat_tl { script=####1 } - \clist_map_break: - } - } - - \bool_if:NF \l__fontspec_scriptlang_exist_bool - { - \bool_if:nF { \str_if_eq_p:ee {#1} {CustomDefault} } - { - \tl_clear:N \l__fontspec_script_name_tl - \__fontspec_warning:nxx {no-script} {\l_fontspec_fontname_tl} {#1} - } - - \bool_if:nF - { - \str_if_eq_p:ee {#1} {Default} || - \str_if_eq_p:ee {#1} {Latin} || - \str_if_eq_p:ee {#1} {CustomDefault} - } - { - \keys_set:nn {fontspec-opentype} { Script = CustomDefault } - } - } - } - } - } -\keys_define:nn {fontspec-opentype} - { - Language .choice: , - Language .groups:n = {opentype} , - } -\cs_new:Nn \fontspec_new_lang:nn - { - \keys_define:nn {fontspec-opentype} { Language / #1 .code:n = - { - \bool_set_false:N \l__fontspec_scriptlang_exist_bool - \clist_map_inline:nn {#2} - { - \exp_args:No \__fontspec_check_lang:NnTF \l__fontspec_fontface_cs_tl {####1} - { - \tl_set:Nn \l__fontspec_lang_tl {####1} - \int_set:Nn \l__fontspec_language_int {\l__fontspec_strnum_int} - \tl_gset:Nx \g__fontspec_single_feat_tl { language=####1 } - \bool_set_true:N \l__fontspec_scriptlang_exist_bool - \clist_map_break: - } - } - \bool_if:NF \l__fontspec_scriptlang_exist_bool - { - \__fontspec_warning:nx {language-not-exist} {#1} - \keys_set:nn {fontspec-opentype} { Language = Default } - } - } - } - } -\__fontspec_keys_define_code:nnn {fontspec-opentype} { Language / Default } - { - \tl_set:Nn \l__fontspec_lang_tl {dflt} - \int_zero:N \l__fontspec_language_int - \tl_gset:Nn \g__fontspec_single_feat_tl { language=dflt } - } -\cs_new:Nn \__fontspec_ot_compat:nn - { - \aliasfontfeatureoption {#1} {#2Off} {No#2} - } -\__fontspec_ot_compat:nn {Ligatures} {Rare} -\__fontspec_ot_compat:nn {Ligatures} {Required} -\__fontspec_ot_compat:nn {Ligatures} {Common} -\__fontspec_ot_compat:nn {Ligatures} {Discretionary} -\__fontspec_ot_compat:nn {Ligatures} {Contextual} -\__fontspec_ot_compat:nn {Ligatures} {Historic} -\__fontspec_ot_compat:nn {Numbers} {SlashedZero} -\__fontspec_ot_compat:nn {Contextuals} {Swash} -\__fontspec_ot_compat:nn {Contextuals} {Alternate} -\__fontspec_ot_compat:nn {Contextuals} {WordInitial} -\__fontspec_ot_compat:nn {Contextuals} {WordFinal} -\__fontspec_ot_compat:nn {Contextuals} {LineFinal} -\__fontspec_ot_compat:nn {Contextuals} {Inner} -\__fontspec_ot_compat:nn {Diacritics} {MarkToBase} -\__fontspec_ot_compat:nn {Diacritics} {MarkToMark} -\__fontspec_ot_compat:nn {Diacritics} {AboveBase} -\__fontspec_ot_compat:nn {Diacritics} {BelowBase} - -%%^^A%% fontspec-code-scripts.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\newfontscript{Adlam}{adlm} -\newfontscript{Ahom}{ahom} -\newfontscript{Anatolian~Hieroglyphs}{hluw} -\newfontscript{Arabic}{arab} -\newfontscript{Armenian}{armn} -\newfontscript{Avestan}{avst} -\newfontscript{Balinese}{bali} -\newfontscript{Bamum}{bamu} -\newfontscript{Bassa~Vah}{bass} -\newfontscript{Batak}{batk} -\newfontscript{Bengali}{bng2,beng} -\newfontscript{Bhaiksuki}{bhks} -\newfontscript{Bopomofo}{bopo} -\newfontscript{Brahmi}{brah} -\newfontscript{Braille}{brai} -\newfontscript{Buginese}{bugi} -\newfontscript{Buhid}{buhd} -\newfontscript{Byzantine~Music}{byzm} -\newfontscript{Canadian~Syllabics}{cans} -\newfontscript{Carian}{cari} -\newfontscript{Caucasian~Albanian}{aghb} -\newfontscript{Chakma}{cakm} -\newfontscript{Cham}{cham} -\newfontscript{Cherokee}{cher} -\newfontscript{Chorasmian}{chrs} -\newfontscript{CJK~Ideographic}{hani} -\newfontscript{Coptic}{copt} -\newfontscript{Cypriot~Syllabary}{cprt} -\newfontscript{Cypro~Minoan}{cpmn} -\newfontscript{Cyrillic}{cyrl} -\newfontscript{Default}{DFLT} -\newfontscript{CustomDefault}{latn,DFLT} -\newfontscript{Deseret}{dsrt} -\newfontscript{Devanagari}{dev2,deva} -\newfontscript{Dives~Akuru}{diak} -\newfontscript{Dogra}{dogr} -\newfontscript{Duployan}{dupl} -\newfontscript{Egyptian~Hieroglyphs}{egyp} -\newfontscript{Elbasan}{elba} -\newfontscript{Elymaic}{elym} -\newfontscript{Ethiopic}{ethi} -\newfontscript{Georgian}{geor} -\newfontscript{Glagolitic}{glag} -\newfontscript{Gothic}{goth} -\newfontscript{Grantha}{gran} -\newfontscript{Greek}{grek} -\newfontscript{Gujarati}{gjr2,gujr} -\newfontscript{Gunjala~Gondi}{gong} -\newfontscript{Gurmukhi}{gur2,guru} -\newfontscript{Hangul~Jamo}{jamo} -\newfontscript{Hangul}{hang} -\newfontscript{Hanifi~Rohingya}{rohg} -\newfontscript{Hanunoo}{hano} -\newfontscript{Hatran}{hatr} -\newfontscript{Hebrew}{hebr} -\newfontscript{Hiragana~and~Katakana}{kana} -\newfontscript{Imperial~Aramaic}{armi} -\newfontscript{Inscriptional~Pahlavi}{phli} -\newfontscript{Inscriptional~Parthian}{prti} -\newfontscript{Javanese}{java} -\newfontscript{Kaithi}{kthi} -\newfontscript{Kannada}{knd2,knda} -\newfontscript{Kayah~Li}{kali} -\newfontscript{Kharosthi}{khar} -\newfontscript{Khitan~Small~Script}{kits} -\newfontscript{Khmer}{khmr} -\newfontscript{Khojki}{khoj} -\newfontscript{Khudawadi}{sind} -\newfontscript{Lao}{lao~} -\newfontscript{Latin}{latn} -\newfontscript{Lepcha}{lepc} -\newfontscript{Limbu}{limb} -\newfontscript{Linear~A}{lina} -\newfontscript{Linear~B}{linb} -\newfontscript{Lisu}{lisu} -\newfontscript{Lycian}{lyci} -\newfontscript{Lydian}{lydi} -\newfontscript{Mahajani}{mahj} -\newfontscript{Makasar}{maka} -\newfontscript{Malayalam}{mlm2,mlym} -\newfontscript{Mandaic}{mand} -\newfontscript{Manichaean}{mani} -\newfontscript{Marchen}{marc} -\newfontscript{Masaram Gondi}{gonm} -\newfontscript{Math}{math} -\newfontscript{Medefaidrin}{medf} -\newfontscript{Meitei~Mayek}{mtei} -\newfontscript{Mende~Kikakui}{mend} -\newfontscript{Meroitic~Cursive}{merc} -\newfontscript{Meroitic~Hieroglyphs}{mero} -\newfontscript{Miao}{plrd} -\newfontscript{Modi}{modi} -\newfontscript{Mongolian}{mong} -\newfontscript{Mro}{mroo} -\newfontscript{Multani}{mult} -\newfontscript{Musical~Symbols}{musc} -\newfontscript{Myanmar}{mym2,mymr} -\newfontscript{N'Ko}{nko~} -\newfontscript{Nabataean}{nbat} -\newfontscript{Nandinagari}{nand} -\newfontscript{Newa}{newa} -\newfontscript{Nushu}{nshu} -\newfontscript{Nyiakeng~Puachue~Hmong}{hmnp} -\newfontscript{Odia}{ory2,orya} -\newfontscript{Ogham}{ogam} -\newfontscript{Ol~Chiki}{olck} -\newfontscript{Old~Italic}{ital} -\newfontscript{Old~Hungarian}{hung} -\newfontscript{Old~North~Arabian}{narb} -\newfontscript{Old~Permic}{perm} -\newfontscript{Old~Persian~Cuneiform}{xpeo} -\newfontscript{Old~Sogdian}{sogo} -\newfontscript{Old~South~Arabian}{sarb} -\newfontscript{Old~Turkic}{orkh} -\newfontscript{Old~Uyghur}{ougr} -\newfontscript{Osage}{osge} -\newfontscript{Osmanya}{osma} -\newfontscript{Pahawh~Hmong}{hmng} -\newfontscript{Palmyrene}{palm} -\newfontscript{Pau~Cin~Hau}{pauc} -\newfontscript{Phags-pa}{phag} -\newfontscript{Phoenician}{phnx} -\newfontscript{Psalter~Pahlavi}{phlp} -\newfontscript{Rejang}{rjng} -\newfontscript{Runic}{runr} -\newfontscript{Samaritan}{samr} -\newfontscript{Saurashtra}{saur} -\newfontscript{Sharada}{shrd} -\newfontscript{Shavian}{shaw} -\newfontscript{Siddham}{sidd} -\newfontscript{Sign~Writing}{sgnw} -\newfontscript{Sinhala}{sinh} -\newfontscript{Sogdian}{sogd} -\newfontscript{Sora~Sompeng}{sora} -\newfontscript{Sumero-Akkadian~Cuneiform}{xsux} -\newfontscript{Sundanese}{sund} -\newfontscript{Syloti~Nagri}{sylo} -\newfontscript{Syriac}{syrc} -\newfontscript{Tagalog}{tglg} -\newfontscript{Tagbanwa}{tagb} -\newfontscript{Tai~Le}{tale} -\newfontscript{Tai~Lu}{talu} -\newfontscript{Tai~Tham}{lana} -\newfontscript{Tai~Viet}{tavt} -\newfontscript{Takri}{takr} -\newfontscript{Tamil}{tml2,taml} -\newfontscript{Tangsa}{tnsa} -\newfontscript{Tangut}{tang} -\newfontscript{Telugu}{tel2,telu} -\newfontscript{Thaana}{thaa} -\newfontscript{Thai}{thai} -\newfontscript{Tibetan}{tibt} -\newfontscript{Tifinagh}{tfng} -\newfontscript{Tirhuta}{tirh} -\newfontscript{Toto}{toto} -\newfontscript{Ugaritic~Cuneiform}{ugar} -\newfontscript{Vai}{vai~} -\newfontscript{Vithkuqi}{vith} -\newfontscript{Wancho}{wcho} -\newfontscript{Warang~Citi}{wara} -\newfontscript{Yezidi}{yezi} -\newfontscript{Yi}{yi~~} -\newfontscript{Zanabazar~Square}{zanb} -\newfontscript{CJK}{hani} -\newfontscript{Kana}{kana} -\newfontscript{Maths}{math} -\newfontscript{N'ko}{nko~} -\newfontscript{Oriya}{ory2,orya} - -%%^^A%% fontspec-code-lang.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\newfontlanguage{Abaza}{ABA} -\newfontlanguage{Abkhazian}{ABK} -\newfontlanguage{Adyghe}{ADY} -\newfontlanguage{Afrikaans}{AFK} -\newfontlanguage{Afar}{AFR} -\newfontlanguage{Agaw}{AGW} -\newfontlanguage{Altai}{ALT} -\newfontlanguage{Amharic}{AMH} -\newfontlanguage{Arabic}{ARA} -\newfontlanguage{Aari}{ARI} -\newfontlanguage{Arakanese}{ARK} -\newfontlanguage{Assamese}{ASM} -\newfontlanguage{Athapaskan}{ATH} -\newfontlanguage{Avar}{AVR} -\newfontlanguage{Awadhi}{AWA} -\newfontlanguage{Aymara}{AYM} -\newfontlanguage{Azeri}{AZE} -\newfontlanguage{Badaga}{BAD} -\newfontlanguage{Baghelkhandi}{BAG} -\newfontlanguage{Balkar}{BAL} -\newfontlanguage{Baule}{BAU} -\newfontlanguage{Berber}{BBR} -\newfontlanguage{Bench}{BCH} -\newfontlanguage{Bible~Cree}{BCR} -\newfontlanguage{Belarussian}{BEL} -\newfontlanguage{Bemba}{BEM} -\newfontlanguage{Bengali}{BEN} -\newfontlanguage{Bulgarian}{BGR} -\newfontlanguage{Bhili}{BHI} -\newfontlanguage{Bhojpuri}{BHO} -\newfontlanguage{Bikol}{BIK} -\newfontlanguage{Bilen}{BIL} -\newfontlanguage{Blackfoot}{BKF} -\newfontlanguage{Balochi}{BLI} -\newfontlanguage{Balante}{BLN} -\newfontlanguage{Balti}{BLT} -\newfontlanguage{Bambara}{BMB} -\newfontlanguage{Bamileke}{BML} -\newfontlanguage{Breton}{BRE} -\newfontlanguage{Brahui}{BRH} -\newfontlanguage{Braj~Bhasha}{BRI} -\newfontlanguage{Burmese}{BRM} -\newfontlanguage{Bashkir}{BSH} -\newfontlanguage{Beti}{BTI} -\newfontlanguage{Catalan}{CAT} -\newfontlanguage{Cebuano}{CEB} -\newfontlanguage{Chechen}{CHE} -\newfontlanguage{Chaha~Gurage}{CHG} -\newfontlanguage{Chattisgarhi}{CHH} -\newfontlanguage{Chichewa}{CHI} -\newfontlanguage{Chukchi}{CHK} -\newfontlanguage{Chipewyan}{CHP} -\newfontlanguage{Cherokee}{CHR} -\newfontlanguage{Chuvash}{CHU} -\newfontlanguage{Comorian}{CMR} -\newfontlanguage{Coptic}{COP} -\newfontlanguage{Cree}{CRE} -\newfontlanguage{Carrier}{CRR} -\newfontlanguage{Crimean~Tatar}{CRT} -\newfontlanguage{Church~Slavonic}{CSL} -\newfontlanguage{Czech}{CSY} -\newfontlanguage{Danish}{DAN} -\newfontlanguage{Dargwa}{DAR} -\newfontlanguage{Woods~Cree}{DCR} -\newfontlanguage{German}{DEU} -\newfontlanguage{Dogri}{DGR} -\newfontlanguage{Divehi}{DIV} -\newfontlanguage{Djerma}{DJR} -\newfontlanguage{Dangme}{DNG} -\newfontlanguage{Dinka}{DNK} -\newfontlanguage{Dungan}{DUN} -\newfontlanguage{Dzongkha}{DZN} -\newfontlanguage{Ebira}{EBI} -\newfontlanguage{Eastern~Cree}{ECR} -\newfontlanguage{Edo}{EDO} -\newfontlanguage{Efik}{EFI} -\newfontlanguage{Greek}{ELL} -\newfontlanguage{English}{ENG} -\newfontlanguage{Erzya}{ERZ} -\newfontlanguage{Spanish}{ESP} -\newfontlanguage{Estonian}{ETI} -\newfontlanguage{Basque}{EUQ} -\newfontlanguage{Evenki}{EVK} -\newfontlanguage{Even}{EVN} -\newfontlanguage{Ewe}{EWE} -\newfontlanguage{French~Antillean}{FAN} -\newfontlanguage{Farsi}{FAR} -\newfontlanguage{Parsi}{FAR} -\newfontlanguage{Persian}{FAR} -\newfontlanguage{Finnish}{FIN} -\newfontlanguage{Fijian}{FJI} -\newfontlanguage{Flemish}{FLE} -\newfontlanguage{Forest~Nenets}{FNE} -\newfontlanguage{Fon}{FON} -\newfontlanguage{Faroese}{FOS} -\newfontlanguage{French}{FRA} -\newfontlanguage{Frisian}{FRI} -\newfontlanguage{Friulian}{FRL} -\newfontlanguage{Futa}{FTA} -\newfontlanguage{Fulani}{FUL} -\newfontlanguage{Ga}{GAD} -\newfontlanguage{Gaelic}{GAE} -\newfontlanguage{Gagauz}{GAG} -\newfontlanguage{Galician}{GAL} -\newfontlanguage{Garshuni}{GAR} -\newfontlanguage{Garhwali}{GAW} -\newfontlanguage{Ge'ez}{GEZ} -\newfontlanguage{Gilyak}{GIL} -\newfontlanguage{Gumuz}{GMZ} -\newfontlanguage{Gondi}{GON} -\newfontlanguage{Greenlandic}{GRN} -\newfontlanguage{Garo}{GRO} -\newfontlanguage{Guarani}{GUA} -\newfontlanguage{Gujarati}{GUJ} -\newfontlanguage{Haitian}{HAI} -\newfontlanguage{Halam}{HAL} -\newfontlanguage{Harauti}{HAR} -\newfontlanguage{Hausa}{HAU} -\newfontlanguage{Hawaiin}{HAW} -\newfontlanguage{Hammer-Banna}{HBN} -\newfontlanguage{Hiligaynon}{HIL} -\newfontlanguage{Hindi}{HIN} -\newfontlanguage{High~Mari}{HMA} -\newfontlanguage{Hindko}{HND} -\newfontlanguage{Ho}{HO} -\newfontlanguage{Harari}{HRI} -\newfontlanguage{Croatian}{HRV} -\newfontlanguage{Hungarian}{HUN} -\newfontlanguage{Armenian}{HYE} -\newfontlanguage{Igbo}{IBO} -\newfontlanguage{Ijo}{IJO} -\newfontlanguage{Ilokano}{ILO} -\newfontlanguage{Indonesian}{IND} -\newfontlanguage{Ingush}{ING} -\newfontlanguage{Inuktitut}{INU} -\newfontlanguage{Irish}{IRI} -\newfontlanguage{Irish~Traditional}{IRT} -\newfontlanguage{Icelandic}{ISL} -\newfontlanguage{Inari~Sami}{ISM} -\newfontlanguage{Italian}{ITA} -\newfontlanguage{Hebrew}{IWR} -\newfontlanguage{Javanese}{JAV} -\newfontlanguage{Yiddish}{JII} -\newfontlanguage{Japanese}{JAN} -\newfontlanguage{Judezmo}{JUD} -\newfontlanguage{Jula}{JUL} -\newfontlanguage{Kabardian}{KAB} -\newfontlanguage{Kachchi}{KAC} -\newfontlanguage{Kalenjin}{KAL} -\newfontlanguage{Kannada}{KAN} -\newfontlanguage{Karachay}{KAR} -\newfontlanguage{Georgian}{KAT} -\newfontlanguage{Kazakh}{KAZ} -\newfontlanguage{Kebena}{KEB} -\newfontlanguage{Khutsuri~Georgian}{KGE} -\newfontlanguage{Khakass}{KHA} -\newfontlanguage{Khanty-Kazim}{KHK} -\newfontlanguage{Khmer}{KHM} -\newfontlanguage{Khanty-Shurishkar}{KHS} -\newfontlanguage{Khanty-Vakhi}{KHV} -\newfontlanguage{Khowar}{KHW} -\newfontlanguage{Kikuyu}{KIK} -\newfontlanguage{Kirghiz}{KIR} -\newfontlanguage{Kisii}{KIS} -\newfontlanguage{Kokni}{KKN} -\newfontlanguage{Kalmyk}{KLM} -\newfontlanguage{Kamba}{KMB} -\newfontlanguage{Kumaoni}{KMN} -\newfontlanguage{Komo}{KMO} -\newfontlanguage{Komso}{KMS} -\newfontlanguage{Kanuri}{KNR} -\newfontlanguage{Kodagu}{KOD} -\newfontlanguage{Korean~Old~Hangul}{KOH} -\newfontlanguage{Konkani}{KOK} -\newfontlanguage{Kikongo}{KON} -\newfontlanguage{Komi-Permyak}{KOP} -\newfontlanguage{Korean}{KOR} -\newfontlanguage{Komi-Zyrian}{KOZ} -\newfontlanguage{Kpelle}{KPL} -\newfontlanguage{Krio}{KRI} -\newfontlanguage{Karakalpak}{KRK} -\newfontlanguage{Karelian}{KRL} -\newfontlanguage{Karaim}{KRM} -\newfontlanguage{Karen}{KRN} -\newfontlanguage{Koorete}{KRT} -\newfontlanguage{Kashmiri}{KSH} -\newfontlanguage{Khasi}{KSI} -\newfontlanguage{Kildin~Sami}{KSM} -\newfontlanguage{Kui}{KUI} -\newfontlanguage{Kulvi}{KUL} -\newfontlanguage{Kumyk}{KUM} -\newfontlanguage{Kurdish}{KUR} -\newfontlanguage{Kurukh}{KUU} -\newfontlanguage{Kuy}{KUY} -\newfontlanguage{Koryak}{KYK} -\newfontlanguage{Ladin}{LAD} -\newfontlanguage{Lahuli}{LAH} -\newfontlanguage{Lak}{LAK} -\newfontlanguage{Lambani}{LAM} -\newfontlanguage{Lao}{LAO} -\newfontlanguage{Latin}{LAT} -\newfontlanguage{Laz}{LAZ} -\newfontlanguage{L-Cree}{LCR} -\newfontlanguage{Ladakhi}{LDK} -\newfontlanguage{Lezgi}{LEZ} -\newfontlanguage{Lingala}{LIN} -\newfontlanguage{Low~Mari}{LMA} -\newfontlanguage{Limbu}{LMB} -\newfontlanguage{Lomwe}{LMW} -\newfontlanguage{Lower~Sorbian}{LSB} -\newfontlanguage{Lule~Sami}{LSM} -\newfontlanguage{Lithuanian}{LTH} -\newfontlanguage{Luba}{LUB} -\newfontlanguage{Luganda}{LUG} -\newfontlanguage{Luhya}{LUH} -\newfontlanguage{Luo}{LUO} -\newfontlanguage{Latvian}{LVI} -\newfontlanguage{Majang}{MAJ} -\newfontlanguage{Makua}{MAK} -\newfontlanguage{Malayalam~Traditional}{MAL} -\newfontlanguage{Mansi}{MAN} -\newfontlanguage{Marathi}{MAR} -\newfontlanguage{Marwari}{MAW} -\newfontlanguage{Mbundu}{MBN} -\newfontlanguage{Manchu}{MCH} -\newfontlanguage{Moose~Cree}{MCR} -\newfontlanguage{Mende}{MDE} -\newfontlanguage{Me'en}{MEN} -\newfontlanguage{Mizo}{MIZ} -\newfontlanguage{Macedonian}{MKD} -\newfontlanguage{Male}{MLE} -\newfontlanguage{Malagasy}{MLG} -\newfontlanguage{Malinke}{MLN} -\newfontlanguage{Malayalam~Reformed}{MLR} -\newfontlanguage{Malay}{MLY} -\newfontlanguage{Mandinka}{MND} -\newfontlanguage{Mongolian}{MNG} -\newfontlanguage{Manipuri}{MNI} -\newfontlanguage{Maninka}{MNK} -\newfontlanguage{Manx~Gaelic}{MNX} -\newfontlanguage{Moksha}{MOK} -\newfontlanguage{Moldavian}{MOL} -\newfontlanguage{Mon}{MON} -\newfontlanguage{Moroccan}{MOR} -\newfontlanguage{Maori}{MRI} -\newfontlanguage{Maithili}{MTH} -\newfontlanguage{Maltese}{MTS} -\newfontlanguage{Mundari}{MUN} -\newfontlanguage{Naga-Assamese}{NAG} -\newfontlanguage{Nanai}{NAN} -\newfontlanguage{Naskapi}{NAS} -\newfontlanguage{N-Cree}{NCR} -\newfontlanguage{Ndebele}{NDB} -\newfontlanguage{Ndonga}{NDG} -\newfontlanguage{Nepali}{NEP} -\newfontlanguage{Newari}{NEW} -\newfontlanguage{Nagari}{NGR} -\newfontlanguage{Norway~House~Cree}{NHC} -\newfontlanguage{Nisi}{NIS} -\newfontlanguage{Niuean}{NIU} -\newfontlanguage{Nkole}{NKL} -\newfontlanguage{N'ko}{NKO} -\newfontlanguage{Dutch}{NLD} -\newfontlanguage{Nogai}{NOG} -\newfontlanguage{Norwegian}{NOR} -\newfontlanguage{Northern~Sami}{NSM} -\newfontlanguage{Northern~Tai}{NTA} -\newfontlanguage{Esperanto}{NTO} -\newfontlanguage{Nynorsk}{NYN} -\newfontlanguage{Oji-Cree}{OCR} -\newfontlanguage{Ojibway}{OJB} -\newfontlanguage{Oriya}{ORI} -\newfontlanguage{Oromo}{ORO} -\newfontlanguage{Ossetian}{OSS} -\newfontlanguage{Palestinian~Aramaic}{PAA} -\newfontlanguage{Pali}{PAL} -\newfontlanguage{Punjabi}{PAN} -\newfontlanguage{Palpa}{PAP} -\newfontlanguage{Pashto}{PAS} -\newfontlanguage{Polytonic~Greek}{PGR} -\newfontlanguage{Pilipino}{PIL} -\newfontlanguage{Palaung}{PLG} -\newfontlanguage{Polish}{PLK} -\newfontlanguage{Provencal}{PRO} -\newfontlanguage{Portuguese}{PTG} -\newfontlanguage{Chin}{QIN} -\newfontlanguage{Rajasthani}{RAJ} -\newfontlanguage{R-Cree}{RCR} -\newfontlanguage{Russian~Buriat}{RBU} -\newfontlanguage{Riang}{RIA} -\newfontlanguage{Rhaeto-Romanic}{RMS} -\newfontlanguage{Romanian}{ROM} -\newfontlanguage{Romany}{ROY} -\newfontlanguage{Rusyn}{RSY} -\newfontlanguage{Ruanda}{RUA} -\newfontlanguage{Russian}{RUS} -\newfontlanguage{Sadri}{SAD} -\newfontlanguage{Sanskrit}{SAN} -\newfontlanguage{Santali}{SAT} -\newfontlanguage{Sayisi}{SAY} -\newfontlanguage{Sekota}{SEK} -\newfontlanguage{Selkup}{SEL} -\newfontlanguage{Sango}{SGO} -\newfontlanguage{Shan}{SHN} -\newfontlanguage{Sibe}{SIB} -\newfontlanguage{Sidamo}{SID} -\newfontlanguage{Silte~Gurage}{SIG} -\newfontlanguage{Skolt~Sami}{SKS} -\newfontlanguage{Slovak}{SKY} -\newfontlanguage{Slavey}{SLA} -\newfontlanguage{Slovenian}{SLV} -\newfontlanguage{Somali}{SML} -\newfontlanguage{Samoan}{SMO} -\newfontlanguage{Sena}{SNA} -\newfontlanguage{Sindhi}{SND} -\newfontlanguage{Sinhalese}{SNH} -\newfontlanguage{Soninke}{SNK} -\newfontlanguage{Sodo~Gurage}{SOG} -\newfontlanguage{Sotho}{SOT} -\newfontlanguage{Albanian}{SQI} -\newfontlanguage{Serbian}{SRB} -\newfontlanguage{Saraiki}{SRK} -\newfontlanguage{Serer}{SRR} -\newfontlanguage{South~Slavey}{SSL} -\newfontlanguage{Southern~Sami}{SSM} -\newfontlanguage{Suri}{SUR} -\newfontlanguage{Svan}{SVA} -\newfontlanguage{Swedish}{SVE} -\newfontlanguage{Swadaya~Aramaic}{SWA} -\newfontlanguage{Swahili}{SWK} -\newfontlanguage{Swazi}{SWZ} -\newfontlanguage{Sutu}{SXT} -\newfontlanguage{Syriac}{SYR} -\newfontlanguage{Tabasaran}{TAB} -\newfontlanguage{Tajiki}{TAJ} -\newfontlanguage{Tamil}{TAM} -\newfontlanguage{Tatar}{TAT} -\newfontlanguage{TH-Cree}{TCR} -\newfontlanguage{Telugu}{TEL} -\newfontlanguage{Tongan}{TGN} -\newfontlanguage{Tigre}{TGR} -\newfontlanguage{Tigrinya}{TGY} -\newfontlanguage{Thai}{THA} -\newfontlanguage{Tahitian}{THT} -\newfontlanguage{Tibetan}{TIB} -\newfontlanguage{Turkish}{TRK,TUR} -\newfontlanguage{Turkmen}{TKM} -\newfontlanguage{Temne}{TMN} -\newfontlanguage{Tswana}{TNA} -\newfontlanguage{Tundra~Nenets}{TNE} -\newfontlanguage{Tonga}{TNG} -\newfontlanguage{Todo}{TOD} -\newfontlanguage{Tsonga}{TSG} -\newfontlanguage{Turoyo~Aramaic}{TUA} -\newfontlanguage{Tulu}{TUL} -\newfontlanguage{Tuvin}{TUV} -\newfontlanguage{Twi}{TWI} -\newfontlanguage{Udmurt}{UDM} -\newfontlanguage{Ukrainian}{UKR} -\newfontlanguage{Urdu}{URD} -\newfontlanguage{Upper~Sorbian}{USB} -\newfontlanguage{Uyghur}{UYG} -\newfontlanguage{Uzbek}{UZB} -\newfontlanguage{Venda}{VEN} -\newfontlanguage{Vietnamese}{VIT} -\newfontlanguage{Wa}{WA} -\newfontlanguage{Wagdi}{WAG} -\newfontlanguage{West-Cree}{WCR} -\newfontlanguage{Welsh}{WEL} -\newfontlanguage{Wolof}{WLF} -\newfontlanguage{Tai~Lue}{XBD} -\newfontlanguage{Xhosa}{XHS} -\newfontlanguage{Yakut}{YAK} -\newfontlanguage{Yoruba}{YBA} -\newfontlanguage{Y-Cree}{YCR} -\newfontlanguage{Yi~Classic}{YIC} -\newfontlanguage{Yi~Modern}{YIM} -\newfontlanguage{Chinese~Hong~Kong}{ZHH} -\newfontlanguage{Chinese~Phonetic}{ZHP} -\newfontlanguage{Chinese~Simplified}{ZHS} -\newfontlanguage{Chinese~Traditional}{ZHT} -\newfontlanguage{Zande}{ZND} -\newfontlanguage{Zulu}{ZUL} - -%%^^A%% fontspec-code-feat-aat.dtx -- part of FONTSPEC <wspr.io/fontspec> - - -%%^^A%% fontspec-code-enc.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\DeclareDocumentCommand \EncodingCommand { m O{} O{} m } - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \EncodingCommand } - \DeclareTextCommand{#1}{\UnicodeEncodingName}[#2][#3]{#4} - } -\DeclareDocumentCommand \EncodingAccent {mm} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \EncodingAccent } - \DeclareTextCommand{#1}{\UnicodeEncodingName}{\add@unicode@accent{#2}} - } -\DeclareDocumentCommand \EncodingSymbol {mm} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \EncodingSymbol } - \DeclareTextSymbol{#1}{\UnicodeEncodingName}{#2} - } -\DeclareDocumentCommand \EncodingComposite {mmm} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \EncodingComposite } - \DeclareTextComposite{#1}{\UnicodeEncodingName}{#2}{#3} - } -\DeclareDocumentCommand \EncodingCompositeCommand {mmm} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \EncodingCompositeCommand } - \DeclareTextCompositeCommand{#1}{\UnicodeEncodingName}{#2}{#3} - } -\DeclareDocumentCommand \DeclareUnicodeEncoding {mm} - { - \DeclareFontEncoding{#1}{}{} - \DeclareFontSubstitution{#1}{lmr}{m}{n} - \DeclareFontFamily{#1}{lmr}{} - - \DeclareFontShape{#1}{lmr}{m}{n} - {<->\UnicodeFontFile{lmroman10-regular}{\UnicodeFontTeXLigatures}}{} - \DeclareFontShape{#1}{lmr}{m}{it} - {<->\UnicodeFontFile{lmroman10-italic}{\UnicodeFontTeXLigatures}}{} - \DeclareFontShape{#1}{lmr}{m}{sc} - {<->\UnicodeFontFile{lmromancaps10-regular}{\UnicodeFontTeXLigatures}}{} - \DeclareFontShape{#1}{lmr}{bx}{n} - {<->\UnicodeFontFile{lmroman10-bold}{\UnicodeFontTeXLigatures}}{} - \DeclareFontShape{#1}{lmr}{bx}{it} - {<->\UnicodeFontFile{lmroman10-bolditalic}{\UnicodeFontTeXLigatures}}{} - - \tl_set_eq:NN \l__fontspec_prev_unicode_name_tl \UnicodeEncodingName - \tl_set:Nn \UnicodeEncodingName {#1} - \bool_set_true:N \l__fontspec_defining_encoding_bool - #2 - \bool_set_false:N \l__fontspec_defining_encoding_bool - \tl_set_eq:NN \UnicodeEncodingName \l__fontspec_prev_unicode_name_tl - } -\DeclareDocumentCommand \UndeclareSymbol {m} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \UndeclareSymbol } - \UndeclareTextCommand {#1} {\UnicodeEncodingName} - } -\DeclareDocumentCommand \UndeclareAccent {m} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \UndeclareAccent } - \UndeclareTextCommand {#1} {\UnicodeEncodingName} - } -\DeclareDocumentCommand \UndeclareCommand {m} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \UndeclareCommand } - \UndeclareTextCommand {#1} {\UnicodeEncodingName} - } -\DeclareDocumentCommand \UndeclareComposite {mm} - { - \bool_if:NF \l__fontspec_defining_encoding_bool - { \__fontspec_error:nn {only-inside-encdef} \UndeclareComposite } - \cs_undefine:c - { \c_backslash_str \UnicodeEncodingName \token_to_str:N #1 - \tl_to_str:n {#2} } - } - -%%^^A%% fontspec-code-math.dtx -- part of FONTSPEC <wspr.io/fontspec> -\@ifpackageloaded{euler} - { \bool_gset_true:N \g__fontspec_pkg_euler_loaded_bool } - { \bool_gset_false:N \g__fontspec_pkg_euler_loaded_bool } -\cs_new:Nn \fontspec_setup_maths: - { - \@ifpackageloaded{euler} - { - \bool_if:NTF \g__fontspec_pkg_euler_loaded_bool - { \bool_gset_true:N \g__fontspec_math_euler_bool } - { \__fontspec_error:n {euler-too-late} } - } - {} - \@ifpackageloaded{lucbmath}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{} - \@ifpackageloaded{lucidabr}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{} - \@ifpackageloaded{lucimatx}{ \bool_gset_true:N \g__fontspec_math_lucida_bool }{} - \DeclareSymbolFont{legacymaths}{OT1}{cmr}{m}{n} - \SetSymbolFont{legacymaths}{bold}{OT1}{cmr}{bx}{n} - \DeclareMathAccent{\acute} {\mathalpha}{legacymaths}{19} - \DeclareMathAccent{\grave} {\mathalpha}{legacymaths}{18} - \DeclareMathAccent{\ddot} {\mathalpha}{legacymaths}{127} - \DeclareMathAccent{\tilde} {\mathalpha}{legacymaths}{126} - \DeclareMathAccent{\bar} {\mathalpha}{legacymaths}{22} - \DeclareMathAccent{\breve} {\mathalpha}{legacymaths}{21} - \DeclareMathAccent{\check} {\mathalpha}{legacymaths}{20} - \DeclareMathAccent{\hat} {\mathalpha}{legacymaths}{94} % too bad, euler - \DeclareMathAccent{\dot} {\mathalpha}{legacymaths}{95} - \DeclareMathAccent{\mathring}{\mathalpha}{legacymaths}{23} - \group_begin: - \mathchardef\@tempa="603A \relax - \ifx\colon\@tempa - \DeclareMathSymbol{\colon}{\mathpunct}{legacymaths}{58} - \fi - \group_end: - \bool_if:NF \g__fontspec_math_euler_bool - { - \DeclareMathSymbol{!}{\mathclose}{legacymaths}{33} - \DeclareMathSymbol{:}{\mathrel} {legacymaths}{58} - \DeclareMathSymbol{;}{\mathpunct}{legacymaths}{59} - \DeclareMathSymbol{?}{\mathclose}{legacymaths}{63} - \bool_if:NF \g__fontspec_math_lucida_bool - { - \DeclareMathSymbol{0}{\mathalpha}{legacymaths}{`0} - \DeclareMathSymbol{1}{\mathalpha}{legacymaths}{`1} - \DeclareMathSymbol{2}{\mathalpha}{legacymaths}{`2} - \DeclareMathSymbol{3}{\mathalpha}{legacymaths}{`3} - \DeclareMathSymbol{4}{\mathalpha}{legacymaths}{`4} - \DeclareMathSymbol{5}{\mathalpha}{legacymaths}{`5} - \DeclareMathSymbol{6}{\mathalpha}{legacymaths}{`6} - \DeclareMathSymbol{7}{\mathalpha}{legacymaths}{`7} - \DeclareMathSymbol{8}{\mathalpha}{legacymaths}{`8} - \DeclareMathSymbol{9}{\mathalpha}{legacymaths}{`9} - \DeclareMathSymbol{\Gamma}{\mathalpha}{legacymaths}{0} - \DeclareMathSymbol{\Delta}{\mathalpha}{legacymaths}{1} - \DeclareMathSymbol{\Theta}{\mathalpha}{legacymaths}{2} - \DeclareMathSymbol{\Lambda}{\mathalpha}{legacymaths}{3} - \DeclareMathSymbol{\Xi}{\mathalpha}{legacymaths}{4} - \DeclareMathSymbol{\Pi}{\mathalpha}{legacymaths}{5} - \DeclareMathSymbol{\Sigma}{\mathalpha}{legacymaths}{6} - \DeclareMathSymbol{\Upsilon}{\mathalpha}{legacymaths}{7} - \DeclareMathSymbol{\Phi}{\mathalpha}{legacymaths}{8} - \DeclareMathSymbol{\Psi}{\mathalpha}{legacymaths}{9} - \DeclareMathSymbol{\Omega}{\mathalpha}{legacymaths}{10} - \DeclareMathSymbol{+}{\mathbin}{legacymaths}{43} - \DeclareMathSymbol{=}{\mathrel}{legacymaths}{61} - \DeclareMathDelimiter{(}{\mathopen} {legacymaths}{40}{largesymbols}{0} - \DeclareMathDelimiter{)}{\mathclose}{legacymaths}{41}{largesymbols}{1} - \DeclareMathDelimiter{[}{\mathopen} {legacymaths}{91}{largesymbols}{2} - \DeclareMathDelimiter{]}{\mathclose}{legacymaths}{93}{largesymbols}{3} - \DeclareMathDelimiter{/}{\mathord}{legacymaths}{47}{largesymbols}{14} - \DeclareMathSymbol{\mathdollar}{\mathord}{legacymaths}{36} - \renewcommand{\hbar}{{\mathchar"AF\mkern-9mu h}}% TODO: test with other fonts - } - } - \DeclareSymbolFont{operators}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\shapedefault - \SetSymbolFont{operators}{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\shapedefault - \DeclareSymbolFontAlphabet\mathrm{operators} - \SetMathAlphabet\mathit{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\itdefault - \SetMathAlphabet\mathbf{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\shapedefault - \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\shapedefault - \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\shapedefault - \SetSymbolFont{operators}{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\shapedefault - \tl_if_empty:NTF \g__fontspec_bfmathrm_tl - { - \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\itdefault - } - { - \SetMathAlphabet\mathrm{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\shapedefault - \SetMathAlphabet\mathbf{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\bfdefault\shapedefault - \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\itdefault - } - \SetMathAlphabet\mathsf{bold}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\bfdefault\shapedefault - \SetMathAlphabet\mathtt{bold}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\shapedefault - } -\cs_new:Nn \fontspec_maybe_setup_maths: - { - \@ifpackageloaded{anttor} - { - \ifx\define@antt@mathversions a\bool_gset_false:N \g__fontspec_math_bool\fi - }{} - \@ifpackageloaded{arevmath} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{eulervm} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{mathdesign} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{concmath} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{cmbright} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{mathesf} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{gfsartemisia} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{gfsneohellenic} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{iwona} - { - \ifx\define@iwona@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi - }{} - \@ifpackageloaded{kpfonts}{\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{kmath} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{kurier} - { - \ifx\define@kurier@mathversions a\bool_set_false:N \g__fontspec_math_bool\fi - }{} - \@ifpackageloaded{fouriernc} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{fourier} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{lmodern} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{mathpazo} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{mathptmx} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{MinionPro} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{unicode-math} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{breqn} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{pxfonts} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{txfonts} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{newpxmath} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{newtxmath} {\bool_gset_false:N \g__fontspec_math_bool}{} - \@ifpackageloaded{mtpro2} {\bool_gset_false:N \g__fontspec_math_bool}{} - \bool_if:NT \g__fontspec_math_bool - { - \__fontspec_info:n {setup-math} - \fontspec_setup_maths: - } - } -\AtBeginDocument{\fontspec_maybe_setup_maths:} - -%%^^A%% fontspec-code-closing.dtx -- part of FONTSPEC <wspr.io/fontspec> -\bool_if:NT \g__fontspec_cfg_bool - { - \InputIfFileExists{fontspec.cfg} - {} - { \typeout{No~ fontspec.cfg~ file~ found;~ no~ configuration~ loaded.} } - } - -%%^^A%% fontspec-code-xfss.dtx -- part of FONTSPEC <wspr.io/fontspec> - -\providecommand*\scitdefault{\scdefault\itdefault} -\providecommand*\scsldefault{\scdefault\sldefault} -\providecommand*\scswdefault{\scdefault\swdefault} -\cs_new:Nn \__fontspec_shape_merge:nn { c__fontspec_shape_#1_#2_tl } -\cs_new:Nn \__fontspec_merge_default_shapes: - { - \tl_const:cn { \__fontspec_shape_merge:nn \shapedefault\scdefault } {\scdefault} - \tl_const:cn { \__fontspec_shape_merge:nn \itdefault \scdefault } {\scitdefault} - \tl_const:cn { \__fontspec_shape_merge:nn \sldefault \scdefault } {\scsldefault} - \tl_const:cn { \__fontspec_shape_merge:nn \swdefault \scdefault } {\scswdefault} - \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \itdefault } {\scitdefault} - \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \sldefault } {\scsldefault} - \tl_const:cn { \__fontspec_shape_merge:nn \scdefault \swdefault } {\scswdefault} - \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \itdefault } {\scitdefault} - \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \sldefault } {\scsldefault} - \tl_const:cn { \__fontspec_shape_merge:nn \scitdefault \shapedefault } {\scdefault} - \tl_const:cn { \__fontspec_shape_merge:nn \scsldefault \shapedefault } {\scdefault} - } -\__fontspec_merge_default_shapes: -\prg_new_conditional:Nnn \__fontspec_if_merge_shape:n {TF} - { - \bool_lazy_and:nnTF - { \tl_if_exist_p:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } } - { - \cs_if_exist_p:c - { - \f@encoding/\f@family/\f@series/ - \tl_use:c { \__fontspec_shape_merge:nn {\f@shape} {#1} } - } - } - \prg_return_true: \prg_return_false: - } -\cs_set_eq:NN \emfontdeclare \DeclareEmphSequence -\cs_set_protected:Npn \strongfontdeclare #1 - { - \prop_gclear:N \g__fontspec_strong_prop - \int_zero:N \l__fontspec_strongdef_int - - \group_begin: - \normalfont - \clist_map_inline:nn {\strongreset,#1} - { - ##1 - \prop_gput_if_new:NxV \g__fontspec_strong_prop { \f@series } { \l__fontspec_strongdef_int } - \prop_gput:Nxn \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strongdef_int } { ##1 } - \int_incr:N \l__fontspec_strongdef_int - } - \group_end: - } -\DeclareRobustCommand \strongenv - { - \@nomath\strongenv - - \prop_get:NxNT \g__fontspec_strong_prop { \f@series } \l__fontspec_strong_tmp_tl - { - \int_set:Nn \l__fontspec_strong_int { \l__fontspec_strong_tmp_tl } - } - - \int_incr:N \l__fontspec_strong_int - - \prop_get:NxNTF \g__fontspec_strong_prop { switch-\int_use:N \l__fontspec_strong_int } \l__fontspec_strong_switch_tl - { \l__fontspec_strong_switch_tl } - { - \int_zero:N \l__fontspec_strong_int - \strongreset - } - - } -\DeclareTextFontCommand{\strong}{\strongenv} -\cs_set:Npn \strongreset {} -\cs_set:Npn \reset@font - { - \normalfont - \int_zero:N \l__fontspec_strong_int - } -\cs_new:Nn \fontspec_set_strong_level:n { \int_set:Nn \l__fontspec_strong_int {#1} } -\strongfontdeclare{ \bfseries } diff --git a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx index 58851e7e5a..2e67737df9 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx @@ -82,7 +82,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -969,7 +969,7 @@ %<@@=hyp> % \end{macrocode} % \begin{macrocode} -\ProvidesFile{hgeneric-testphase.def}[2023-02-20 v0.95w % +\ProvidesFile{hgeneric-testphase.def}[2023-03-09 v0.95x % generic Hyperref driver for the LaTeX PDF management testphase bundle] \RequirePackage{etoolbox} %why? diff --git a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf Binary files differindex c5476881c0..306f715e8d 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx index e812e75256..94dddfa8ee 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx @@ -45,7 +45,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % @@ -56,27 +56,27 @@ % \begin{macrocode} %<drivers>\ProvidesExplFile %<*dvipdfmx> - {l3backend-testphase-dvipdfmx.def}{2023-02-20}{} + {l3backend-testphase-dvipdfmx.def}{2023-03-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: dvipdfmx} %</dvipdfmx> %<*dvips> - {l3backend-testphase-dvips.def}{2023-02-20}{} + {l3backend-testphase-dvips.def}{2023-03-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: dvips} %</dvips> %<*dvisvgm> - {l3backend-testphase-dvisvgm.def}{2023-02-20}{} + {l3backend-testphase-dvisvgm.def}{2023-03-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: dvisvgm} %</dvisvgm> %<*luatex> - {l3backend-testphase-luatex.def}{2023-02-20}{} + {l3backend-testphase-luatex.def}{2023-03-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (LuaTeX)} %</luatex> %<*pdftex> - {l3backend-testphase-pdftex.def}{2023-02-20}{} + {l3backend-testphase-pdftex.def}{2023-03-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (pdfTeX)} %</pdftex> %<*xdvipdfmx> - {l3backend-testphase-xetex.def}{2023-02-20}{} + {l3backend-testphase-xetex.def}{2023-03-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: XeTeX} %</xdvipdfmx> % \end{macrocode} @@ -1965,6 +1965,7 @@ \pdfmanagement_add:nnn{Info}{Creator}{(TeX)} %</drivers> %<*dvips> + \AddToHook{begindocument}{\pdfmanagement_add:nnn{Info}{Producer}{(pdfTeX+dvips)}} \__kernel_backend_literal:e{!~<</DocumentUUID~(DocumentUUID)>>~setpagedevice} \__kernel_backend_literal:e{!~<</InstanceUUID~(InstanceUUID)>>~setpagedevice} %</dvips> @@ -2006,6 +2007,7 @@ \AddToDocumentProperties[hyperref]{pdfmetadate}{D:20010101205959-00'00'} \AddToDocumentProperties[hyperref]{pdfdate}{D:20010101205959-00'00'} \AddToDocumentProperties[hyperref]{pdfinstanceid}{uuid:0a57c455-157a-4141-8c19-6237d832fc80} + \AddToDocumentProperties[hyperref]{pdfproducer}{\c_sys_engine_exec_str-NN.NN.NN} } %</drivers> % \end{macrocode} @@ -2024,29 +2026,98 @@ % an unnamed object so should be referenced directly with |\pdf_object_ref_last:| % \begin{macrocode} %<*luatex> -\cs_new_protected:Npn \__pdf_backend_metadata_stream:n #1 +\cs_new_protected:Npn \@@_backend_metadata_stream:n #1 { \tex_immediate:D \tex_pdfextension:D obj ~uncompressed~ - \__pdf_backend_object_write:nn {stream} {{/Type~/Metadata~/Subtype~/XML}{#1}} + \@@_backend_object_write:nn {stream} {{/Type~/Metadata~/Subtype~/XML}{#1}} } %</luatex> %<*pdftex> -\cs_new_protected:Npn \__pdf_backend_metadata_stream:n #1 +\cs_new_protected:Npn \@@_backend_metadata_stream:n #1 { \group_begin: \tex_pdfcompresslevel:D 0 \scan_stop: \tex_immediate:D \tex_pdfobj:D - \__pdf_backend_object_write:nn {stream} {{/Type~/Metadata~/Subtype~/XML}{#1}} + \@@_backend_object_write:nn {stream} {{/Type~/Metadata~/Subtype~/XML}{#1}} \group_end: } %</pdftex> %<*xdvipdfmx|dvipdfmx|dvips|dvisvgm> -\cs_new_protected:Npn \__pdf_backend_metadata_stream:n #1 +\cs_new_protected:Npn \@@_backend_metadata_stream:n #1 { \pdf_object_unnamed_write:nn {stream}{{/Type~/Metadata~/Subtype~/XML}{#1}} } %</xdvipdfmx|dvipdfmx|dvips|dvisvgm> % \end{macrocode} +% +% \subsection{Suppressing deprecated PDF features} +% +% \texttt{/ProcSet}, \texttt{/CharSet} and the \texttt{/Info} dictionary +% are deprecated in PDF 2.0. For the pdf/A-4 standard they must be suppressed. +% Not every engine is able to do this, but for pdfTeX and luatex we define suitable +% backend command. \texttt{/ProcSet} is suppressed automatically +% for pdf version 2.0 starting with in texlive 2023. +% \begin{macro}{\@@_backend_omit_charset:n} +% The option to omit /Charset exists already for quite some time for the two +% engines. +% \begin{macrocode} +%<*xdvipdfmx|dvipdfmx|dvips|dvisvgm> +\cs_new_protected:Npn \@@_backend_omit_charset:n #1 {} %#1 number +%</xdvipdfmx|dvipdfmx|dvips|dvisvgm> +%<*pdftex> +\cs_new_protected:Npn \@@_backend_omit_charset:n #1 %#1 number + { + \tex_pdfomitcharset:D = #1 \scan_stop: + } +%</pdftex> +%<*luatex> +\cs_new_protected:Npn \@@_backend_omit_charset:n #1 %#1 number + { + \tex_pdfvariable:D omitcharset = #1 \scan_stop: + } +%</luatex> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_backend_omit_info:n} +% The option to suppress the info dictionary will be available in +% texlive 2023. +% \begin{macrocode} +%<*xdvipdfmx|dvipdfmx|dvips|dvisvgm> +\cs_new_protected:Npn \@@_backend_omit_info:n #1 {} %#1 number +%</xdvipdfmx|dvipdfmx|dvips|dvisvgm> +%<*pdftex> +\bool_lazy_and:nnTF + { \int_compare_p:nNn {\tex_pdftexversion:D } > {139} } + { \int_compare_p:nNn {\tex_pdftexrevision:D } > {24} } + { + \cs_new_protected:Npn \@@_backend_omit_info:n #1 %#1 number + { + \pdfomitinfodict = #1 \scan_stop: + } + } + { + \cs_new_protected:Npn \@@_backend_omit_info:n #1 {}%#1 number + + } +%</pdftex> +%<*luatex> + \int_compare:nNnTF {\directlua{tex.print(status.list()["development_id"])} } > {7560} + { + \cs_new_protected:Npn \@@_backend_omit_info:n #1 %#1 number + { + \tex_pdfvariable:D omitinfodict = #1 \scan_stop: + } + } + { + \cs_new_protected:Npn \@@_backend_omit_info:n #1 {} %#1 number + } +%</luatex> +% \end{macrocode} +% \end{macro} +% + +% % \subsection{lua code for lualatex} % \begin{macrocode} %<*lua> diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf Binary files differindex 229895df9b..03c2cb4d73 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx index bd62c74dc4..761a2fef58 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -432,7 +432,7 @@ % \begin{macrocode} %<@@=pdfannot> %<*header> -\ProvidesExplPackage{l3pdfannot}{2023-02-20}{0.95w} +\ProvidesExplPackage{l3pdfannot}{2023-03-09}{0.95x} {PDF-annotations} \RequirePackage{l3pdfdict} %</header> diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf Binary files differindex c8d599d700..6efe0a3e81 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx index b46a87348e..4a6af666de 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -208,7 +208,7 @@ % \begin{macrocode} %<@@=pdfdict> %<*header> -\ProvidesExplPackage{l3pdfdict}{2023-02-20}{0.95w} +\ProvidesExplPackage{l3pdfdict}{2023-03-09}{0.95x} {Tools for PDF dictionaries (LaTeX PDF management testphase bundle)} %</header> % \end{macrocode} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf Binary files differindex 30c708719d..277eda9a51 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx index f5f653cad7..0a3933eaca 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf Binary files differindex 1a07c64766..f3f2709d1c 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx index 34e1d8b8e0..e5f0b33fed 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx @@ -64,7 +64,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf Binary files differindex 8b051f6999..c3a510d875 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx index 8a3711b797..b2920fcdc4 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf Binary files differindex 000a7452d5..c668f282fe 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx index f2df427ebf..5011ea4916 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx @@ -55,7 +55,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf Binary files differindex b9b7bbb303..e33b6a3598 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx index 423231bf7c..55a230c77e 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx @@ -83,7 +83,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf Binary files differindex c95db774a0..400c83654e 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx index d4a6011750..72f111d55a 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf Binary files differindex 608479e30b..98020b9fa2 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx index f972c7cf87..c9181a6ed8 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx @@ -69,7 +69,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -973,7 +973,7 @@ %<*package> %<@@=pdffield> \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{l3pdffield-testphase}{2023-02-20}{0.95w}% +\ProvidesExplPackage{l3pdffield-testphase}{2023-03-09}{0.95x}% {form fields} % \end{macrocode} % \subsection{hyperref specific command} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf Binary files differindex 63440cf172..35caa5b8db 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx index 4582d4a99d..fe3ffbd6ef 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -398,7 +398,7 @@ % % \begin{macrocode} %<*header> -\ProvidesExplPackage{l3pdffile}{2023-02-20}{0.95w} +\ProvidesExplPackage{l3pdffile}{2023-03-09}{0.95x} {embedding and referencing files in PDF---LaTeX PDF management testphase bundle} \RequirePackage{l3pdftools} %temporarly!! %</header> diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf Binary files differindex e06e86127d..c51b62daf8 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx index 4fffefa1d7..df5724be08 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx @@ -57,7 +57,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -632,7 +632,7 @@ %<@@=pdfmanagement> %<*header> % -\ProvidesExplPackage{l3pdfmanagement}{2023-02-20}{0.95w} +\ProvidesExplPackage{l3pdfmanagement}{2023-03-09}{0.95x} {Management of core PDF dictionaries (LaTeX PDF management testphase bundle)} %</header> % \end{macrocode} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf Binary files differindex 54c1ccae90..fa89390e25 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx index ed08282b30..034cf6fd00 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -200,17 +200,18 @@ % tested from TeX, but in a current LaTeX normally ToUnicode are set for all fonts. % \item[|tagged|] that is set in A-2a and A-3a and means that the pdf must be % tagged. This is currently neither tested not enforced somewhere. +% \item[|no_CharSet|] CharSet is deprecated is pdf 2.0 and should not +% be used in A-4. l3pdfmeta will therefore suppress it for the +% engines pdftex and luatex (the other engines have no suitable option) % \item[|Trailer_no_Info|] The \texttt{Info} dictionary % has been deprecated since quite some time. Metadata should be set with % XMP-data instead. In PDF A-4 now the \texttt{Info} dictionary % shall not be present in the trailer dictionary at all % (unless there exists a PieceInfo entry in the Catalog). And if it is present -% it should only contain the \texttt{/ModDate} entry. The engines -% do not offer currently an option to suppress the dictionary completly, -% one can only give the entries the value null (it only works for all entries -% with lualatex and pdflatex). The next pdflatex will offer \cs{pdfomitinfodict}. -% Until then l3pdfmeta does nothing with this requirement. -% +% it should only contain the \texttt{/ModDate} entry. In +% texlive 2023 the engines pdftex and luatex have primitives +% to suppress the dictionary +% and l3pdfmeta will make use of it. % \end{description} % % \subsubsection{Tests with values and special handlers} @@ -562,7 +563,7 @@ % \begin{macrocode} %<@@=pdfmeta> %<*header> -\ProvidesExplPackage{l3pdfmeta}{2023-02-20}{0.95w} +\ProvidesExplPackage{l3pdfmeta}{2023-03-09}{0.95x} {PDF-Standards---LaTeX PDF management testphase bundle} %</header> % \end{macrocode} @@ -746,6 +747,10 @@ { \pdfmeta_standard_verify:nF { annot_flags } { \@@_verify_pdfa_annot_flags: } + \pdfmeta_standard_verify:nF { Trailer_no_Info } + { \__pdf_backend_omit_info:n {1} } + \pdfmeta_standard_verify:nF { no_CharSet } + { \__pdf_backend_omit_charset:n {1} } \pdfmeta_standard_verify:nnF { min_pdf_version } { \pdf_version: } { \msg_warning:nnxxx {pdf}{wrong-pdfversion} @@ -939,6 +944,8 @@ \prop_gput:cnn { g_@@_standard_pdf/A-4_prop }{year}{2020} \prop_gput:cnn + { g_@@_standard_pdf/A-4_prop }{no_CharSet}{} +\prop_gput:cnn { g_@@_standard_pdf/A-4_prop }{Trailer_no_Info}{} \prop_gremove:cn { g_@@_standard_pdf/A-4_prop }{conformance} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf Binary files differindex 2795c0188f..66e3bf0206 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx index d3ad09cbfb..8996d74131 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -211,7 +211,7 @@ % % \begin{macrocode} %<*header> -\ProvidesExplPackage{l3pdftools}{2023-02-20}{0.95w} +\ProvidesExplPackage{l3pdftools}{2023-03-09}{0.95x} {candidate commands for l3pdf---LaTeX PDF management testphase bundle} %</header> % \end{macrocode} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf Binary files differindex e0b99f153f..633a4ef871 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx index c12604614d..4eeb9071ab 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -132,7 +132,7 @@ % \begin{macrocode} %<@@=pdf> %<*header> -\ProvidesExplPackage{l3pdfxform}{2023-02-20}{0.95w} +\ProvidesExplPackage{l3pdfxform}{2023-03-09}{0.95x} {command to create xforms (beta)---LaTeX PDF management testphase bundle} %</header> % \end{macrocode} diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf Binary files differindex b9261b84cb..4d0fb96e1f 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx index 5fbd9314e6..ba3473cb30 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -215,7 +215,7 @@ % \begin{macrocode} %<@@=pdfmanagement> %<*header> -\ProvidesExplPackage{ltdocinit}{2023-02-20}{0.95w} +\ProvidesExplPackage{ltdocinit}{2023-03-09}{0.95x} {Initialize document metadata} %</header> % \end{macrocode} diff --git a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf Binary files differindex d7311dddb1..963c915cca 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua b/macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua deleted file mode 100644 index 1d4eab4de1..0000000000 --- a/macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua +++ /dev/null @@ -1,78 +0,0 @@ -if not luaotfload.set_transparent_colorstack then return end -local l = lpeg -local spaces = l.P' '^0 -local digit16 = l.R('09', 'af', 'AF') - -local octet = digit16 * digit16 / function(s) return string.format('%.3g ', tonumber(s, 16) / 255) end -local htmlcolor = l.Cs(octet * octet * octet * -1 * l.Cc'rg') -local color_export = { - token.create'endlocalcontrol', - token.create'tex_hpack:D', - token.new(0, 1), - token.create'color_export:nnN', - token.new(0, 1), - '', - token.new(0, 2), - token.new(0, 1), - 'backend', - token.new(0, 2), - token.create'l_tmpa_tl', - token.create'exp_after:wN', - token.create'__color_select:nn', - token.create'l_tmpa_tl', - token.new(0, 2), -} -local group_end = token.create'group_end:' -local value = (1 - l.P'}')^0 -luatexbase.add_to_callback('luaotfload.parse_color', function (value) - local html = htmlcolor:match(value) - if html then return html end - - tex.runtoks(function() - token.get_next() - color_export[6] = value - tex.sprint(-2, color_export) - end) - local list = token.scan_list() - if not list.head or list.head.next or list.head.subtype ~= node.subtype'pdf_colorstack' then - error'Unexpected backend behavior' - end - local cmd = list.head.data - node.free(list) - return cmd -end, 'l3color') - --- Let's also integrate l3opacity - -luaotfload.set_transparent_colorstack(token.create'c__opacity_backend_stack_int'.index) - -local transparent_register = { - token.create'pdfmanagement_add:nnn', - token.new(0, 1), - 'Page/Resources/ExtGState', - token.new(0, 2), - token.new(0, 1), - '', - token.new(0, 2), - token.new(0, 1), - '<</ca ', - '', - '/CA ', - '', - '>>', - token.new(0, 2), -} -luatexbase.add_to_callback('luaotfload.parse_transparent', function(value) - value = (octet * -1):match(value) - if not value then - tex.error'Invalid transparency value' - return - end - value = value:sub(1, -2) - local result = 'opacity' .. value - tex.runtoks(function() - transparent_register[6], transparent_register[10], transparent_register[12] = result, value, value - tex.sprint(-2, transparent_register) - end) - return '/' .. result .. ' gs' -end, 'l3opacity') diff --git a/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf b/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf Binary files differindex 891af85d6d..dc8d376f76 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx index 2e40ed6814..23ce50f33d 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -63,7 +63,7 @@ % |debug={firstaidoff={name1,name2,...},...}|. % \begin{macrocode} %<*package> -\ProvidesExplPackage{pdfmanagement-firstaid}{2023-02-20}{0.95w} +\ProvidesExplPackage{pdfmanagement-firstaid}{2023-03-09}{0.95x} {LaTeX PDF management testphase bundle / firstaid-patches} %<@@=pdfmanagement> @@ -96,36 +96,21 @@ % \subsection{Fontspec} % When using luaLaTeX opacity is broken (issue \#30) as % fontspec/luaotfload doesn't use the pdfmanagement but write to ExtGState directly -% To repair this some new lua code is needed. This also -% improves the color parsing and allows to use cmyk and spot colors as font colors. -% It is also needed to use a patch version of \texttt{fontspec-luatex.sty} to -% slightly change the way how the Opacity and Color key are handled. -% The patch is only executed if luaotfload is new enough. +% To repair this some new lua code is needed. It also needs a new fontspec +% and a change in the color key. % \begin{macrocode} \sys_if_engine_luatex:T { - \lua_now:n - { - if~not~luaotfload.set_transparent_colorstack~ - then~ - tex.print("\\bool_gset_false:N\\g_@@_firstaid_fontspec_bool")~ - end - } \bool_if:NT \g_@@_firstaid_fontspec_bool { - \msg_info:nnn{pdfmanagement}{firstaid}{fontspec} - \file_if_exist:nT { luaotfload-l3color-tmp.lua } - { - \lua_load_module:n { luaotfload-l3color-tmp.lua } - } - - \declare@file@substitution{fontspec-luatex.sty}{fontspec-luatex-tmp-ltx.sty} - \AddToHook{package/fontspec/after} + \@ifpackagelater{fontspec}{2023-03-10} { - \str_if_eq:vnF{ver@fontspec.sty}{2022/01/15~v2.8a~Font~selection~for~XeLaTeX~and~LuaLaTeX} - {\msg_warn:nnn{pdfmanagement}{firstaid-changed}{fontspec}} - } - } + \__fontspec_keys_define_code:nnn {fontspec} {Color} + { + \tl_set:Nn \l__fontspec_hexcol_tl {#1} + } + }{} + } } % \end{macrocode} % \subsection{Output routine} diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf Binary files differindex 30aa895e05..05f5aeac65 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx index 7b8a19d4cb..15ee3c7d0c 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx +++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Version 0.95w, released 2023-02-20} +% \date{Version 0.95x, released 2023-03-09} % % \maketitle % \begin{documentation} @@ -386,7 +386,7 @@ % \begin{macrocode} %<@@=pdf> %<*package> -\ProvidesExplPackage{pdfmanagement-testphase}{2023-02-20}{0.95w} +\ProvidesExplPackage{pdfmanagement-testphase}{2023-03-09}{0.95x} {LaTeX PDF management testphase bundle} \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} \IfFormatAtLeastTF{2020-10-01}{}{ @@ -414,7 +414,7 @@ % to allow to set it in the document. % \begin{macrocode} %<*header> -\ProvidesExplFile{pdfmanagement-testphase.ltx}{2023-02-20}{0.95w} +\ProvidesExplFile{pdfmanagement-testphase.ltx}{2023-03-09}{0.95x} {PDF~management~code~(testphase)} %</header> %<*package> diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf Binary files differindex c4205bc6e4..7e40c5713c 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf +++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf diff --git a/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty index 98baf67303..192e4b77a1 100644 --- a/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty +++ b/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty @@ -1,6 +1,6 @@ %% LaTeX2e file `xcolor-patches.sty' %% -\ProvidesPackage{xcolor-patches-tmp-ltx}[2023-02-20 v0.95w patch xcolor for l3color] +\ProvidesPackage{xcolor-patches-tmp-ltx}[2023-03-09 v0.95x patch xcolor for l3color] \@ifundefined{color_set:nn}{\RequirePackage{l3color}}{} \ExplSyntaxOn diff --git a/macros/latex/contrib/tugboat/NEWS b/macros/latex/contrib/tugboat/NEWS index 5f9b4fa553..aa1e53391e 100644 --- a/macros/latex/contrib/tugboat/NEWS +++ b/macros/latex/contrib/tugboat/NEWS @@ -1,7 +1,16 @@ -$Id: NEWS 458 2023-01-16 18:44:30Z karl $ +$Id: NEWS 463 2023-03-08 21:59:19Z karl $ This file records noteworthy changes. This file is public domain. ----------------- +2.29 (2023-03-08): + +ltugboat.cls: +- \url: the fallback definition now typesets (in tt) more special characters. +- omit TUG-specific doi when not typesetting in the production environment. + +tugboat.bst: abbreviate "chapter" to "ch." in tugboat.bst. + +----------------- 2.28 (2023-01-16): ltugboat.cls: diff --git a/macros/latex/contrib/tugboat/ltubguid.pdf b/macros/latex/contrib/tugboat/ltubguid.pdf Binary files differindex 4e9a95b979..3d39af7dad 100644 --- a/macros/latex/contrib/tugboat/ltubguid.pdf +++ b/macros/latex/contrib/tugboat/ltubguid.pdf diff --git a/macros/latex/contrib/tugboat/tugboat.bst b/macros/latex/contrib/tugboat/tugboat.bst index a64d28fd17..1129bb8ab5 100644 --- a/macros/latex/contrib/tugboat/tugboat.bst +++ b/macros/latex/contrib/tugboat/tugboat.bst @@ -1,4 +1,4 @@ -%%% $Id: tugboat.bst 457 2023-01-16 18:43:54Z karl $ +%%% $Id: tugboat.bst 462 2023-03-08 17:26:54Z karl $ %%% TUGboat changes are public domain. %%% %%% Modified for TUGboat from abbrvurl.bst: @@ -735,7 +735,7 @@ FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ - { "chapter" } + { "ch." } { type "l" change.case$ } if$ chapter tie.or.space.connect @@ -972,7 +972,8 @@ FUNCTION {format.pubmed} % (aka the doiurl variable), and only add it if needed. % % This code is from https://tex.stackexchange.com/questions/119237 -% (thank you, mafp). +% (thank you, mafp). The original urlbst package solved the problem in a +% different (simpler) way in its 0.9.1 (January 2023) release. % % The "X Y contains" function checks if string Y is contained in X. % Although we only need to check if Y is at the beginning of X, diff --git a/macros/latex/contrib/tugboat/tugboat.dtx b/macros/latex/contrib/tugboat/tugboat.dtx index d205ab011d..ea7f22af77 100644 --- a/macros/latex/contrib/tugboat/tugboat.dtx +++ b/macros/latex/contrib/tugboat/tugboat.dtx @@ -1,5 +1,5 @@ % \iffalse (this is a meta-comment (so they say)) -% $Id: tugboat.dtx 459 2023-01-16 21:05:37Z karl $ +% $Id: tugboat.dtx 462 2023-03-08 17:26:54Z karl $ % tugboat.dtx - main source for LaTeX TUGboat classes. % % Copyright 1994-2023 TeX Users Group. @@ -28,7 +28,7 @@ %<ltugboatsty>\ProvidesPackage{ltugboat} %<ltugprocsty>\ProvidesPackage{ltugproc} %<ltugcomn> \ProvidesPackage{ltugcomn} - [2023-01-16 v2.28 + [2023-03-08 v2.29 %<ltugboatcls> TUGboat journal class% %<ltugproccls> TUG conference proceedings class% %<ltugboatsty|ltugprocsty> TUG compatibility package% @@ -1308,7 +1308,13 @@ \def\tburl{\url}% \def\tbsurl{\url}% no hyperref, so just \url is fine. \def\tbhurl{\url}% - \ifx\url\undefined \let\url\texttt \fi % er, make sure \url is defined + \ifx\url\undefined % make sure \url is defined + \def\url{\begingroup % might as well catch common special chars + \catcode`\#=12 \catcode`\$=12 \catcode`\%=12 \catcode`\^=12 + \catcode`\&=12 \catcode`\_=12 \catcode`\~=12 + \finish@tub@url} + \def\finish@tub@url#1{\tt #1\endgroup} + \fi \else % This hyperref hook-in is due to Ulrike Fischer. % \url{https://github.com/latex3/hyperref/issues/125}. @@ -3544,21 +3550,27 @@ \def\tubdoiprefix{10.47397/tb} % the number crossref assigned us \def\tubabovedoi{} % fudge spacing or whatever. % -\def\tubtypesetdoi{\iftubomitdoioption\else % if not explicit omission ... - \iftubfinaloption % do this if [final], even if pageno>900 - \vbox to 0pt{% don't impact normal layout - \edef\thedoi{\ifnum\count0>900 xnot\fi % but make url invalid if >900 - doi.org/\tubdoiprefix/\volno-\issno/\jobname}% - \scriptsize - \vskip\baselineskip - \tubabovedoi - \iftubsecondcolstart \moveright \tubcolwidthandgutter \fi - \rlap{\expandafter\tbsurl\expandafter{\thedoi}}% - \vss - }% +\def\tubtypesetdoi{% + \iftubomitdoioption\else % do if not explicit omission ... + \ifnum\volno>0 % and if being run for production ... + \iftubfinaloption % and if [final], even if pageno>900 + \vbox to 0pt{% don't impact normal layout + \edef\thedoi{% but make url invalid if >900 + \ifnum\count0>900 example.org% + \else doi.org\fi + /\tubdoiprefix/\volno-\issno/\jobname}% + \scriptsize + \vskip\baselineskip + \tubabovedoi + \iftubsecondcolstart \moveright \tubcolwidthandgutter \fi + \rlap{\expandafter\tbsurl\expandafter{\thedoi}}% + \vss + }% + \fi % tubfinaloption + \fi % volno>0 + \fi % !tubomitdoioption \global\let\tubtypesetdoi\@empty % only do it once, no matter what. - \fi -\fi} +} % % % \end{macrocode} diff --git a/macros/latex/contrib/tugboat/tugboat.pdf b/macros/latex/contrib/tugboat/tugboat.pdf Binary files differindex 611ea5fe18..fc6500607f 100644 --- a/macros/latex/contrib/tugboat/tugboat.pdf +++ b/macros/latex/contrib/tugboat/tugboat.pdf diff --git a/macros/luatex/latex/lua-typo/README.md b/macros/luatex/latex/lua-typo/README.md index 0930ac70cf..9577fee1cf 100644 --- a/macros/luatex/latex/lua-typo/README.md +++ b/macros/luatex/latex/lua-typo/README.md @@ -81,7 +81,12 @@ Changes * v.0.61: - bug fixes and documentation enhanced. - - colours `mygrey` and `myred` renamed `LTgrey` and `LTred`. + - colours `mygrey` and `myred` renamed as `LTgrey` and `LTred`. + +* v.0.65: + - new option `ShortFinalWord` to detect short end-of-sentence word + on top of next page. + - code cleaning. -- Copyright 2020--2023 Daniel Flipo diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf Binary files differindex f5ea36a35e..35fe6bc907 100644 --- a/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf +++ b/macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdf diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf Binary files differindex 287b2660b5..ed50a38d11 100644 --- a/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf +++ b/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo.pdf Binary files differindex 55acdc97b8..6990971202 100644 --- a/macros/luatex/latex/lua-typo/doc/lua-typo.pdf +++ b/macros/luatex/latex/lua-typo/doc/lua-typo.pdf diff --git a/macros/luatex/latex/lua-typo/source/lua-typo.dtx b/macros/luatex/latex/lua-typo/source/lua-typo.dtx index 9929679bc2..41a9966280 100644 --- a/macros/luatex/latex/lua-typo/source/lua-typo.dtx +++ b/macros/luatex/latex/lua-typo/source/lua-typo.dtx @@ -52,29 +52,28 @@ \csname fi\endcsname %</gobble> %<*driver> -\RequirePackage{pdfmanagement-testphase} -%<+doc>\DeclareDocumentMetadata{pdfstandard=A-2b, lang=en-GB} -%<+docfr>\DeclareDocumentMetadata{pdfstandard=A-2b, lang=fr-FR} -\documentclass[a4paper]{ltxdoc} -\usepackage[dvipsnames]{xcolor} +%<+doc>\DocumentMetadata{pdfstandard=A-2b, lang=en-GB} +%<+doc>\documentclass[a4paper,british]{ltxdoc} +%<+docfr>\DocumentMetadata{pdfstandard=A-2b, lang=fr-FR} +%<+docfr>\documentclass[a4paper,french]{ltxdoc} \usepackage{fontspec} \setmainfont{erewhon} \setsansfont{Cabin}[Scale=MatchLowercase] \setmonofont{VeraMono.ttf}[ Scale = MatchLowercase, - ItalicFont = VeraMoIt.ttf, - BoldFont = VeraMoBd.ttf, - BoldItalicFont = VeraMoBI.ttf, - HyphenChar=None, Color=Sepia, + ItalicFont = VeraMoIt.ttf, + BoldFont = VeraMoBd.ttf, + BoldItalicFont = VeraMoBI.ttf, + HyphenChar=None, + Color=5D1D00, ] \usepackage[expansion=true, protrusion=true]{microtype} -%<+doc>\usepackage[british]{babel} -%<+docfr>\usepackage[french]{babel} +\usepackage{babel,varioref} %<+docfr>\frenchsetup{og=«, fg=»} + \usepackage[ShortPages, OverfullLines, UnderfullLines, Widows, Orphans, EOPHyphens, RepeatedHyphens ]{lua-typo} -\luatypoLLminWD=3em \renewcommand*\descriptionlabel[1]{% \hspace{\labelsep}\texttt{#1}} \usepackage{array,url,verbatim} @@ -100,7 +99,7 @@ \newcommand*\file[1]{\texttt{#1}} \newcommand*\pkg[1]{\texttt{#1}} \newcommand*\opt[1]{\texttt{#1}} -\renewcommand\meta[1]{\texttt{\textsl{\color{Sepia}<#1>}}} +\renewcommand\meta[1]{\texttt{\textsl{<#1>}}} \newcommand*\node[1]{\textsc{#1}} % \setlength{\parindent}{0pt} @@ -205,7 +204,7 @@ % \pkg{lua-typo}, il suffit d’ajouter dans le préambule la ligne %\\ % |\usepackage[All]{lua-typo}| % -% La version courante (0.61) nécessite un noyau LaTeX récent, +% La version courante (0.65) nécessite un noyau LaTeX récent, % 2021/06/01 ou ultérieur. Ceux qui ne disposent que d’un noyau plus % ancient reçoivent un message d’avertissement et un message d’erreur % «\texttt{Unable to register callback}» ; une version «rollback » @@ -235,10 +234,20 @@ % ou pour se limiter aux tests \meta{OptX} et \meta{OptY} :\\ % |\usepackage[|\meta{OptX}|, |\meta{OptY}|]{lua-typo}| % -% \pagebreak[4] -% Le tableau suivant donne le nom des options et le type des -% vérifications proposées : +% La liste des options et le type des vérifications proposées sont +% présentés dans le tableau \vpageref{options-fr}. +% Par exemple, pour limiter les vérifications aux lignes trop pleines +% ou creuses, il suffit de coder :\\ +% |\usepackage[OverfullLines, UnderfullLines]{lua-typo}|\\ +% Pour tout vérifier sauf les coupures répétées en fin de ligne on +% codera :\\ +% |\usepackage[All, RepeatedHyphens=false]{lua-typo}|\\ +% Notez que l’option that \opt{All} doit être la première de la +% liste, les suivantes étant rétirées de la liste complète définie +% par~\opt{All}. % +% \begin{table}[ht] +% \centering\label{options-fr} % \begin{tabular}{>{\ttfamily}ll} % \multicolumn{1}{l}{Nom} & Imperfection à signaler\\ \hline % All & Active toutes les options ci-dessous\\ @@ -258,18 +267,10 @@ % LastWordMatch & Même (partie de) mot en fin de lignes % consécutives ?\\ % FootnoteSplit & Fin de note de bas de page sur page suivante?\\ +% ShortFinalWord & Mot de fin de phrase court en haut de page\\ % \hline % \end{tabular} -% -% Par exemple, pour limiter les vérifications aux lignes trop pleines -% ou creuses, il suffit de coder :\\ -% |\usepackage[OverfullLines, UnderfullLines]{lua-typo}|\\ -% Pour tout vérifier sauf les coupures répétées en fin de ligne on -% codera :\\ -% |\usepackage[All, RepeatedHyphens=false]{lua-typo}|\\ -% Notez que l’option that \opt{All} doit être la première de la -% liste, les suivantes étant rétirées de la liste complète définie -% par~\opt{All}. +% \end{table} % % Le nom des différentes options n’étant pas facile à mémoriser, il % est possible de les retrouver sans devoir consulter la @@ -299,6 +300,9 @@ % \item[RepeatedHyphens :] de même, lorsque le nombre de lignes % consécutives affectées par des coupures dépasse le seuil fixé % (voir ci-dessous), ne sont coloriées que les coupures en excès. +% \item[ShortFinalWord :] lorsque le premier mot de la première ligne +% d’une page termine une phrase et qu’il est court (au plus +% |\luatypoMinLen=4| lettres), on le signale. % \end{description} % % \section{Paramétrage personnalisé} @@ -374,7 +378,7 @@ % commun), ainsi que la présence de « mon » en début ou fin de % deux lignes consécutives (trois lettres en commun). % -% \item[EOLShortWords:] cette option signale la présence en fin de +% \item[EOLShortWords:] cette option signale la présence en fin de % ligne de mots très courts (une ou deux lettres) % qui sont répertoriés dans une des listes % suivantes (elles dépendent de la langue courante) :\\ @@ -423,14 +427,16 @@ % \luatypoSetColor{11}{LTred} % Répétitions en fin de ligne % \luatypoSetColor{12}{LTgrey}% Dernière ligne d’alinéa presque pleine % \luatypoSetColor{13}{cyan} % Note de bas de page éclatée +% \luatypoSetColor{14}{red} % Mot de fin de phrase en haut de page % \end{verbatim} -% \pkg{lua-typo} charge l’extension graphique \pkg{color}. -% Seules les couleurs portant un nom (\emph{named colors}) peuvent -% être utilisées ; pour en définir de nouvelles, il faut donc soit -% utiliser la commande |\definecolor| de l’extension \pkg{color} -% (comme ci-dessus pour |LTgrey| ou |LTred|), soit charger l’extension -% \pkg{xcolor} package qui donne accès à une kyrielle de noms de -% couleurs. +% \pkg{lua-typo} charge les extensions \pkg{luacolor} et donc +% \pkg{color}. Seules les couleurs portant un nom (\emph{named +% colors}) peuvent être utilisées dans la commande +% |\luatypoSetColor| ; pour en définir de nouvelles il faut donc, +% soit utiliser la commande |\definecolor| de l’extension +% \pkg{color} (comme ci-dessus pour |LTgrey| ou |LTred|), soit +% charger l’extension \pkg{xcolor} qui donne accès à une +% kyrielle de noms de couleurs. % \end{FrenchDoc} % % \StopEventually{} @@ -449,9 +455,9 @@ % \filedate.}, is meant for careful writers and proofreaders who do % not feel totally satisfied with LaTeX output, the most frequent % issues being overfull or underfull lines, widows and orphans, -% hyphenated words split across two pages, consecutive lines ending -% with hyphens, paragraphs ending on too short or nearly full lines, -% homeoarchy, etc. +% hyphenated words split across two pages, two many consecutive lines +% ending with hyphens, paragraphs ending on too short or nearly full +% lines, homeoarchy, etc. % % This package, which works with LuaLaTeX only, % \emph{does not try to correct anything} but just highlights @@ -469,7 +475,7 @@ % may be acceptable in some conditions (multi-columns, technical % papers) and unbearable in others (literary works f.i.). % Moreover, correcting a potential issue somewhere may result in -% other much more serious flaws elsewhere…\\ +% other much more serious flaws somewhere else …\\ % b) Conversely, possible bugs in \pkg{lua-typo} might hide issues % that should normally be highlighted. % @@ -543,6 +549,7 @@ % FirstWordMatch & same (part of) word starting two consecutive lines?\\ % LastWordMatch & same (part of) word ending two consecutive lines?\\ % FootnoteSplit & footnotes spread over two pages or more?\\ +% ShortFinalWord & Short word ending a sentence on the next page\\ % \hline % \end{tabular}\\[12pt] % For example, if you want \pkg{lua-typo} to only warn about overfull @@ -559,7 +566,6 @@ % this option provides an easy way to get their names without having % to look into the documentation. % -% \enlargethispage*{\baselineskip} % With option \opt{None}, \pkg{lua-typo} \emph{does absolutely % nothing}, all checks are disabled as the main function is not added % to any LuaTeX callback. It not quite equivalent to commenting out @@ -577,6 +583,9 @@ % \item[RepeatedHyphens:] ditto, when the number of consecutives % hyphenated lines is too high, only the hyphenated words in % excess (the last ones) are hightlighted. +% \item[ShortFinalWord :] the first word on a page is highlighted +% if it ends a sentence and is short (up to |\luatypoMinLen=4| +% letters). % \end{description} % % \section{Customisation} @@ -685,17 +694,18 @@ % \luatypoSetColor9{red} % Nearly empty page (a few lines) % \luatypoSetColor{10}{LTred} % First word matches % \luatypoSetColor{11}{LTred} % Last word matches -% \luatypoSetColor{12}{LTgrey}% paragraph’s last line nearly full -% \luatypoSetColor{13}{cyan} % footnotes spread over two pages +% \luatypoSetColor{12}{LTgrey}% Paragraph’s last line nearly full +% \luatypoSetColor{13}{cyan} % Footnotes spread over two pages +% \luatypoSetColor{14}{red} % Short final word on top of the page % \end{verbatim} % -% \pkg{lua-typo} loads the \pkg{color} package from the LaTeX graphic -% bundle. Only named colours can be used by \pkg{lua-typo}, so you -% can either use the |\definecolor| from \pkg{color} package to -% define yours (as done in the config file for `LTgrey’) or load the +% \pkg{lua-typo} loads the \pkg{luacolor} package which loads the +% \pkg{color} package from the LaTeX graphic bundle. +% |\luatypoSetColor| requires named colours, so you can either use +% the |\definecolor| from \pkg{color} package to define yours +% (as done in the config file for `LTgrey’ and `LTred’) or load the % \pkg{xcolor} package which provides a bunch of named colours. % -% \clearpage % \section{\TeX{}nical details} % % \iffalse @@ -709,7 +719,7 @@ %<+scan>\ProvidesPackage{scan-page} %<+dtx>\ProvidesFile{lua-typo.dtx} %<*dtx|sty|scan> - [2023-02-10 v.0.61 Daniel Flipo] + [2023-03-08 v.0.65 Daniel Flipo] %</dtx|sty|scan> %<*sty> % \fi @@ -725,7 +735,7 @@ % \begin{macrocode} \ifdefined\DeclareRelease \DeclareRelease{v0.4}{2021-01-01}{lua-typo-2021-04-18.sty} - \DeclareCurrentRelease{}{2023-02-04} + \DeclareCurrentRelease{}{2023-03-08} \else \PackageWarning{lua-typo}{Your LaTeX kernel is too old to provide access\MessageBreak to former versions of the lua-typo package.% @@ -761,6 +771,7 @@ \newcount\luatypoPageMin \newcount\luatypoMinFull \newcount\luatypoMinPart +\newcount\luatypoMinLen \newcount\luatypo@LANGno \newcount\luatypo@options \newtoks\luatypo@single @@ -797,6 +808,7 @@ luatypo = { } \DeclareBoolOption[false]{FirstWordMatch} \DeclareBoolOption[false]{LastWordMatch} \DeclareBoolOption[false]{FootnoteSplit} +\DeclareBoolOption[false]{ShortFinalWord} % \end{macrocode} % Option \opt{All} resets all booleans relative to specific % typographic checks to \opt{true}. @@ -809,6 +821,7 @@ luatypo = { } \LT@ParLastHyphentrue \LT@EOLShortWordstrue \LT@FirstWordMatchtrue \LT@LastWordMatchtrue \LT@BackParindenttrue \LT@FootnoteSplittrue + \LT@ShortFinalWordtrue } \ProcessKeyvalOptions{luatypo} % \end{macrocode} @@ -909,6 +922,12 @@ luatypo = { } \else \directlua{ luatypo.FootnoteSplit = false }% \fi + \ifLT@ShortFinalWord + \advance\luatypo@options by 1 + \directlua{ luatypo.ShortFinalWord = true }% + \else + \directlua{ luatypo.ShortFinalWord = false }% + \fi } % \end{macrocode} % @@ -936,6 +955,7 @@ luatypo = { } FirstWordMatch [false]\MessageBreak LastWordMatch [false]\MessageBreak FootnoteSplit [false]\MessageBreak + ShortFinalWord [false]\MessageBreak \MessageBreak *********************************************% \MessageBreak Lua-typo [ShowOptions] @@ -954,6 +974,7 @@ luatypo = { } luatypo.Stretch = tex.count.luatypoStretchMax luatypo.MinFull = tex.count.luatypoMinFull luatypo.MinPart = tex.count.luatypoMinPart + luatypo.MinLen = tex.count.luatypoMinLen luatypo.LLminWD = tex.dimen.luatypoLLminWD luatypo.BackPI = tex.dimen.luatypoBackPI luatypo.BackFuzz = tex.dimen.luatypoBackFuzz @@ -1004,8 +1025,8 @@ luatypo = { } % lines. The first argument is a language name, say \opt{french}, % which is turned into a command |\l@french| expanding to a number % known by luatex, otherwise an error message occurs. -% The UTF8 string entered as second argument has to be converted -% into the font internal coding. +% The utf-8 string entered as second argument has to be +% converted into the font internal coding. % \begin{macrocode} \newcommand*{\luatypoOneChar}[2]{% \def\luatypo@LANG{#1}\luatypo@single={#2}% @@ -1016,7 +1037,7 @@ luatypo = { } local string = \the\luatypo@single luatypo.single[langno] = " " for p, c in utf8.codes(string) do - local s = string.char(c) + local s = utf8.char(c) luatypo.single[langno] = luatypo.single[langno] .. s end %<dbg> texio.write_nl("SINGLE=" .. luatypo.single[langno]) @@ -1035,7 +1056,7 @@ luatypo = { } local string = \the\luatypo@double luatypo.double[langno] = " " for p, c in utf8.codes(string) do - local s = string.char(c) + local s = utf8.char(c) luatypo.double[langno] = luatypo.double[langno] .. s end %<dbg> texio.write_nl("DOUBLE=" .. luatypo.double[langno]) @@ -1087,14 +1108,11 @@ char_to_discard[string.byte(":")] = true char_to_discard[string.byte(";")] = true char_to_discard[string.byte("-")] = true -local split_lig = { } -split_lig[0xFB00] = "ff" -split_lig[0xFB01] = "fi" -split_lig[0xFB02] = "fl" -split_lig[0xFB03] = "ffi" -split_lig[0xFB04] = "ffl" -split_lig[0xFB05] = "st" -split_lig[0xFB06] = "st" +local eow_char = { } +eow_char[string.byte(".")] = true +eow_char[string.byte("!")] = true +eow_char[string.byte("?")] = true +eow_char[utf8.codepoint("…")] = true local DISC = node.id("disc") local GLYPH = node.id("glyph") @@ -1134,10 +1152,13 @@ local HYPH = 0x2D % \begin{macrocode} local LIGA = 0x102 % \end{macrocode} -% |parline| (current paragraph) must not be reset on every new page! +% Counter |parline| (current paragraph) \emph{must not be reset} +% on every new page! % \begin{macrocode} local parline = 0 - +% \end{macrocode} +% Local definitions for the `node’ library: +% \begin{macrocode} local dimensions = node.dimensions local rangedimensions = node.rangedimensions local effective_glue = node.effective_glue @@ -1148,13 +1169,44 @@ local traverse_id = node.traverse_id local has_field = node.has_field local uses_font = node.uses_font local is_glyph = node.is_glyph - % \end{macrocode} +% Local definitions from the `unicode.utf8’ library: replacements are +% needed for functions |string.gsub()|, |string.find()| and +% |string.reverse()| which are meant for one-byte characters only. +% +% \changes{v0.65}{2023/03/02}{Three new functions for utf-8 strings’ +% manipulations.} % -% \changes{v0.32}{2021/03/14}{Better protection against unexpected +% |utf8_find| requires an utf-8 string and a `pattern’ (also utf-8), +% it returns |nil| if pattern is not found, or the \emph{byte} +% position of the first match otherwise [not an issue as we only +% care for true/false]. +% \begin{macrocode} +local utf8_find = unicode.utf8.find +% \end{macrocode} +% |utf8_gsub| mimics |string.gsub| for utf-8 strings. +% \begin{macrocode} +local utf8_gsub = unicode.utf8.gsub +% \end{macrocode} +% |utf8_reverse| returns the reversed string (utf-8 chars read from +% end to beginning) [same as |string.reverse| but for utf-8 strings]. +% \begin{macrocode} +local utf8_reverse = function (s) + if utf8.len(s) > 1 then + local so = "" + for p, c in utf8.codes(s) do + so = utf8.char(c) .. so + end + s = so + end + return s +end +% \end{macrocode} +% +%\changes{v0.32}{2021/03/14}{Better protection against unexpected % nil nodes.} % -% This auxillary function colours glyphs and discretionaries. +% The next function colours glyphs and discretionaries. % It requires two arguments: a node and a (named) colour. % % \begin{macrocode} @@ -1166,34 +1218,20 @@ local color_node = function (node, color) local repl = node.replace if pre then set_attribute(pre,attr,color) -%<dbg> texio.write_nl('PRE=' .. tostring(pre.char)) end if post then set_attribute(post,attr,color) -%<dbg> if pre then -%<dbg> texio.write(' POST=' .. tostring(post.char)) -%<dbg> else -%<dbg> texio.write_nl('POST=' .. tostring(post.char)) -%<dbg> end end if repl then set_attribute(repl,attr,color) -%<dbg> if pre or post then -%<dbg> texio.write(' REPL=' .. tostring(repl.char)) -%<dbg> else -%<dbg> texio.write_nl('REPL=' .. tostring(repl.char)) -%<dbg> end end -%<dbg> if pre or post or repl then -%<dbg> texio.write_nl(' ') -%<dbg> end elseif node then set_attribute(node,attr,color) end end % \end{macrocode} % -% This auxillary function colours a whole line. It requires two +% The nextfunction colours a whole line. It requires two % arguments: a line’s node and a (named) colour.\par % Digging into nested hlists and vlists is needed f.i.\ to colour % aligned equations. @@ -1245,9 +1283,9 @@ local color_line = function (head, color) end % \end{macrocode} % -% This function appends a line to a buffer which will be written -% to file `\cs{jobname.typo}’; it takes four arguments: -% a string, two numbers (which can be \node{nil}) and a flag. +% The next function takes four arguments: a string, two numbers +% (which can be \node{nil}) and a flag. It appends a line to +% a buffer which will be written to file `\cs{jobname.typo}’. % % \changes{v0.50}{2021/05/13}{Summary of flaws written to file % `\cs{jobname.typo}’.} @@ -1277,77 +1315,72 @@ end % While comparing two words, the only significant nodes are glyphs % and ligatures, dicretionnaries other than ligatures, kerns % (letterspacing) should be discarded. -% For each word to be compared we build a ``signature'' made of +% For each word to be compared we build a ``signature’’ made of % glyphs and split ligatures. % -% \changes{v0.32}{2021/03/14}{Experimental code to deal with non -% standard ligatures.} +% \changes{v0.65}{2023/03/02}{All ligatures are now split using the +% node’s `components’ field rather than a table.} % % The first function adds a node to a signature of type string. % It returns the augmented string and its length. % The last argument is a boolean needed when building a signature -% backwards (see |check_last_word|). +% backwards (see |check_line_last_word|). % \begin{macrocode} local signature = function (node, string, swap) local n = node local str = string if n and n.id == GLYPH then - local b, id = is_glyph(n) - if b and not char_to_discard[b] then -% \end{macrocode} -% Punctuation has to be discarded; the French apostrophe -% (right quote U+2019) has a char code ``out of range'', -% we replace it with U+0027; -% Other glyphs should have char codes less than 0x100 (or 0x180?) or -% be ligatures… standard ones (U+FB00 to U+FB06) are converted using -% table |split_lig|. -% \begin{macrocode} - if b == 0x2019 then b = 0x27 end - if b < 0x100 then - str = str .. string.char(b) - elseif split_lig[b] then - local c = split_lig[b] - if swap then - c = string.reverse(c) - end - str = str .. c + local b = n.char + if b and not char_to_discard[b] then % \end{macrocode} -% Experimental: store other ligatures as the last two digits of their -% decimal code… +% Punctuation has to be discarded; other glyphs may be ligatures, +% then they have a |components| field which holds the list of glyphs +% which compose the ligature. % \begin{macrocode} - elseif n.subtype == LIGA and b > 0xE000 then - local c = string.sub(b,-2) - if swap then - c = string.reverse(c) - end - str = str .. c - end - end + if n.components then + local c = "" + for nn in traverse_id(GLYPH, n.components) do + c = c .. utf8.char(nn.char) + end + if swap then + str = str .. utf8_reverse(c) + else + str = str .. c + end + else + str = str .. utf8.char(b) + end + end elseif n and n.id == DISC then % \end{macrocode} -% Ligatures are split into |pre| and |post| and both parts are -% stored. In case of \emph{ffl, ffi}, the post part is also -% a ligature… +% Discretionaries are split into |pre| and |post| and both parts +% are stored. They might be ligatures (\emph{ffl, ffi})… % \begin{macrocode} local pre = n.pre local post = n.post local c1 = "" local c2 = "" - if pre and pre.char and pre.char ~= HYPH and pre.char < 0x100 then - c1 = string.char(pre.char) + if pre and pre.char then + if pre.components then + for nn in traverse_id(GLYPH, post.components) do + c1 = c1 .. utf8.char(nn.char) + end + else + c1 = utf8.char(pre.char) + end + c1 = utf8_gsub(c1, "-", "") end if post and post.char then - if post.char < 0x100 then - c2 = string.char(post.char) - elseif split_lig[post.char] then - c2 = split_lig[post.char] - if swap then - c2 = string.reverse(c2) + if post.components then + for nn in traverse_id(GLYPH, post.components) do + c2 = c2 .. utf8.char(nn.char) end + else + c2 = utf8.char(post.char) end end if swap then - str = str .. c2 .. c1 + str = str .. utf8_reverse(c2) .. c1 else str = str .. c1 .. c2 end @@ -1355,39 +1388,39 @@ local signature = function (node, string, swap) % \end{macrocode} % The returned length is the number of \emph{letters}. % \begin{macrocode} - local len = string.len(str) - if string.find(str, "_") then + local len = utf8.len(str) + if utf8_find(str, "_") then len = len - 1 end return len, str end % \end{macrocode} % -% This auxillary function looks for consecutive lines ending with the -% same letters.\par +% The next function looks for consecutive lines ending with +% the same letters.\par % It requires five arguments: a string (previous line’s signature), % a node (the last one on the current line), a line number, a column % number (possibly |nil|) and a boolean to cancel checking in some -% cases (end of paragraphs).\par +% cases (end of paragraphs). % It prints the matching part at end of linewith with the supplied % colour and returns the current line’s last word and a boolean (match). % -% \changes{v0.32}{2021/03/14}{Functions `check\_first\_word’ and -% `check\_last\_word’ rewritten.} +% \changes{v0.32}{2021/03/14}{Functions `check\_line\_first\_word’ and +% `check\_line\_last\_word’ rewritten.} % % \changes{v0.50}{2021/05/13}{Homeoarchy detection added for lines % starting or ending on \cs{mbox}.} % -% \changes{v0.61}{2023/02/06}{`check\_last\_word’ returns a flag +% \changes{v0.61}{2023/02/06}{`check\_line\_last\_word’ returns a flag % to set pageflag.} % % \begin{macrocode} -local check_last_word = function (old, node, line, colno, flag) +local check_line_last_word = function (old, node, line, colno, flag) local COLOR = luatypo.colortbl[11] local match = false local new = "" local maxlen = 0 - if flag and node then + if node then local swap = true local box, go % \end{macrocode} @@ -1431,69 +1464,91 @@ local check_last_word = function (old, node, line, colno, flag) maxlen, new = signature (n, new, swap) until not n or n.id == GLUE end - new = string.reverse(new) -%<dbg> texio.write_nl('EOLsigold=' .. old) -%<dbg> texio.write(' EOLsig=' .. new) - local MinFull = luatypo.MinFull - local MinPart = luatypo.MinPart - MinFull = math.min(MinPart,MinFull) - local k = MinPart - local oldlast = string.gsub (old, '.*_', '') - local newlast = string.gsub (new, '.*_', '') - local i = string.find(new, "_") - if i and i > maxlen - MinPart + 1 then - k = MinPart + 1 - end - local oldsub = string.sub(old,-k) - local newsub = string.sub(new,-k) - local l = string.len(new) - if oldsub == newsub and l >= k then -%<dbg> texio.write_nl('EOLnewsub=' .. newsub) - match = true - elseif oldlast == newlast and string.len(newlast) >= MinFull then -%<dbg> texio.write_nl('EOLnewlast=' .. newlast) - match = true - oldsub = oldlast - newsub = newlast - k = string.len(newlast) - end - if match then + new = utf8_reverse(new) +%<dbg> texio.write_nl("EOLsigold=" .. old) +%<dbg> texio.write(" EOLsig=" .. new) % \end{macrocode} -% Minimal partial match; any more glyphs matching? +% When called with flag |false|, |check_line_last_word| returns +% the last word’s signature, but doesn’t compare it with the +% previous line’s. % \begin{macrocode} - local osub = oldsub - local nsub = newsub - while osub == nsub and k <= maxlen do - k = k +1 - osub = string.sub(old,-k) - nsub = string.sub(new,-k) - if osub == nsub then - newsub = nsub + if flag then + local MinFull = luatypo.MinFull + local MinPart = luatypo.MinPart + MinFull = math.min(MinPart,MinFull) + local k = MinPart + local dlo = utf8_reverse(old) + local wen = utf8_reverse(new) + local oldlast = utf8_gsub (old, ".*_", "_") + local newlast = utf8_gsub (new, ".*_", "_") + local i + if utf8_find(newlast, "_") then + i = utf8.len(newlast) + end + if i and i > maxlen - MinPart + 1 then + k = MinPart + 1 + end + local oldsub = "" + local newsub = "" + for p, c in utf8.codes(dlo) do + if utf8.len(oldsub) < k then + oldsub = utf8.char(c) .. oldsub end end - newsub = string.gsub(newsub, '^_', '') -%<dbg> texio.write_nl('EOLfullmatch=' .. newsub) - local msg = "E.O.L. MATCH=" .. newsub - log_flaw(msg, line, colno, footnote) + for p, c in utf8.codes(wen) do + if utf8.len(newsub) < k then + newsub = utf8.char(c) .. newsub + end + end + local l = utf8.len(new) + if oldsub == newsub and l >= k then +%<dbg> texio.write_nl("EOLnewsub=" .. newsub) + match = true + elseif oldlast == newlast and utf8.len(newlast) > MinFull then +%<dbg> texio.write_nl("EOLnewlast=" .. newlast) + match = true + oldsub = oldlast + newsub = newlast + k = utf8.len(newlast) + end + if match then +% \end{macrocode} +% Minimal partial match; any more glyphs matching? +% \begin{macrocode} + local osub = oldsub + local nsub = newsub + while osub == nsub and k <= maxlen do + k = k +1 + osub = string.sub(old,-k) + nsub = string.sub(new,-k) + if osub == nsub then + newsub = nsub + end + end + newsub = utf8_gsub(newsub, "^_", "") +%<dbg> texio.write_nl("EOLfullmatch=" .. newsub) + local msg = "E.O.L. MATCH=" .. newsub + log_flaw(msg, line, colno, footnote) % \end{macrocode} % Lest’s colour the matching string. % \begin{macrocode} - oldsub = string.reverse(newsub) - local newsub = "" - local n = lastn - repeat - if n and n.id ~= GLUE then - color_node(n, COLOR) - l, newsub = signature(n, newsub, swap) - elseif n and n.id == GLUE then - newsub = newsub .. "_" - elseif not n and box then - n = box - else - break - end - n = n.prev - until newsub == oldsub or l >= k + oldsub = utf8_reverse(newsub) + local newsub = "" + local n = lastn + repeat + if n and n.id ~= GLUE then + color_node(n, COLOR) + l, newsub = signature(n, newsub, swap) + elseif n and n.id == GLUE then + newsub = newsub .. "_" + elseif not n and box then + n = box + else + break + end + n = n.prev + until newsub == oldsub or l >= k + end end end return new, match @@ -1503,11 +1558,11 @@ end % Same thing for beginning of lines: check the first two words % and compare their signature with the previous line’s. % -% \changes{v0.61}{2023/02/06}{`check\_first\_word’ returns a flag +% \changes{v0.61}{2023/02/06}{`check\_line\_first\_word’ returns a flag % to set pageflag.} % % \begin{macrocode} -local check_first_word = function (old, node, line, colno, flag) +local check_line_first_word = function (old, node, line, colno, flag) local COLOR = luatypo.colortbl[10] local match = false local swap = false @@ -1548,10 +1603,10 @@ local check_first_word = function (old, node, line, colno, flag) maxlen, new = signature (n, new, swap) until not n or n.id == GLUE end -%<dbg> texio.write_nl('BOLsigold=' .. old) -%<dbg> texio.write(' BOLsig=' .. new) +%<dbg> texio.write_nl("BOLsigold=" .. old) +%<dbg> texio.write(" BOLsig=" .. new) % \end{macrocode} -% When called with flag |false|, |check_first_word| returns +% When called with flag |false|, |check_line_first_word| returns % the first word’s signature, but doesn’t compare it with the % previous line’s. % \begin{macrocode} @@ -1560,26 +1615,33 @@ local check_first_word = function (old, node, line, colno, flag) local MinPart = luatypo.MinPart MinFull = math.min(MinPart,MinFull) local k = MinPart - local oldsub = "" - local newsub = "" - local oldfirst = string.gsub (old, '_.*', '') - local newfirst = string.gsub (new, '_.*', '') - local i = string.find(new, "_") + local oldfirst = utf8_gsub (old, "_.*", "_") + local newfirst = utf8_gsub (new, "_.*", "_") + local i + if utf8_find(newfirst, "_") then + i = utf8.len(newfirst) + end if i and i <= MinPart then k = MinPart + 1 end - local oldsub = string.sub(old,1,k) - local newsub = string.sub(new,1,k) - local l = string.len(newsub) + local oldsub = "" + local newsub = "" + for p, c in utf8.codes(old) do + if utf8.len(oldsub) < k then oldsub = oldsub .. utf8.char(c) end + end + for p, c in utf8.codes(new) do + if utf8.len(newsub) < k then newsub = newsub .. utf8.char(c) end + end + local l = utf8.len(newsub) if oldsub == newsub and l >= k then -%<dbg> texio.write_nl('BOLnewsub=' .. newsub) +%<dbg> texio.write_nl("BOLnewsub=" .. newsub) match = true - elseif oldfirst == newfirst and string.len(newfirst) >= MinFull then -%<dbg> texio.write_nl('BOLnewfirst=' .. newfirst) + elseif oldfirst == newfirst and utf8.len(newfirst) > MinFull then +%<dbg> texio.write_nl("BOLnewfirst=" .. newfirst) match = true oldsub = oldfirst newsub = newfirst - k = string.len(newfirst) + k = utf8.len(newfirst) end if match then % \end{macrocode} @@ -1595,8 +1657,8 @@ local check_first_word = function (old, node, line, colno, flag) newsub = nsub end end - newsub = string.gsub(newsub, '_$', '') --$ -%<dbg> texio.write_nl('BOLfullmatch=' .. newsub) + newsub = utf8_gsub(newsub, "_$", "") --$ +%<dbg> texio.write_nl("BOLfullmatch=" .. newsub) local msg = "B.O.L. MATCH=" .. newsub log_flaw(msg, line, colno, footnote) % \end{macrocode} @@ -1604,7 +1666,7 @@ local check_first_word = function (old, node, line, colno, flag) % \begin{macrocode} oldsub = newsub local newsub = "" - local k = string.len(oldsub) + local k = utf8.len(oldsub) local n = start repeat if n and n.id ~= GLUE then @@ -1625,13 +1687,79 @@ local check_first_word = function (old, node, line, colno, flag) end % \end{macrocode} % -% \pagebreak[4] -% This auxillary function looks for a short word (one or two chars) -% at end of lines, compares it to a given list and colours it if -% matches. The first argument must be a node of type |GLYPH|, +% \changes{v0.65}{2023/03/02}{New `check\_page\_first\_word’ function.} +% +% The next function checks the first word on a new page: if +% it ends a sentence and is short (up to |luatypoMinLen| characters), +% the function returns |true| and colors the offending word. +% Otherwise it just retrurs |false|. +% The function requires two arguments: the line’s first node and +% a column number (possibly |nil|). +% +% \begin{macrocode} +local check_page_first_word = function (node, colno) + local COLOR = luatypo.colortbl[14] + local match = false + local swap = false + local new = "" + local maxlen = luatypo.MinLen + local len = 0 + local n = node + local pn + while n and n.id ~= GLYPH and n.id ~= DISC and + (n.id ~= HLIST or n.subtype == INDENT) do + n = n.next + end + local start = n + if n and n.id == HLIST then + start = n.head + n = n.head + end + repeat + len, new = signature (n, new, swap) + n = n.next + until len > maxlen or (n and n.id == GLYPH and eow_char[n.char]) or + (n and n.id == GLUE) or + (n and n.id == KERN and n.subtype == 1) +% \end{macrocode} +% In French `?’ and `!’ are preceded by a glue (babel) or a kern +% (polyglossia). +% \begin{macrocode} + if n and (n.id == GLUE or n.id == KERN) then + pn = n + n = n.next + end + if len <= maxlen and n and n.id == GLYPH and eow_char[n.char] then + match =true + if pn and (pn.id == GLUE or pn.id == KERN) then + new = new .. " " + len = len + 1 + end + len = len + 1 + end +%<dbg> texio.write_nl("FinalWord=" .. new) + if match then + local msg = "ShortFinalWord=" .. new + log_flaw(msg, 1, colno, false) +% \end{macrocode} +% Lest’s colour the final word and punctuation sign. +% \begin{macrocode} + local n = start + repeat + color_node(n, COLOR) + n = n.next + until eow_char[n.char] + color_node(n, COLOR) + end + return match +end +% \end{macrocode} +% +% The next function looks for a short word (one or two +% chars) at end of lines, compares it to a given list and colours it +% if matches. The first argument must be a node of type |GLYPH|, % usually the last line’s node, the next two are the line and -% column number.\par -% TODO: where does ``out of range’’ starts? U+0100? U+0180? +% column number. % % \changes{v0.61}{2023/02/06}{`check\_regexpr’ returns a flag % to set pageflag in `check\_vtop’.} @@ -1651,11 +1779,11 @@ local check_regexpr = function (glyph, line, colno) % \end{macrocode} % For single char words, the previous node is a glue. % \begin{macrocode} - if lchar and lchar < 0x100 and previous and previous.id == GLUE then - match = string.find(luatypo.single[lang], string.char(lchar)) + if lchar and previous and previous.id == GLUE then + match = utf8_find(luatypo.single[lang], utf8.char(lchar)) if match then retflag = true - local msg = "RGX MATCH=" .. string.char(lchar) + local msg = "RGX MATCH=" .. utf8.char(lchar) log_flaw(msg, line, colno, footnote) color_node(glyph,COLOR) end @@ -1671,9 +1799,9 @@ local check_regexpr = function (glyph, line, colno) % \end{macrocode} % For two chars words, the previous node is a glue… % \begin{macrocode} - if pchar and pchar < 0x100 and pprev and pprev.id == GLUE then - local pattern = string.char(pchar) .. string.char(lchar) - match = string.find(luatypo.double[lang], pattern) + if pchar and pprev and pprev.id == GLUE then + local pattern = utf8.char(pchar) .. utf8.char(lchar) + match = utf8_find(luatypo.double[lang], pattern) if match then retflag = true local msg = "RGX MATCH=" .. pattern @@ -1690,10 +1818,9 @@ local check_regexpr = function (glyph, line, colno) if pprev and pprev.id == GLYPH then local pchar, id = is_glyph(pprev) local ppprev = pprev.prev - if pchar and pchar < 0x100 and - ppprev and ppprev.id == GLUE then - local pattern = string.char(pchar) .. string.char(lchar) - match = string.find(luatypo.double[lang], pattern) + if pchar and ppprev and ppprev.id == GLUE then + local pattern = utf8.char(pchar) .. utf8.char(lchar) + match = utf8_find(luatypo.double[lang], pattern) if match then retflag = true local msg = "REGEXP MATCH=" .. pattern @@ -1709,8 +1836,8 @@ return retflag end % \end{macrocode} % -% This auxillary function prints the first part of an hyphenated word -% up to the discretionary, with a supplied colour. +% The next function prints the first part of an hyphenated +% word up to the discretionary, with a supplied colour. % It requires two arguments: a \node{disc} node and a (named) colour. % % \begin{macrocode} @@ -1725,7 +1852,7 @@ local show_pre_disc = function (disc, color) % \end{macrocode} % % \begin{macro}{footnoterule-ahead} -% This auxillary function scans the current \node{vlist} in search +% The next function scans the current \node{vlist} in search % of a |\footnoterule|; it returns |true| if found, false otherwise. % The \node{rule} node above footnotes is normaly surrounded by % two (vertical) \node{kern} nodes, the total height is either @@ -1759,11 +1886,11 @@ local footnoterule_ahead = function (head) if totalht == 0 or totalht == ruleht then flag = true else -%<dbg> texio.write_nl(' ') -%<dbg> texio.write_nl('Not a footnoterule:') -%<dbg> texio.write(' KERN height=' .. ht1) -%<dbg> texio.write(' RULE height=' .. ht2) -%<dbg> texio.write(' KERN height=' .. ht3) +%<dbg> texio.write_nl(" ") +%<dbg> texio.write_nl("Not a footnoterule:") +%<dbg> texio.write(" KERN height=" .. ht1) +%<dbg> texio.write(" RULE height=" .. ht2) +%<dbg> texio.write(" KERN height=" .. ht3) end end end @@ -1774,7 +1901,7 @@ end % \end{macro} % % \begin{macro}{get-pagebody} -% This auxillary function scans the \node{vlist}s on the current +% The next function scans the \node{vlist}s on the current % page in search of the page body. % It returns the corresponding node or nil in case of failure. % @@ -1789,29 +1916,29 @@ local get_pagebody = function (head) repeat fn = fn.next until fn.id == VLIST and fn.height > 0 -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl(" ") %<dbg> local ht = string.format("%.1fpt", fn.height/65536) %<dbg> local dp = string.format("%.1fpt", fn.depth/65536) -%<dbg> texio.write_nl('get_pagebody: TOP VLIST') -%<dbg> texio.write(' ht=' .. ht .. ' dp=' .. dp) +%<dbg> texio.write_nl("get_pagebody: TOP VLIST") +%<dbg> texio.write(" ht=" .. ht .. " dp=" .. dp) first = fn.list for n in traverse_id(VLIST,first) do if n.subtype == 0 and n.height == textht then %<dbg> local ht = string.format("%.1fpt", n.height/65536) -%<dbg> texio.write_nl('BODY found: ht=' .. ht) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("BODY found: ht=" .. ht) +%<dbg> texio.write_nl(" ") body = n break else -%<dbg> texio.write_nl('Skip short VLIST:') +%<dbg> texio.write_nl("Skip short VLIST:") %<dbg> local ht = string.format("%.1fpt", n.height/65536) %<dbg> local dp = string.format("%.1fpt", n.depth/65536) -%<dbg> texio.write(' ht=' .. ht .. ' dp=' .. dp) +%<dbg> texio.write(" ht=" .. ht .. " dp=" .. dp) first = n.list for n in traverse_id(VLIST,first) do if n.subtype == 0 and n.height == textht then %<dbg> local ht = string.format("%.1fpt", n.height/65536) -%<dbg> texio.write_nl(' BODY: ht=' .. ht) +%<dbg> texio.write_nl(" BODY: ht=" .. ht) body = n break end @@ -1819,7 +1946,7 @@ local get_pagebody = function (head) end end if not body then - texio.write_nl('***lua-typo ERROR: PAGE BODY *NOT* FOUND!***') + texio.write_nl("***lua-typo ERROR: PAGE BODY *NOT* FOUND!***") end return body end @@ -1827,7 +1954,7 @@ end % \end{macro} % % \begin{macro}{check-vtop} -% This function is called repeatedly by |check_page| (see below); +% The next function is called repeatedly by |check_page| (see below); % it scans the boxes found in the page body (f.i. columns) % in search of typographical flaws and logs. % @@ -1863,6 +1990,7 @@ check_vtop = function (head, colno, vpos) local EOLShortWords = luatypo.EOLShortWords local LastWordMatch = luatypo.LastWordMatch local FootnoteSplit = luatypo.FootnoteSplit + local ShortFinalWord = luatypo.ShortFinalWord local Stretch = math.max(luatypo.Stretch/100,1) local blskip = tex.getglue("baselineskip") local vpos_min = PAGEmin * blskip @@ -1904,6 +2032,7 @@ check_vtop = function (head, colno, vpos) vpos = vpos + head.height + head.depth local linewd = head.width local first = head.head + local ListItem = false if footnote then ftnline = ftnline + 1 line = ftnline @@ -1926,9 +2055,9 @@ check_vtop = function (head, colno, vpos) body_bottom = true elseif footnoterule_ahead(n) then body_bottom = true -%<dbg> texio.write_nl('=> FOOTNOTE RULE ahead') -%<dbg> texio.write_nl('check_vtop: last line before footnotes') -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("=> FOOTNOTE RULE ahead") +%<dbg> texio.write_nl("check_vtop: last line before footnotes") +%<dbg> texio.write_nl(" ") end % \end{macrocode} % Is the current line overfull or underfull? @@ -1954,6 +2083,7 @@ check_vtop = function (head, colno, vpos) color_line (head, COLOR) end % \end{macrocode} +% \enlargethispage*{2\baselineskip} % Set flag |ftnsplit| to |true| on every page’s last line. % This flag will be reset to false if the current line ends a % paragraph. @@ -1976,7 +2106,6 @@ check_vtop = function (head, colno, vpos) (first.id == GLUE and first.subtype == LFTSKIP) do first = first.next end - local ListItem = false % \end{macrocode} % Now let’s analyse the beginning of the current line. % \begin{macrocode} @@ -1987,6 +2116,8 @@ check_vtop = function (head, colno, vpos) % they are frozen in footnotes). % \begin{macrocode} hyphcount = 0 + firstwd = "" + lastwd = "" if not footnote then parline = 1 if body_bottom then @@ -2043,8 +2174,8 @@ check_vtop = function (head, colno, vpos) local llwd = linewd - PFskip %<dbg> local PFskip_pt = string.format("%.1fpt", PFskip/65536) %<dbg> local llwd_pt = string.format("%.1fpt", llwd/65536) -%<dbg> texio.write_nl('PFskip= ' .. PFskip_pt) -%<dbg> texio.write(' llwd= ' .. llwd_pt) +%<dbg> texio.write_nl("PFskip= " .. PFskip_pt) +%<dbg> texio.write(" llwd= " .. llwd_pt) % \end{macrocode} % |llwd| is the line’s length. Is it too short? % \begin{macrocode} @@ -2095,7 +2226,7 @@ check_vtop = function (head, colno, vpos) if FirstWordMatch then local flag = not ListItem firstwd, flag = - check_first_word(firstwd, first, line, colno, flag) + check_line_first_word(firstwd, first, line, colno, flag) if flag then pageflag = true end @@ -2109,7 +2240,7 @@ check_vtop = function (head, colno, vpos) flag = false end lastwd, flag = - check_last_word(lastwd, pn, line, colno, flag) + check_line_last_word(lastwd, pn, line, colno, flag) if flag then pageflag = true end @@ -2123,46 +2254,46 @@ check_vtop = function (head, colno, vpos) % Colour the whole line now if it is a orphan or a footnote % continuing on the next page. % \begin{macrocode} - if orphanflag and Orphans then - pageflag = true - local msg = "ORPHAN" - log_flaw(msg, line, colno, footnote) - local COLOR = luatypo.colortbl[5] - color_line (head, COLOR) - end - if ftnsplit and FootnoteSplit then - pageflag = true - local msg = "FOOTNOTE SPLIT" - log_flaw(msg, line, colno, footnote) - local COLOR = luatypo.colortbl[13] - color_line (head, COLOR) - end - if (page_bottom or body_bottom) and EOPHyphens then + if orphanflag and Orphans then + pageflag = true + local msg = "ORPHAN" + log_flaw(msg, line, colno, footnote) + local COLOR = luatypo.colortbl[5] + color_line (head, COLOR) + end + if ftnsplit and FootnoteSplit then + pageflag = true + local msg = "FOOTNOTE SPLIT" + log_flaw(msg, line, colno, footnote) + local COLOR = luatypo.colortbl[13] + color_line (head, COLOR) + end + if (page_bottom or body_bottom) and EOPHyphens then % \end{macrocode} % This hyphen occurs on the page’s last line (body or footnote), % colour (differently) the last word. % \begin{macrocode} - pageflag = true - local msg = "LAST WORD SPLIT" - log_flaw(msg, line, colno, footnote) - local COLOR = luatypo.colortbl[1] - local pg = show_pre_disc (pn,COLOR) - end + pageflag = true + local msg = "LAST WORD SPLIT" + log_flaw(msg, line, colno, footnote) + local COLOR = luatypo.colortbl[1] + local pg = show_pre_disc (pn,COLOR) + end % \end{macrocode} % Track matching words at the beginning and end of line. % \begin{macrocode} if FirstWordMatch then local flag = not ListItem firstwd, flag = - check_first_word(firstwd, first, line, colno, flag) + check_line_first_word(firstwd, first, line, colno, flag) if flag then pageflag = true end end if LastWordMatch then - local flag = false + local flag = true lastwd, flag = - check_last_word(lastwd, ln, line, colno, true) + check_line_last_word(lastwd, ln, line, colno, flag) if flag then pageflag = true end @@ -2206,36 +2337,36 @@ check_vtop = function (head, colno, vpos) % Colour the whole line now if it is a orphan or a footnote % continuing on the next page. % \begin{macrocode} - if orphanflag and Orphans then - pageflag = true - local msg = "ORPHAN" - log_flaw(msg, line, colno, footnote) - local COLOR = luatypo.colortbl[5] - color_line (head, COLOR) - end - if ftnsplit and FootnoteSplit then - pageflag = true - local msg = "FOOTNOTE SPLIT" - log_flaw(msg, line, colno, footnote) - local COLOR = luatypo.colortbl[13] - color_line (head, COLOR) - end + if orphanflag and Orphans then + pageflag = true + local msg = "ORPHAN" + log_flaw(msg, line, colno, footnote) + local COLOR = luatypo.colortbl[5] + color_line (head, COLOR) + end + if ftnsplit and FootnoteSplit then + pageflag = true + local msg = "FOOTNOTE SPLIT" + log_flaw(msg, line, colno, footnote) + local COLOR = luatypo.colortbl[13] + color_line (head, COLOR) + end % \end{macrocode} -% Track matching words at the beginning and end of line and shot +% Track matching words at the beginning and end of line and short % words. % \begin{macrocode} if FirstWordMatch then local flag = not ListItem firstwd, flag = - check_first_word(firstwd, first, line, colno, flag) + check_line_first_word(firstwd, first, line, colno, flag) if flag then pageflag = true end end if LastWordMatch and pn then - local flag + local flag = true lastwd, flag = - check_last_word(lastwd, pn, line, colno, true) + check_line_last_word(lastwd, pn, line, colno, flag) if flag then pageflag = true end @@ -2252,6 +2383,13 @@ check_vtop = function (head, colno, vpos) end end % \end{macrocode} +% Check the page’s first word (end of sentence?). +% \begin{macrocode} + if ShortFinalWord and pageline == 1 and parline > 1 and + check_page_first_word(first,colno) then + pageflag = true + end +% \end{macrocode} % End of scanning for the main type of node (text lines). % \begin{macrocode} elseif head.id == HLIST and @@ -2323,8 +2461,8 @@ check_vtop = function (head, colno, vpos) % set the |footnote| flag and reset some counters and flags % for the coming footnote lines. % \begin{macrocode} -%<dbg> texio.write_nl('check_vtop: footnotes start') -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("check_vtop: footnotes start") +%<dbg> texio.write_nl(" ") footnote = true ftnline = 0 body_bottom = false @@ -2342,15 +2480,15 @@ check_vtop = function (head, colno, vpos) if first_bot then %<dbg> local vpos_pt = string.format("%.1fpt", vpos/65536) %<dbg> local vmin_pt = string.format("%.1fpt", vpos_min/65536) -%<dbg> texio.write_nl('pageline=' .. pageline) -%<dbg> texio.write_nl('vpos=' .. vpos_pt) -%<dbg> texio.write(' vpos_min=' .. vmin_pt) +%<dbg> texio.write_nl("pageline=" .. pageline) +%<dbg> texio.write_nl("vpos=" .. vpos_pt) +%<dbg> texio.write(" vpos_min=" .. vmin_pt) %<dbg> if page_bottom then %<dbg> local tht = tex.getdimen("textheight") %<dbg> local tht_pt = string.format("%.1fpt", tht/65536) -%<dbg> texio.write(' textheight=' .. tht_pt) +%<dbg> texio.write(" textheight=" .. tht_pt) %<dbg> end -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl(" ") if pageline > 1 and pageline < PAGEmin and ShortPages then pageshort = true end @@ -2388,21 +2526,21 @@ check_vtop = function (head, colno, vpos) elseif head.id == HLIST and head.subtype == BOX then local hf = head.list if hf and hf.id == VLIST and hf.subtype == 0 then -%<dbg> texio.write_nl('check_vtop: BREAK => multicol') -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("check_vtop: BREAK => multicol") +%<dbg> texio.write_nl(" ") break end end head = nextnode end %<dbg> if nextnode then -%<dbg> texio.write('Exit check_vtop, next=') +%<dbg> texio.write("Exit check_vtop, next=") %<dbg> texio.write(tostring(node.type(nextnode.id))) -%<dbg> texio.write('-'.. nextnode.subtype) +%<dbg> texio.write("-".. nextnode.subtype) %<dbg> else -%<dbg> texio.write_nl('Exit check_vtop, next=nil') +%<dbg> texio.write_nl("Exit check_vtop, next=nil") %<dbg> end -%<dbg> texio.write_nl('') +%<dbg> texio.write_nl("") % \end{macrocode} % Update the list of flagged pages avoiding duplicates: % \begin{macrocode} @@ -2451,8 +2589,8 @@ luatypo.check_page = function (head) % of bowing, let’s step down one level. % \begin{macrocode} %<dbg> local boxwd = string.format("%.1fpt", first.width/65536) -%<dbg> texio.write_nl('One step down: boxwd=' .. boxwd) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("One step down: boxwd=" .. boxwd) +%<dbg> texio.write_nl(" ") top = body.list first = top.list end @@ -2461,9 +2599,9 @@ luatypo.check_page = function (head) % \begin{macrocode} while top do first = top.list -%<dbg> texio.write_nl('Page loop: top=' .. tostring(node.type(top.id))) -%<dbg> texio.write('-' .. top.subtype) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("Page loop: top=" .. tostring(node.type(top.id))) +%<dbg> texio.write("-" .. top.subtype) +%<dbg> texio.write_nl(" ") if top and top.id == VLIST and top.subtype == 0 and top.width > textwd/2 then % \end{macrocode} @@ -2471,11 +2609,11 @@ luatypo.check_page = function (head) % \begin{macrocode} %<dbg> local boxht = string.format("%.1fpt", top.height/65536) %<dbg> local boxwd = string.format("%.1fpt", top.width/65536) -%<dbg> texio.write_nl('**VLIST: ') +%<dbg> texio.write_nl("**VLIST: ") %<dbg> texio.write(tostring(node.type(top.id))) -%<dbg> texio.write('-' .. top.subtype) -%<dbg> texio.write(' wd=' .. boxwd .. ' ht=' .. boxht) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write("-" .. top.subtype) +%<dbg> texio.write(" wd=" .. boxwd .. " ht=" .. boxht) +%<dbg> texio.write_nl(" ") local next = check_vtop(first,colno,vpos) if next then top = next @@ -2489,24 +2627,24 @@ luatypo.check_page = function (head) % Two or more columns, each one is boxed in a vlist.\par % Run |check_vtop| on every column. % \begin{macrocode} -%<dbg> texio.write_nl('**MULTICOL type1:') -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("**MULTICOL type1:") +%<dbg> texio.write_nl(" ") colno = 0 for n in traverse_id(VLIST, first) do colno = colno + 1 col = n.list -%<dbg> texio.write_nl('Start of col.' .. colno) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("Start of col." .. colno) +%<dbg> texio.write_nl(" ") check_vtop(col,colno,vpos) -%<dbg> texio.write_nl('End of col.' .. colno) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("End of col." .. colno) +%<dbg> texio.write_nl(" ") end colno = nil top = top.next -%<dbg> texio.write_nl('MULTICOL type1 END: next=') +%<dbg> texio.write_nl("MULTICOL type1 END: next=") %<dbg> texio.write(tostring(node.type(top.id))) -%<dbg> texio.write('-' .. top.subtype) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write("-" .. top.subtype) +%<dbg> texio.write_nl(" ") elseif (top and top.id == HLIST and top.subtype == BOX) and (first and first.id == HLIST and first.subtype == BOX) and (first.height > 0 and first.width > 0) then @@ -2515,19 +2653,19 @@ luatypo.check_page = function (head) % holds a vlist.\par % Run |check_vtop| on every column. % \begin{macrocode} -%<dbg> texio.write_nl('**MULTICOL type2:') -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("**MULTICOL type2:") +%<dbg> texio.write_nl(" ") colno = 0 for n in traverse_id(HLIST, first) do colno = colno + 1 local nn = n.list if nn and nn.list then col = nn.list -%<dbg> texio.write_nl('Start of col.' .. colno) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("Start of col." .. colno) +%<dbg> texio.write_nl(" ") check_vtop(col,colno,vpos) -%<dbg> texio.write_nl('End of col.' .. colno) -%<dbg> texio.write_nl(' ') +%<dbg> texio.write_nl("End of col." .. colno) +%<dbg> texio.write_nl(" ") end end colno = nil @@ -2543,18 +2681,17 @@ return luatypo.check_page % \end{macrocode} % \end{macro} % +% \changes{v0.50}{2021/05/02}{Callback `pre\_output\_filter’ replaced +% by `pre\_shipout\_filter’, in the former the material is not boxed +% yet and footnotes are not visible.} +% % NOTE: |effective_glue| requires a `parent’ node, as pointed out by % Marcel Krüger on S.E., this implies using |pre_shipout_filter| % instead of |pre_output_filter|. % % Add the |luatypo.check_page| function to the |pre_shipout_filter| % callback (with priority 1 for colour attributes to be effective), -% unless option |None| is selected ; remember that the |None| -% boolean’s value is forwarded to Lua `AtEndOfPackage’… -% -% \changes{v0.50}{2021/05/02}{Callback `pre\_output\_filter’ replaced -% by `pre\_shipout\_filter’, in the former the material is not boxed -% yet and footnotes are not visible.} +% unless option |None| is selected. % % \begin{macrocode} \AtEndOfPackage{% @@ -2567,17 +2704,16 @@ return luatypo.check_page } % \end{macrocode} % -% Load a local config file if present in LaTeX’s search path.\par -% Otherwise, set reasonnable defaults. +% Load a config file if present in LaTeX’s search path or +% set reasonnable defaults. % -% \changes{v0.61}{2023/02/07}{Colours mygrey, myred renamed +% \changes{v0.61}{2023/02/07}{Colours mygrey, myred renamed as % LTgrey, LTred.} % % \begin{macrocode} - \InputIfFileExists{lua-typo.cfg}% - {\PackageInfo{lua-typo.sty}{'lua-typo.cfg' file loaded}}% - {\PackageInfo{lua-typo.sty}{'lua-typo.cfg' file not found. + {\PackageInfo{lua-typo.sty}{"lua-typo.cfg" file loaded}}% + {\PackageInfo{lua-typo.sty}{"lua-typo.cfg" file not found. \MessageBreak Providing default values.}% \definecolor{LTgrey}{gray}{0.6}% \definecolor{LTred}{rgb}{1,0.55,0} @@ -2595,6 +2731,7 @@ return luatypo.check_page \luatypoSetColor{11}{LTred}% Last word matches \luatypoSetColor{12}{LTgrey}% Paragraph ending on a nearly full line \luatypoSetColor{13}{cyan}% Footnote split + \luatypoSetColor{14}{red}% Too short first (final) word on the page \luatypoBackPI=1em\relax \luatypoBackFuzz=2pt\relax \ifdim\parindent=0pt \luatypoLLminWD=20pt\relax @@ -2604,6 +2741,7 @@ return luatypo.check_page \luatypoPageMin=5\relax \luatypoMinFull=4\relax \luatypoMinPART=4\relax + \luatypoMinLen=4\relax }% % \end{macrocode} % \iffalse @@ -2643,6 +2781,10 @@ return luatypo.check_page \luatypoMinFull=3\relax \luatypoMinPart=4\relax +%% Minimum number of characters for the first word on a page if it ends +%% a sentence. +\luatypoMinLen=4\relax + %% Default colours = red, cyan, LTgrey \definecolor{LTgrey}{gray}{0.6} \definecolor{LTred}{rgb}{1,0.55,0} @@ -2660,11 +2802,12 @@ return luatypo.check_page \luatypoSetColor{11}{LTred} % Last word matches \luatypoSetColor{12}{LTgrey}% Paragraph ending on a nearly full line \luatypoSetColor{13}{cyan} % Footnote split +\luatypoSetColor{14}{red} % Too short first (final) word on the page %% Language specific settings (example for French): %% short words (two letters max) to be avoided at end of lines. -%%\luatypoOneChar{french}{'À Ô Y'} -%%\luatypoTwoChars{french}{'Je Tu Il On Au De'} +%%\luatypoOneChar{french}{"À Ô Y"} +%%\luatypoTwoChars{french}{"Je Tu Il On Au De"} % \end{macrocode} % % \iffalse @@ -2729,12 +2872,12 @@ return luatypo.check_page \AtVeryEndDocument{% \directlua{ - texio.write_nl(' ') - texio.write_nl('***************************') - texio.write_nl('*** PAGE SCANNING ONLY: ***') - texio.write_nl('*** NO CHECK PERFORMED! ***') - texio.write_nl('***************************') - texio.write_nl(' ') + texio.write_nl(" ") + texio.write_nl("***************************") + texio.write_nl("*** PAGE SCANNING ONLY: ***") + texio.write_nl("*** NO CHECK PERFORMED! ***") + texio.write_nl("***************************") + texio.write_nl(" ") }% } @@ -2750,21 +2893,10 @@ luatypo.colortbl = { } luatypo.pagelist = " " local hyphcount = 0 -local parlines = 0 -local pagelines = 0 local pageno = 0 local prevno = 0 local pageflag = false -local char_to_discard = { } -char_to_discard[string.byte(",")] = true -char_to_discard[string.byte(".")] = true -char_to_discard[string.byte("!")] = true -char_to_discard[string.byte("?")] = true -char_to_discard[string.byte(":")] = true -char_to_discard[string.byte(";")] = true -char_to_discard[string.byte("-")] = true - local DISC = node.id("disc") local GLYPH = node.id("glyph") local GLUE = node.id("glue") @@ -2807,24 +2939,24 @@ local get_pagebody = function (head) first = fn.list local ht = string.format("%.1fpt", fn.height/65536) local dp = string.format("%.1fpt", fn.depth/65536) - texio.write_nl('SKIP vlist: ht=' .. ht .. ' dp=' .. dp) + texio.write_nl("SKIP vlist: ht=" .. ht .. " dp=" .. dp) for n in traverse_id(VLIST,first) do if n.subtype == 0 and n.height == textht then local ht = string.format("%.1fpt", n.height/65536) - texio.write_nl(' BODY: ' .. ht) - texio.write_nl(' ') + texio.write_nl(" BODY: " .. ht) + texio.write_nl(" ") body = n break else local ht = string.format("%.1fpt", n.height/65536) local dp = string.format("%.1fpt", n.depth/65536) - texio.write_nl(' SKIP vlist: ht=' .. ht .. ' dp=' .. dp) + texio.write_nl(" SKIP vlist: ht=" .. ht .. " dp=" .. dp) first = n.list for n in traverse_id(VLIST,first) do if n.subtype == 0 and n.height == textht then ht = string.format("%.1fpt", n.height/65536) - texio.write_nl(' BODY: ' .. ht) - texio.write_nl(' ') + texio.write_nl(" BODY: " .. ht) + texio.write_nl(" ") body = n break end @@ -2832,37 +2964,48 @@ local get_pagebody = function (head) end end if not body then - texio.write_nl('***lua-typo ERROR: PAGE BODY *NOT* FOUND!***') + texio.write_nl("***lua-typo ERROR: PAGE BODY *NOT* FOUND!***") end return body end local print_subtype = function (node,parent) local n = node - if n.id == GLYPH and n.subtype == 256 and n.char < 0x100 then - texio.write(string.char(n.char)) - else - if n.subtype then - texio.write(n.subtype) - else - texio.write(' ') - end - end - if n.id == GLUE then + if n.id == GLYPH then + texio.write(utf8.char(n.char)) + elseif n.id == GLUE then real_pt = string.format("%.1fpt", effective_glue(n,parent)/65536) - texio.write(' realwd=' .. real_pt) + texio.write(" realwd=" .. real_pt) elseif n.id == DISC then - texio.write(' pre=' .. tostring(n.pre)) - texio.write(' post=' .. tostring(n.post)) - texio.write(' repl=' .. tostring(n.replace)) + local c = "" + if n.replace then + for nn in traverse_id(GLYPH, n.replace) do + c = c .. utf8.char(nn.char) + end + texio.write(c) + end + if n.pre then + c = "" + for nn in traverse_id(GLYPH, n.pre) do + c = c .. utf8.char(nn.char) + end + texio.write(" pre=" .. c) + end + if n.post then + c = "" + for nn in traverse_id(GLYPH, n.post) do + c = c .. utf8.char(nn.char) + end + texio.write(" post=" .. c) + end elseif n.subtype and n.subtype < 256 and n.height and n.depth then ht_pt = string.format("%.1fpt", n.height/65536) dp_pt = string.format("%.1fpt", n.depth/65536) - texio.write(' ht=' .. ht_pt .. ' dp=' .. dp_pt) + texio.write(" ht=" .. ht_pt .. " dp=" .. dp_pt) if n.width then wd_pt = string.format("%.1fpt", n.width/65536) - texio.write(' wd=' .. wd_pt) - end + texio.write(" wd=" .. wd_pt) + end end end @@ -2874,9 +3017,9 @@ local scanvlist = function (head) local textht = tex.getdimen("textheight") local textwd = tex.getdimen("textwidth") local pageno = tex.getcount("c@page") - texio.write_nl('PAGE ' .. pageno) - texio.write(' textheight='.. string.format("%.1fpt", textht/65536)) - texio.write(' textwidth=' .. string.format("%.1fpt", textwd/65536)) + texio.write_nl("PAGE " .. pageno) + texio.write(" textheight=".. string.format("%.1fpt", textht/65536)) + texio.write(" textwidth=" .. string.format("%.1fpt", textwd/65536)) local linecount = 0 local body, parent, ht_pt, dp_pt, real_pt body = get_pagebody(head) @@ -2886,46 +3029,46 @@ local scanvlist = function (head) end while (head) do texio.write_nl(tostring(node.type(head.id))) - texio.write('-') + texio.write("-") print_subtype(head,body) if head.kern then ht_pt = string.format("%.1fpt", head.kern/65536) - texio.write(' KERN ht/wd=' .. ht_pt) + texio.write(" KERN ht/wd=" .. ht_pt) end local next = head.next local first = head.head for n in traverse(first) do parent = head - texio.write_nl(' ' .. tostring(node.type(n.id))) - texio.write('-') + texio.write_nl(" " .. tostring(node.type(n.id))) + texio.write("-") print_subtype(n,head) if n.id == VLIST or n.id == HLIST then local ff = n.head for nn in traverse(ff) do parent = n - texio.write_nl(' ' .. tostring(node.type(nn.id))) - texio.write('-') + texio.write_nl(" " .. tostring(node.type(nn.id))) + texio.write("-") print_subtype(nn,n) if nn.id == VLIST or nn.id == HLIST then local f3 = nn.head for n3 in traverse(f3) do parent = nn - texio.write_nl(' ' .. tostring(node.type(n3.id))) - texio.write('-') + texio.write_nl(" " .. tostring(node.type(n3.id))) + texio.write("-") print_subtype(n3,nn) if n3.id == VLIST or n3.id == HLIST then local f4 = n3.head for n4 in traverse(f4) do parent = n3 - texio.write_nl(' ' .. tostring(node.type(n4.id))) - texio.write('-') + texio.write_nl(" " .. tostring(node.type(n4.id))) + texio.write("-") print_subtype(n4,n3) if n4.id == VLIST or n4.id == HLIST then local f5 = n4.head for n5 in traverse(f5) do parent = n4 - texio.write_nl(' ' .. tostring(node.type(n4.id))) - texio.write('-') + texio.write_nl(" " .. tostring(node.type(n4.id))) + texio.write("-") print_subtype(n5,n4) end end diff --git a/macros/optex/README b/macros/optex/README index 36c2c98bb1..220e29fa5f 100644 --- a/macros/optex/README +++ b/macros/optex/README @@ -22,7 +22,11 @@ doc/ ... PDF version of the OpTeX documentation and sources. History: -<1.10> Feb 2022: +<1.11> Mar 2023: + \fontfamsub: the substitution of missing families introduced. + New font family files created. + Minor bugs fixed. +<1.10> Feb 2023: key-values improved: \iskv, \kvx, \nokvx introduced. unimath-codes: control sequences are macros, no \chardef. \bp, \expr: optional syntax for setting the number of digits after decimal point. diff --git a/macros/optex/base/f-cabin.opm b/macros/optex/base/f-cabin.opm new file mode 100644 index 0000000000..d0b6e19387 --- /dev/null +++ b/macros/optex/base/f-cabin.opm @@ -0,0 +1,43 @@ +%% This is part of the OpTeX project, see http://petr.olsak.net/optex + +\_famdecl [Cabin] \Cabin {Inspired by Gill's typefaces + touch of a modernism} + {\caps \cond \medium \semibold} {\rm \bf \it \bi} {FiraMath} + {[Cabin-Regular]} + {\_def\_fontnamegen{[Cabin\_condV-\_currV\_condV]:\_capsV\_fontfeatures}} + +\_wlog{\_detokenize{% +Modifiers:^^J + \caps ...... caps & small caps (unavailable in condensed variants)^^J + \cond ...... condensed variants^^J + \medium .... medium weight (only \rm, \it)^^J + \semibold .. semibold weight (only \bf, \bi)^^J +}} + +\_moddef \resetmod {\_fsetV caps={},cond={} \_fvars Regular Bold Italic BoldItalic } +\_moddef \caps {\_fsetV caps=+smcp;\_ffonum; } +\_moddef \nocaps {\_fsetV caps={} } +\_moddef \cond {\_fsetV cond=Condensed } +\_moddef \nocond {\_fsetV cond={} } +\_moddef \medium {\_fvars Medium Bold MediumItalic BoldItalic } +\_moddef \semibold {\_fvars Regular SemiBold Italic SemiBoldItalic } + +\_initfontfamily % new font family must be initialized + +\_ifmathloading + \_loadmath {[FiraMath-Regular]} + \_addUmathfont \_xits {[XITSMath-Regular]}{} {[XITSMath-Bold]}{} {} + \_addto\_frak{\_fam\_xits}\_addto\_cal{\_fam\_xits} \_public \frak \cal ; + % \bf, \bi from FiraMath: + \_let\_bsansvariables=\_bfvariables + \_let\_bsansGreek=\_bfGreek + \_let\_bsansgreek=\_bfgreek + \_let\_bsansdigits=\_bfdigits + \_let\_bisansvariables=\_bivariables + \_let\_bisansgreek=\_bigreek + % \_resetmathchars <fam-number> <list of \Umathchardef csnames> ; + \_mathchars \_xits {\bigtriangleup \bigblacktriangleup \blacktriangle + \vartriangle \smallblacktriangleright} % ... etc. you can add more +\_fi + +\_endcode + diff --git a/macros/optex/base/f-erewhon.opm b/macros/optex/base/f-erewhon.opm index 11fc55330e..efc23c411e 100644 --- a/macros/optex/base/f-erewhon.opm +++ b/macros/optex/base/f-erewhon.opm @@ -3,7 +3,7 @@ \_famdecl [Erewhon] \Erewhon {Derived from Heuristica with slanted variants} {\caps} {\rm \bf \it \bi \sl \bs} {Erewhon} {[Erewhon-Regular]} - {\_def\_fontnamegen {[Erewhon-\_currV]:\_capsV\_fontfeatures}} + {\_def\_fontnamegen {[Erewhon-\_currV]:script=latn;\_capsV\_fontfeatures}} \_wlog{\_detokenize{% Modifiers:^^J diff --git a/macros/optex/base/f-fira.opm b/macros/optex/base/f-fira.opm new file mode 100644 index 0000000000..17f246e54b --- /dev/null +++ b/macros/optex/base/f-fira.opm @@ -0,0 +1,55 @@ +%% This is part of the OpTeX project, see http://petr.olsak.net/optex + +\_famdecl [Fira] \Fira {FiraSans and FiraMono with FiraMath} + {\sans \mono \caps \allsc \nocaps \thin \light \book \medium} + {\rm \bf \it \bi} + {FiraMath} + {[FiraSans-Regular]} + {\_def \_fontnamegen {[Fira\_subV-\_currV]:\_capsV\_fontfeatures}} + +\_wlog{\_detokenize{% +Modifiers (subfamilies):^^J + \mono ...... Monospaced variants [Mono]^^J +Modifiers (face weight):^^J + \thin ...... \rm, \it = Thin, \bf, \bi = Regular (Sans)^^J + \light ..... \rm, \it = Light, \bf, \bi = Medium (Sans)^^J + \book ...... \rm, \it = Book, \bf, \bi = SemiBold (Sans)^^J + \medium .... \rm, \it = Medium, \bf, \bi = ExtraBold/Bold (Sans, Mono)^^J +Modifiers (small caps):^^J + \caps ...... Caps and small caps (Sans)^^J + \allsc ..... Small caps only (Sans)^^J + \nocaps .... No small caps^^J +}} + +\_moddef \resetmod {\_fsetV sub=Sans,caps={} \_fvars Regular Bold Italic BoldItalic } +\_moddef \mono {\_fsetV sub=Mono,caps={} \_fvars Regular Bold Oblique BoldOblique } +\_moddef \caps {\_fsetV caps=+smcp;\_ffonum; } +\_moddef \allsc {\_fsetV caps=+smcp;+c2sc;\_ffonum; } +\_moddef \nocaps {\_fsetV caps={} } + +\_moddef \thin {\_onlyif sub=Sans: {\_fvars Thin Regular ThinItalic Italic }} +\_moddef \light {\_onlyif sub=Sans: {\_fvars Light Medium LightItalic MediumItalic }} +\_moddef \book {\_onlyif sub=Sans: {\_fvars Book SemiBold BookItalic SemiBoldItalic }} +\_moddef \medium {\_onlyif sub=Sans: {\_fvars Medium ExtraBold MediumItalic ExtraBoldItalic }% + \_onlyif sub=Mono: {\_fvars Medium Bold MediumOblique BoldOblique }} + +\_initfontfamily % new font family must be initialized + +\_ifmathloading + \_loadmath {[FiraMath-Regular]} + \_addUmathfont \_xits {[XITSMath-Regular]}{} {[XITSMath-Bold]}{} {} + \_addto\_frak{\_fam\_xits}\_addto\_cal{\_fam\_xits} \_public \frak \cal ; + % \bf, \bi from FiraMath: + \_let\_bsansvariables=\_bfvariables + \_let\_bsansGreek=\_bfGreek + \_let\_bsansgreek=\_bfgreek + \_let\_bsansdigits=\_bfdigits + \_let\_bisansvariables=\_bivariables + \_let\_bisansgreek=\_bigreek + % \_resetmathchars <fam-number> <list of \Umathchardef csnames> ; + \_mathchars \_xits {\bigtriangleup \bigblacktriangleup \blacktriangle + \vartriangle \smallblacktriangleright + \unicodevdots \unicodeadots \unicodeddots} % ... etc. you can add more +\_fi + +\_endcode diff --git a/macros/optex/base/f-heros.opm b/macros/optex/base/f-heros.opm index d749553882..a7aebdb4b8 100644 --- a/macros/optex/base/f-heros.opm +++ b/macros/optex/base/f-heros.opm @@ -32,7 +32,8 @@ Modifiers:^^J \_let\_bisansgreek=\_bigreek % \_resetmathchars <fam-number> <list of \Umathchardef csnames> ; \_mathchars \_xits {\bigtriangleup \bigblacktriangleup \blacktriangle - \vartriangle \smallblacktriangleright} % ... etc. you can add more + \vartriangle \smallblacktriangleright + \unicodevdots \unicodeadots \unicodeddots} % ... etc. you can add more \_fi \_endcode diff --git a/macros/optex/base/f-inconsolata.opm b/macros/optex/base/f-inconsolata.opm new file mode 100644 index 0000000000..732b6fd4f5 --- /dev/null +++ b/macros/optex/base/f-inconsolata.opm @@ -0,0 +1,18 @@ +%% This is part of the OpTeX project, see http://petr.olsak.net/optex + +\_famdecl [Inconsolata] \Inconsolata {Inconsolata monospaced fonts} + {\narrow} {\rm \bf} {} + {[Inconsolatazi4-Regular.otf]} + {\_def \_fontnamegen {[Inconsolata\_subV-\_currV]:\_fontfeatures}} + +\_wlog{\_detokenize{% +Modifiers:^^J + \narrow ...... Narrow variants^^J +}} + +\_moddef \resetmod {\_fsetV sub=zi4 \_fvars Regular Bold . . } +\_moddef \narrow {\_fsetV sub=N \_fvars Regular Bold . . } + +\_initfontfamily % new font family must be initialized + +\_endcode diff --git a/macros/optex/base/f-xcharter.opm b/macros/optex/base/f-xcharter.opm index b776582a1c..9cdef445ca 100644 --- a/macros/optex/base/f-xcharter.opm +++ b/macros/optex/base/f-xcharter.opm @@ -1,7 +1,7 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex \_famdecl [XCharter] \XCharter {An extension of Bitstream Charter} - {\caps \slant} {\rm \bf \it \bi} {} + {\caps \slant} {\rm \bf \it \bi} {XCharter} {[XCharter-Roman]} {\_def\_fontnamegen {[XCharter-\_currV]:script=latn;\_capsV\_fontfeatures}} @@ -17,6 +17,9 @@ Modifiers:^^J \_initfontfamily % new font family must be initialized +\loadmath{[XCharter-Math]} +\loadboldmath{[XCharter-Math-Bold]} \to {[XCharter-Math]} + \_endcode See the file `f-heros.opm` for information about principles of such diff --git a/macros/optex/base/fams-ini.opm b/macros/optex/base/fams-ini.opm index 505887f46e..3754cc8f6d 100644 --- a/macros/optex/base/fams-ini.opm +++ b/macros/optex/base/fams-ini.opm @@ -7,6 +7,7 @@ \_faminfo [Catalogue] {Catalogue of all registered font families} {fonts-catalog} {} \_famalias [Catalog] +\_famsrc {TeXlive} \_famtext {Computer Modern like family:} \_famfrom {GUST} @@ -132,6 +133,12 @@ { -,\onum: {\rm\bf\it\bi} } \_famalias [Caslon] +\_famfrom {Pablo Impallari, Igino Marini} +\_faminfo [Cabin] {Inspired by Gill's typefaces + touch of a modernism} {f-cabin} + { -,\caps: {\rm\bf\it\bi} \medium: {\rm\it} \semibold: {\bf\bi} + \cond: {\rm\bf\it\bi} \cond\medium: {\rm\it} \cond\semibold: {\bf\bi} + } + \_famfrom {Adobe, Paul D. Hunt} \_faminfo [Source Pro] {Adobe SourceSerifPro, SourceSansPro, SourceCodePro} {f-sourcepro} { \elight,\light,-,\bolder: {\rm\it} -,\bolder: {\bf\bi} @@ -192,10 +199,12 @@ -,\medium,\semibold: {\bf\bi} } \_famfrom {CTU in Prague, Roman Cernohous} +\_famsrc {non free font, used in CTU Style, see \url{https://www.cvut.cz/en/ctu-logo}} \_faminfo [Technika] {Fonts from visual style of CTU in Prague} {f-technika} { -,\light,\book, \caps, \caps\book: {\rm\bf\it\bi} -:{\stencil} } \_famalias [CTU Technika] +\_famsrc {TeXlive} \_famfrom {Bitstream, Andrey V. Panov, Michael Sharpe} \_faminfo [XCharter] {An extension of Bitstream Charter} {f-xcharter} { -,\slant,\caps,\caps\slant: {\rm\bf\it\bi} } @@ -204,6 +213,16 @@ \_faminfo [GFSBodoni] {Based on Bodoni with greek letters} {f-gfsbodoni} { -: {\rm\bf\it\bi} \caps: {\rm} } +\_famfrom {bBox Type GmbH, Carrois Corporate GbR, Edenspiekermann AG} +\_faminfo [Fira] {Humanist sans-serif, originally designed for Firefox OS} {f-fira} + { \thin,\light,\book,-,\medium,\mono,\mono\medium,% + \thin\caps,\light\caps,\book\caps,\caps,\medium\caps,% + \thin\allsc,\light\allsc,\book\allsc,\allsc,\medium\allsc: {\rm\bf\it\bi} } + +\_famfrom {Raph Levien} +\_faminfo [Inconsolata] {A monospaced font for code listing} {f-inconsolata} + { -,\narrow: {\rm\bf} } + \_endcode Once you have prepared a font family file with the name `f-<famname>.opm` and diff --git a/macros/optex/base/fonts-catalog.opm b/macros/optex/base/fonts-catalog.opm index 347c94b145..893c731df0 100644 --- a/macros/optex/base/fonts-catalog.opm +++ b/macros/optex/base/fonts-catalog.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \_undefined {Font catalogue <2022-07-11>} % loaded on demand by \fontfam[catalog] +\_codedecl \_undefined {Font catalogue <2023-03-09>} % loaded on demand by \fontfam[catalog] \_tracinglostchars=1 % only to log file \_initunifonts @@ -41,7 +41,9 @@ \_iftrue {\_ttfixed \$Default math font\$: \_mathfaminfo \_par} \_else Default math font (\_mathfaminfo): \_the\_catalogmathsample \_par \_fi\_fi - \_else {\_qquad\_ttfixed ... family skipped, fonts not found in your system.} + \_else {\_qquad\_ttfixed ... family skipped, fonts not found in your system.\_nl + \_null\_qquad ... where is the family from:\_nl + \_null\_qquad\_qquad\_the\_famsrc} \_fi\_fi\_fi \_egroup } @@ -134,6 +136,7 @@ described in the \code{fams-ini.opm} file. \_endcode % ------------------------------------- +2023-03-09 \_famsrc introduced 2022-07-11 \_raggedbottom added 2022-02-22 \_ttfixed, \footline set as global, bug fixed 2020-02-26 released diff --git a/macros/optex/base/fonts-resize.opm b/macros/optex/base/fonts-resize.opm index e76596611b..4fc8ab1e28 100644 --- a/macros/optex/base/fonts-resize.opm +++ b/macros/optex/base/fonts-resize.opm @@ -186,8 +186,8 @@ gives the extended syntax: % or \font \<font switch> = {<font name>:<font features>} <size spec> \endtt -where <font file name> is name of the OpenType font file without extension -(extensions `.otf` or `.ttf` are assumed). The braces in the syntax +where <font file name> is name of the OpenType font file with the extension +`.otf` or `.ttf` or without it. The braces in the syntax are optional, use them when the <font file name> or <font name> includes spaces. The original syntax for `tfm` files is also available. Example: \begtt @@ -206,14 +206,32 @@ You can use \^`\ufont` macro which runs \^`\initunifonts` followed by `\font` primitive. And \^`\fontfam` does (among other things) \^`\initunifonts` too. You need not to specify \^`\initunifonts` if \^`\fontfam` or \^`\ufont` is used. -It seems that you must decide about final size of the font before it is -loaded by the `\font` primitive. It is not exactly true; \OpTeX/ offers -powerful possibility to resize the font already loaded on demand. -See the example at the end of next subsection. +When \^`\initunifonts` is declared then the `\font` primitive is ready to read +Type1 fonts too. If you have `file.afm` and `file.pfb` then you can +declare `\font\f=file.afm` and use `\f`. It means that you needn't to create +`tfm` files nor `vf` files, you can use Type1 fonts directly. +They behave as Unicode fonts if the `afm` metrics are implemented correctly +(with correct names of all included glyphs). But we must to say that Type1 +font format is old technology, the loading of Type1 fonts is not optimized. +Use OpenType fonts (`otf` of `ttf`) if it is possible. + +Let's sum it up. Suppose that \^`\initunifonts` was used. +The `\font` primitive is able to load OpenType +fonts (`otf` or `ttf`), Type1 fonts (`afm` and `pfb`) or classical `tfm` fonts. +We strongly recommend to prefer OpenType format over Type1 format +over `tfm` format. The last one desn't support Unicode. If there is nothing +else left and you must to use `tfm`, then you must to implement re-encoding from +Unicode to the `tfm` encoding at macro level, see the +\ulink[http://petr.olsak.net/optex/optex-tricks.html\#nonunicode]{\OpTeX/ trick 0018} +for example. \secc[setfontsize] The `\setfontsize` macro +It seems that you must decide about final size of the font before it is +loaded by the `\font` primitive. It is not exactly true; \OpTeX/ offers +powerful possibility to resize the font already loaded on demand. + The \^`\setfontsize` `{<size spec>}` saves the information about `<size spec>`. This information is taken into account when a variant selector (for example `\rm`, `\bf`, `\it`, `\bi`) diff --git a/macros/optex/base/fonts-select.opm b/macros/optex/base/fonts-select.opm index 6b10f75aff..3b5f02c3fa 100644 --- a/macros/optex/base/fonts-select.opm +++ b/macros/optex/base/fonts-select.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \fontfam {Fonts selection system <2022-12-01>} % preloaded in format +\_codedecl \fontfam {Fonts selection system <2023-03-09>} % preloaded in format \_doc ----------------------------- The main principle of the Font Selection System is: run one or more @@ -130,7 +130,9 @@ \_initunifonts \_unichars \_uniaccents \_unless\_ifcsname _f:\_csstring#2:main.fam\_endcsname \_isfont{#7}\_iffalse - \_opwarning{Family [#1] skipped, font "#7" not found}\_ea\_ea\_ea\_endinput \_else + \_opwarning{Family [#1] skipped, font "#7" not found}\_endinput + \_lowercase{\_ifcsname _fams:#1\_endcsname}\_famsubstitute \_fi + \_else \_edef\_currfamily {\_csstring #2}\_def\_mathfaminfo{#6}% \_wterm {FONT: [#1] -- \_string#2 \_detokenize{(#3)^^J mods:{#4} vars:{#5} math:{#6}}}% \_unless \_ifx #2\_undefined @@ -138,7 +140,7 @@ \_protected\_edef#2{\_def\_noexpand\_currfamily{\_csstring #2}\_unexpanded{#8\_resetfam}}% \_ea \_let \_csname _f:\_currfamily:main.fam\_endcsname =#2% \_fi - \_else \_csname _f:\_csstring#2:main.fam\_endcsname \_rm \_ea \_endinput \_fi + \_else \_csname _f:\_csstring#2:main.fam\_endcsname \_rm \_endinput \_empty\_fi } \_def\_initfontfamily{% \_csname _f:\_currfamily:main.fam\_endcsname \_rm @@ -308,18 +310,21 @@ \_cod ----------------------------- \_protected\_def \_fontfam [#1]{% - \_lowercase{\_edef\_famname{\_ea\_removespaces #1 {} }}% + \_lowercase{\_edef\_famname{\_ea\_removespaces \_expanded{#1} {} }}% \_isfile {f-\_famname.opm}\_iftrue \_opinput {f-\_famname.opm}% \_else \_tryloadfamslocal \_edef\_famfile{\_trycs{_famf:\_famname}{}}% - \_ifx\_famfile\_empty \_listfamnames + \_ifx\_famfile\_empty + \_ifcsname _fams:\_famname \_endcsname \_famsubstitute + \_else \_listfamnames + \_fi \_else \_opinput {\_famfile.opm}% - \_fi\_fi + \_fi\_empty\_fi } \_def\_tryloadfamslocal{% \_isfile {fams-local.opm}\_iftrue - \_opinput {fams-local.opm}\_famfrom={}% + \_opinput {fams-local.opm}\_famfrom={}\_famsrc={}% \_fi \_let \_tryloadfamslocal=\_relax % need not to load fams-local.opm twice } @@ -341,6 +346,27 @@ \_public \fontfam ; \_doc ----------------------------- + \`\fontfamsub` `[<Family>][<byFamily>]` declares automatic substitution of + <Family> by <byFamily> which is done when <Family> is not installed. I.e. + if there is no `f-<family>.opm` file or there is no regular font of the + family installed. + \`\_famsubstitute` is internal macro used in \^`\fontfam` and \^`\_famdecl` macros. + It consumes the rest of the macro, runs \^`\nospacefuturelet` in order to + do `\endpinput` to the current `f-file` and runs \^`\fontfam` again. + The table of such substutitions are saved in the macros `\_fams:<family>`. + \_cod ----------------------------- + +\_def \_fontfamsub [#1]#2[#3]{\_lowercase{\_sxdef{_fams:#1}{#3}}} + +\_def\_famsubstitute #1\_empty\_fi{\_fi\_fi\_fi + \_wterm {FONT: Family [\_famname] not found, substituted by [\_cs{_fams:\_famname}]}% + \_nospacefuturelet\_tmp\_famsubstituteA % we want to \endinput current f-file +} +\_def\_famsubstituteA{\_fontfam[\_cs{_fams:\_famname}]} + +\_public \fontfamsub ; + + \_doc ----------------------------- When the `fams-ini.opm` or `fams-local.opm` files are read then we need to save only a mapping from family names or alias names to the font family file names. All other information is ignored in this case. But if these files @@ -360,6 +386,9 @@ \`\_famfrom` declares type foundry or owner or designer of the font family. It can be used in `fams-ini.opm` or `fams-local.opm` and it is printed in the font catalog. + \nl + \`\_famsrc` declares the source, where is the font family from (used in `fams-ini.opm` + and if the font isn't found when the fonts catalog is printed). \_cod ----------------------------- \_def\_famtext #1{} @@ -372,10 +401,10 @@ \_lowercase{\_edef\_tmpa{\_ea\_removespaces #1 {} }}% \_sdef{_famf:\_tmpa\_ea}\_ea{\_famfile}% } -\_newtoks\_famfrom +\_newtoks\_famfrom \_newtoks\_famsrc \_input fams-ini.opm \_let\_famfile=\_undefined -\_famfrom={} +\_famfrom={} \_famsrc={} \_doc ----------------------------- When the \^`\fontfam``[catalog]` is used then the file @@ -899,6 +928,7 @@ with Unicode fonts loaded by \^`\fontfam`. \endinput +2023-03-09 \_famsrc, \fontfamsub introduced 2022-12-01 \faminfo saves f-<filename> to the format only when needed 2022-11-08 \protected: \fontdef, \famvardef, \fontfam 2022-02-22 Font Selection System reimplemented, \fontsel introduced diff --git a/macros/optex/base/graphics.opm b/macros/optex/base/graphics.opm index 77e78cef23..6a095343d6 100644 --- a/macros/optex/base/graphics.opm +++ b/macros/optex/base/graphics.opm @@ -7,9 +7,6 @@ or new syntax `\inspic{<filename>}`. So, we need to define two auxiliary macros \`\_inspicA` and \`\_inspicB`. - You can include more `\pdfximage` parameters (like `page<number>`) - in the \`\_picparams` macro. - All `\inspic` macros are surrounded in `\hbox` in order user can write `\moveright\inspic ...` or something similar. \_cod ----------------------------- @@ -19,11 +16,9 @@ \_def\_inspicB #1{% \_pdfximage \_ifdim\_picwidth=\_zo \_else width\_picwidth\_fi \_ifdim\_picheight=\_zo \_else height\_picheight\_fi - \_picparams {\_the\_picdir#1}% + \_the\_picparams {\_the\_picdir#1}% \_pdfrefximage\_pdflastximage\_egroup} -\_def\_picparams{} - \_public \inspic ; \_doc ----------------------------- @@ -48,7 +43,7 @@ \_newtoks\_inkdefs \_inkdefs={% \_def\makeatletter#1\makeatother{}% \_def\includegraphics[#1]#2{\_inkscanpage#1,page=,\_fin \_inspic{\_the\_tmptoks}\_hss}% - \_def\_inkscanpage#1page=#2,#3\_fin{\_ifx,#2,\_else\_def\_picparams{page#2}\_fi}% + \_def\_inkscanpage#1page=#2,#3\_fin{\_ifx,#2,\_else\_picparams{page#2}\_fi}% \_def\put(#1,#2)#3{\_nointerlineskip\_vbox to\_zo{\_vss\_hbox to\_zo{\_kern#1\_picwidth \_pdfsave\_hbox to\_zo{#3}\_pdfrestore\_hss}\_kern#2\_picwidth}}% \_def\begin#1{\_csname _begin#1\_endcsname}% diff --git a/macros/optex/base/hi-syntax.opm b/macros/optex/base/hi-syntax.opm index c708be0563..7e5b77b826 100644 --- a/macros/optex/base/hi-syntax.opm +++ b/macros/optex/base/hi-syntax.opm @@ -144,7 +144,7 @@ file name must include it in lowercase letters. For example, the file \printdoc hisyntax-c.opm -\OpTeX/ provides `hisyntax-{c,python,tex,html}.opm` files. +\OpTeX/ provides `hisyntax-{c,lua,python,tex,html}.opm` files. You can take inspiration from these files and declare more languages. Users can re-declare default colors by \^`\hicolors``={<list of color declarations>}`. diff --git a/macros/optex/base/hisyntax-c.opm b/macros/optex/base/hisyntax-c.opm index d0a4217b31..07d6a6570c 100644 --- a/macros/optex/base/hisyntax-c.opm +++ b/macros/optex/base/hisyntax-c.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \_hisyntaxc {Syntax highlighting for C sources <2020-04-03>} +\_codedecl \_hisyntaxc {Syntax highlighting for C sources <2023-03-02>} \_newtoks \_hisyntaxc \_newtoks \_hicolorsc @@ -25,10 +25,15 @@ \_ea \_foreach \_tmpa \_do {\_replthis{#1}{\n\o#1\n}} \_foreach % keywords - {auto}{break}{case}{char}{continue}{default}{do}{double}% - {else}{entry}{enum}{extern}{float}{for}{goto}{if}{int}{long}{register}% - {return}{short}{sizeof}{static}{struct}{switch}{typedef}{union}% - {unsigned}{void}{while} + {alignas}{alignof}{auto}{bool}{break}{case}{char}{const}% + {constexpr}{continue}{default}{do}{double}{else}{enum}{extern}% + {false}{float}{for}{goto}{if}{inline}{int}{long}{nullptr}% + {register}{restrict}{return}{short}{signed}{sizeof}{static}% + {static_assert}{struct}{switch}{thread_local}{true}{typedef}% + {typeof}{typeof_unqual}{union}{unsigned}{void}{volatile}{while}% + {_Alignas}{_Alignof}{_Atomic}{_BitInt}{_Bool}{_Complex}% + {_Decimal128}{_Decimal32}{_Decimal64}{_Generic}{_Imaginary}% + {_Noreturn}{_Static_assert}{_Thread_local} \_do {\_replthis{\n#1\n}{\z K{#1}}} \_replthis{.}{\n.\n} % numbers \_foreach 0123456789 @@ -64,3 +69,8 @@ keyword is applied in the `\foreach` loop too. See `hi-sytax.opm` for more information about `\hicolor`, `\replfromto` and `\replthis` macros. + +\endinput + +2023-03-02: more C keywords added +2020-04-03: released diff --git a/macros/optex/base/lists.opm b/macros/optex/base/lists.opm index 57b057d6c8..e7785678dd 100644 --- a/macros/optex/base/lists.opm +++ b/macros/optex/base/lists.opm @@ -1,25 +1,21 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \begitems {Lists: begitems, enditems <2021-03-10>} % preloaded in format +\_codedecl \begitems {Lists: begitems, enditems <2022-02-25>} % preloaded in format \_doc ----------------------------- \`\_aboveliskip` is used above the list of items,\nl - \`\_belowliskip` is used below the list of items and\nl - \`\_interliskip` is used between items.\nl - \`\_listskipA` is used as `\listskipamount` at level 1 of items.\nl - \`\_listskipB` is used as `\listskipamount` at other levels.\nl - \`\_setlistskip` sets the skip dependent on the current level of items + \`\_belowliskip` is used below the list of items,\nl + \`\_setlistskip` sets the skip dependent on the current level of items,\nl + \`\_listskipab` is \^`\ilistskipamount` or \^`\olistskipamount`. \_cod ----------------------------- -\_def\_aboveliskip {\_removelastskip \_penalty-100 \_vskip\_listskipamount} -\_def\_belowliskip {\_penalty-200 \_vskip\_listskipamount} -\_def\_interliskip {} -\_def\_listskipA {\_medskipamount} -\_def\_listskipB {0pt plus.5\_smallskipamount} +\_def\_aboveliskip {\_removelastskip \_penalty-100 \_vskip\_listskipab} +\_def\_belowliskip {\_penalty-200 \_vskip\_listskipab} +\_newskip\_listskipab \_def\_setlistskip {% - \_ifnum \_ilevel = 1 \_listskipamount = \_listskipA \_relax - \_else \_listskipamount = \_listskipB \_relax + \_ifnum \_ilevel = 1 \_listskipab = \_olistskipamount \_relax + \_else \_listskipab = \_ilistskipamount \_relax \_fi} \_doc ----------------------------- @@ -54,17 +50,19 @@ } \_def\_enditems{\_par\_belowliskip\_egroup \_isnextchar\_par{}{\_noindent}} -\_def\_startitem{\_par \_ifnum\_itemnum>0 \_interliskip \_fi +\_def\_startitem{\_par \_ifnum\_itemnum>0 \_vskip\_itemskipamount \_fi \_advance\_itemnum by1 \_the\_everyitem \_noindent\_llap{\_the\_printitem}\_ignorespaces } \_public \begitems \enditems \itemnum ; \_doc ---------------------------- - \`\novspaces` sets \^`\listskipamount` to 0pt. + \`\novspaces` sets \^`\_listskipab` and \^`\itemskipamount` to 0pt. + Moreover, it deactivates \^`\_setlistskip` (for inner lists). \_cod ---------------------------- -\_def\_novspaces {\_removelastskip \_listskipamount=0pt \_relax} +\_def\_novspaces {\_removelastskip + \_listskipab=\_zoskip \_itemskipamount=\_zoskip \_let\_setlistskip=\_relax} \_public \novspaces ; \_doc ----------------------------- @@ -123,6 +121,7 @@ \_endcode % ------------------------------------- +2022-02-25 \olistskipamount, \ilistskipamount, \itemskipamount introduced 2021-03-10 \_ifmmode*\_else\_ea\_startitem\_fi added to * defintition 2020-04-21 \isnextchar\par added to \enditems 2020-03-18 introduced diff --git a/macros/optex/base/optex.ini b/macros/optex/base/optex.ini index 3266cf0ab1..ebf31ea4c2 100644 --- a/macros/optex/base/optex.ini +++ b/macros/optex/base/optex.ini @@ -21,7 +21,7 @@ % OpTeX version -\def\optexversion{1.10 Feb 2023} +\def\optexversion{1.11 Mar 2023} \def\fmtname{OpTeX} \let\fmtversion=\optexversion diff --git a/macros/optex/base/parameters.opm b/macros/optex/base/parameters.opm index 855969f4de..8867f4477a 100644 --- a/macros/optex/base/parameters.opm +++ b/macros/optex/base/parameters.opm @@ -197,12 +197,16 @@ parameters locally in the group where \^`\inspic` is used in order to not influence the dimensions of other images. But there exist many situations you need to put the same dimensions to more images, - so you can set this parameter only once before more \^`\inspic` macros. + so you can set this parameter only once before more \^`\inspic` macros.\nl + More parameters accepted by `\pdfximage` primitive can be set in the + \`\picparams` tokens list. For example `\picparams={page3}` + selects page 3 from included PDF file. \_cod ----------------------------- \_newdimen\_picwidth \_picwidth=0pt \_let\picw=\_picwidth \_newdimen\_picheight \_picheight=0pt -\_public \picwidth \picheight ; +\_newtoks\_picparams +\_public \picwidth \picheight \picparams ; \_doc ----------------------------- \`\kvdict` is dictionary name when \~`\readkv`, \~`\kvx`, \~`\kv`, and \~`\iskv` are @@ -310,16 +314,25 @@ \nl The \`\ilevel` keeps the value of the current nesting level of the items list. \nl - The \`\listskipamount` gives vertical skip above and below the items list - if `\ilevel=1`. + The \`\olistskipamount` is vertical skip above and below the items list + if `\ilevel=1`.\nl + The \`\ilistskipamount` is vertical skip above and below the items list + if `\ilevel>1`.\nl + The \`\itemskipamount` is vertical skip between list items, but not above the firts + and below the last. \_cod ----------------------------- -\_newtoks\_defaultitem \_defaultitem={$\_bullet$\_enspace} +\_newtoks\_defaultitem \_defaultitem={$\_bullet$\_enspace} \_newtoks\_everyitem \_newtoks\_everylist -\_newskip \_listskipamount \_listskipamount=\_medskipamount \_newcount \_ilevel -\_public \defaultitem \everyitem \everylist \listskipamount \ilevel ; +\_newskip\_olistskipamount \_olistskipamount=\_medskipamount +\_newskip\_ilistskipamount \_ilistskipamount=0pt plus.5\_smallskipamount +\_newskip\_itemskipamount \_itemskipamount=0pt + +\_public \defaultitem \everyitem \everylist \ilevel + \olistskipamount \ilistskipamount \itemskipamount ; +\_let \listskipamount = \_olistskipamount % for backward compatibility \_doc ----------------------------- The \^`\tit` macro includes `\vglue`\`\titskip` above the title of the document. diff --git a/macros/optex/doc/optex-doc.pdf b/macros/optex/doc/optex-doc.pdf Binary files differindex ed937d191e..d300514088 100644 --- a/macros/optex/doc/optex-doc.pdf +++ b/macros/optex/doc/optex-doc.pdf diff --git a/macros/optex/doc/optex-doc.tex b/macros/optex/doc/optex-doc.tex index bbb19e44f2..4b0082ee35 100644 --- a/macros/optex/doc/optex-doc.tex +++ b/macros/optex/doc/optex-doc.tex @@ -21,7 +21,7 @@ \tit Format Based on Plain \TeX/ and OPmac\fnotemark1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\hfill Version 1.10 +\hfill Version 1.11 \centerline{\it Petr Olšák, 2020, 2021, 2022, 2023} diff --git a/macros/optex/doc/optex-userdoc.tex b/macros/optex/doc/optex-userdoc.tex index 937952079a..4ae414cfbc 100644 --- a/macros/optex/doc/optex-userdoc.tex +++ b/macros/optex/doc/optex-userdoc.tex @@ -1062,7 +1062,7 @@ The \~`\begtt`...\~`\endtt` pair or \~`\verbinput` can be used for listings of codes. Automatic syntax highlighting is possible, for example `\begtt` \^`\hisyntax{C}` activates colors for C programs. Or `\verbinput` \^`\hisyntax{HTML} (-) file.html` can be used for HTML or XML codes. -\OpTeX/ implements C, Python, \TeX/, HTML and XML syntax highlighting. +\OpTeX/ implements C, Lua, Python, \TeX/, HTML and XML syntax highlighting. More languages can be declared, see the section~\ref[hisyntax]. If the code is read by \^`\verbinput` and there are comment lines prefixed @@ -1459,6 +1459,7 @@ by default, this means that the image files are searched in the current directory. Example: \^`\picdir={img/}` supposes that image files are in `img` subdirectory. Note: the directory name must end by `/` in the \^`\picdir` declaration. +More parameters can be inclued using the \^`\picparams` token list. Inkscape\fnote {A powerful and free Wysiwyg editor for creating vector graphics.} diff --git a/macros/optex/pkg/tikz.opm b/macros/optex/pkg/tikz.opm index 87b2f7369a..4da799a4aa 100644 --- a/macros/optex/pkg/tikz.opm +++ b/macros/optex/pkg/tikz.opm @@ -1,6 +1,6 @@ % This is macro package used by OpTeX, see http://petr.olsak.net/optex -\_codedecl \tikzpicture {TikZ for OpTeX <2022-02-18>} +\_codedecl \tikzpicture {TikZ for OpTeX <2023-03-04>} \_namespace{pgf} \_catcode`\@=11 \_let\_optexforeach=\foreach @@ -155,11 +155,17 @@ \_let\.foreach=\pgffor@foreach % \_pgf_foreach is \pgffor@foreach \_let\foreach=\_optexforeach % \foreach is OpTeX's \foreach +\_let\.usetikzlibrary=\usetikzlibrary +\_def\usetikzlibrary#1{\_let\foreach=\.foreach + \.usetikzlibrary{#1}\let\foreach=\_optexforeach +} + % don't worry about reseting catcodes - we are at the end of \opinput'ed file \_endnamespace \_endcode History: +2023-03-04 \_tikz_foreach used during \usetikzlibrary (bug fix). 2022-03-18 Tikz's \foreach only in its environment. 2022-03-05 resources management re-implemented. 2021-07-15 released |