summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-03-10 03:04:05 +0000
committerNorbert Preining <norbert@preining.info>2023-03-10 03:04:05 +0000
commitf6cb3d263826846efe7b926e6ad2092198db0522 (patch)
tree16abd399e7b120d3c3ac7d75efc4d04cf7bb022f /macros
parent716c428e47ad2e893c0f970b9fa866d2a88f00e4 (diff)
CTAN sync 202303100304
Diffstat (limited to 'macros')
-rw-r--r--macros/latex-dev/base/README.md2
-rw-r--r--macros/latex-dev/base/alltt.dtx2
-rw-r--r--macros/latex-dev/base/alltt.ins4
-rw-r--r--macros/latex-dev/base/alltt.pdfbin223831 -> 223829 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.pdfbin264112 -> 264161 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.tex4
-rw-r--r--macros/latex-dev/base/changes.txt19
-rw-r--r--macros/latex-dev/base/classes.dtx2
-rw-r--r--macros/latex-dev/base/classes.ins4
-rw-r--r--macros/latex-dev/base/classes.pdfbin560326 -> 560248 bytes
-rw-r--r--macros/latex-dev/base/clsguide.pdfbin414419 -> 414447 bytes
-rw-r--r--macros/latex-dev/base/clsguide.tex4
-rw-r--r--macros/latex-dev/base/cmextra.ins4
-rw-r--r--macros/latex-dev/base/cmfonts.ins4
-rw-r--r--macros/latex-dev/base/cmfonts.pdfbin292160 -> 292136 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.pdfbin257314 -> 257355 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.tex4
-rw-r--r--macros/latex-dev/base/doc-code.pdfbin1075110 -> 1074767 bytes
-rw-r--r--macros/latex-dev/base/doc.pdfbin755547 -> 755242 bytes
-rw-r--r--macros/latex-dev/base/docstrip.dtx2
-rw-r--r--macros/latex-dev/base/docstrip.ins4
-rw-r--r--macros/latex-dev/base/docstrip.pdfbin504178 -> 504361 bytes
-rw-r--r--macros/latex-dev/base/ec.ins4
-rw-r--r--macros/latex-dev/base/encguide.pdfbin1318126 -> 1318139 bytes
-rw-r--r--macros/latex-dev/base/encguide.tex2
-rw-r--r--macros/latex-dev/base/exscale.dtx2
-rw-r--r--macros/latex-dev/base/exscale.ins4
-rw-r--r--macros/latex-dev/base/exscale.pdfbin204711 -> 204709 bytes
-rw-r--r--macros/latex-dev/base/fix-cm.dtx2
-rw-r--r--macros/latex-dev/base/fix-cm.ins4
-rw-r--r--macros/latex-dev/base/fix-cm.pdfbin287733 -> 287724 bytes
-rw-r--r--macros/latex-dev/base/fntguide.pdfbin517838 -> 517890 bytes
-rw-r--r--macros/latex-dev/base/fntguide.tex4
-rw-r--r--macros/latex-dev/base/fontdef.dtx2
-rw-r--r--macros/latex-dev/base/format.ins8
-rw-r--r--macros/latex-dev/base/graphpap.dtx2
-rw-r--r--macros/latex-dev/base/graphpap.ins4
-rw-r--r--macros/latex-dev/base/graphpap.pdfbin161713 -> 161725 bytes
-rw-r--r--macros/latex-dev/base/idx.tex2
-rw-r--r--macros/latex-dev/base/ifthen.dtx2
-rw-r--r--macros/latex-dev/base/ifthen.ins4
-rw-r--r--macros/latex-dev/base/ifthen.pdfbin221211 -> 221226 bytes
-rw-r--r--macros/latex-dev/base/inputenc.dtx2
-rw-r--r--macros/latex-dev/base/inputenc.ins4
-rw-r--r--macros/latex-dev/base/inputenc.pdfbin318204 -> 318166 bytes
-rw-r--r--macros/latex-dev/base/lablst.tex2
-rw-r--r--macros/latex-dev/base/lamport-manual.pdfbin170878 -> 170874 bytes
-rw-r--r--macros/latex-dev/base/latex209.dtx2
-rw-r--r--macros/latex-dev/base/latex209.ins4
-rw-r--r--macros/latex-dev/base/latexrelease.dtx2
-rw-r--r--macros/latex-dev/base/latexrelease.ins4
-rw-r--r--macros/latex-dev/base/latexrelease.pdfbin282115 -> 282105 bytes
-rw-r--r--macros/latex-dev/base/latexsym.dtx2
-rw-r--r--macros/latex-dev/base/latexsym.ins6
-rw-r--r--macros/latex-dev/base/latexsym.pdfbin200760 -> 200762 bytes
-rw-r--r--macros/latex-dev/base/lb2.err7
-rw-r--r--macros/latex-dev/base/lb2.pdfbin252140 -> 252313 bytes
-rw-r--r--macros/latex-dev/base/letter.dtx2
-rw-r--r--macros/latex-dev/base/letter.ins4
-rw-r--r--macros/latex-dev/base/letter.pdfbin337430 -> 337493 bytes
-rw-r--r--macros/latex-dev/base/lgc2.err22
-rw-r--r--macros/latex-dev/base/lgc2.pdfbin215684 -> 217560 bytes
-rw-r--r--macros/latex-dev/base/lppl.pdfbin132382 -> 132384 bytes
-rw-r--r--macros/latex-dev/base/ltalloc.dtx2
-rw-r--r--macros/latex-dev/base/ltbibl.dtx2
-rw-r--r--macros/latex-dev/base/ltboxes.dtx2
-rw-r--r--macros/latex-dev/base/ltclass.dtx2
-rw-r--r--macros/latex-dev/base/ltcmd.dtx2
-rw-r--r--macros/latex-dev/base/ltcmdhooks-code.pdfbin719408 -> 719205 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks-doc.pdfbin478686 -> 478517 bytes
-rw-r--r--macros/latex-dev/base/ltcntrl.dtx2
-rw-r--r--macros/latex-dev/base/ltcounts.dtx2
-rw-r--r--macros/latex-dev/base/ltdefns.dtx2
-rw-r--r--macros/latex-dev/base/ltdirchk.dtx2
-rw-r--r--macros/latex-dev/base/lterror.dtx2
-rw-r--r--macros/latex-dev/base/ltexpl.dtx2
-rw-r--r--macros/latex-dev/base/ltfilehook-code.pdfbin803060 -> 803151 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook-doc.pdfbin547926 -> 547988 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook.dtx2
-rw-r--r--macros/latex-dev/base/ltfiles.dtx14
-rw-r--r--macros/latex-dev/base/ltfinal.dtx2
-rw-r--r--macros/latex-dev/base/ltfloat.dtx2
-rw-r--r--macros/latex-dev/base/ltfntcmd.dtx2
-rw-r--r--macros/latex-dev/base/ltfssaxes.dtx2
-rw-r--r--macros/latex-dev/base/ltfssbas.dtx2
-rw-r--r--macros/latex-dev/base/ltfsscmp.dtx2
-rw-r--r--macros/latex-dev/base/ltfssdcl.dtx2
-rw-r--r--macros/latex-dev/base/ltfssini.dtx2
-rw-r--r--macros/latex-dev/base/ltfsstrc.dtx2
-rw-r--r--macros/latex-dev/base/lthooks-code.pdfbin1091429 -> 1091279 bytes
-rw-r--r--macros/latex-dev/base/lthooks-doc.pdfbin701473 -> 701283 bytes
-rw-r--r--macros/latex-dev/base/lthooks.dtx2
-rw-r--r--macros/latex-dev/base/lthyphen.dtx2
-rw-r--r--macros/latex-dev/base/ltidxglo.dtx2
-rw-r--r--macros/latex-dev/base/ltkeys.dtx2
-rw-r--r--macros/latex-dev/base/ltlength.dtx2
-rw-r--r--macros/latex-dev/base/ltlists.dtx2
-rw-r--r--macros/latex-dev/base/ltlogos.dtx2
-rw-r--r--macros/latex-dev/base/ltluatex.dtx6
-rw-r--r--macros/latex-dev/base/ltluatex.pdfbin324910 -> 325056 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-code.pdfbin715658 -> 715474 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-doc.pdfbin586024 -> 585862 bytes
-rw-r--r--macros/latex-dev/base/ltmath.dtx2
-rw-r--r--macros/latex-dev/base/ltmiscen.dtx2
-rw-r--r--macros/latex-dev/base/ltnews.cls27
-rw-r--r--macros/latex-dev/base/ltnews.pdfbin1255282 -> 1265382 bytes
-rw-r--r--macros/latex-dev/base/ltnews.tex18
-rw-r--r--macros/latex-dev/base/ltnews01.pdfbin161518 -> 161534 bytes
-rw-r--r--macros/latex-dev/base/ltnews01.tex2
-rw-r--r--macros/latex-dev/base/ltnews02.pdfbin159792 -> 159811 bytes
-rw-r--r--macros/latex-dev/base/ltnews02.tex2
-rw-r--r--macros/latex-dev/base/ltnews03.pdfbin159332 -> 159349 bytes
-rw-r--r--macros/latex-dev/base/ltnews03.tex2
-rw-r--r--macros/latex-dev/base/ltnews04.pdfbin152525 -> 152545 bytes
-rw-r--r--macros/latex-dev/base/ltnews04.tex2
-rw-r--r--macros/latex-dev/base/ltnews05.pdfbin174494 -> 174686 bytes
-rw-r--r--macros/latex-dev/base/ltnews05.tex2
-rw-r--r--macros/latex-dev/base/ltnews06.pdfbin142849 -> 142870 bytes
-rw-r--r--macros/latex-dev/base/ltnews06.tex2
-rw-r--r--macros/latex-dev/base/ltnews07.pdfbin137811 -> 138211 bytes
-rw-r--r--macros/latex-dev/base/ltnews07.tex2
-rw-r--r--macros/latex-dev/base/ltnews08.pdfbin155053 -> 155426 bytes
-rw-r--r--macros/latex-dev/base/ltnews08.tex2
-rw-r--r--macros/latex-dev/base/ltnews09.pdfbin129570 -> 129989 bytes
-rw-r--r--macros/latex-dev/base/ltnews09.tex2
-rw-r--r--macros/latex-dev/base/ltnews10.pdfbin169416 -> 169414 bytes
-rw-r--r--macros/latex-dev/base/ltnews10.tex2
-rw-r--r--macros/latex-dev/base/ltnews11.pdfbin111948 -> 112191 bytes
-rw-r--r--macros/latex-dev/base/ltnews11.tex2
-rw-r--r--macros/latex-dev/base/ltnews12.pdfbin156551 -> 156746 bytes
-rw-r--r--macros/latex-dev/base/ltnews12.tex2
-rw-r--r--macros/latex-dev/base/ltnews13.pdfbin182225 -> 182464 bytes
-rw-r--r--macros/latex-dev/base/ltnews13.tex2
-rw-r--r--macros/latex-dev/base/ltnews14.pdfbin170473 -> 170716 bytes
-rw-r--r--macros/latex-dev/base/ltnews14.tex2
-rw-r--r--macros/latex-dev/base/ltnews15.pdfbin130309 -> 130323 bytes
-rw-r--r--macros/latex-dev/base/ltnews15.tex2
-rw-r--r--macros/latex-dev/base/ltnews16.pdfbin138073 -> 138090 bytes
-rw-r--r--macros/latex-dev/base/ltnews16.tex2
-rw-r--r--macros/latex-dev/base/ltnews17.pdfbin166228 -> 166247 bytes
-rw-r--r--macros/latex-dev/base/ltnews17.tex2
-rw-r--r--macros/latex-dev/base/ltnews18.pdfbin38033 -> 38320 bytes
-rw-r--r--macros/latex-dev/base/ltnews18.tex2
-rw-r--r--macros/latex-dev/base/ltnews19.pdfbin230028 -> 230181 bytes
-rw-r--r--macros/latex-dev/base/ltnews19.tex3
-rw-r--r--macros/latex-dev/base/ltnews20.pdfbin318548 -> 318566 bytes
-rw-r--r--macros/latex-dev/base/ltnews20.tex1
-rw-r--r--macros/latex-dev/base/ltnews21.pdfbin244867 -> 244870 bytes
-rw-r--r--macros/latex-dev/base/ltnews22.pdfbin317773 -> 317779 bytes
-rw-r--r--macros/latex-dev/base/ltnews22.tex2
-rw-r--r--macros/latex-dev/base/ltnews23.pdfbin286591 -> 286600 bytes
-rw-r--r--macros/latex-dev/base/ltnews23.tex2
-rw-r--r--macros/latex-dev/base/ltnews24.pdfbin265279 -> 265292 bytes
-rw-r--r--macros/latex-dev/base/ltnews24.tex2
-rw-r--r--macros/latex-dev/base/ltnews25.pdfbin204935 -> 204948 bytes
-rw-r--r--macros/latex-dev/base/ltnews25.tex2
-rw-r--r--macros/latex-dev/base/ltnews26.pdfbin379462 -> 379472 bytes
-rw-r--r--macros/latex-dev/base/ltnews26.tex2
-rw-r--r--macros/latex-dev/base/ltnews27.pdfbin250592 -> 251083 bytes
-rw-r--r--macros/latex-dev/base/ltnews27.tex3
-rw-r--r--macros/latex-dev/base/ltnews28.pdfbin376643 -> 376652 bytes
-rw-r--r--macros/latex-dev/base/ltnews28.tex2
-rw-r--r--macros/latex-dev/base/ltnews29.pdfbin455107 -> 455116 bytes
-rw-r--r--macros/latex-dev/base/ltnews29.tex2
-rw-r--r--macros/latex-dev/base/ltnews30.pdfbin511909 -> 511895 bytes
-rw-r--r--macros/latex-dev/base/ltnews31.pdfbin526323 -> 526332 bytes
-rw-r--r--macros/latex-dev/base/ltnews31.tex1
-rw-r--r--macros/latex-dev/base/ltnews32.pdfbin546160 -> 546186 bytes
-rw-r--r--macros/latex-dev/base/ltnews33.pdfbin522412 -> 522416 bytes
-rw-r--r--macros/latex-dev/base/ltnews34.pdfbin508044 -> 508052 bytes
-rw-r--r--macros/latex-dev/base/ltnews34.tex1
-rw-r--r--macros/latex-dev/base/ltnews35.pdfbin563089 -> 563098 bytes
-rw-r--r--macros/latex-dev/base/ltnews36.pdfbin517565 -> 517571 bytes
-rw-r--r--macros/latex-dev/base/ltnews37.pdfbin408962 -> 456714 bytes
-rw-r--r--macros/latex-dev/base/ltnews37.tex148
-rw-r--r--macros/latex-dev/base/ltoutenc.dtx2
-rw-r--r--macros/latex-dev/base/ltoutenc.ins4
-rw-r--r--macros/latex-dev/base/ltoutput.dtx2
-rw-r--r--macros/latex-dev/base/ltpage.dtx2
-rw-r--r--macros/latex-dev/base/ltpageno.dtx2
-rw-r--r--macros/latex-dev/base/ltpar.dtx2
-rw-r--r--macros/latex-dev/base/ltpara-code.pdfbin667129 -> 671573 bytes
-rw-r--r--macros/latex-dev/base/ltpara-doc.pdfbin560008 -> 559554 bytes
-rw-r--r--macros/latex-dev/base/ltpara.dtx68
-rw-r--r--macros/latex-dev/base/ltpictur.dtx2
-rw-r--r--macros/latex-dev/base/ltplain.dtx2
-rw-r--r--macros/latex-dev/base/ltsect.dtx2
-rw-r--r--macros/latex-dev/base/ltshipout-code.pdfbin820928 -> 821006 bytes
-rw-r--r--macros/latex-dev/base/ltshipout-doc.pdfbin565931 -> 566006 bytes
-rw-r--r--macros/latex-dev/base/ltshipout.dtx2
-rw-r--r--macros/latex-dev/base/ltspace.dtx2
-rw-r--r--macros/latex-dev/base/lttab.dtx2
-rw-r--r--macros/latex-dev/base/lttextcomp.dtx2
-rw-r--r--macros/latex-dev/base/ltthm.dtx2
-rw-r--r--macros/latex-dev/base/ltvers.dtx4
-rw-r--r--macros/latex-dev/base/ltx3info.pdfbin219349 -> 219354 bytes
-rw-r--r--macros/latex-dev/base/ltx3info.tex2
-rw-r--r--macros/latex-dev/base/ltxcheck.tex2
-rw-r--r--macros/latex-dev/base/ltxdoc.dtx2
-rw-r--r--macros/latex-dev/base/ltxdoc.pdfbin243286 -> 243283 bytes
-rw-r--r--macros/latex-dev/base/ltxref.dtx2
-rw-r--r--macros/latex-dev/base/makeindx.dtx2
-rw-r--r--macros/latex-dev/base/makeindx.ins4
-rw-r--r--macros/latex-dev/base/makeindx.pdfbin165821 -> 165817 bytes
-rw-r--r--macros/latex-dev/base/modguide.pdfbin257804 -> 257827 bytes
-rw-r--r--macros/latex-dev/base/modguide.tex4
-rw-r--r--macros/latex-dev/base/newdc.ins4
-rw-r--r--macros/latex-dev/base/newlfont.dtx2
-rw-r--r--macros/latex-dev/base/nfssfont.dtx2
-rw-r--r--macros/latex-dev/base/nfssfont.ins4
-rw-r--r--macros/latex-dev/base/nfssfont.pdfbin211180 -> 211180 bytes
-rw-r--r--macros/latex-dev/base/olddc.ins4
-rw-r--r--macros/latex-dev/base/oldlfont.dtx2
-rw-r--r--macros/latex-dev/base/preload.dtx2
-rw-r--r--macros/latex-dev/base/proc.dtx2
-rw-r--r--macros/latex-dev/base/proc.ins4
-rw-r--r--macros/latex-dev/base/proc.pdfbin227059 -> 227056 bytes
-rw-r--r--macros/latex-dev/base/slides.dtx2
-rw-r--r--macros/latex-dev/base/slides.ins8
-rw-r--r--macros/latex-dev/base/slides.pdfbin375518 -> 375514 bytes
-rw-r--r--macros/latex-dev/base/slifonts.pdfbin234191 -> 234188 bytes
-rw-r--r--macros/latex-dev/base/source2e.pdfbin5789493 -> 5797424 bytes
-rw-r--r--macros/latex-dev/base/source2e.tex2
-rw-r--r--macros/latex-dev/base/syntonly.dtx2
-rw-r--r--macros/latex-dev/base/syntonly.ins4
-rw-r--r--macros/latex-dev/base/syntonly.pdfbin189819 -> 189552 bytes
-rw-r--r--macros/latex-dev/base/testpage.tex2
-rw-r--r--macros/latex-dev/base/tlc2.err19
-rw-r--r--macros/latex-dev/base/tlc2.pdfbin290615 -> 291015 bytes
-rw-r--r--macros/latex-dev/base/tulm.ins4
-rw-r--r--macros/latex-dev/base/tulm.pdfbin162772 -> 162766 bytes
-rw-r--r--macros/latex-dev/base/unpack.ins2
-rw-r--r--macros/latex-dev/base/usrguide-historic.pdfbin438515 -> 438570 bytes
-rw-r--r--macros/latex-dev/base/usrguide-historic.tex4
-rw-r--r--macros/latex-dev/base/usrguide.pdfbin474808 -> 474841 bytes
-rw-r--r--macros/latex-dev/base/usrguide.tex4
-rw-r--r--macros/latex-dev/base/utf8ienc.dtx2
-rw-r--r--macros/latex-dev/base/utf8ienc.pdfbin353428 -> 353281 bytes
-rw-r--r--macros/latex-dev/base/webcomp.pdfbin146198 -> 146195 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/README.md4
-rw-r--r--macros/latex-dev/required/latex-lab/blocks-code.pdfbin0 -> 864389 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/blocks-code.tex4
-rw-r--r--macros/latex-dev/required/latex-lab/blocks-doc.pdfbin0 -> 439093 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/blocks-doc.tex4
-rw-r--r--macros/latex-dev/required/latex-lab/changes.txt38
-rw-r--r--macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdfbin512028 -> 517856 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdfbin375913 -> 382232 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/documentmetadata-support.dtx61
-rw-r--r--macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex141
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx131
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdfbin0 -> 357221 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-block-tagging.dtx3821
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-block-tagging.pdfbin0 -> 864389 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx1418
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdfbin614913 -> 799900 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx102
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdfbin0 -> 302106 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathtagging.dtx1277
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathtagging.pdfbin0 -> 608921 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx223
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdfbin0 -> 357221 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx159
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdfbin0 -> 383590 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx (renamed from macros/latex-dev/required/latex-lab/latex-lab-new-or.dtx)10
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf (renamed from macros/latex-dev/required/latex-lab/latex-lab-new-or.pdf)bin529122 -> 529680 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.dtx810
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.pdfbin0 -> 527032 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx78
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-testphase.pdfbin290841 -> 296921 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx203
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdfbin0 -> 295610 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx443
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdfbin0 -> 341820 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.dtx365
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.pdfbin0 -> 377979 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab.ins39
-rw-r--r--macros/latex-dev/required/latex-lab/usage-of-@footnotemark.txt186
-rw-r--r--macros/latex-dev/required/latex-lab/usage-of-@footnotetext.txt842
-rw-r--r--macros/latex-dev/required/latex-lab/usage-of-kern-kern.txt80
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb-doc.pdfbin186723 -> 187963 bytes
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb-doc.tex16
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb.dtx60
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb.pdfbin364942 -> 367390 bytes
-rw-r--r--macros/latex/contrib/genealogytree/CHANGES.md21
-rw-r--r--macros/latex/contrib/genealogytree/README.md4
-rw-r--r--macros/latex/contrib/genealogytree/genealogytree-example-1.pdfbin207760 -> 208264 bytes
-rw-r--r--macros/latex/contrib/genealogytree/genealogytree-example-2.pdfbin259457 -> 259473 bytes
-rw-r--r--macros/latex/contrib/genealogytree/genealogytree-example-3.pdfbin205130 -> 205145 bytes
-rw-r--r--macros/latex/contrib/genealogytree/genealogytree-example-4.pdfbin307952 -> 307948 bytes
-rw-r--r--macros/latex/contrib/genealogytree/genealogytree-languages.pdfbin468253 -> 600599 bytes
-rw-r--r--macros/latex/contrib/genealogytree/genealogytree.pdfbin9292843 -> 9338306 bytes
-rw-r--r--macros/latex/contrib/genealogytree/genealogytree.sty10
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.contour.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.drawing.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.node.code.tex30
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.options.code.tex8
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.parser.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.processing.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrcore.symbols.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.catalan.code.tex87
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.chinese.code.tex94
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.danish.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.dutch.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.english.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.french.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.german.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.italian.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.portuguese.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.spanish.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlang.swedish.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlib.debug.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlib.fanchart.code.tex6
-rw-r--r--macros/latex/contrib/genealogytree/gtrlib.templates.code.tex6
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md8
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/README.md2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/fontspec-luatex-tmp-ltx.sty3888
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdfbin962540 -> 962873 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx95
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdfbin686472 -> 691708 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdfbin587431 -> 587721 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdfbin515050 -> 515314 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdfbin558354 -> 558634 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdfbin541395 -> 541673 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdfbin543671 -> 543976 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdfbin536785 -> 537067 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdfbin592206 -> 592524 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdfbin516032 -> 516300 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdfbin750122 -> 750467 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdfbin566285 -> 566543 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdfbin681952 -> 682288 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx23
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdfbin811796 -> 812732 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdfbin526936 -> 527235 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdfbin426770 -> 427013 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdfbin588866 -> 589232 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/luaotfload-l3color-tmp.lua78
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/output-patches-tmp-ltx.pdfbin386480 -> 386566 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx37
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdfbin444499 -> 443702 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx6
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdfbin456334 -> 456571 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty2
-rw-r--r--macros/latex/contrib/tugboat/NEWS11
-rw-r--r--macros/latex/contrib/tugboat/ltubguid.pdfbin363980 -> 363060 bytes
-rw-r--r--macros/latex/contrib/tugboat/tugboat.bst7
-rw-r--r--macros/latex/contrib/tugboat/tugboat.dtx46
-rw-r--r--macros/latex/contrib/tugboat/tugboat.pdfbin516448 -> 516315 bytes
-rw-r--r--macros/luatex/latex/lua-typo/README.md7
-rw-r--r--macros/luatex/latex/lua-typo/doc/lua-typo-demo.pdfbin16859 -> 16859 bytes
-rw-r--r--macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdfbin105225 -> 106404 bytes
-rw-r--r--macros/luatex/latex/lua-typo/doc/lua-typo.pdfbin173735 -> 179022 bytes
-rw-r--r--macros/luatex/latex/lua-typo/source/lua-typo.dtx957
-rw-r--r--macros/optex/README6
-rw-r--r--macros/optex/base/f-cabin.opm43
-rw-r--r--macros/optex/base/f-erewhon.opm2
-rw-r--r--macros/optex/base/f-fira.opm55
-rw-r--r--macros/optex/base/f-heros.opm3
-rw-r--r--macros/optex/base/f-inconsolata.opm18
-rw-r--r--macros/optex/base/f-xcharter.opm5
-rw-r--r--macros/optex/base/fams-ini.opm19
-rw-r--r--macros/optex/base/fonts-catalog.opm7
-rw-r--r--macros/optex/base/fonts-resize.opm30
-rw-r--r--macros/optex/base/fonts-select.opm48
-rw-r--r--macros/optex/base/graphics.opm9
-rw-r--r--macros/optex/base/hi-syntax.opm2
-rw-r--r--macros/optex/base/hisyntax-c.opm20
-rw-r--r--macros/optex/base/lists.opm31
-rw-r--r--macros/optex/base/optex.ini2
-rw-r--r--macros/optex/base/parameters.opm27
-rw-r--r--macros/optex/doc/optex-doc.pdfbin1505109 -> 1510893 bytes
-rw-r--r--macros/optex/doc/optex-doc.tex2
-rw-r--r--macros/optex/doc/optex-userdoc.tex3
-rw-r--r--macros/optex/pkg/tikz.opm8
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
index e8d8da01e4..b5a773fce8 100644
--- a/macros/latex-dev/base/alltt.pdf
+++ b/macros/latex-dev/base/alltt.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cfgguide.pdf b/macros/latex-dev/base/cfgguide.pdf
index d574da1576..9199195161 100644
--- a/macros/latex-dev/base/cfgguide.pdf
+++ b/macros/latex-dev/base/cfgguide.pdf
Binary files differ
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
index 30f8f4f5c0..39f29d0e8b 100644
--- a/macros/latex-dev/base/classes.pdf
+++ b/macros/latex-dev/base/classes.pdf
Binary files differ
diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf
index 709334dd02..ab8af60728 100644
--- a/macros/latex-dev/base/clsguide.pdf
+++ b/macros/latex-dev/base/clsguide.pdf
Binary files differ
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
index 255f6af9ad..6274984a6d 100644
--- a/macros/latex-dev/base/cmfonts.pdf
+++ b/macros/latex-dev/base/cmfonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cyrguide.pdf b/macros/latex-dev/base/cyrguide.pdf
index eb8b6a1618..1b614ae415 100644
--- a/macros/latex-dev/base/cyrguide.pdf
+++ b/macros/latex-dev/base/cyrguide.pdf
Binary files differ
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
index 5d573b35df..93037436a6 100644
--- a/macros/latex-dev/base/doc-code.pdf
+++ b/macros/latex-dev/base/doc-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf
index cce65ca48d..796e6319f2 100644
--- a/macros/latex-dev/base/doc.pdf
+++ b/macros/latex-dev/base/doc.pdf
Binary files differ
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
index 661da9efd5..a489d9b28a 100644
--- a/macros/latex-dev/base/docstrip.pdf
+++ b/macros/latex-dev/base/docstrip.pdf
Binary files differ
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
index 07fc3f5113..0c2ed52b02 100644
--- a/macros/latex-dev/base/encguide.pdf
+++ b/macros/latex-dev/base/encguide.pdf
Binary files differ
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
index a5f1195be7..8dd6ce4286 100644
--- a/macros/latex-dev/base/exscale.pdf
+++ b/macros/latex-dev/base/exscale.pdf
Binary files differ
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
index 0f14974f3a..f3eb096139 100644
--- a/macros/latex-dev/base/fix-cm.pdf
+++ b/macros/latex-dev/base/fix-cm.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fntguide.pdf b/macros/latex-dev/base/fntguide.pdf
index b2e74d07e7..d92d3d71bb 100644
--- a/macros/latex-dev/base/fntguide.pdf
+++ b/macros/latex-dev/base/fntguide.pdf
Binary files differ
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
index 3f3b067639..c5d07452ce 100644
--- a/macros/latex-dev/base/graphpap.pdf
+++ b/macros/latex-dev/base/graphpap.pdf
Binary files differ
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
index 1702b8105b..d09c30cace 100644
--- a/macros/latex-dev/base/ifthen.pdf
+++ b/macros/latex-dev/base/ifthen.pdf
Binary files differ
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
index dce32355a2..4c305b8bc1 100644
--- a/macros/latex-dev/base/inputenc.pdf
+++ b/macros/latex-dev/base/inputenc.pdf
Binary files differ
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
index e0895befef..14ffd31d47 100644
--- a/macros/latex-dev/base/lamport-manual.pdf
+++ b/macros/latex-dev/base/lamport-manual.pdf
Binary files differ
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
index a0111a19a8..ce0a066012 100644
--- a/macros/latex-dev/base/latexrelease.pdf
+++ b/macros/latex-dev/base/latexrelease.pdf
Binary files differ
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
index b9d8779f70..2b3650506a 100644
--- a/macros/latex-dev/base/latexsym.pdf
+++ b/macros/latex-dev/base/latexsym.pdf
Binary files differ
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
index 0c85e7c769..d5d94cd6d8 100644
--- a/macros/latex-dev/base/lb2.pdf
+++ b/macros/latex-dev/base/lb2.pdf
Binary files differ
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
index 46adfcc798..fb5d1b851e 100644
--- a/macros/latex-dev/base/letter.pdf
+++ b/macros/latex-dev/base/letter.pdf
Binary files differ
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
index c60439b2de..161aa93503 100644
--- a/macros/latex-dev/base/lgc2.pdf
+++ b/macros/latex-dev/base/lgc2.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lppl.pdf b/macros/latex-dev/base/lppl.pdf
index ecb66844e2..4b4c6fa326 100644
--- a/macros/latex-dev/base/lppl.pdf
+++ b/macros/latex-dev/base/lppl.pdf
Binary files differ
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
index b324da26c9..0dc121d2ce 100644
--- a/macros/latex-dev/base/ltcmdhooks-code.pdf
+++ b/macros/latex-dev/base/ltcmdhooks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltcmdhooks-doc.pdf b/macros/latex-dev/base/ltcmdhooks-doc.pdf
index 42222eb416..c67f46be25 100644
--- a/macros/latex-dev/base/ltcmdhooks-doc.pdf
+++ b/macros/latex-dev/base/ltcmdhooks-doc.pdf
Binary files differ
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
index e031f84227..c0f1ed5dbe 100644
--- a/macros/latex-dev/base/ltfilehook-code.pdf
+++ b/macros/latex-dev/base/ltfilehook-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltfilehook-doc.pdf b/macros/latex-dev/base/ltfilehook-doc.pdf
index ddc060fcc0..c24b2321a9 100644
--- a/macros/latex-dev/base/ltfilehook-doc.pdf
+++ b/macros/latex-dev/base/ltfilehook-doc.pdf
Binary files differ
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
index 4b4b85023e..d2bd8ee0a1 100644
--- a/macros/latex-dev/base/lthooks-code.pdf
+++ b/macros/latex-dev/base/lthooks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lthooks-doc.pdf b/macros/latex-dev/base/lthooks-doc.pdf
index 17e5d3a514..e9954e43f7 100644
--- a/macros/latex-dev/base/lthooks-doc.pdf
+++ b/macros/latex-dev/base/lthooks-doc.pdf
Binary files differ
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
index c99840f04b..855095c6ef 100644
--- a/macros/latex-dev/base/ltluatex.pdf
+++ b/macros/latex-dev/base/ltluatex.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltmarks-code.pdf b/macros/latex-dev/base/ltmarks-code.pdf
index 3204fd93a2..54c2703531 100644
--- a/macros/latex-dev/base/ltmarks-code.pdf
+++ b/macros/latex-dev/base/ltmarks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltmarks-doc.pdf b/macros/latex-dev/base/ltmarks-doc.pdf
index 1203c72f0e..cf70d21cae 100644
--- a/macros/latex-dev/base/ltmarks-doc.pdf
+++ b/macros/latex-dev/base/ltmarks-doc.pdf
Binary files differ
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
index 3185ce2fc0..bc1b2d7b36 100644
--- a/macros/latex-dev/base/ltnews.pdf
+++ b/macros/latex-dev/base/ltnews.pdf
Binary files differ
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
index 8bc64afa46..618176aa56 100644
--- a/macros/latex-dev/base/ltnews01.pdf
+++ b/macros/latex-dev/base/ltnews01.pdf
Binary files differ
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
index 6410f6c49a..423dd7db37 100644
--- a/macros/latex-dev/base/ltnews02.pdf
+++ b/macros/latex-dev/base/ltnews02.pdf
Binary files differ
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
index e6faf40788..a43f3c2ffc 100644
--- a/macros/latex-dev/base/ltnews03.pdf
+++ b/macros/latex-dev/base/ltnews03.pdf
Binary files differ
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
index fdea7fa928..95683443c7 100644
--- a/macros/latex-dev/base/ltnews04.pdf
+++ b/macros/latex-dev/base/ltnews04.pdf
Binary files differ
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
index f45d499a6a..91ba9c3669 100644
--- a/macros/latex-dev/base/ltnews05.pdf
+++ b/macros/latex-dev/base/ltnews05.pdf
Binary files differ
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
index 8fa7fd39ab..57c9abe6a9 100644
--- a/macros/latex-dev/base/ltnews06.pdf
+++ b/macros/latex-dev/base/ltnews06.pdf
Binary files differ
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
index deb8285b1d..a587a13ac7 100644
--- a/macros/latex-dev/base/ltnews07.pdf
+++ b/macros/latex-dev/base/ltnews07.pdf
Binary files differ
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
index 2127ebe3a2..c57077ac14 100644
--- a/macros/latex-dev/base/ltnews08.pdf
+++ b/macros/latex-dev/base/ltnews08.pdf
Binary files differ
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
index d731efbd39..7dff0aaeb5 100644
--- a/macros/latex-dev/base/ltnews09.pdf
+++ b/macros/latex-dev/base/ltnews09.pdf
Binary files differ
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
index 5d2967891b..9911e7cc2e 100644
--- a/macros/latex-dev/base/ltnews10.pdf
+++ b/macros/latex-dev/base/ltnews10.pdf
Binary files differ
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
index 364f3ab434..9d35abb5ea 100644
--- a/macros/latex-dev/base/ltnews11.pdf
+++ b/macros/latex-dev/base/ltnews11.pdf
Binary files differ
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
index 7cccdcc6a4..71aa27bcfc 100644
--- a/macros/latex-dev/base/ltnews12.pdf
+++ b/macros/latex-dev/base/ltnews12.pdf
Binary files differ
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
index 5aa1175b0c..1940689968 100644
--- a/macros/latex-dev/base/ltnews13.pdf
+++ b/macros/latex-dev/base/ltnews13.pdf
Binary files differ
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
index 02063e4e90..66821fc4d0 100644
--- a/macros/latex-dev/base/ltnews14.pdf
+++ b/macros/latex-dev/base/ltnews14.pdf
Binary files differ
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
index 1ff4a5662e..0dfe862498 100644
--- a/macros/latex-dev/base/ltnews15.pdf
+++ b/macros/latex-dev/base/ltnews15.pdf
Binary files differ
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
index 04f5796d12..0c8934029d 100644
--- a/macros/latex-dev/base/ltnews16.pdf
+++ b/macros/latex-dev/base/ltnews16.pdf
Binary files differ
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
index a601da8823..2d5500ff62 100644
--- a/macros/latex-dev/base/ltnews17.pdf
+++ b/macros/latex-dev/base/ltnews17.pdf
Binary files differ
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
index 89350a011c..b88c8a5401 100644
--- a/macros/latex-dev/base/ltnews18.pdf
+++ b/macros/latex-dev/base/ltnews18.pdf
Binary files differ
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
index aa27ba08dc..b6a132732e 100644
--- a/macros/latex-dev/base/ltnews19.pdf
+++ b/macros/latex-dev/base/ltnews19.pdf
Binary files differ
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
index 402394cc48..3c79e0d9be 100644
--- a/macros/latex-dev/base/ltnews20.pdf
+++ b/macros/latex-dev/base/ltnews20.pdf
Binary files differ
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
index e4ea9cc255..c6528cfbea 100644
--- a/macros/latex-dev/base/ltnews21.pdf
+++ b/macros/latex-dev/base/ltnews21.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf
index 5ee6bfc24d..625a3af16e 100644
--- a/macros/latex-dev/base/ltnews22.pdf
+++ b/macros/latex-dev/base/ltnews22.pdf
Binary files differ
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
index c2caca4c16..2d591ff424 100644
--- a/macros/latex-dev/base/ltnews23.pdf
+++ b/macros/latex-dev/base/ltnews23.pdf
Binary files differ
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
index 3c5ede15d2..bea89f1051 100644
--- a/macros/latex-dev/base/ltnews24.pdf
+++ b/macros/latex-dev/base/ltnews24.pdf
Binary files differ
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
index 885993792d..aa027c430c 100644
--- a/macros/latex-dev/base/ltnews25.pdf
+++ b/macros/latex-dev/base/ltnews25.pdf
Binary files differ
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
index 299a726a8e..fe7d100e0d 100644
--- a/macros/latex-dev/base/ltnews26.pdf
+++ b/macros/latex-dev/base/ltnews26.pdf
Binary files differ
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
index cc8f3e4896..29da354bf3 100644
--- a/macros/latex-dev/base/ltnews27.pdf
+++ b/macros/latex-dev/base/ltnews27.pdf
Binary files differ
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
index 9366cf0426..ee61704ae6 100644
--- a/macros/latex-dev/base/ltnews28.pdf
+++ b/macros/latex-dev/base/ltnews28.pdf
Binary files differ
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
index 8dbbb56102..807dc2f7c2 100644
--- a/macros/latex-dev/base/ltnews29.pdf
+++ b/macros/latex-dev/base/ltnews29.pdf
Binary files differ
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
index 7a217b657a..0e1203352a 100644
--- a/macros/latex-dev/base/ltnews30.pdf
+++ b/macros/latex-dev/base/ltnews30.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews31.pdf b/macros/latex-dev/base/ltnews31.pdf
index c4a8f385eb..878583bfb2 100644
--- a/macros/latex-dev/base/ltnews31.pdf
+++ b/macros/latex-dev/base/ltnews31.pdf
Binary files differ
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
index 2e8fc1b80b..35069ceab5 100644
--- a/macros/latex-dev/base/ltnews32.pdf
+++ b/macros/latex-dev/base/ltnews32.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews33.pdf b/macros/latex-dev/base/ltnews33.pdf
index 05ed870d0b..e42df53c30 100644
--- a/macros/latex-dev/base/ltnews33.pdf
+++ b/macros/latex-dev/base/ltnews33.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews34.pdf b/macros/latex-dev/base/ltnews34.pdf
index 5648f3e89e..0707a1e9a2 100644
--- a/macros/latex-dev/base/ltnews34.pdf
+++ b/macros/latex-dev/base/ltnews34.pdf
Binary files differ
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
index 2bab979d1a..bef895d098 100644
--- a/macros/latex-dev/base/ltnews35.pdf
+++ b/macros/latex-dev/base/ltnews35.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews36.pdf b/macros/latex-dev/base/ltnews36.pdf
index 575e2b9feb..acd22fa631 100644
--- a/macros/latex-dev/base/ltnews36.pdf
+++ b/macros/latex-dev/base/ltnews36.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews37.pdf b/macros/latex-dev/base/ltnews37.pdf
index a9216f04fd..3b13c3e619 100644
--- a/macros/latex-dev/base/ltnews37.pdf
+++ b/macros/latex-dev/base/ltnews37.pdf
Binary files differ
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
index 0537eb4ec9..7813560129 100644
--- a/macros/latex-dev/base/ltpara-code.pdf
+++ b/macros/latex-dev/base/ltpara-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltpara-doc.pdf b/macros/latex-dev/base/ltpara-doc.pdf
index bbd4a35c70..fec25ce942 100644
--- a/macros/latex-dev/base/ltpara-doc.pdf
+++ b/macros/latex-dev/base/ltpara-doc.pdf
Binary files differ
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
index 5c4df6d628..79b27f4984 100644
--- a/macros/latex-dev/base/ltshipout-code.pdf
+++ b/macros/latex-dev/base/ltshipout-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltshipout-doc.pdf b/macros/latex-dev/base/ltshipout-doc.pdf
index 6d28fe7faf..131c5251a0 100644
--- a/macros/latex-dev/base/ltshipout-doc.pdf
+++ b/macros/latex-dev/base/ltshipout-doc.pdf
Binary files differ
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
index 122feaff59..ccdd69abd9 100644
--- a/macros/latex-dev/base/ltx3info.pdf
+++ b/macros/latex-dev/base/ltx3info.pdf
Binary files differ
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
index 0e75ce008e..188d833aeb 100644
--- a/macros/latex-dev/base/ltxdoc.pdf
+++ b/macros/latex-dev/base/ltxdoc.pdf
Binary files differ
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
index 8ebcab2ea6..8d714a1cf1 100644
--- a/macros/latex-dev/base/makeindx.pdf
+++ b/macros/latex-dev/base/makeindx.pdf
Binary files differ
diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf
index 0778d8eb49..d484bf783b 100644
--- a/macros/latex-dev/base/modguide.pdf
+++ b/macros/latex-dev/base/modguide.pdf
Binary files differ
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
index 601fa1592e..cb2d37b3c3 100644
--- a/macros/latex-dev/base/nfssfont.pdf
+++ b/macros/latex-dev/base/nfssfont.pdf
Binary files differ
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
index 97cc3e82c8..dc5c8e3a67 100644
--- a/macros/latex-dev/base/proc.pdf
+++ b/macros/latex-dev/base/proc.pdf
Binary files differ
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
index c18411078c..49a2fbf7be 100644
--- a/macros/latex-dev/base/slides.pdf
+++ b/macros/latex-dev/base/slides.pdf
Binary files differ
diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf
index 8115e6ae86..4707b8a219 100644
--- a/macros/latex-dev/base/slifonts.pdf
+++ b/macros/latex-dev/base/slifonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/source2e.pdf b/macros/latex-dev/base/source2e.pdf
index d956472b5d..f84a84ea72 100644
--- a/macros/latex-dev/base/source2e.pdf
+++ b/macros/latex-dev/base/source2e.pdf
Binary files differ
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
index ef69d1da2e..24da1cf460 100644
--- a/macros/latex-dev/base/syntonly.pdf
+++ b/macros/latex-dev/base/syntonly.pdf
Binary files differ
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
index 067c94c0c6..e21a6fb104 100644
--- a/macros/latex-dev/base/tlc2.pdf
+++ b/macros/latex-dev/base/tlc2.pdf
Binary files differ
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
index 57ead84747..d2c4ec94d0 100644
--- a/macros/latex-dev/base/tulm.pdf
+++ b/macros/latex-dev/base/tulm.pdf
Binary files differ
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
index a390a49de9..3149112b43 100644
--- a/macros/latex-dev/base/usrguide-historic.pdf
+++ b/macros/latex-dev/base/usrguide-historic.pdf
Binary files differ
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
index 263df7df63..c4953d7e33 100644
--- a/macros/latex-dev/base/usrguide.pdf
+++ b/macros/latex-dev/base/usrguide.pdf
Binary files differ
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
index 4459986064..d211ec2de1 100644
--- a/macros/latex-dev/base/utf8ienc.pdf
+++ b/macros/latex-dev/base/utf8ienc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf
index 1bf17cd5bd..a7e1a07aec 100644
--- a/macros/latex-dev/base/webcomp.pdf
+++ b/macros/latex-dev/base/webcomp.pdf
Binary files differ
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
new file mode 100644
index 0000000000..300f15ecbf
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/blocks-code.pdf
Binary files differ
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
new file mode 100644
index 0000000000..ccff6f95eb
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/blocks-doc.pdf
Binary files differ
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
index 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
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf b/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf
index 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
Binary files differ
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
new file mode 100644
index 0000000000..765870ac61
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf
Binary files differ
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
new file mode 100644
index 0000000000..92be446ea7
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-block-tagging.pdf
Binary files differ
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
index 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
Binary files differ
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
new file mode 100644
index 0000000000..219b39d6cb
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf
Binary files differ
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
new file mode 100644
index 0000000000..270cf6d721
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtagging.pdf
Binary files differ
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
new file mode 100644
index 0000000000..1272745dd9
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf
Binary files differ
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
new file mode 100644
index 0000000000..e9f69f428b
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf
Binary files differ
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
index 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
Binary files differ
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
new file mode 100644
index 0000000000..09e73151bc
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-sec-tagging.pdf
Binary files differ
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
index 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
Binary files differ
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
new file mode 100644
index 0000000000..444d701cdf
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf
Binary files differ
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
new file mode 100644
index 0000000000..1e8357e811
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf
Binary files differ
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
new file mode 100644
index 0000000000..b0b3f531db
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-tagging-functions.pdf
Binary files differ
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
index a877bbe57c..dae1c3f742 100644
--- a/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf
+++ b/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf
Binary files differ
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
index 11268e191f..395080ae3f 100644
--- a/macros/latex/contrib/babel-contrib/french/frenchb.pdf
+++ b/macros/latex/contrib/babel-contrib/french/frenchb.pdf
Binary files differ
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
index 0b893c644a..ab59ba00b9 100644
--- a/macros/latex/contrib/genealogytree/genealogytree-example-1.pdf
+++ b/macros/latex/contrib/genealogytree/genealogytree-example-1.pdf
Binary files differ
diff --git a/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf b/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf
index ec8a2ea0fc..b84b9ac1eb 100644
--- a/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf
+++ b/macros/latex/contrib/genealogytree/genealogytree-example-2.pdf
Binary files differ
diff --git a/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf b/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf
index 8fa4eb74cc..6bbe1e3096 100644
--- a/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf
+++ b/macros/latex/contrib/genealogytree/genealogytree-example-3.pdf
Binary files differ
diff --git a/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf b/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf
index 9995cbd07a..87dd10be43 100644
--- a/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf
+++ b/macros/latex/contrib/genealogytree/genealogytree-example-4.pdf
Binary files differ
diff --git a/macros/latex/contrib/genealogytree/genealogytree-languages.pdf b/macros/latex/contrib/genealogytree/genealogytree-languages.pdf
index 58f985e5db..7307ad730d 100644
--- a/macros/latex/contrib/genealogytree/genealogytree-languages.pdf
+++ b/macros/latex/contrib/genealogytree/genealogytree-languages.pdf
Binary files differ
diff --git a/macros/latex/contrib/genealogytree/genealogytree.pdf b/macros/latex/contrib/genealogytree/genealogytree.pdf
index 9c75dfe74e..3d110c0514 100644
--- a/macros/latex/contrib/genealogytree/genealogytree.pdf
+++ b/macros/latex/contrib/genealogytree/genealogytree.pdf
Binary files differ
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
index c5476881c0..306f715e8d 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
Binary files differ
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
index 229895df9b..03c2cb4d73 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
Binary files differ
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
index c8d599d700..6efe0a3e81 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
Binary files differ
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
index 30c708719d..277eda9a51 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
Binary files differ
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
index 1a07c64766..f3f2709d1c 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
Binary files differ
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
index 8b051f6999..c3a510d875 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
Binary files differ
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
index 000a7452d5..c668f282fe 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
Binary files differ
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
index b9b7bbb303..e33b6a3598 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
Binary files differ
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
index c95db774a0..400c83654e 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
Binary files differ
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
index 608479e30b..98020b9fa2 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
Binary files differ
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
index 63440cf172..35caa5b8db 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
Binary files differ
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
index e06e86127d..c51b62daf8 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
Binary files differ
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
index 54c1ccae90..fa89390e25 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
Binary files differ
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
index 2795c0188f..66e3bf0206 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
Binary files differ
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
index e0b99f153f..633a4ef871 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
Binary files differ
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
index b9261b84cb..4d0fb96e1f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
Binary files differ
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
index d7311dddb1..963c915cca 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
Binary files differ
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
index 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
Binary files differ
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
index 30aa895e05..05f5aeac65 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
Binary files differ
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
index c4205bc6e4..7e40c5713c 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
Binary files differ
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
index 4e9a95b979..3d39af7dad 100644
--- a/macros/latex/contrib/tugboat/ltubguid.pdf
+++ b/macros/latex/contrib/tugboat/ltubguid.pdf
Binary files differ
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
index 611ea5fe18..fc6500607f 100644
--- a/macros/latex/contrib/tugboat/tugboat.pdf
+++ b/macros/latex/contrib/tugboat/tugboat.pdf
Binary files differ
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
index 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
Binary files differ
diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo-fr.pdf
index 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
Binary files differ
diff --git a/macros/luatex/latex/lua-typo/doc/lua-typo.pdf b/macros/luatex/latex/lua-typo/doc/lua-typo.pdf
index 55acdc97b8..6990971202 100644
--- a/macros/luatex/latex/lua-typo/doc/lua-typo.pdf
+++ b/macros/luatex/latex/lua-typo/doc/lua-typo.pdf
Binary files differ
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
index ed937d191e..d300514088 100644
--- a/macros/optex/doc/optex-doc.pdf
+++ b/macros/optex/doc/optex-doc.pdf
Binary files differ
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