summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-02-15 03:01:30 +0000
committerNorbert Preining <norbert@preining.info>2024-02-15 03:01:30 +0000
commit5b6839a58ea5468b40ebd52b579e680b8e62ff13 (patch)
tree1dfc09f53794115129a07bf566b466cc337606f5
parenta90336c3069c198b41b7b6eb76e3389610ad5eb7 (diff)
CTAN sync 202402150301
-rw-r--r--FILES.byname1394
-rw-r--r--FILES.byname.gzbin2635232 -> 2636014 bytes
-rw-r--r--FILES.last07days814
-rw-r--r--biblio/bibtex/contrib/francais-bst/README.md6
-rw-r--r--biblio/bibtex/contrib/francais-bst/francais-bst.mbs47
-rw-r--r--biblio/bibtex/contrib/francais-bst/francais-bst.pdfbin43186 -> 43765 bytes
-rw-r--r--biblio/bibtex/contrib/francais-bst/francais.dbj2
-rw-r--r--biblio/bibtex/contrib/francais-bst/francaisbst.dbj2
-rw-r--r--biblio/bibtex/contrib/francais-bst/francaissc.dbj2
-rw-r--r--biblio/ctan-bibdata/ctan.bib68
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/README24
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex12
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex9
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex4
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex59
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex2
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdfbin0 -> 37950 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdfbin0 -> 25278 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdfbin0 -> 53190 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdfbin0 -> 75547 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdfbin0 -> 1393 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex5
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdfbin0 -> 31545 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdfbin0 -> 49262 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdfbin0 -> 32124 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty508
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdfbin6952517 -> 7456869 bytes
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex86
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex4
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex75
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex20
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex202
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex237
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex15
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex269
-rw-r--r--graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex268
-rw-r--r--macros/generic/lt3luabridge/docstrip.cfg2
-rw-r--r--macros/generic/lt3luabridge/lt3luabridge.dtx44
-rw-r--r--macros/generic/lt3luabridge/lt3luabridge.pdfbin494475 -> 497075 bytes
-rw-r--r--macros/latex-dev/base/README.md2
-rw-r--r--macros/latex-dev/base/alltt.dtx6
-rw-r--r--macros/latex-dev/base/alltt.ins4
-rw-r--r--macros/latex-dev/base/alltt.pdfbin223831 -> 223861 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.pdfbin264168 -> 264168 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.tex2
-rw-r--r--macros/latex-dev/base/changes.txt137
-rw-r--r--macros/latex-dev/base/classes.dtx14
-rw-r--r--macros/latex-dev/base/classes.ins4
-rw-r--r--macros/latex-dev/base/classes.pdfbin560998 -> 560294 bytes
-rw-r--r--macros/latex-dev/base/clsguide-historic.pdfbin415615 -> 415956 bytes
-rw-r--r--macros/latex-dev/base/clsguide-historic.tex12
-rw-r--r--macros/latex-dev/base/clsguide.pdfbin489925 -> 489795 bytes
-rw-r--r--macros/latex-dev/base/clsguide.tex6
-rw-r--r--macros/latex-dev/base/cmextra.ins4
-rw-r--r--macros/latex-dev/base/cmfonts.fdd2
-rw-r--r--macros/latex-dev/base/cmfonts.ins4
-rw-r--r--macros/latex-dev/base/cmfonts.pdfbin292600 -> 292600 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.pdfbin257359 -> 257359 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.tex2
-rw-r--r--macros/latex-dev/base/doc-code.pdfbin1075915 -> 1078428 bytes
-rw-r--r--macros/latex-dev/base/doc.dtx223
-rw-r--r--macros/latex-dev/base/doc.pdfbin756298 -> 757049 bytes
-rw-r--r--macros/latex-dev/base/docstrip.dtx16
-rw-r--r--macros/latex-dev/base/docstrip.ins4
-rw-r--r--macros/latex-dev/base/docstrip.pdfbin506630 -> 506365 bytes
-rw-r--r--macros/latex-dev/base/ec.ins4
-rw-r--r--macros/latex-dev/base/encguide.pdfbin1318576 -> 1318576 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.pdfbin204708 -> 204708 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.pdfbin287727 -> 287727 bytes
-rw-r--r--macros/latex-dev/base/fntguide.pdfbin517708 -> 517708 bytes
-rw-r--r--macros/latex-dev/base/fntguide.tex2
-rw-r--r--macros/latex-dev/base/fontdef.dtx32
-rw-r--r--macros/latex-dev/base/format.ins14
-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.pdfbin161722 -> 161722 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.pdfbin221219 -> 221219 bytes
-rw-r--r--macros/latex-dev/base/inputenc.dtx8
-rw-r--r--macros/latex-dev/base/inputenc.ins4
-rw-r--r--macros/latex-dev/base/inputenc.pdfbin318199 -> 318372 bytes
-rw-r--r--macros/latex-dev/base/lablst.tex2
-rw-r--r--macros/latex-dev/base/lamport-manual.pdfbin170876 -> 170876 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.ins5
-rw-r--r--macros/latex-dev/base/latexrelease.pdfbin282095 -> 282095 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.pdfbin200759 -> 200759 bytes
-rw-r--r--macros/latex-dev/base/lb2.err11
-rw-r--r--macros/latex-dev/base/lb2.pdfbin252497 -> 253116 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.pdfbin337852 -> 337772 bytes
-rw-r--r--macros/latex-dev/base/lgc2.pdfbin217659 -> 217659 bytes
-rw-r--r--macros/latex-dev/base/lppl.pdfbin132370 -> 132370 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.dtx9
-rw-r--r--macros/latex-dev/base/ltclass.dtx38
-rw-r--r--macros/latex-dev/base/ltcmd.dtx217
-rw-r--r--macros/latex-dev/base/ltcmdhooks-code.pdfbin755882 -> 752365 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks-doc.pdfbin499346 -> 497334 bytes
-rw-r--r--macros/latex-dev/base/ltcmdhooks.dtx24
-rw-r--r--macros/latex-dev/base/ltcntrl.dtx2
-rw-r--r--macros/latex-dev/base/ltcounts.dtx21
-rw-r--r--macros/latex-dev/base/ltdefns.dtx22
-rw-r--r--macros/latex-dev/base/ltdirchk.dtx10
-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.pdfbin804030 -> 803049 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook-doc.pdfbin548695 -> 548011 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook.dtx26
-rw-r--r--macros/latex-dev/base/ltfiles.dtx59
-rw-r--r--macros/latex-dev/base/ltfinal.dtx8
-rw-r--r--macros/latex-dev/base/ltfloat.dtx2
-rw-r--r--macros/latex-dev/base/ltfntcmd.dtx10
-rw-r--r--macros/latex-dev/base/ltfssaxes.dtx12
-rw-r--r--macros/latex-dev/base/ltfssbas.dtx6
-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.dtx12
-rw-r--r--macros/latex-dev/base/ltfsstrc.dtx25
-rw-r--r--macros/latex-dev/base/lthooks-code.pdfbin1258628 -> 1248644 bytes
-rw-r--r--macros/latex-dev/base/lthooks-doc.pdfbin755246 -> 758273 bytes
-rw-r--r--macros/latex-dev/base/lthooks.dtx403
-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.dtx10
-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.dtx28
-rw-r--r--macros/latex-dev/base/ltluatex.pdfbin325191 -> 325142 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-code.pdfbin716681 -> 711767 bytes
-rw-r--r--macros/latex-dev/base/ltmarks-doc.pdfbin586808 -> 575242 bytes
-rw-r--r--macros/latex-dev/base/ltmarks.dtx656
-rw-r--r--macros/latex-dev/base/ltmath.dtx2
-rw-r--r--macros/latex-dev/base/ltmeta.dtx15
-rw-r--r--macros/latex-dev/base/ltmiscen.dtx14
-rw-r--r--macros/latex-dev/base/ltnews.cls2
-rw-r--r--macros/latex-dev/base/ltnews.pdfbin1360066 -> 1390205 bytes
-rw-r--r--macros/latex-dev/base/ltnews.tex4
-rw-r--r--macros/latex-dev/base/ltnews01.pdfbin169553 -> 169553 bytes
-rw-r--r--macros/latex-dev/base/ltnews01.tex2
-rw-r--r--macros/latex-dev/base/ltnews02.pdfbin151773 -> 151773 bytes
-rw-r--r--macros/latex-dev/base/ltnews02.tex2
-rw-r--r--macros/latex-dev/base/ltnews03.pdfbin151324 -> 151324 bytes
-rw-r--r--macros/latex-dev/base/ltnews03.tex2
-rw-r--r--macros/latex-dev/base/ltnews04.pdfbin152551 -> 152551 bytes
-rw-r--r--macros/latex-dev/base/ltnews04.tex2
-rw-r--r--macros/latex-dev/base/ltnews05.pdfbin175211 -> 175211 bytes
-rw-r--r--macros/latex-dev/base/ltnews05.tex2
-rw-r--r--macros/latex-dev/base/ltnews06.pdfbin142867 -> 142867 bytes
-rw-r--r--macros/latex-dev/base/ltnews06.tex2
-rw-r--r--macros/latex-dev/base/ltnews07.pdfbin138214 -> 138214 bytes
-rw-r--r--macros/latex-dev/base/ltnews07.tex2
-rw-r--r--macros/latex-dev/base/ltnews08.pdfbin155442 -> 155442 bytes
-rw-r--r--macros/latex-dev/base/ltnews08.tex2
-rw-r--r--macros/latex-dev/base/ltnews09.pdfbin130028 -> 130028 bytes
-rw-r--r--macros/latex-dev/base/ltnews09.tex2
-rw-r--r--macros/latex-dev/base/ltnews10.pdfbin169433 -> 169433 bytes
-rw-r--r--macros/latex-dev/base/ltnews10.tex2
-rw-r--r--macros/latex-dev/base/ltnews11.pdfbin112208 -> 112208 bytes
-rw-r--r--macros/latex-dev/base/ltnews11.tex2
-rw-r--r--macros/latex-dev/base/ltnews12.pdfbin156764 -> 156764 bytes
-rw-r--r--macros/latex-dev/base/ltnews12.tex2
-rw-r--r--macros/latex-dev/base/ltnews13.pdfbin182483 -> 182483 bytes
-rw-r--r--macros/latex-dev/base/ltnews13.tex2
-rw-r--r--macros/latex-dev/base/ltnews14.pdfbin170722 -> 170722 bytes
-rw-r--r--macros/latex-dev/base/ltnews14.tex2
-rw-r--r--macros/latex-dev/base/ltnews15.pdfbin130328 -> 130328 bytes
-rw-r--r--macros/latex-dev/base/ltnews15.tex2
-rw-r--r--macros/latex-dev/base/ltnews16.pdfbin138107 -> 138107 bytes
-rw-r--r--macros/latex-dev/base/ltnews16.tex2
-rw-r--r--macros/latex-dev/base/ltnews17.pdfbin166269 -> 166269 bytes
-rw-r--r--macros/latex-dev/base/ltnews17.tex2
-rw-r--r--macros/latex-dev/base/ltnews18.pdfbin39839 -> 39839 bytes
-rw-r--r--macros/latex-dev/base/ltnews18.tex2
-rw-r--r--macros/latex-dev/base/ltnews19.pdfbin225936 -> 225936 bytes
-rw-r--r--macros/latex-dev/base/ltnews19.tex2
-rw-r--r--macros/latex-dev/base/ltnews20.pdfbin318193 -> 318193 bytes
-rw-r--r--macros/latex-dev/base/ltnews20.tex2
-rw-r--r--macros/latex-dev/base/ltnews21.pdfbin245228 -> 245228 bytes
-rw-r--r--macros/latex-dev/base/ltnews21.tex2
-rw-r--r--macros/latex-dev/base/ltnews22.pdfbin318026 -> 318026 bytes
-rw-r--r--macros/latex-dev/base/ltnews22.tex2
-rw-r--r--macros/latex-dev/base/ltnews23.pdfbin286824 -> 286824 bytes
-rw-r--r--macros/latex-dev/base/ltnews23.tex2
-rw-r--r--macros/latex-dev/base/ltnews24.pdfbin265497 -> 265497 bytes
-rw-r--r--macros/latex-dev/base/ltnews24.tex2
-rw-r--r--macros/latex-dev/base/ltnews25.pdfbin205100 -> 205100 bytes
-rw-r--r--macros/latex-dev/base/ltnews25.tex2
-rw-r--r--macros/latex-dev/base/ltnews26.pdfbin379733 -> 379733 bytes
-rw-r--r--macros/latex-dev/base/ltnews26.tex2
-rw-r--r--macros/latex-dev/base/ltnews27.pdfbin251283 -> 251283 bytes
-rw-r--r--macros/latex-dev/base/ltnews27.tex2
-rw-r--r--macros/latex-dev/base/ltnews28.pdfbin376933 -> 376933 bytes
-rw-r--r--macros/latex-dev/base/ltnews28.tex2
-rw-r--r--macros/latex-dev/base/ltnews29.pdfbin455437 -> 455437 bytes
-rw-r--r--macros/latex-dev/base/ltnews29.tex2
-rw-r--r--macros/latex-dev/base/ltnews30.pdfbin512240 -> 512240 bytes
-rw-r--r--macros/latex-dev/base/ltnews30.tex2
-rw-r--r--macros/latex-dev/base/ltnews31.pdfbin526688 -> 526688 bytes
-rw-r--r--macros/latex-dev/base/ltnews31.tex2
-rw-r--r--macros/latex-dev/base/ltnews32.pdfbin546540 -> 546540 bytes
-rw-r--r--macros/latex-dev/base/ltnews32.tex2
-rw-r--r--macros/latex-dev/base/ltnews33.pdfbin522757 -> 522757 bytes
-rw-r--r--macros/latex-dev/base/ltnews33.tex2
-rw-r--r--macros/latex-dev/base/ltnews34.pdfbin508345 -> 508345 bytes
-rw-r--r--macros/latex-dev/base/ltnews34.tex2
-rw-r--r--macros/latex-dev/base/ltnews35.pdfbin563307 -> 563307 bytes
-rw-r--r--macros/latex-dev/base/ltnews35.tex2
-rw-r--r--macros/latex-dev/base/ltnews36.pdfbin517934 -> 517934 bytes
-rw-r--r--macros/latex-dev/base/ltnews36.tex2
-rw-r--r--macros/latex-dev/base/ltnews37.pdfbin456933 -> 456933 bytes
-rw-r--r--macros/latex-dev/base/ltnews37.tex2
-rw-r--r--macros/latex-dev/base/ltnews38.pdfbin523672 -> 523675 bytes
-rw-r--r--macros/latex-dev/base/ltnews38.tex2
-rw-r--r--macros/latex-dev/base/ltnews39.pdfbin0 -> 473345 bytes
-rw-r--r--macros/latex-dev/base/ltnews39.tex640
-rw-r--r--macros/latex-dev/base/ltoutenc.dtx27
-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.pdfbin672700 -> 672114 bytes
-rw-r--r--macros/latex-dev/base/ltpara-doc.pdfbin560578 -> 560037 bytes
-rw-r--r--macros/latex-dev/base/ltpara.dtx20
-rw-r--r--macros/latex-dev/base/ltpictur.dtx2
-rw-r--r--macros/latex-dev/base/ltplain.dtx22
-rw-r--r--macros/latex-dev/base/ltproperties-code.pdfbin558646 -> 557051 bytes
-rw-r--r--macros/latex-dev/base/ltproperties-doc.pdfbin433141 -> 432129 bytes
-rw-r--r--macros/latex-dev/base/ltproperties.dtx45
-rw-r--r--macros/latex-dev/base/ltsect.dtx2
-rw-r--r--macros/latex-dev/base/ltshipout-code.pdfbin821655 -> 821580 bytes
-rw-r--r--macros/latex-dev/base/ltshipout-doc.pdfbin566566 -> 567728 bytes
-rw-r--r--macros/latex-dev/base/ltshipout.dtx34
-rw-r--r--macros/latex-dev/base/ltsockets-code.pdfbin606454 -> 598937 bytes
-rw-r--r--macros/latex-dev/base/ltsockets-doc.pdfbin489314 -> 481774 bytes
-rw-r--r--macros/latex-dev/base/ltsockets.dtx38
-rw-r--r--macros/latex-dev/base/ltspace.dtx14
-rw-r--r--macros/latex-dev/base/lttab.dtx2
-rw-r--r--macros/latex-dev/base/lttagging.dtx775
-rw-r--r--macros/latex-dev/base/lttemplates.dtx2698
-rw-r--r--macros/latex-dev/base/lttextcomp.dtx677
-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.pdfbin219358 -> 219358 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.dtx13
-rw-r--r--macros/latex-dev/base/ltxdoc.pdfbin244215 -> 244141 bytes
-rw-r--r--macros/latex-dev/base/ltxguide.cls2
-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.pdfbin165816 -> 165816 bytes
-rw-r--r--macros/latex-dev/base/minimal.cls2
-rw-r--r--macros/latex-dev/base/modguide.pdfbin257825 -> 257825 bytes
-rw-r--r--macros/latex-dev/base/modguide.tex2
-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.dtx8
-rw-r--r--macros/latex-dev/base/nfssfont.ins4
-rw-r--r--macros/latex-dev/base/nfssfont.pdfbin211171 -> 211314 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.pdfbin227065 -> 227065 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.pdfbin375493 -> 375493 bytes
-rw-r--r--macros/latex-dev/base/slifonts.fdd8
-rw-r--r--macros/latex-dev/base/slifonts.pdfbin234171 -> 233905 bytes
-rw-r--r--macros/latex-dev/base/source2e.pdfbin6150247 -> 6239225 bytes
-rw-r--r--macros/latex-dev/base/source2e.tex6
-rw-r--r--macros/latex-dev/base/source2edoc.cls87
-rw-r--r--macros/latex-dev/base/syntonly.dtx8
-rw-r--r--macros/latex-dev/base/syntonly.ins4
-rw-r--r--macros/latex-dev/base/syntonly.pdfbin190255 -> 189440 bytes
-rw-r--r--macros/latex-dev/base/testpage.tex2
-rw-r--r--macros/latex-dev/base/tlc2.pdfbin291143 -> 291143 bytes
-rw-r--r--macros/latex-dev/base/tlc3.err31
-rw-r--r--macros/latex-dev/base/tlc3.pdfbin326462 -> 345764 bytes
-rw-r--r--macros/latex-dev/base/tulm.fdd2
-rw-r--r--macros/latex-dev/base/tulm.ins4
-rw-r--r--macros/latex-dev/base/tulm.pdfbin162773 -> 162773 bytes
-rw-r--r--macros/latex-dev/base/unpack.ins2
-rw-r--r--macros/latex-dev/base/usrguide-historic.pdfbin438602 -> 439393 bytes
-rw-r--r--macros/latex-dev/base/usrguide-historic.tex8
-rw-r--r--macros/latex-dev/base/usrguide.pdfbin477695 -> 483354 bytes
-rw-r--r--macros/latex-dev/base/usrguide.tex72
-rw-r--r--macros/latex-dev/base/utf8ienc.dtx7
-rw-r--r--macros/latex-dev/base/utf8ienc.pdfbin353655 -> 353399 bytes
-rw-r--r--macros/latex-dev/base/webcomp.err2
-rw-r--r--macros/latex-dev/base/webcomp.pdfbin146199 -> 146197 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/README.md4
-rw-r--r--macros/latex-dev/required/latex-lab/blocks-code.pdfbin886150 -> 871503 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/blocks-doc.pdfbin440234 -> 485950 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/changes.txt85
-rw-r--r--macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdfbin523380 -> 531721 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdfbin389003 -> 419214 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/documentmetadata-support.dtx48
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx90
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdfbin357553 -> 373342 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-bib.dtx19
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-bib.pdfbin411092 -> 383259 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-block.dtx153
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-block.pdfbin886150 -> 871503 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx16
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdfbin272864 -> 273812 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-float.dtx71
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-float.pdfbin444977 -> 426817 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdfbin815656 -> 815072 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx9
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-graphic.pdfbin496997 -> 517737 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx259
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdfbin0 -> 389702 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-math.dtx1560
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-math.pdfbin612623 -> 740461 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx2
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdfbin302371 -> 302442 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx11
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdfbin357553 -> 373342 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx4
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-minipage.pdfbin280811 -> 280811 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx4
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-namespace.pdfbin234649 -> 234649 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx2
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdfbin389721 -> 389721 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx2
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdfbin632310 -> 632196 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-sec.dtx17
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-sec.pdfbin527916 -> 527096 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-table.dtx1311
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-table.pdfbin621929 -> 556861 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx5
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-testphase.pdfbin298403 -> 298373 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-text.dtx2
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-text.pdfbin307812 -> 307812 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-title.dtx518
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-title.pdfbin0 -> 348117 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx2
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdfbin296124 -> 296124 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx8
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdfbin361084 -> 361081 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc.dtx10
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab-toc.pdfbin396817 -> 396814 bytes
-rw-r--r--macros/latex-dev/required/latex-lab/latex-lab.ins8
-rw-r--r--macros/latex-dev/required/tools/README.md2
-rw-r--r--macros/latex-dev/required/tools/afterpage.dtx2
-rw-r--r--macros/latex-dev/required/tools/afterpage.ins4
-rw-r--r--macros/latex-dev/required/tools/afterpage.pdfbin198100 -> 198100 bytes
-rw-r--r--macros/latex-dev/required/tools/array-2023-11-01.sty375
-rw-r--r--macros/latex-dev/required/tools/array.dtx465
-rw-r--r--macros/latex-dev/required/tools/array.pdfbin517410 -> 838028 bytes
-rw-r--r--macros/latex-dev/required/tools/bm.dtx10
-rw-r--r--macros/latex-dev/required/tools/bm.ins4
-rw-r--r--macros/latex-dev/required/tools/bm.pdfbin323929 -> 323640 bytes
-rw-r--r--macros/latex-dev/required/tools/calc.dtx2
-rw-r--r--macros/latex-dev/required/tools/calc.pdfbin370660 -> 370660 bytes
-rw-r--r--macros/latex-dev/required/tools/changes.txt44
-rw-r--r--macros/latex-dev/required/tools/dcolumn.dtx2
-rw-r--r--macros/latex-dev/required/tools/dcolumn.pdfbin221038 -> 221038 bytes
-rw-r--r--macros/latex-dev/required/tools/delarray.dtx2
-rw-r--r--macros/latex-dev/required/tools/delarray.pdfbin191058 -> 191058 bytes
-rw-r--r--macros/latex-dev/required/tools/enumerate.dtx2
-rw-r--r--macros/latex-dev/required/tools/enumerate.pdfbin215077 -> 215077 bytes
-rw-r--r--macros/latex-dev/required/tools/fileerr.dtx2
-rw-r--r--macros/latex-dev/required/tools/fileerr.pdfbin188281 -> 187725 bytes
-rw-r--r--macros/latex-dev/required/tools/fontsmpl.dtx2
-rw-r--r--macros/latex-dev/required/tools/fontsmpl.pdfbin146438 -> 146438 bytes
-rw-r--r--macros/latex-dev/required/tools/ftnright.dtx2
-rw-r--r--macros/latex-dev/required/tools/ftnright.pdfbin387794 -> 387253 bytes
-rw-r--r--macros/latex-dev/required/tools/hhline.dtx2
-rw-r--r--macros/latex-dev/required/tools/hhline.pdfbin189678 -> 189678 bytes
-rw-r--r--macros/latex-dev/required/tools/indentfirst.dtx2
-rw-r--r--macros/latex-dev/required/tools/indentfirst.pdfbin157352 -> 157352 bytes
-rw-r--r--macros/latex-dev/required/tools/layout.dtx2
-rw-r--r--macros/latex-dev/required/tools/layout.pdfbin260278 -> 260278 bytes
-rw-r--r--macros/latex-dev/required/tools/longtable.dtx366
-rw-r--r--macros/latex-dev/required/tools/longtable.ins4
-rw-r--r--macros/latex-dev/required/tools/longtable.pdfbin391258 -> 400149 bytes
-rw-r--r--macros/latex-dev/required/tools/multicol.dtx65
-rw-r--r--macros/latex-dev/required/tools/multicol.ins4
-rw-r--r--macros/latex-dev/required/tools/multicol.pdfbin523618 -> 524502 bytes
-rw-r--r--macros/latex-dev/required/tools/rawfonts.dtx2
-rw-r--r--macros/latex-dev/required/tools/rawfonts.pdfbin138956 -> 138956 bytes
-rw-r--r--macros/latex-dev/required/tools/shellesc.dtx2
-rw-r--r--macros/latex-dev/required/tools/shellesc.pdfbin176171 -> 176171 bytes
-rw-r--r--macros/latex-dev/required/tools/showkeys.dtx10
-rw-r--r--macros/latex-dev/required/tools/showkeys.pdfbin252975 -> 252684 bytes
-rw-r--r--macros/latex-dev/required/tools/somedefs.dtx2
-rw-r--r--macros/latex-dev/required/tools/somedefs.pdfbin167583 -> 167583 bytes
-rw-r--r--macros/latex-dev/required/tools/tabularx.dtx51
-rw-r--r--macros/latex-dev/required/tools/tabularx.ins4
-rw-r--r--macros/latex-dev/required/tools/tabularx.pdfbin287013 -> 289601 bytes
-rw-r--r--macros/latex-dev/required/tools/theorem.dtx2
-rw-r--r--macros/latex-dev/required/tools/theorem.pdfbin352315 -> 351765 bytes
-rw-r--r--macros/latex-dev/required/tools/tools-overview.pdfbin73673 -> 73673 bytes
-rw-r--r--macros/latex-dev/required/tools/tools-overview.tex2
-rw-r--r--macros/latex-dev/required/tools/tools.ins4
-rw-r--r--macros/latex-dev/required/tools/trace.dtx2
-rw-r--r--macros/latex-dev/required/tools/trace.pdfbin222074 -> 222074 bytes
-rw-r--r--macros/latex-dev/required/tools/varioref.dtx2
-rw-r--r--macros/latex-dev/required/tools/varioref.ins4
-rw-r--r--macros/latex-dev/required/tools/varioref.pdfbin393134 -> 393134 bytes
-rw-r--r--macros/latex-dev/required/tools/verbatim.dtx31
-rw-r--r--macros/latex-dev/required/tools/verbatim.pdfbin331003 -> 331587 bytes
-rw-r--r--macros/latex-dev/required/tools/xr.dtx2
-rw-r--r--macros/latex-dev/required/tools/xr.pdfbin170451 -> 170451 bytes
-rw-r--r--macros/latex-dev/required/tools/xspace.dtx2
-rw-r--r--macros/latex-dev/required/tools/xspace.pdfbin257027 -> 257027 bytes
-rw-r--r--macros/latex/contrib/eolang/README.md2
-rw-r--r--macros/latex/contrib/eolang/eolang.12
-rw-r--r--macros/latex/contrib/eolang/eolang.dtx28
-rw-r--r--macros/latex/contrib/eolang/eolang.pdfbin1940589 -> 1940560 bytes
-rwxr-xr-xmacros/latex/contrib/eolang/eolang.pl7
-rw-r--r--macros/latex/contrib/huawei/LICENSE.txt2
-rw-r--r--macros/latex/contrib/huawei/README.md2
-rw-r--r--macros/latex/contrib/huawei/huawei.dtx8
-rw-r--r--macros/latex/contrib/huawei/huawei.ins4
-rw-r--r--macros/latex/contrib/huawei/huawei.pdfbin808894 -> 809033 bytes
-rw-r--r--macros/latex/contrib/jnuexam/jnuexam.cls6
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md23
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin623299 -> 610363 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1776513 -> 1792513 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex6
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx170
-rw-r--r--macros/latex/contrib/l3kernel/l3bitset.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3cctab.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx54
-rw-r--r--macros/latex/contrib/l3kernel/l3color.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx98
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx17
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx46
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.pdfbin564281 -> 565282 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin150985 -> 151264 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx5
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-functions.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-symbolic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-types.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx72
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx53
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin396222 -> 396222 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin122959 -> 122959 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin150919 -> 150919 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin148747 -> 148747 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin114754 -> 114754 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin112524 -> 112524 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin151591 -> 151591 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin128344 -> 128344 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin163484 -> 163484 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin250159 -> 250159 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin150302 -> 150302 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin170102 -> 170102 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin205020 -> 205020 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3pdf.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv9
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin82696 -> 82731 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx2014
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin296657 -> 296657 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin242421 -> 231496 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin218315 -> 242296 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-map.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx7
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx103
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-build.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx31
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin7488727 -> 7574815 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3body.tex9
-rw-r--r--macros/latex/contrib/l3packages/CHANGELOG.md17
-rw-r--r--macros/latex/contrib/l3packages/README.md104
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e.dtx8
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e.ins4
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e.pdfbin412557 -> 412717 bytes
-rw-r--r--macros/latex/contrib/l3packages/xfp.dtx8
-rw-r--r--macros/latex/contrib/l3packages/xfp.ins4
-rw-r--r--macros/latex/contrib/l3packages/xfp.pdfbin332260 -> 332421 bytes
-rw-r--r--macros/latex/contrib/l3packages/xfrac.dtx1141
-rw-r--r--macros/latex/contrib/l3packages/xfrac.ins49
-rw-r--r--macros/latex/contrib/l3packages/xfrac.pdfbin482959 -> 0 bytes
-rw-r--r--macros/latex/contrib/l3packages/xparse.dtx8
-rw-r--r--macros/latex/contrib/l3packages/xparse.ins4
-rw-r--r--macros/latex/contrib/l3packages/xparse.pdfbin534533 -> 534182 bytes
-rw-r--r--macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty1371
-rw-r--r--macros/latex/contrib/l3packages/xtemplate.dtx2265
-rw-r--r--macros/latex/contrib/l3packages/xtemplate.ins4
-rw-r--r--macros/latex/contrib/l3packages/xtemplate.pdfbin450604 -> 448106 bytes
-rw-r--r--macros/optex/README5
-rw-r--r--macros/optex/base/alloc.opm13
-rw-r--r--macros/optex/base/doc.opm10
-rw-r--r--macros/optex/base/f-fbb.opm26
-rw-r--r--macros/optex/base/f-gentium.opm26
-rw-r--r--macros/optex/base/fams-ini.opm10
-rw-r--r--macros/optex/base/fonts-opmac.opm9
-rw-r--r--macros/optex/base/fonts-preload.opm6
-rw-r--r--macros/optex/base/fonts-resize.opm5
-rw-r--r--macros/optex/base/hyperlinks.opm7
-rw-r--r--macros/optex/base/if-macros.opm7
-rw-r--r--macros/optex/base/keyval.opm25
-rw-r--r--macros/optex/base/logos.opm17
-rw-r--r--macros/optex/base/margins.opm4
-rw-r--r--macros/optex/base/math-macros.opm5
-rw-r--r--macros/optex/base/more-macros.opm50
-rw-r--r--macros/optex/base/optex-tricks.opm50
-rw-r--r--macros/optex/base/optex.ini2
-rw-r--r--macros/optex/base/others.opm11
-rw-r--r--macros/optex/base/parameters.opm10
-rw-r--r--macros/optex/base/plain-macros.opm18
-rw-r--r--macros/optex/base/prefixed.opm6
-rw-r--r--macros/optex/base/sections.opm20
-rw-r--r--macros/optex/base/unimath-codes.opm5
-rw-r--r--macros/optex/base/unimath-macros.opm4
-rw-r--r--macros/optex/demo/op-mathalign.tex2
-rw-r--r--macros/optex/doc/optex-doc.pdfbin1585608 -> 1907216 bytes
-rw-r--r--macros/optex/doc/optex-doc.tex29
-rw-r--r--macros/optex/doc/optex-techdoc.tex1
-rw-r--r--macros/optex/doc/optex-userdoc.tex18
-rw-r--r--macros/optex/doc/primitives.tex387
-rw-r--r--macros/optex/pkg/mte.opm2
-rw-r--r--support/texlogfilter/README10
-rwxr-xr-xsupport/texlogfilter/texlogfilter17
-rw-r--r--support/texlogfilter/texlogfilter.html9
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl7
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb12
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc16
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2547836 -> 2545820 bytes
-rw-r--r--timestamp2
589 files changed, 17703 insertions, 8581 deletions
diff --git a/FILES.byname b/FILES.byname
index 347340e639..45280b76a9 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -632,14 +632,14 @@
1992/07/20 | 484 | biblio/bibtex/contrib/examples/xampl-siam.ltx
1992/07/20 | 488 | biblio/bibtex/contrib/examples/xampl-unsrt.ltx
2005/09/29 | 22158 | biblio/bibtex/contrib/examples.zip
-2023/10/28 | 864 | biblio/bibtex/contrib/francais-bst/francaisbst.dbj
+2024/02/14 | 864 | biblio/bibtex/contrib/francais-bst/francaisbst.dbj
2023/10/28 | 1466 | biblio/bibtex/contrib/francais-bst/francais-bst.ins
-2023/10/28 | 244927 | biblio/bibtex/contrib/francais-bst/francais-bst.mbs
-2023/10/28 | 43186 | biblio/bibtex/contrib/francais-bst/francais-bst.pdf
-2023/10/28 | 18612 | biblio/bibtex/contrib/francais-bst/francais.dbj
-2023/10/28 | 18618 | biblio/bibtex/contrib/francais-bst/francaissc.dbj
-2023/10/28 | 5530 | biblio/bibtex/contrib/francais-bst/README.md
-2023/10/29 | 114641 | biblio/bibtex/contrib/francais-bst.zip
+2024/02/14 | 244660 | biblio/bibtex/contrib/francais-bst/francais-bst.mbs
+2024/02/14 | 43765 | biblio/bibtex/contrib/francais-bst/francais-bst.pdf
+2024/02/14 | 18612 | biblio/bibtex/contrib/francais-bst/francais.dbj
+2024/02/14 | 18618 | biblio/bibtex/contrib/francais-bst/francaissc.dbj
+2024/02/14 | 5533 | biblio/bibtex/contrib/francais-bst/README.md
+2024/02/14 | 115236 | biblio/bibtex/contrib/francais-bst.zip
2022/10/06 | 8217 | biblio/bibtex/contrib/gbt7714/CHANGELOG.md
2022/10/06 | 126 | biblio/bibtex/contrib/gbt7714/DEPENDS.txt
2022/10/06 | 120983 | biblio/bibtex/contrib/gbt7714/gbt7714.dtx
@@ -2077,12 +2077,12 @@
2023/10/05 | 1710 | biblio/citation-style-language/README.md
2023/10/05 | 12878 | biblio/citation-style-language/vancouver.csl
2023/10/05 | 4531754 | biblio/citation-style-language.zip
-2024/02/13 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2024/02/14 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx
-2024/02/13 | 2846767 | biblio/ctan-bibdata/ctan.bib
-2024/02/13 | 3708800 | biblio/ctan-bibdata/ctan.pdf
+2024/02/14 | 2847464 | biblio/ctan-bibdata/ctan.bib
+2024/02/14 | 3708800 | biblio/ctan-bibdata/ctan.pdf
2023/01/16 | 1489 | biblio/ctan-bibdata/README
-2024/02/13 | 4117312 | biblio/ctan-bibdata.zip
+2024/02/14 | 4117477 | biblio/ctan-bibdata.zip
2023/02/23 | 3126 | biblio/pbibtex/pbibtex-base/cpp.awk
2023/02/23 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh
2023/02/23 | 22362 | biblio/pbibtex/pbibtex-base/jabbrv.bst
@@ -2239,7 +2239,7 @@
1989/12/11 | 6196 | biblio/tib/tib.man
1989/03/29 | 23265 | biblio/tib/vitaMake
2005/12/15 | 366385 | biblio/tib.zip
-2024/01/21 | 18185 | CTAN.sites
+2024/02/14 | 18102 | CTAN.sites
1990/10/03 | 5032 | dviware/beebe/00readme.txt
1990/10/03 | 479 | dviware/beebe/doc/00dir.cmd
1990/10/03 | 1209 | dviware/beebe/doc/00dir.lst
@@ -5444,7 +5444,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2024/02/13 | 69020 | FILES.last07days
+2024/02/14 | 78421 | FILES.last07days
2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs
2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf
2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf
@@ -172590,24 +172590,24 @@
2023/05/28 | 3520 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Ar.tex
2023/05/28 | 14932 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_blocksfamilies.tex
2022/10/08 | 11905 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_buildCelll.tex
-2023/02/06 | 17003 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
+2024/02/13 | 17497 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
2023/05/28 | 5034 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_CS.tex
2023/05/28 | 1415 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DarkMode.tex
-2023/05/28 | 5301 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex
+2024/02/13 | 5302 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex
2023/02/20 | 6597 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DesignCS.tex
2023/05/28 | 1296 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DiscY.tex
-2023/05/28 | 1880 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex
-2023/02/19 | 12752 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
-2023/05/28 | 10410 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
-2023/05/27 | 22864 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
+2024/02/13 | 1923 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex
+2024/02/13 | 12785 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
+2024/02/14 | 10404 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
+2024/02/13 | 24731 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
2023/05/28 | 26973 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_libCS.tex
2023/05/28 | 6076 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_ls.tex
-2023/05/28 | 3058 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
+2024/02/11 | 3060 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
2023/05/28 | 11360 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_OtherCont.tex
-2023/05/28 | 5240 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
+2024/02/13 | 5241 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
2023/05/28 | 12075 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TitleLegend.tex
2023/05/28 | 10380 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_variations.tex
-2023/05/28 | 3905 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
+2024/02/13 | 3906 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
2022/07/13 | 117440 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_color.pdf
2022/07/13 | 182133 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_colorPicker.pdf
2022/07/12 | 39130 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_general.pdf
@@ -172616,29 +172616,37 @@
2022/07/14 | 115111 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_saveTrailing.pdf
2022/07/13 | 101948 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_set.pdf
2022/07/14 | 117480 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_trailing.pdf
-2023/05/31 | 25778 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
-2023/05/30 | 7248 | graphics/pgf/contrib/pgf-periodictable/myGroupColors.tex
+2024/02/13 | 53190 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf
+2024/02/13 | 75547 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf
+2024/02/11 | 1393 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf
+2024/02/11 | 25812 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
+2024/02/13 | 25278 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf
+2024/02/13 | 37950 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf
+2024/02/11 | 31545 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf
+2024/02/11 | 49262 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf
+2024/02/13 | 32124 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf
+2024/02/14 | 7248 | graphics/pgf/contrib/pgf-periodictable/myGroupColors.tex
2022/10/11 | 87 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.ist
-2023/05/30 | 6952517 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
-2023/05/28 | 12409 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
-2023/05/28 | 188338 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
+2024/02/14 | 7456869 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
+2024/02/14 | 20122 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
+2024/02/11 | 208031 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
2023/02/06 | 21041 | graphics/pgf/contrib/pgf-periodictable/pgfPT.backcolors.keys.tex
-2022/10/10 | 19890 | graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
+2024/02/14 | 19892 | graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
2022/10/10 | 46858 | graphics/pgf/contrib/pgf-periodictable/pgfPTcolorSchemes.html
2022/09/02 | 111753 | graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.pdf
2022/10/10 | 358 | graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.tex
2022/10/10 | 9698 | graphics/pgf/contrib/pgf-periodictable/pgfPT.coordinates.tex
-2022/11/07 | 76915 | graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
-2023/02/19 | 76093 | graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
+2024/02/10 | 77977 | graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
+2024/02/11 | 76664 | graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
2022/11/01 | 8883 | graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex
2023/04/02 | 2322 | graphics/pgf/contrib/pgf-periodictable/pgfPT.input.library.tex
-2023/05/27 | 28189 | graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex
+2024/02/10 | 30959 | graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex
2023/02/25 | 76975 | graphics/pgf/contrib/pgf-periodictable/pgfPT.library.colorschemes.tex
-2023/05/27 | 14569 | graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
-2022/11/01 | 8571 | graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex
+2024/02/10 | 17776 | graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
+2024/02/12 | 8844 | graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex
2020/08/16 | 1682 | graphics/pgf/contrib/pgf-periodictable/pgfPT_radio_symbol.pdf
2022/10/10 | 888 | graphics/pgf/contrib/pgf-periodictable/pgfPT_radio_symbol.tex
-2023/05/30 | 1884 | graphics/pgf/contrib/pgf-periodictable/README
+2024/02/14 | 2778 | graphics/pgf/contrib/pgf-periodictable/README
2022/03/03 | 11004 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec10.pdf
2022/03/03 | 9761 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec11.pdf
2022/03/03 | 9924 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec12.pdf
@@ -172736,7 +172744,9 @@
2022/03/03 | 9908 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec98.pdf
2022/03/03 | 9805 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec99.pdf
2022/03/03 | 10358 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec9.pdf
-2023/05/31 | 6911467 | graphics/pgf/contrib/pgf-periodictable.zip
+2024/02/10 | 10424 | graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex
+2024/02/10 | 8133 | graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex
+2024/02/14 | 7653968 | graphics/pgf/contrib/pgf-periodictable.zip
2022/06/15 | 426 | graphics/pgf/contrib/pgf-pie/COPYING
2022/06/15 | 104 | graphics/pgf/contrib/pgf-pie/demo/before-after-number.tex
2022/06/15 | 150 | graphics/pgf/contrib/pgf-pie/demo/change-direction.tex
@@ -206413,7 +206423,7 @@
2023/09/30 | 894643 | info/yet-another-guide-latex2e/Yet-Another-Guide-LaTeX2e_v12.pdf
2023/09/30 | 143740 | info/yet-another-guide-latex2e/Yet-Another-Guide-LaTeX2e_v12.tex
2023/10/16 | 902397 | info/yet-another-guide-latex2e.zip
-2023/10/28 | 132498 | install/biblio/bibtex/contrib/francais-bst.tds.zip
+2024/02/14 | 133094 | install/biblio/bibtex/contrib/francais-bst.tds.zip
2021/02/04 | 4944311 | install/biblio/bibtex/contrib/gost.tds.zip
2023/10/05 | 4539322 | install/biblio/citation-style-language.tds.zip
2022/10/28 | 795249 | install/fonts/accanthis.tds.zip
@@ -206766,8 +206776,8 @@
2024/01/04 | 949878 | install/macros/latex/contrib/l3backend.tds.zip
2024/02/08 | 829326 | install/macros/latex/contrib/l3build.tds.zip
2024/01/04 | 4059172 | install/macros/latex/contrib/l3experimental.tds.zip
-2024/01/22 | 14204630 | install/macros/latex/contrib/l3kernel.tds.zip
-2023/10/10 | 2257270 | install/macros/latex/contrib/l3packages.tds.zip
+2024/02/13 | 14314783 | install/macros/latex/contrib/l3kernel.tds.zip
+2024/02/13 | 1758079 | install/macros/latex/contrib/l3packages.tds.zip
2023/10/14 | 606244 | install/macros/latex/contrib/lastpage.tds.zip
2009/09/02 | 556672 | install/macros/latex/contrib/layouts.tds.zip
2008/07/25 | 125603 | install/macros/latex/contrib/lcyw.tds.zip
@@ -206914,12 +206924,12 @@
2020/04/09 | 806385 | install/macros/latex/contrib/zhlipsum.tds.zip
2022/07/14 | 321454 | install/macros/latex/contrib/zhnumber.tds.zip
2023/11/14 | 1622886 | install/macros/latex/contrib/zref-clever.tds.zip
-2023/11/01 | 43672902 | install/macros/latex-dev/latex-base-dev.tds.zip
+2024/02/14 | 44296835 | install/macros/latex-dev/latex-base-dev.tds.zip
2023/11/01 | 2795764 | install/macros/latex-dev/required/latex-amsmath-dev.tds.zip
2023/11/01 | 268960 | install/macros/latex-dev/required/latex-firstaid-dev.tds.zip
2023/11/01 | 3112054 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip
-2023/11/01 | 11456206 | install/macros/latex-dev/required/latex-lab-dev.tds.zip
-2023/11/01 | 7343701 | install/macros/latex-dev/required/latex-tools-dev.tds.zip
+2024/02/14 | 12314341 | install/macros/latex-dev/required/latex-lab-dev.tds.zip
+2024/02/14 | 7679515 | install/macros/latex-dev/required/latex-tools-dev.tds.zip
2024/01/15 | 43672614 | install/macros/latex/latex-base.tds.zip
2020/06/01 | 1578753 | install/macros/latex/required/amscls.tds.zip
2024/02/07 | 3720932 | install/macros/latex/required/babel-base.tds.zip
@@ -215218,16 +215228,16 @@
2015/04/18 | 4795 | macros/generic/lpform/lpform.sty
2014/07/14 | 902 | macros/generic/lpform/README
2015/04/18 | 271086 | macros/generic/lpform.zip
-2022/10/24 | 1389 | macros/generic/lt3luabridge/docstrip.cfg
-2022/10/24 | 181 | macros/generic/lt3luabridge/example.context
-2022/10/24 | 217 | macros/generic/lt3luabridge/example.latex
-2022/10/24 | 167 | macros/generic/lt3luabridge/example.plaintex
-2022/10/24 | 19105 | macros/generic/lt3luabridge/LICENSE
-2022/10/24 | 14380 | macros/generic/lt3luabridge/lt3luabridge.dtx
-2022/10/24 | 253 | macros/generic/lt3luabridge/lt3luabridge.ins
-2022/10/24 | 494475 | macros/generic/lt3luabridge/lt3luabridge.pdf
-2022/10/24 | 896 | macros/generic/lt3luabridge/README.md
-2022/10/24 | 492236 | macros/generic/lt3luabridge.zip
+2024/02/14 | 1389 | macros/generic/lt3luabridge/docstrip.cfg
+2024/02/14 | 181 | macros/generic/lt3luabridge/example.context
+2024/02/14 | 217 | macros/generic/lt3luabridge/example.latex
+2024/02/14 | 167 | macros/generic/lt3luabridge/example.plaintex
+2024/02/14 | 19105 | macros/generic/lt3luabridge/LICENSE
+2024/02/14 | 14878 | macros/generic/lt3luabridge/lt3luabridge.dtx
+2024/02/14 | 253 | macros/generic/lt3luabridge/lt3luabridge.ins
+2024/02/14 | 497075 | macros/generic/lt3luabridge/lt3luabridge.pdf
+2024/02/14 | 896 | macros/generic/lt3luabridge/README.md
+2024/02/14 | 494613 | macros/generic/lt3luabridge.zip
2023/12/04 | 66238 | macros/generic/ltxcmds/ltxcmds.dtx
2023/12/04 | 419825 | macros/generic/ltxcmds/ltxcmds.pdf
2023/12/04 | 379 | macros/generic/ltxcmds/README.md
@@ -233096,17 +233106,17 @@
2008/06/01 | 200380 | macros/latex/contrib/envlab/envlab.pdf
1997/07/16 | 3824 | macros/latex/contrib/envlab/readme.v12
2008/06/02 | 372141 | macros/latex/contrib/envlab.zip
-2024/01/11 | 47687 | macros/latex/contrib/eolang/cactus.pdf
-2024/01/11 | 488 | macros/latex/contrib/eolang/DEPENDS.txt
-2024/01/11 | 741 | macros/latex/contrib/eolang/eolang.1
-2024/01/11 | 641 | macros/latex/contrib/eolang/eolang.bib
-2024/01/11 | 62101 | macros/latex/contrib/eolang/eolang.dtx
-2024/01/11 | 2628 | macros/latex/contrib/eolang/eolang.ins
-2024/01/11 | 1940589 | macros/latex/contrib/eolang/eolang.pdf
-2024/01/11 | 4954 | macros/latex/contrib/eolang/eolang.pl
-2024/01/11 | 1083 | macros/latex/contrib/eolang/LICENSE.txt
-2024/01/11 | 1300 | macros/latex/contrib/eolang/README.md
-2024/01/11 | 1940069 | macros/latex/contrib/eolang.zip
+2024/02/14 | 47687 | macros/latex/contrib/eolang/cactus.pdf
+2024/02/14 | 488 | macros/latex/contrib/eolang/DEPENDS.txt
+2024/02/14 | 741 | macros/latex/contrib/eolang/eolang.1
+2024/02/14 | 641 | macros/latex/contrib/eolang/eolang.bib
+2024/02/14 | 62209 | macros/latex/contrib/eolang/eolang.dtx
+2024/02/14 | 2628 | macros/latex/contrib/eolang/eolang.ins
+2024/02/14 | 1940560 | macros/latex/contrib/eolang/eolang.pdf
+2024/02/14 | 4981 | macros/latex/contrib/eolang/eolang.pl
+2024/02/14 | 1083 | macros/latex/contrib/eolang/LICENSE.txt
+2024/02/14 | 1315 | macros/latex/contrib/eolang/README.md
+2024/02/14 | 1940056 | macros/latex/contrib/eolang.zip
1991/01/31 | 1291 | macros/latex/contrib/epic/epic.readme
2009/07/09 | 25846 | macros/latex/contrib/epic/epic.sty
1991/01/31 | 2444 | macros/latex/contrib/epic/misc.sty
@@ -237876,14 +237886,14 @@
2024/01/09 | 1083 | macros/latex/contrib/href-ul/LICENSE.txt
2024/01/09 | 1244 | macros/latex/contrib/href-ul/README.md
2024/01/09 | 288348 | macros/latex/contrib/href-ul.zip
-2023/09/21 | 677 | macros/latex/contrib/huawei/DEPENDS.txt
-2023/09/21 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf
-2023/09/21 | 33619 | macros/latex/contrib/huawei/huawei.dtx
-2023/09/21 | 2626 | macros/latex/contrib/huawei/huawei.ins
-2023/09/21 | 808894 | macros/latex/contrib/huawei/huawei.pdf
-2023/09/21 | 1083 | macros/latex/contrib/huawei/LICENSE.txt
-2023/09/21 | 1513 | macros/latex/contrib/huawei/README.md
-2023/09/21 | 1051550 | macros/latex/contrib/huawei.zip
+2024/02/14 | 677 | macros/latex/contrib/huawei/DEPENDS.txt
+2024/02/14 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf
+2024/02/14 | 33660 | macros/latex/contrib/huawei/huawei.dtx
+2024/02/14 | 2626 | macros/latex/contrib/huawei/huawei.ins
+2024/02/14 | 809033 | macros/latex/contrib/huawei/huawei.pdf
+2024/02/14 | 1083 | macros/latex/contrib/huawei/LICENSE.txt
+2024/02/14 | 1632 | macros/latex/contrib/huawei/README.md
+2024/02/14 | 1051694 | macros/latex/contrib/huawei.zip
2022/10/16 | 327838 | macros/latex/contrib/huaz/huaz.pdf
2022/10/16 | 20294 | macros/latex/contrib/huaz/huaz.sty
2022/10/16 | 21740 | macros/latex/contrib/huaz/huaz.tex
@@ -239991,11 +240001,11 @@
2023/12/14 | 163 | macros/latex/contrib/jnuexam/exam-b-answer.tex
2023/12/18 | 95796 | macros/latex/contrib/jnuexam/exam-b-empty.pdf
2020/11/12 | 163 | macros/latex/contrib/jnuexam/exam-b-empty.tex
-2023/12/18 | 44500 | macros/latex/contrib/jnuexam/jnuexam.cls
+2024/02/02 | 44517 | macros/latex/contrib/jnuexam/jnuexam.cls
2023/12/18 | 81144 | macros/latex/contrib/jnuexam/jnuexam.pdf
2023/12/14 | 13581 | macros/latex/contrib/jnuexam/jnuexam.tex
2023/12/18 | 176 | macros/latex/contrib/jnuexam/README
-2023/12/18 | 500901 | macros/latex/contrib/jnuexam.zip
+2024/02/14 | 500903 | macros/latex/contrib/jnuexam.zip
2022/09/24 | 437856 | macros/latex/contrib/jobname-suffix/jobname-suffix.pdf
2022/09/24 | 3170 | macros/latex/contrib/jobname-suffix/jobname-suffix.sty
2022/09/24 | 7142 | macros/latex/contrib/jobname-suffix/jobname-suffix.tex
@@ -240745,136 +240755,134 @@
2024/01/04 | 1624 | macros/latex/contrib/l3experimental/xgalley.ins
2024/01/04 | 299509 | macros/latex/contrib/l3experimental/xgalley.pdf
2024/01/05 | 4023424 | macros/latex/contrib/l3experimental.zip
-2024/01/22 | 56750 | macros/latex/contrib/l3kernel/CHANGELOG.md
-2024/01/22 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx
-2024/01/22 | 623299 | macros/latex/contrib/l3kernel/expl3.pdf
-2024/01/22 | 1776513 | macros/latex/contrib/l3kernel/interface3.pdf
-2024/01/22 | 2077 | macros/latex/contrib/l3kernel/interface3.tex
-2024/01/22 | 135335 | macros/latex/contrib/l3kernel/l3basics.dtx
-2024/01/22 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx
-2024/01/22 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
-2024/01/22 | 87746 | macros/latex/contrib/l3kernel/l3box.dtx
-2024/01/22 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx
-2024/01/22 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx
-2024/01/22 | 88106 | macros/latex/contrib/l3kernel/l3coffins.dtx
-2024/01/22 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx
-2024/01/22 | 43808 | macros/latex/contrib/l3kernel/l3debug.dtx
-2024/01/22 | 24519 | macros/latex/contrib/l3kernel/l3deprecation.dtx
-2024/01/22 | 158926 | macros/latex/contrib/l3kernel/l3doc.dtx
-2024/01/22 | 564281 | macros/latex/contrib/l3kernel/l3doc.pdf
-2024/01/22 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx
-2024/01/22 | 150985 | macros/latex/contrib/l3kernel/l3docstrip.pdf
-2024/01/22 | 88671 | macros/latex/contrib/l3kernel/l3expan.dtx
-2024/01/22 | 144331 | macros/latex/contrib/l3kernel/l3file.dtx
-2024/01/22 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx
-2024/01/22 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx
-2024/01/22 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
-2024/01/22 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
-2024/01/22 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
-2024/01/22 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
-2024/01/22 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx
-2024/01/22 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
-2024/01/22 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
-2024/01/22 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx
-2024/01/22 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
-2024/01/22 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
-2024/01/22 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx
-2024/01/22 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx
-2024/01/22 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
-2024/01/22 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
-2024/01/22 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
-2024/01/22 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx
-2024/01/22 | 6393 | macros/latex/contrib/l3kernel/l3.ins
-2024/01/22 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx
-2024/01/22 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx
-2024/01/22 | 27481 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
-2024/01/22 | 130498 | macros/latex/contrib/l3kernel/l3keys.dtx
-2024/01/22 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx
-2024/01/22 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx
-2024/01/22 | 82300 | macros/latex/contrib/l3kernel/l3msg.dtx
-2024/01/22 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx
-2024/01/22 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf
-2024/01/22 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex
-2024/01/22 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf
-2024/01/22 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
-2024/01/22 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf
-2024/01/22 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
-2024/01/22 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf
-2024/01/22 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
-2024/01/22 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf
-2024/01/22 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
-2024/01/22 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf
-2024/01/22 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex
-2024/01/22 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf
-2024/01/22 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
-2024/01/22 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf
-2024/01/22 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
-2024/01/22 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf
-2024/01/22 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
-2024/01/22 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf
-2024/01/22 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
-2024/01/22 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf
-2024/01/22 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
-2024/01/22 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf
-2024/01/22 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
-2024/01/22 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf
-2024/01/22 | 4890 | macros/latex/contrib/l3kernel/l3news.tex
-2024/01/22 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx
-2024/01/22 | 48220 | macros/latex/contrib/l3kernel/l3prefixes.csv
-2024/01/22 | 82696 | macros/latex/contrib/l3kernel/l3prefixes.pdf
-2024/01/22 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex
-2024/01/22 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx
-2024/01/22 | 60374 | macros/latex/contrib/l3kernel/l3prop.dtx
-2024/01/22 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx
-2024/01/22 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx
-2024/01/22 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx
-2024/01/22 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx
-2024/01/22 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx
-2024/01/22 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx
-2024/01/22 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx
-2024/01/22 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf
-2024/01/22 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex
-2024/01/22 | 242421 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
-2024/01/22 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
-2024/01/22 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx
-2024/01/22 | 218315 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
-2024/01/22 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex
-2024/01/22 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx
-2024/01/22 | 48953 | macros/latex/contrib/l3kernel/l3text.dtx
-2024/01/22 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx
-2024/01/22 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx
-2024/01/22 | 64034 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
-2024/01/22 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx
-2024/01/22 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx
-2024/01/22 | 116345 | macros/latex/contrib/l3kernel/l3token.dtx
-2024/01/22 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx
-2024/01/22 | 3078 | macros/latex/contrib/l3kernel/README.md
-2024/01/22 | 24757 | macros/latex/contrib/l3kernel/source3body.tex
-2024/01/22 | 7488727 | macros/latex/contrib/l3kernel/source3.pdf
-2024/01/22 | 2282 | macros/latex/contrib/l3kernel/source3.tex
-2024/01/22 | 13939563 | macros/latex/contrib/l3kernel.zip
-2023/10/10 | 7555 | macros/latex/contrib/l3packages/CHANGELOG.md
-2023/10/10 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex
-2023/10/10 | 12312 | macros/latex/contrib/l3packages/l3keys2e.dtx
-2023/10/10 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins
-2023/10/10 | 412557 | macros/latex/contrib/l3packages/l3keys2e.pdf
-2023/10/10 | 3463 | macros/latex/contrib/l3packages/README.md
-2023/10/10 | 7374 | macros/latex/contrib/l3packages/xfp.dtx
-2023/10/10 | 1191 | macros/latex/contrib/l3packages/xfp.ins
-2023/10/10 | 332260 | macros/latex/contrib/l3packages/xfp.pdf
-2023/10/10 | 39366 | macros/latex/contrib/l3packages/xfrac.dtx
-2023/10/10 | 1306 | macros/latex/contrib/l3packages/xfrac.ins
-2023/10/10 | 482959 | macros/latex/contrib/l3packages/xfrac.pdf
-2023/10/10 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty
-2023/10/10 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty
-2023/10/10 | 59625 | macros/latex/contrib/l3packages/xparse.dtx
-2023/10/10 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex
-2023/10/10 | 1272 | macros/latex/contrib/l3packages/xparse.ins
-2023/10/10 | 534533 | macros/latex/contrib/l3packages/xparse.pdf
-2023/10/10 | 100838 | macros/latex/contrib/l3packages/xtemplate.dtx
-2023/10/10 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins
-2023/10/10 | 450604 | macros/latex/contrib/l3packages/xtemplate.pdf
-2023/10/10 | 2238289 | macros/latex/contrib/l3packages.zip
+2024/02/13 | 57438 | macros/latex/contrib/l3kernel/CHANGELOG.md
+2024/02/13 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx
+2024/02/13 | 610363 | macros/latex/contrib/l3kernel/expl3.pdf
+2024/02/13 | 1792513 | macros/latex/contrib/l3kernel/interface3.pdf
+2024/02/13 | 1949 | macros/latex/contrib/l3kernel/interface3.tex
+2024/02/13 | 137539 | macros/latex/contrib/l3kernel/l3basics.dtx
+2024/02/13 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx
+2024/02/13 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
+2024/02/13 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx
+2024/02/13 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx
+2024/02/13 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx
+2024/02/13 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx
+2024/02/13 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx
+2024/02/13 | 41847 | macros/latex/contrib/l3kernel/l3debug.dtx
+2024/02/13 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx
+2024/02/13 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx
+2024/02/13 | 565282 | macros/latex/contrib/l3kernel/l3doc.pdf
+2024/02/13 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx
+2024/02/13 | 151264 | macros/latex/contrib/l3kernel/l3docstrip.pdf
+2024/02/13 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx
+2024/02/13 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx
+2024/02/13 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx
+2024/02/13 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx
+2024/02/13 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
+2024/02/13 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
+2024/02/13 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
+2024/02/13 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
+2024/02/13 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx
+2024/02/13 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
+2024/02/13 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
+2024/02/13 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx
+2024/02/13 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
+2024/02/13 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
+2024/02/13 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx
+2024/02/13 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx
+2024/02/13 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
+2024/02/13 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
+2024/02/13 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
+2024/02/13 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx
+2024/02/13 | 6393 | macros/latex/contrib/l3kernel/l3.ins
+2024/02/13 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx
+2024/02/13 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx
+2024/02/13 | 29836 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+2024/02/13 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx
+2024/02/13 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx
+2024/02/13 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx
+2024/02/13 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx
+2024/02/13 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx
+2024/02/13 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf
+2024/02/13 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex
+2024/02/13 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf
+2024/02/13 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
+2024/02/13 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf
+2024/02/13 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
+2024/02/13 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf
+2024/02/13 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
+2024/02/13 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf
+2024/02/13 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
+2024/02/13 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf
+2024/02/13 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex
+2024/02/13 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf
+2024/02/13 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
+2024/02/13 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf
+2024/02/13 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
+2024/02/13 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf
+2024/02/13 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
+2024/02/13 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf
+2024/02/13 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
+2024/02/13 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf
+2024/02/13 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
+2024/02/13 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf
+2024/02/13 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
+2024/02/13 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf
+2024/02/13 | 4890 | macros/latex/contrib/l3kernel/l3news.tex
+2024/02/13 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx
+2024/02/13 | 48372 | macros/latex/contrib/l3kernel/l3prefixes.csv
+2024/02/13 | 82731 | macros/latex/contrib/l3kernel/l3prefixes.pdf
+2024/02/13 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex
+2024/02/13 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx
+2024/02/13 | 103074 | macros/latex/contrib/l3kernel/l3prop.dtx
+2024/02/13 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx
+2024/02/13 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx
+2024/02/13 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx
+2024/02/13 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx
+2024/02/13 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx
+2024/02/13 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx
+2024/02/13 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx
+2024/02/13 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf
+2024/02/13 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex
+2024/02/13 | 231496 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+2024/02/13 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
+2024/02/13 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx
+2024/02/13 | 242296 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
+2024/02/13 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex
+2024/02/13 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx
+2024/02/13 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx
+2024/02/13 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx
+2024/02/13 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx
+2024/02/13 | 62663 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+2024/02/13 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx
+2024/02/13 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx
+2024/02/13 | 116935 | macros/latex/contrib/l3kernel/l3token.dtx
+2024/02/13 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx
+2024/02/13 | 3078 | macros/latex/contrib/l3kernel/README.md
+2024/02/13 | 24830 | macros/latex/contrib/l3kernel/source3body.tex
+2024/02/13 | 7574815 | macros/latex/contrib/l3kernel/source3.pdf
+2024/02/13 | 2282 | macros/latex/contrib/l3kernel/source3.tex
+2024/02/14 | 14046736 | macros/latex/contrib/l3kernel.zip
+2024/02/13 | 7813 | macros/latex/contrib/l3packages/CHANGELOG.md
+2024/02/13 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex
+2024/02/13 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx
+2024/02/13 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins
+2024/02/13 | 412717 | macros/latex/contrib/l3packages/l3keys2e.pdf
+2024/02/13 | 1005 | macros/latex/contrib/l3packages/README.md
+2024/02/13 | 7372 | macros/latex/contrib/l3packages/xfp.dtx
+2024/02/13 | 1191 | macros/latex/contrib/l3packages/xfp.ins
+2024/02/13 | 332421 | macros/latex/contrib/l3packages/xfp.pdf
+2024/02/13 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty
+2024/02/13 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty
+2024/02/13 | 59622 | macros/latex/contrib/l3packages/xparse.dtx
+2024/02/13 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex
+2024/02/13 | 1272 | macros/latex/contrib/l3packages/xparse.ins
+2024/02/13 | 534182 | macros/latex/contrib/l3packages/xparse.pdf
+2024/02/13 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty
+2024/02/13 | 28221 | macros/latex/contrib/l3packages/xtemplate.dtx
+2024/02/13 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins
+2024/02/13 | 448106 | macros/latex/contrib/l3packages/xtemplate.pdf
+2024/02/14 | 1749530 | macros/latex/contrib/l3packages.zip
2008/03/30 | 76250 | macros/latex/contrib/labbook/labboode.pdf
2003/08/06 | 81327 | macros/latex/contrib/labbook/labbook.dtx
2003/06/03 | 1041 | macros/latex/contrib/labbook/labbook.el
@@ -256982,306 +256990,310 @@
2022/04/18 | 501158 | macros/latex/contrib/zwpagelayout/zwpagelayout.pdf
2022/04/18 | 36154 | macros/latex/contrib/zwpagelayout/zwpagelayout.sty
2022/04/18 | 69553 | macros/latex/contrib/zwpagelayout/zwpagelayout.tex
-2023/11/01 | 7104 | macros/latex-dev/base/alltt.dtx
-2023/11/01 | 2890 | macros/latex-dev/base/alltt.ins
-2023/11/01 | 223831 | macros/latex-dev/base/alltt.pdf
-2023/11/01 | 3282 | macros/latex-dev/base/bugs.txt
-2023/11/01 | 264168 | macros/latex-dev/base/cfgguide.pdf
-2023/11/01 | 22723 | macros/latex-dev/base/cfgguide.tex
-2023/11/01 | 42708 | macros/latex-dev/base/changes.old.txt
-2023/11/01 | 404085 | macros/latex-dev/base/changes.txt
-2023/11/01 | 156238 | macros/latex-dev/base/classes.dtx
-2023/11/01 | 4087 | macros/latex-dev/base/classes.ins
-2023/11/01 | 560998 | macros/latex-dev/base/classes.pdf
-2023/11/01 | 415615 | macros/latex-dev/base/clsguide-historic.pdf
-2023/11/01 | 69439 | macros/latex-dev/base/clsguide-historic.tex
-2023/11/01 | 489925 | macros/latex-dev/base/clsguide.pdf
-2023/11/01 | 64604 | macros/latex-dev/base/clsguide.tex
-2023/11/01 | 5273 | macros/latex-dev/base/cmextra.ins
-2023/11/01 | 44531 | macros/latex-dev/base/cmfonts.fdd
-2023/11/01 | 4324 | macros/latex-dev/base/cmfonts.ins
-2023/11/01 | 292600 | macros/latex-dev/base/cmfonts.pdf
-2023/11/01 | 257359 | macros/latex-dev/base/cyrguide.pdf
-2023/11/01 | 17782 | macros/latex-dev/base/cyrguide.tex
-2023/11/01 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty
-2023/11/01 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty
-2023/11/01 | 1075915 | macros/latex-dev/base/doc-code.pdf
-2023/11/01 | 96 | macros/latex-dev/base/doc-code.tex
-2023/11/01 | 242471 | macros/latex-dev/base/doc.dtx
-2023/11/01 | 756298 | macros/latex-dev/base/doc.pdf
-2023/11/01 | 171396 | macros/latex-dev/base/docstrip.dtx
-2023/11/01 | 4273 | macros/latex-dev/base/docstrip.ins
-2023/11/01 | 506630 | macros/latex-dev/base/docstrip.pdf
-2023/11/01 | 4390 | macros/latex-dev/base/ec.ins
-2023/11/01 | 1318576 | macros/latex-dev/base/encguide.pdf
-2023/11/01 | 52813 | macros/latex-dev/base/encguide.tex
-2023/11/01 | 7216 | macros/latex-dev/base/exscale.dtx
-2023/11/01 | 3338 | macros/latex-dev/base/exscale.ins
-2023/11/01 | 204708 | macros/latex-dev/base/exscale.pdf
-2023/11/01 | 23516 | macros/latex-dev/base/fix-cm.dtx
-2023/11/01 | 2892 | macros/latex-dev/base/fix-cm.ins
-2023/11/01 | 287727 | macros/latex-dev/base/fix-cm.pdf
-2023/11/01 | 517708 | macros/latex-dev/base/fntguide.pdf
-2023/11/01 | 108248 | macros/latex-dev/base/fntguide.tex
-2023/11/01 | 60321 | macros/latex-dev/base/fontdef.dtx
-2023/11/01 | 9887 | macros/latex-dev/base/format.ins
-2023/11/01 | 5509 | macros/latex-dev/base/graphpap.dtx
-2023/11/01 | 2892 | macros/latex-dev/base/graphpap.ins
-2023/11/01 | 161722 | macros/latex-dev/base/graphpap.pdf
-2023/11/01 | 2705 | macros/latex-dev/base/idx.tex
-2023/11/01 | 18753 | macros/latex-dev/base/ifthen.dtx
-2023/11/01 | 2888 | macros/latex-dev/base/ifthen.ins
-2023/11/01 | 221219 | macros/latex-dev/base/ifthen.pdf
-2023/11/01 | 106904 | macros/latex-dev/base/inputenc.dtx
-2023/11/01 | 5714 | macros/latex-dev/base/inputenc.ins
-2023/11/01 | 318199 | macros/latex-dev/base/inputenc.pdf
-2023/11/01 | 4079 | macros/latex-dev/base/lablst.tex
-2023/11/01 | 13759 | macros/latex-dev/base/lamport-manual.err
-2023/11/01 | 170876 | macros/latex-dev/base/lamport-manual.pdf
-2023/11/01 | 38730 | macros/latex-dev/base/latex209.dtx
-2023/11/01 | 4219 | macros/latex-dev/base/latex209.ins
-2023/11/01 | 45347 | macros/latex-dev/base/latexrelease.dtx
-2023/11/01 | 6145 | macros/latex-dev/base/latexrelease.ins
-2023/11/01 | 282095 | macros/latex-dev/base/latexrelease.pdf
-2023/11/01 | 6709 | macros/latex-dev/base/latexsym.dtx
-2023/11/01 | 5041 | macros/latex-dev/base/latexsym.ins
-2023/11/01 | 200759 | macros/latex-dev/base/latexsym.pdf
-2023/11/01 | 52887 | macros/latex-dev/base/lb2.err
-2023/11/01 | 252497 | macros/latex-dev/base/lb2.pdf
-2023/11/01 | 1279 | macros/latex-dev/base/legal.txt
-2023/11/01 | 63280 | macros/latex-dev/base/letter.dtx
-2023/11/01 | 3372 | macros/latex-dev/base/letter.ins
-2023/11/01 | 337852 | macros/latex-dev/base/letter.pdf
-2023/11/01 | 21229 | macros/latex-dev/base/lgc2.err
-2023/11/01 | 217659 | macros/latex-dev/base/lgc2.pdf
-2023/11/01 | 9068 | macros/latex-dev/base/lppl-1-0.txt
-2023/11/01 | 14341 | macros/latex-dev/base/lppl-1-1.txt
-2023/11/01 | 14421 | macros/latex-dev/base/lppl-1-2.txt
-2023/11/01 | 132370 | macros/latex-dev/base/lppl.pdf
-2023/11/01 | 23386 | macros/latex-dev/base/lppl.tex
-2023/11/01 | 19040 | macros/latex-dev/base/lppl.txt
-2023/11/01 | 4298 | macros/latex-dev/base/ltalloc.dtx
-2023/11/01 | 17389 | macros/latex-dev/base/ltbibl.dtx
-2023/11/01 | 49020 | macros/latex-dev/base/ltboxes.dtx
-2023/11/01 | 145334 | macros/latex-dev/base/ltclass.dtx
-2023/11/01 | 183132 | macros/latex-dev/base/ltcmd.dtx
-2023/11/01 | 755882 | macros/latex-dev/base/ltcmdhooks-code.pdf
-2023/11/01 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex
-2023/11/01 | 499346 | macros/latex-dev/base/ltcmdhooks-doc.pdf
-2023/11/01 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex
-2023/11/01 | 67588 | macros/latex-dev/base/ltcmdhooks.dtx
-2023/11/01 | 9557 | macros/latex-dev/base/ltcntrl.dtx
-2023/11/01 | 24286 | macros/latex-dev/base/ltcounts.dtx
-2023/11/01 | 92954 | macros/latex-dev/base/ltdefns.dtx
-2023/11/01 | 35984 | macros/latex-dev/base/ltdirchk.dtx
-2023/11/01 | 27069 | macros/latex-dev/base/lterror.dtx
-2023/11/01 | 19533 | macros/latex-dev/base/ltexpl.dtx
-2023/11/01 | 804030 | macros/latex-dev/base/ltfilehook-code.pdf
-2023/11/01 | 105 | macros/latex-dev/base/ltfilehook-code.tex
-2023/11/01 | 548695 | macros/latex-dev/base/ltfilehook-doc.pdf
-2023/11/01 | 241 | macros/latex-dev/base/ltfilehook-doc.tex
-2023/11/01 | 67442 | macros/latex-dev/base/ltfilehook.dtx
-2023/11/01 | 61493 | macros/latex-dev/base/ltfiles.dtx
-2023/11/01 | 51180 | macros/latex-dev/base/ltfinal.dtx
-2023/11/01 | 55687 | macros/latex-dev/base/ltfloat.dtx
-2023/11/01 | 29267 | macros/latex-dev/base/ltfntcmd.dtx
-2023/11/01 | 58547 | macros/latex-dev/base/ltfssaxes.dtx
-2023/11/01 | 82917 | macros/latex-dev/base/ltfssbas.dtx
-2023/11/01 | 10370 | macros/latex-dev/base/ltfsscmp.dtx
-2023/11/01 | 75111 | macros/latex-dev/base/ltfssdcl.dtx
-2023/11/01 | 84215 | macros/latex-dev/base/ltfssini.dtx
-2023/11/01 | 72475 | macros/latex-dev/base/ltfsstrc.dtx
-2023/11/01 | 1258628 | macros/latex-dev/base/lthooks-code.pdf
-2023/11/01 | 102 | macros/latex-dev/base/lthooks-code.tex
-2023/11/01 | 755246 | macros/latex-dev/base/lthooks-doc.pdf
-2023/11/01 | 238 | macros/latex-dev/base/lthooks-doc.tex
-2023/11/01 | 301237 | macros/latex-dev/base/lthooks.dtx
-2023/11/01 | 4945 | macros/latex-dev/base/lthyphen.dtx
-2023/11/01 | 5859 | macros/latex-dev/base/ltidxglo.dtx
-2023/11/01 | 19853 | macros/latex-dev/base/ltkeys.dtx
-2023/11/01 | 4757 | macros/latex-dev/base/ltlength.dtx
-2023/11/01 | 36154 | macros/latex-dev/base/ltlists.dtx
-2023/11/01 | 3725 | macros/latex-dev/base/ltlogos.dtx
-2023/11/01 | 75286 | macros/latex-dev/base/ltluatex.dtx
-2023/11/01 | 325191 | macros/latex-dev/base/ltluatex.pdf
-2023/11/01 | 716681 | macros/latex-dev/base/ltmarks-code.pdf
-2023/11/01 | 102 | macros/latex-dev/base/ltmarks-code.tex
-2023/11/01 | 586808 | macros/latex-dev/base/ltmarks-doc.pdf
-2023/11/01 | 238 | macros/latex-dev/base/ltmarks-doc.tex
-2023/11/01 | 63142 | macros/latex-dev/base/ltmarks.dtx
-2023/11/01 | 42287 | macros/latex-dev/base/ltmath.dtx
-2023/11/01 | 6217 | macros/latex-dev/base/ltmeta.dtx
-2023/11/01 | 65684 | macros/latex-dev/base/ltmiscen.dtx
-2023/11/01 | 169553 | macros/latex-dev/base/ltnews01.pdf
-2023/11/01 | 5246 | macros/latex-dev/base/ltnews01.tex
-2023/11/01 | 151773 | macros/latex-dev/base/ltnews02.pdf
-2023/11/01 | 5462 | macros/latex-dev/base/ltnews02.tex
-2023/11/01 | 151324 | macros/latex-dev/base/ltnews03.pdf
-2023/11/01 | 5369 | macros/latex-dev/base/ltnews03.tex
-2023/11/01 | 152551 | macros/latex-dev/base/ltnews04.pdf
-2023/11/01 | 5678 | macros/latex-dev/base/ltnews04.tex
-2023/11/01 | 175211 | macros/latex-dev/base/ltnews05.pdf
-2023/11/01 | 5699 | macros/latex-dev/base/ltnews05.tex
-2023/11/01 | 142867 | macros/latex-dev/base/ltnews06.pdf
-2023/11/01 | 5544 | macros/latex-dev/base/ltnews06.tex
-2023/11/01 | 138214 | macros/latex-dev/base/ltnews07.pdf
-2023/11/01 | 5576 | macros/latex-dev/base/ltnews07.tex
-2023/11/01 | 155442 | macros/latex-dev/base/ltnews08.pdf
-2023/11/01 | 5732 | macros/latex-dev/base/ltnews08.tex
-2023/11/01 | 130028 | macros/latex-dev/base/ltnews09.pdf
-2023/11/01 | 5451 | macros/latex-dev/base/ltnews09.tex
-2023/11/01 | 169433 | macros/latex-dev/base/ltnews10.pdf
-2023/11/01 | 5825 | macros/latex-dev/base/ltnews10.tex
-2023/11/01 | 112208 | macros/latex-dev/base/ltnews11.pdf
-2023/11/01 | 5529 | macros/latex-dev/base/ltnews11.tex
-2023/11/01 | 156764 | macros/latex-dev/base/ltnews12.pdf
-2023/11/01 | 5574 | macros/latex-dev/base/ltnews12.tex
-2023/11/01 | 182483 | macros/latex-dev/base/ltnews13.pdf
-2023/11/01 | 7029 | macros/latex-dev/base/ltnews13.tex
-2023/11/01 | 170722 | macros/latex-dev/base/ltnews14.pdf
-2023/11/01 | 6424 | macros/latex-dev/base/ltnews14.tex
-2023/11/01 | 130328 | macros/latex-dev/base/ltnews15.pdf
-2023/11/01 | 5986 | macros/latex-dev/base/ltnews15.tex
-2023/11/01 | 138107 | macros/latex-dev/base/ltnews16.pdf
-2023/11/01 | 5775 | macros/latex-dev/base/ltnews16.tex
-2023/11/01 | 166269 | macros/latex-dev/base/ltnews17.pdf
-2023/11/01 | 8970 | macros/latex-dev/base/ltnews17.tex
-2023/11/01 | 39839 | macros/latex-dev/base/ltnews18.pdf
-2023/11/01 | 1341 | macros/latex-dev/base/ltnews18.tex
-2023/11/01 | 225936 | macros/latex-dev/base/ltnews19.pdf
-2023/11/01 | 4190 | macros/latex-dev/base/ltnews19.tex
-2023/11/01 | 318193 | macros/latex-dev/base/ltnews20.pdf
-2023/11/01 | 7244 | macros/latex-dev/base/ltnews20.tex
-2023/11/01 | 245228 | macros/latex-dev/base/ltnews21.pdf
-2023/11/01 | 9935 | macros/latex-dev/base/ltnews21.tex
-2023/11/01 | 318026 | macros/latex-dev/base/ltnews22.pdf
-2023/11/01 | 10792 | macros/latex-dev/base/ltnews22.tex
-2023/11/01 | 286824 | macros/latex-dev/base/ltnews23.pdf
-2023/11/01 | 10791 | macros/latex-dev/base/ltnews23.tex
-2023/11/01 | 265497 | macros/latex-dev/base/ltnews24.pdf
-2023/11/01 | 12334 | macros/latex-dev/base/ltnews24.tex
-2023/11/01 | 205100 | macros/latex-dev/base/ltnews25.pdf
-2023/11/01 | 5588 | macros/latex-dev/base/ltnews25.tex
-2023/11/01 | 379733 | macros/latex-dev/base/ltnews26.pdf
-2023/11/01 | 10798 | macros/latex-dev/base/ltnews26.tex
-2023/11/01 | 251283 | macros/latex-dev/base/ltnews27.pdf
-2023/11/01 | 5691 | macros/latex-dev/base/ltnews27.tex
-2023/11/01 | 376933 | macros/latex-dev/base/ltnews28.pdf
-2023/11/01 | 15047 | macros/latex-dev/base/ltnews28.tex
-2023/11/01 | 455437 | macros/latex-dev/base/ltnews29.pdf
-2023/11/01 | 18944 | macros/latex-dev/base/ltnews29.tex
-2023/11/01 | 512240 | macros/latex-dev/base/ltnews30.pdf
-2023/11/01 | 23646 | macros/latex-dev/base/ltnews30.tex
-2023/11/01 | 526688 | macros/latex-dev/base/ltnews31.pdf
-2023/11/01 | 30452 | macros/latex-dev/base/ltnews31.tex
-2023/11/01 | 546540 | macros/latex-dev/base/ltnews32.pdf
-2023/11/01 | 33243 | macros/latex-dev/base/ltnews32.tex
-2023/11/01 | 522757 | macros/latex-dev/base/ltnews33.pdf
-2023/11/01 | 33911 | macros/latex-dev/base/ltnews33.tex
-2023/11/01 | 508345 | macros/latex-dev/base/ltnews34.pdf
-2023/11/01 | 32331 | macros/latex-dev/base/ltnews34.tex
-2023/11/01 | 563307 | macros/latex-dev/base/ltnews35.pdf
-2023/11/01 | 38226 | macros/latex-dev/base/ltnews35.tex
-2023/11/01 | 517934 | macros/latex-dev/base/ltnews36.pdf
-2023/11/01 | 19333 | macros/latex-dev/base/ltnews36.tex
-2023/11/01 | 456933 | macros/latex-dev/base/ltnews37.pdf
-2023/11/01 | 33083 | macros/latex-dev/base/ltnews37.tex
-2023/11/01 | 523672 | macros/latex-dev/base/ltnews38.pdf
-2023/11/01 | 22948 | macros/latex-dev/base/ltnews38.tex
-2023/11/01 | 21488 | macros/latex-dev/base/ltnews.cls
-2023/11/01 | 1360066 | macros/latex-dev/base/ltnews.pdf
-2023/11/01 | 8051 | macros/latex-dev/base/ltnews.tex
-2023/11/01 | 148294 | macros/latex-dev/base/ltoutenc.dtx
-2023/11/01 | 3367 | macros/latex-dev/base/ltoutenc.ins
-2023/11/01 | 178567 | macros/latex-dev/base/ltoutput.dtx
-2023/11/01 | 14091 | macros/latex-dev/base/ltpage.dtx
-2023/11/01 | 2728 | macros/latex-dev/base/ltpageno.dtx
-2023/11/01 | 672700 | macros/latex-dev/base/ltpara-code.pdf
-2023/11/01 | 99 | macros/latex-dev/base/ltpara-code.tex
-2023/11/01 | 560578 | macros/latex-dev/base/ltpara-doc.pdf
-2023/11/01 | 234 | macros/latex-dev/base/ltpara-doc.tex
-2023/11/01 | 54677 | macros/latex-dev/base/ltpara.dtx
-2023/11/01 | 6155 | macros/latex-dev/base/ltpar.dtx
-2023/11/01 | 69002 | macros/latex-dev/base/ltpictur.dtx
-2023/11/01 | 60156 | macros/latex-dev/base/ltplain.dtx
-2023/11/01 | 558646 | macros/latex-dev/base/ltproperties-code.pdf
-2023/11/01 | 107 | macros/latex-dev/base/ltproperties-code.tex
-2023/11/01 | 433141 | macros/latex-dev/base/ltproperties-doc.pdf
-2023/11/01 | 243 | macros/latex-dev/base/ltproperties-doc.tex
-2023/11/01 | 33306 | macros/latex-dev/base/ltproperties.dtx
-2023/11/01 | 33946 | macros/latex-dev/base/ltsect.dtx
-2023/11/01 | 821655 | macros/latex-dev/base/ltshipout-code.pdf
-2023/11/01 | 104 | macros/latex-dev/base/ltshipout-code.tex
-2023/11/01 | 566566 | macros/latex-dev/base/ltshipout-doc.pdf
-2023/11/01 | 240 | macros/latex-dev/base/ltshipout-doc.tex
-2023/11/01 | 81195 | macros/latex-dev/base/ltshipout.dtx
-2023/11/01 | 606454 | macros/latex-dev/base/ltsockets-code.pdf
-2023/11/01 | 104 | macros/latex-dev/base/ltsockets-code.tex
-2023/11/01 | 489314 | macros/latex-dev/base/ltsockets-doc.pdf
-2023/11/01 | 240 | macros/latex-dev/base/ltsockets-doc.tex
-2023/11/01 | 37668 | macros/latex-dev/base/ltsockets.dtx
-2023/11/01 | 47316 | macros/latex-dev/base/ltspace.dtx
-2023/11/01 | 47896 | macros/latex-dev/base/lttab.dtx
-2023/11/01 | 90660 | macros/latex-dev/base/lttextcomp.dtx
-2023/11/01 | 8731 | macros/latex-dev/base/ltthm.dtx
-2023/11/01 | 15383 | macros/latex-dev/base/ltvers.dtx
-2023/11/01 | 219358 | macros/latex-dev/base/ltx3info.pdf
-2023/11/01 | 18299 | macros/latex-dev/base/ltx3info.tex
-2023/11/01 | 27122 | macros/latex-dev/base/ltxcheck.tex
-2023/11/01 | 22814 | macros/latex-dev/base/ltxdoc.dtx
-2023/11/01 | 244215 | macros/latex-dev/base/ltxdoc.pdf
-2023/11/01 | 7528 | macros/latex-dev/base/ltxguide.cls
-2023/11/01 | 21882 | macros/latex-dev/base/ltxref.dtx
-2023/11/01 | 10601 | macros/latex-dev/base/makeindx.dtx
-2023/11/01 | 3434 | macros/latex-dev/base/makeindx.ins
-2023/11/01 | 165816 | macros/latex-dev/base/makeindx.pdf
-2023/11/01 | 11463 | macros/latex-dev/base/manifest.txt
-2023/11/01 | 1941 | macros/latex-dev/base/minimal.cls
-2023/11/01 | 257825 | macros/latex-dev/base/modguide.pdf
-2023/11/01 | 16500 | macros/latex-dev/base/modguide.tex
-2023/11/01 | 4254 | macros/latex-dev/base/newdc.ins
-2023/11/01 | 6357 | macros/latex-dev/base/newlfont.dtx
-2023/11/01 | 18399 | macros/latex-dev/base/nfssfont.dtx
-2023/11/01 | 2893 | macros/latex-dev/base/nfssfont.ins
-2023/11/01 | 211171 | macros/latex-dev/base/nfssfont.pdf
-2023/11/01 | 3960 | macros/latex-dev/base/olddc.ins
-2023/11/01 | 8626 | macros/latex-dev/base/oldlfont.dtx
-2023/11/01 | 9345 | macros/latex-dev/base/preload.dtx
-2023/11/01 | 13589 | macros/latex-dev/base/proc.dtx
-2023/11/01 | 3401 | macros/latex-dev/base/proc.ins
-2023/11/01 | 227065 | macros/latex-dev/base/proc.pdf
-2023/11/01 | 3100 | macros/latex-dev/base/README.md
-2023/11/01 | 7200 | macros/latex-dev/base/sample2e.tex
-2023/11/01 | 89727 | macros/latex-dev/base/slides.dtx
-2023/11/01 | 6760 | macros/latex-dev/base/slides.ins
-2023/11/01 | 375493 | macros/latex-dev/base/slides.pdf
-2023/11/01 | 15703 | macros/latex-dev/base/slifonts.fdd
-2023/11/01 | 234171 | macros/latex-dev/base/slifonts.pdf
-2023/11/01 | 1694 | macros/latex-dev/base/small2e.tex
-2023/11/01 | 9401 | macros/latex-dev/base/source2edoc.cls
-2023/11/01 | 6150247 | macros/latex-dev/base/source2e.pdf
-2023/11/01 | 15431 | macros/latex-dev/base/source2e.tex
-2023/11/01 | 9395 | macros/latex-dev/base/syntonly.dtx
-2023/11/01 | 2896 | macros/latex-dev/base/syntonly.ins
-2023/11/01 | 190255 | macros/latex-dev/base/syntonly.pdf
-2023/11/01 | 12520 | macros/latex-dev/base/testpage.tex
-2023/11/01 | 173013 | macros/latex-dev/base/tlc2.err
-2023/11/01 | 291143 | macros/latex-dev/base/tlc2.pdf
-2023/11/01 | 43212 | macros/latex-dev/base/tlc3.err
-2023/11/01 | 326462 | macros/latex-dev/base/tlc3.pdf
-2023/11/01 | 12246 | macros/latex-dev/base/tulm.fdd
-2023/11/01 | 3781 | macros/latex-dev/base/tulm.ins
-2023/11/01 | 162773 | macros/latex-dev/base/tulm.pdf
-2023/11/01 | 3181 | macros/latex-dev/base/unpack.ins
-2023/11/01 | 438602 | macros/latex-dev/base/usrguide-historic.pdf
-2023/11/01 | 68735 | macros/latex-dev/base/usrguide-historic.tex
-2023/11/01 | 477695 | macros/latex-dev/base/usrguide.pdf
-2023/11/01 | 52759 | macros/latex-dev/base/usrguide.tex
-2023/11/01 | 92280 | macros/latex-dev/base/utf8ienc.dtx
-2023/11/01 | 353655 | macros/latex-dev/base/utf8ienc.pdf
-2023/11/01 | 10251 | macros/latex-dev/base/webcomp.err
-2023/11/01 | 146199 | macros/latex-dev/base/webcomp.pdf
-2023/11/02 | 43093738 | macros/latex-dev/base.zip
+2024/02/14 | 7104 | macros/latex-dev/base/alltt.dtx
+2024/02/14 | 2890 | macros/latex-dev/base/alltt.ins
+2024/02/14 | 223861 | macros/latex-dev/base/alltt.pdf
+2024/02/14 | 3282 | macros/latex-dev/base/bugs.txt
+2024/02/14 | 264168 | macros/latex-dev/base/cfgguide.pdf
+2024/02/14 | 22723 | macros/latex-dev/base/cfgguide.tex
+2024/02/14 | 42708 | macros/latex-dev/base/changes.old.txt
+2024/02/14 | 408292 | macros/latex-dev/base/changes.txt
+2024/02/14 | 156260 | macros/latex-dev/base/classes.dtx
+2024/02/14 | 4087 | macros/latex-dev/base/classes.ins
+2024/02/14 | 560294 | macros/latex-dev/base/classes.pdf
+2024/02/14 | 415956 | macros/latex-dev/base/clsguide-historic.pdf
+2024/02/14 | 69441 | macros/latex-dev/base/clsguide-historic.tex
+2024/02/14 | 489795 | macros/latex-dev/base/clsguide.pdf
+2024/02/14 | 64605 | macros/latex-dev/base/clsguide.tex
+2024/02/14 | 5273 | macros/latex-dev/base/cmextra.ins
+2024/02/14 | 44531 | macros/latex-dev/base/cmfonts.fdd
+2024/02/14 | 4324 | macros/latex-dev/base/cmfonts.ins
+2024/02/14 | 292600 | macros/latex-dev/base/cmfonts.pdf
+2024/02/14 | 257359 | macros/latex-dev/base/cyrguide.pdf
+2024/02/14 | 17782 | macros/latex-dev/base/cyrguide.tex
+2024/02/14 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty
+2024/02/14 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty
+2024/02/14 | 1078428 | macros/latex-dev/base/doc-code.pdf
+2024/02/14 | 96 | macros/latex-dev/base/doc-code.tex
+2024/02/14 | 241326 | macros/latex-dev/base/doc.dtx
+2024/02/14 | 757049 | macros/latex-dev/base/doc.pdf
+2024/02/14 | 171410 | macros/latex-dev/base/docstrip.dtx
+2024/02/14 | 4273 | macros/latex-dev/base/docstrip.ins
+2024/02/14 | 506365 | macros/latex-dev/base/docstrip.pdf
+2024/02/14 | 4390 | macros/latex-dev/base/ec.ins
+2024/02/14 | 1318576 | macros/latex-dev/base/encguide.pdf
+2024/02/14 | 52813 | macros/latex-dev/base/encguide.tex
+2024/02/14 | 7216 | macros/latex-dev/base/exscale.dtx
+2024/02/14 | 3338 | macros/latex-dev/base/exscale.ins
+2024/02/14 | 204708 | macros/latex-dev/base/exscale.pdf
+2024/02/14 | 23516 | macros/latex-dev/base/fix-cm.dtx
+2024/02/14 | 2892 | macros/latex-dev/base/fix-cm.ins
+2024/02/14 | 287727 | macros/latex-dev/base/fix-cm.pdf
+2024/02/14 | 517708 | macros/latex-dev/base/fntguide.pdf
+2024/02/14 | 108248 | macros/latex-dev/base/fntguide.tex
+2024/02/14 | 60422 | macros/latex-dev/base/fontdef.dtx
+2024/02/14 | 10072 | macros/latex-dev/base/format.ins
+2024/02/14 | 5509 | macros/latex-dev/base/graphpap.dtx
+2024/02/14 | 2892 | macros/latex-dev/base/graphpap.ins
+2024/02/14 | 161722 | macros/latex-dev/base/graphpap.pdf
+2024/02/14 | 2705 | macros/latex-dev/base/idx.tex
+2024/02/14 | 18753 | macros/latex-dev/base/ifthen.dtx
+2024/02/14 | 2888 | macros/latex-dev/base/ifthen.ins
+2024/02/14 | 221219 | macros/latex-dev/base/ifthen.pdf
+2024/02/14 | 106906 | macros/latex-dev/base/inputenc.dtx
+2024/02/14 | 5714 | macros/latex-dev/base/inputenc.ins
+2024/02/14 | 318372 | macros/latex-dev/base/inputenc.pdf
+2024/02/14 | 4079 | macros/latex-dev/base/lablst.tex
+2024/02/14 | 13759 | macros/latex-dev/base/lamport-manual.err
+2024/02/14 | 170876 | macros/latex-dev/base/lamport-manual.pdf
+2024/02/14 | 38730 | macros/latex-dev/base/latex209.dtx
+2024/02/14 | 4219 | macros/latex-dev/base/latex209.ins
+2024/02/14 | 45347 | macros/latex-dev/base/latexrelease.dtx
+2024/02/14 | 6202 | macros/latex-dev/base/latexrelease.ins
+2024/02/14 | 282095 | macros/latex-dev/base/latexrelease.pdf
+2024/02/14 | 6709 | macros/latex-dev/base/latexsym.dtx
+2024/02/14 | 5041 | macros/latex-dev/base/latexsym.ins
+2024/02/14 | 200759 | macros/latex-dev/base/latexsym.pdf
+2024/02/14 | 53334 | macros/latex-dev/base/lb2.err
+2024/02/14 | 253116 | macros/latex-dev/base/lb2.pdf
+2024/02/14 | 1279 | macros/latex-dev/base/legal.txt
+2024/02/14 | 63280 | macros/latex-dev/base/letter.dtx
+2024/02/14 | 3372 | macros/latex-dev/base/letter.ins
+2024/02/14 | 337772 | macros/latex-dev/base/letter.pdf
+2024/02/14 | 21229 | macros/latex-dev/base/lgc2.err
+2024/02/14 | 217659 | macros/latex-dev/base/lgc2.pdf
+2024/02/14 | 9068 | macros/latex-dev/base/lppl-1-0.txt
+2024/02/14 | 14341 | macros/latex-dev/base/lppl-1-1.txt
+2024/02/14 | 14421 | macros/latex-dev/base/lppl-1-2.txt
+2024/02/14 | 132370 | macros/latex-dev/base/lppl.pdf
+2024/02/14 | 23386 | macros/latex-dev/base/lppl.tex
+2024/02/14 | 19040 | macros/latex-dev/base/lppl.txt
+2024/02/14 | 4298 | macros/latex-dev/base/ltalloc.dtx
+2024/02/14 | 17389 | macros/latex-dev/base/ltbibl.dtx
+2024/02/14 | 49035 | macros/latex-dev/base/ltboxes.dtx
+2024/02/14 | 146153 | macros/latex-dev/base/ltclass.dtx
+2024/02/14 | 188047 | macros/latex-dev/base/ltcmd.dtx
+2024/02/14 | 752365 | macros/latex-dev/base/ltcmdhooks-code.pdf
+2024/02/14 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex
+2024/02/14 | 497334 | macros/latex-dev/base/ltcmdhooks-doc.pdf
+2024/02/14 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex
+2024/02/14 | 67672 | macros/latex-dev/base/ltcmdhooks.dtx
+2024/02/14 | 9557 | macros/latex-dev/base/ltcntrl.dtx
+2024/02/14 | 24869 | macros/latex-dev/base/ltcounts.dtx
+2024/02/14 | 93035 | macros/latex-dev/base/ltdefns.dtx
+2024/02/14 | 36003 | macros/latex-dev/base/ltdirchk.dtx
+2024/02/14 | 27069 | macros/latex-dev/base/lterror.dtx
+2024/02/14 | 19533 | macros/latex-dev/base/ltexpl.dtx
+2024/02/14 | 803049 | macros/latex-dev/base/ltfilehook-code.pdf
+2024/02/14 | 105 | macros/latex-dev/base/ltfilehook-code.tex
+2024/02/14 | 548011 | macros/latex-dev/base/ltfilehook-doc.pdf
+2024/02/14 | 241 | macros/latex-dev/base/ltfilehook-doc.tex
+2024/02/14 | 67585 | macros/latex-dev/base/ltfilehook.dtx
+2024/02/14 | 62897 | macros/latex-dev/base/ltfiles.dtx
+2024/02/14 | 51163 | macros/latex-dev/base/ltfinal.dtx
+2024/02/14 | 55687 | macros/latex-dev/base/ltfloat.dtx
+2024/02/14 | 29270 | macros/latex-dev/base/ltfntcmd.dtx
+2024/02/14 | 58548 | macros/latex-dev/base/ltfssaxes.dtx
+2024/02/14 | 82917 | macros/latex-dev/base/ltfssbas.dtx
+2024/02/14 | 10370 | macros/latex-dev/base/ltfsscmp.dtx
+2024/02/14 | 75111 | macros/latex-dev/base/ltfssdcl.dtx
+2024/02/14 | 84220 | macros/latex-dev/base/ltfssini.dtx
+2024/02/14 | 72493 | macros/latex-dev/base/ltfsstrc.dtx
+2024/02/14 | 1248644 | macros/latex-dev/base/lthooks-code.pdf
+2024/02/14 | 102 | macros/latex-dev/base/lthooks-code.tex
+2024/02/14 | 758273 | macros/latex-dev/base/lthooks-doc.pdf
+2024/02/14 | 238 | macros/latex-dev/base/lthooks-doc.tex
+2024/02/14 | 304559 | macros/latex-dev/base/lthooks.dtx
+2024/02/14 | 4945 | macros/latex-dev/base/lthyphen.dtx
+2024/02/14 | 5859 | macros/latex-dev/base/ltidxglo.dtx
+2024/02/14 | 20011 | macros/latex-dev/base/ltkeys.dtx
+2024/02/14 | 4757 | macros/latex-dev/base/ltlength.dtx
+2024/02/14 | 36154 | macros/latex-dev/base/ltlists.dtx
+2024/02/14 | 3725 | macros/latex-dev/base/ltlogos.dtx
+2024/02/14 | 75392 | macros/latex-dev/base/ltluatex.dtx
+2024/02/14 | 325142 | macros/latex-dev/base/ltluatex.pdf
+2024/02/14 | 711767 | macros/latex-dev/base/ltmarks-code.pdf
+2024/02/14 | 102 | macros/latex-dev/base/ltmarks-code.tex
+2024/02/14 | 575242 | macros/latex-dev/base/ltmarks-doc.pdf
+2024/02/14 | 238 | macros/latex-dev/base/ltmarks-doc.tex
+2024/02/14 | 75109 | macros/latex-dev/base/ltmarks.dtx
+2024/02/14 | 42287 | macros/latex-dev/base/ltmath.dtx
+2024/02/14 | 6248 | macros/latex-dev/base/ltmeta.dtx
+2024/02/14 | 65689 | macros/latex-dev/base/ltmiscen.dtx
+2024/02/14 | 169553 | macros/latex-dev/base/ltnews01.pdf
+2024/02/14 | 5246 | macros/latex-dev/base/ltnews01.tex
+2024/02/14 | 151773 | macros/latex-dev/base/ltnews02.pdf
+2024/02/14 | 5462 | macros/latex-dev/base/ltnews02.tex
+2024/02/14 | 151324 | macros/latex-dev/base/ltnews03.pdf
+2024/02/14 | 5369 | macros/latex-dev/base/ltnews03.tex
+2024/02/14 | 152551 | macros/latex-dev/base/ltnews04.pdf
+2024/02/14 | 5678 | macros/latex-dev/base/ltnews04.tex
+2024/02/14 | 175211 | macros/latex-dev/base/ltnews05.pdf
+2024/02/14 | 5699 | macros/latex-dev/base/ltnews05.tex
+2024/02/14 | 142867 | macros/latex-dev/base/ltnews06.pdf
+2024/02/14 | 5544 | macros/latex-dev/base/ltnews06.tex
+2024/02/14 | 138214 | macros/latex-dev/base/ltnews07.pdf
+2024/02/14 | 5576 | macros/latex-dev/base/ltnews07.tex
+2024/02/14 | 155442 | macros/latex-dev/base/ltnews08.pdf
+2024/02/14 | 5732 | macros/latex-dev/base/ltnews08.tex
+2024/02/14 | 130028 | macros/latex-dev/base/ltnews09.pdf
+2024/02/14 | 5451 | macros/latex-dev/base/ltnews09.tex
+2024/02/14 | 169433 | macros/latex-dev/base/ltnews10.pdf
+2024/02/14 | 5825 | macros/latex-dev/base/ltnews10.tex
+2024/02/14 | 112208 | macros/latex-dev/base/ltnews11.pdf
+2024/02/14 | 5529 | macros/latex-dev/base/ltnews11.tex
+2024/02/14 | 156764 | macros/latex-dev/base/ltnews12.pdf
+2024/02/14 | 5574 | macros/latex-dev/base/ltnews12.tex
+2024/02/14 | 182483 | macros/latex-dev/base/ltnews13.pdf
+2024/02/14 | 7029 | macros/latex-dev/base/ltnews13.tex
+2024/02/14 | 170722 | macros/latex-dev/base/ltnews14.pdf
+2024/02/14 | 6424 | macros/latex-dev/base/ltnews14.tex
+2024/02/14 | 130328 | macros/latex-dev/base/ltnews15.pdf
+2024/02/14 | 5986 | macros/latex-dev/base/ltnews15.tex
+2024/02/14 | 138107 | macros/latex-dev/base/ltnews16.pdf
+2024/02/14 | 5775 | macros/latex-dev/base/ltnews16.tex
+2024/02/14 | 166269 | macros/latex-dev/base/ltnews17.pdf
+2024/02/14 | 8970 | macros/latex-dev/base/ltnews17.tex
+2024/02/14 | 39839 | macros/latex-dev/base/ltnews18.pdf
+2024/02/14 | 1341 | macros/latex-dev/base/ltnews18.tex
+2024/02/14 | 225936 | macros/latex-dev/base/ltnews19.pdf
+2024/02/14 | 4190 | macros/latex-dev/base/ltnews19.tex
+2024/02/14 | 318193 | macros/latex-dev/base/ltnews20.pdf
+2024/02/14 | 7244 | macros/latex-dev/base/ltnews20.tex
+2024/02/14 | 245228 | macros/latex-dev/base/ltnews21.pdf
+2024/02/14 | 9935 | macros/latex-dev/base/ltnews21.tex
+2024/02/14 | 318026 | macros/latex-dev/base/ltnews22.pdf
+2024/02/14 | 10792 | macros/latex-dev/base/ltnews22.tex
+2024/02/14 | 286824 | macros/latex-dev/base/ltnews23.pdf
+2024/02/14 | 10791 | macros/latex-dev/base/ltnews23.tex
+2024/02/14 | 265497 | macros/latex-dev/base/ltnews24.pdf
+2024/02/14 | 12334 | macros/latex-dev/base/ltnews24.tex
+2024/02/14 | 205100 | macros/latex-dev/base/ltnews25.pdf
+2024/02/14 | 5588 | macros/latex-dev/base/ltnews25.tex
+2024/02/14 | 379733 | macros/latex-dev/base/ltnews26.pdf
+2024/02/14 | 10798 | macros/latex-dev/base/ltnews26.tex
+2024/02/14 | 251283 | macros/latex-dev/base/ltnews27.pdf
+2024/02/14 | 5691 | macros/latex-dev/base/ltnews27.tex
+2024/02/14 | 376933 | macros/latex-dev/base/ltnews28.pdf
+2024/02/14 | 15047 | macros/latex-dev/base/ltnews28.tex
+2024/02/14 | 455437 | macros/latex-dev/base/ltnews29.pdf
+2024/02/14 | 18944 | macros/latex-dev/base/ltnews29.tex
+2024/02/14 | 512240 | macros/latex-dev/base/ltnews30.pdf
+2024/02/14 | 23646 | macros/latex-dev/base/ltnews30.tex
+2024/02/14 | 526688 | macros/latex-dev/base/ltnews31.pdf
+2024/02/14 | 30452 | macros/latex-dev/base/ltnews31.tex
+2024/02/14 | 546540 | macros/latex-dev/base/ltnews32.pdf
+2024/02/14 | 33243 | macros/latex-dev/base/ltnews32.tex
+2024/02/14 | 522757 | macros/latex-dev/base/ltnews33.pdf
+2024/02/14 | 33911 | macros/latex-dev/base/ltnews33.tex
+2024/02/14 | 508345 | macros/latex-dev/base/ltnews34.pdf
+2024/02/14 | 32331 | macros/latex-dev/base/ltnews34.tex
+2024/02/14 | 563307 | macros/latex-dev/base/ltnews35.pdf
+2024/02/14 | 38226 | macros/latex-dev/base/ltnews35.tex
+2024/02/14 | 517934 | macros/latex-dev/base/ltnews36.pdf
+2024/02/14 | 19333 | macros/latex-dev/base/ltnews36.tex
+2024/02/14 | 456933 | macros/latex-dev/base/ltnews37.pdf
+2024/02/14 | 33083 | macros/latex-dev/base/ltnews37.tex
+2024/02/14 | 523675 | macros/latex-dev/base/ltnews38.pdf
+2024/02/14 | 22946 | macros/latex-dev/base/ltnews38.tex
+2024/02/14 | 473345 | macros/latex-dev/base/ltnews39.pdf
+2024/02/14 | 25598 | macros/latex-dev/base/ltnews39.tex
+2024/02/14 | 21488 | macros/latex-dev/base/ltnews.cls
+2024/02/14 | 1390205 | macros/latex-dev/base/ltnews.pdf
+2024/02/14 | 8051 | macros/latex-dev/base/ltnews.tex
+2024/02/14 | 148564 | macros/latex-dev/base/ltoutenc.dtx
+2024/02/14 | 3367 | macros/latex-dev/base/ltoutenc.ins
+2024/02/14 | 178567 | macros/latex-dev/base/ltoutput.dtx
+2024/02/14 | 14091 | macros/latex-dev/base/ltpage.dtx
+2024/02/14 | 2728 | macros/latex-dev/base/ltpageno.dtx
+2024/02/14 | 672114 | macros/latex-dev/base/ltpara-code.pdf
+2024/02/14 | 99 | macros/latex-dev/base/ltpara-code.tex
+2024/02/14 | 560037 | macros/latex-dev/base/ltpara-doc.pdf
+2024/02/14 | 234 | macros/latex-dev/base/ltpara-doc.tex
+2024/02/14 | 54826 | macros/latex-dev/base/ltpara.dtx
+2024/02/14 | 6155 | macros/latex-dev/base/ltpar.dtx
+2024/02/14 | 69002 | macros/latex-dev/base/ltpictur.dtx
+2024/02/14 | 60434 | macros/latex-dev/base/ltplain.dtx
+2024/02/14 | 557051 | macros/latex-dev/base/ltproperties-code.pdf
+2024/02/14 | 107 | macros/latex-dev/base/ltproperties-code.tex
+2024/02/14 | 432129 | macros/latex-dev/base/ltproperties-doc.pdf
+2024/02/14 | 243 | macros/latex-dev/base/ltproperties-doc.tex
+2024/02/14 | 33439 | macros/latex-dev/base/ltproperties.dtx
+2024/02/14 | 33946 | macros/latex-dev/base/ltsect.dtx
+2024/02/14 | 821580 | macros/latex-dev/base/ltshipout-code.pdf
+2024/02/14 | 104 | macros/latex-dev/base/ltshipout-code.tex
+2024/02/14 | 567728 | macros/latex-dev/base/ltshipout-doc.pdf
+2024/02/14 | 240 | macros/latex-dev/base/ltshipout-doc.tex
+2024/02/14 | 80747 | macros/latex-dev/base/ltshipout.dtx
+2024/02/14 | 598937 | macros/latex-dev/base/ltsockets-code.pdf
+2024/02/14 | 104 | macros/latex-dev/base/ltsockets-code.tex
+2024/02/14 | 481774 | macros/latex-dev/base/ltsockets-doc.pdf
+2024/02/14 | 240 | macros/latex-dev/base/ltsockets-doc.tex
+2024/02/14 | 37710 | macros/latex-dev/base/ltsockets.dtx
+2024/02/14 | 47308 | macros/latex-dev/base/ltspace.dtx
+2024/02/14 | 47896 | macros/latex-dev/base/lttab.dtx
+2024/02/14 | 24793 | macros/latex-dev/base/lttagging.dtx
+2024/02/14 | 92269 | macros/latex-dev/base/lttemplates.dtx
+2024/02/14 | 114225 | macros/latex-dev/base/lttextcomp.dtx
+2024/02/14 | 8731 | macros/latex-dev/base/ltthm.dtx
+2024/02/14 | 15384 | macros/latex-dev/base/ltvers.dtx
+2024/02/14 | 219358 | macros/latex-dev/base/ltx3info.pdf
+2024/02/14 | 18299 | macros/latex-dev/base/ltx3info.tex
+2024/02/14 | 27122 | macros/latex-dev/base/ltxcheck.tex
+2024/02/14 | 22822 | macros/latex-dev/base/ltxdoc.dtx
+2024/02/14 | 244141 | macros/latex-dev/base/ltxdoc.pdf
+2024/02/14 | 7528 | macros/latex-dev/base/ltxguide.cls
+2024/02/14 | 21882 | macros/latex-dev/base/ltxref.dtx
+2024/02/14 | 10601 | macros/latex-dev/base/makeindx.dtx
+2024/02/14 | 3434 | macros/latex-dev/base/makeindx.ins
+2024/02/14 | 165816 | macros/latex-dev/base/makeindx.pdf
+2024/02/14 | 11463 | macros/latex-dev/base/manifest.txt
+2024/02/14 | 1941 | macros/latex-dev/base/minimal.cls
+2024/02/14 | 257825 | macros/latex-dev/base/modguide.pdf
+2024/02/14 | 16500 | macros/latex-dev/base/modguide.tex
+2024/02/14 | 4254 | macros/latex-dev/base/newdc.ins
+2024/02/14 | 6357 | macros/latex-dev/base/newlfont.dtx
+2024/02/14 | 18401 | macros/latex-dev/base/nfssfont.dtx
+2024/02/14 | 2893 | macros/latex-dev/base/nfssfont.ins
+2024/02/14 | 211314 | macros/latex-dev/base/nfssfont.pdf
+2024/02/14 | 3960 | macros/latex-dev/base/olddc.ins
+2024/02/14 | 8626 | macros/latex-dev/base/oldlfont.dtx
+2024/02/14 | 9345 | macros/latex-dev/base/preload.dtx
+2024/02/14 | 13589 | macros/latex-dev/base/proc.dtx
+2024/02/14 | 3401 | macros/latex-dev/base/proc.ins
+2024/02/14 | 227065 | macros/latex-dev/base/proc.pdf
+2024/02/14 | 3100 | macros/latex-dev/base/README.md
+2024/02/14 | 7200 | macros/latex-dev/base/sample2e.tex
+2024/02/14 | 89727 | macros/latex-dev/base/slides.dtx
+2024/02/14 | 6760 | macros/latex-dev/base/slides.ins
+2024/02/14 | 375493 | macros/latex-dev/base/slides.pdf
+2024/02/14 | 15693 | macros/latex-dev/base/slifonts.fdd
+2024/02/14 | 233905 | macros/latex-dev/base/slifonts.pdf
+2024/02/14 | 1694 | macros/latex-dev/base/small2e.tex
+2024/02/14 | 6911 | macros/latex-dev/base/source2edoc.cls
+2024/02/14 | 6239225 | macros/latex-dev/base/source2e.pdf
+2024/02/14 | 15479 | macros/latex-dev/base/source2e.tex
+2024/02/14 | 9398 | macros/latex-dev/base/syntonly.dtx
+2024/02/14 | 2896 | macros/latex-dev/base/syntonly.ins
+2024/02/14 | 189440 | macros/latex-dev/base/syntonly.pdf
+2024/02/14 | 12520 | macros/latex-dev/base/testpage.tex
+2024/02/14 | 173013 | macros/latex-dev/base/tlc2.err
+2024/02/14 | 291143 | macros/latex-dev/base/tlc2.pdf
+2024/02/14 | 44328 | macros/latex-dev/base/tlc3.err
+2024/02/14 | 345764 | macros/latex-dev/base/tlc3.pdf
+2024/02/14 | 12246 | macros/latex-dev/base/tulm.fdd
+2024/02/14 | 3781 | macros/latex-dev/base/tulm.ins
+2024/02/14 | 162773 | macros/latex-dev/base/tulm.pdf
+2024/02/14 | 3181 | macros/latex-dev/base/unpack.ins
+2024/02/14 | 439393 | macros/latex-dev/base/usrguide-historic.pdf
+2024/02/14 | 68746 | macros/latex-dev/base/usrguide-historic.tex
+2024/02/14 | 483354 | macros/latex-dev/base/usrguide.pdf
+2024/02/14 | 55017 | macros/latex-dev/base/usrguide.tex
+2024/02/14 | 92294 | macros/latex-dev/base/utf8ienc.dtx
+2024/02/14 | 353399 | macros/latex-dev/base/utf8ienc.pdf
+2024/02/14 | 10247 | macros/latex-dev/base/webcomp.err
+2024/02/14 | 146197 | macros/latex-dev/base/webcomp.pdf
+2024/02/14 | 43697199 | macros/latex-dev/base.zip
2023/11/01 | 8663 | macros/latex-dev/required/amsmath/amsbsy.dtx
2023/11/01 | 1505 | macros/latex-dev/required/amsmath/amsbsy.ins
2023/11/01 | 174946 | macros/latex-dev/required/amsmath/amsbsy.pdf
@@ -257357,134 +257369,139 @@
2023/11/01 | 10753 | macros/latex-dev/required/graphics/trig.dtx
2023/11/01 | 199266 | macros/latex-dev/required/graphics/trig.pdf
2023/11/02 | 3074347 | macros/latex-dev/required/graphics.zip
-2023/11/01 | 886150 | macros/latex-dev/required/latex-lab/blocks-code.pdf
-2023/11/01 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex
-2023/11/01 | 440234 | macros/latex-dev/required/latex-lab/blocks-doc.pdf
-2023/11/01 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex
-2023/11/01 | 6593 | macros/latex-dev/required/latex-lab/changes.txt
-2023/11/01 | 523380 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf
-2023/11/01 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex
-2023/11/01 | 389003 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf
-2023/11/01 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex
-2023/11/01 | 19447 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx
-2023/11/01 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex
-2023/11/01 | 3179 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx
-2023/11/01 | 357553 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf
-2023/11/01 | 14027 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx
-2023/11/01 | 411092 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf
-2023/11/01 | 135159 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx
-2023/11/01 | 886150 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf
-2023/11/01 | 4566 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx
-2023/11/01 | 272864 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf
-2023/11/01 | 16852 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx
-2023/11/01 | 444977 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf
-2023/11/01 | 87681 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx
-2023/11/01 | 815656 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf
-2023/11/01 | 34333 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx
-2023/11/01 | 496997 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf
-2023/11/01 | 6127 | macros/latex-dev/required/latex-lab/latex-lab.ins
-2023/11/01 | 37115 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx
-2023/11/01 | 612623 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf
-2023/11/01 | 2453 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx
-2023/11/01 | 302371 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf
-2023/11/01 | 6134 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx
-2023/11/01 | 357553 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf
-2023/11/01 | 7303 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx
-2023/11/01 | 280811 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf
-2023/11/01 | 2882 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx
-2023/11/01 | 234649 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf
-2023/11/01 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx
-2023/11/01 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf
-2023/11/01 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx
-2023/11/01 | 632310 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf
-2023/11/01 | 26638 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx
-2023/11/01 | 527916 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf
-2023/11/01 | 65052 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx
-2023/11/01 | 621929 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf
-2023/11/01 | 4770 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx
-2023/11/01 | 298403 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf
-2023/11/01 | 3669 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx
-2023/11/01 | 307812 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf
-2023/11/01 | 12805 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx
-2023/11/01 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx
-2023/11/01 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf
-2023/11/01 | 18464 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx
-2023/11/01 | 361084 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf
-2023/11/01 | 396817 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf
-2023/11/01 | 1156 | macros/latex-dev/required/latex-lab/README.md
-2023/11/02 | 11370244 | macros/latex-dev/required/latex-lab.zip
-2023/11/01 | 14075 | macros/latex-dev/required/tools/afterpage.dtx
-2023/11/01 | 2538 | macros/latex-dev/required/tools/afterpage.ins
-2023/11/01 | 198100 | macros/latex-dev/required/tools/afterpage.pdf
-2023/11/01 | 11749 | macros/latex-dev/required/tools/array-2016-10-06.sty
-2023/11/01 | 12559 | macros/latex-dev/required/tools/array-2020-02-10.sty
-2023/11/01 | 128520 | macros/latex-dev/required/tools/array.dtx
-2023/11/01 | 517410 | macros/latex-dev/required/tools/array.pdf
-2023/11/01 | 61635 | macros/latex-dev/required/tools/bm.dtx
-2023/11/01 | 2524 | macros/latex-dev/required/tools/bm.ins
-2023/11/01 | 323929 | macros/latex-dev/required/tools/bm.pdf
-2023/11/01 | 53167 | macros/latex-dev/required/tools/calc.dtx
-2023/11/01 | 370660 | macros/latex-dev/required/tools/calc.pdf
-2023/11/01 | 63675 | macros/latex-dev/required/tools/changes.txt
-2023/11/01 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx
-2023/11/01 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf
-2023/11/01 | 6789 | macros/latex-dev/required/tools/delarray.dtx
-2023/11/01 | 191058 | macros/latex-dev/required/tools/delarray.pdf
-2023/11/01 | 10637 | macros/latex-dev/required/tools/enumerate.dtx
-2023/11/01 | 215077 | macros/latex-dev/required/tools/enumerate.pdf
-2023/11/01 | 4959 | macros/latex-dev/required/tools/fileerr.dtx
-2023/11/01 | 188281 | macros/latex-dev/required/tools/fileerr.pdf
-2023/11/01 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx
-2023/11/01 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf
-2023/11/01 | 39697 | macros/latex-dev/required/tools/ftnright.dtx
-2023/11/01 | 387794 | macros/latex-dev/required/tools/ftnright.pdf
-2023/11/01 | 11148 | macros/latex-dev/required/tools/hhline.dtx
-2023/11/01 | 189678 | macros/latex-dev/required/tools/hhline.pdf
-2023/11/01 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx
-2023/11/01 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf
-2023/11/01 | 32047 | macros/latex-dev/required/tools/layout.dtx
-2023/11/01 | 260278 | macros/latex-dev/required/tools/layout.pdf
-2023/11/01 | 12133 | macros/latex-dev/required/tools/longtable-2020-01-07.sty
-2023/11/01 | 76541 | macros/latex-dev/required/tools/longtable.dtx
-2023/11/01 | 2538 | macros/latex-dev/required/tools/longtable.ins
-2023/11/01 | 391258 | macros/latex-dev/required/tools/longtable.pdf
-2023/11/01 | 3284 | macros/latex-dev/required/tools/manifest.txt
-2023/11/01 | 29712 | macros/latex-dev/required/tools/multicol-2017-04-11.sty
-2023/11/01 | 31646 | macros/latex-dev/required/tools/multicol-2019-10-01.sty
-2023/11/01 | 186367 | macros/latex-dev/required/tools/multicol.dtx
-2023/11/01 | 2576 | macros/latex-dev/required/tools/multicol.ins
-2023/11/01 | 523618 | macros/latex-dev/required/tools/multicol.pdf
-2023/11/01 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx
-2023/11/01 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf
-2023/11/01 | 1664 | macros/latex-dev/required/tools/README.md
-2023/11/01 | 9559 | macros/latex-dev/required/tools/shellesc.dtx
-2023/11/01 | 176171 | macros/latex-dev/required/tools/shellesc.pdf
-2023/11/01 | 8632 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty
-2023/11/01 | 30279 | macros/latex-dev/required/tools/showkeys.dtx
-2023/11/01 | 252975 | macros/latex-dev/required/tools/showkeys.pdf
-2023/11/01 | 5791 | macros/latex-dev/required/tools/somedefs.dtx
-2023/11/01 | 167583 | macros/latex-dev/required/tools/somedefs.pdf
-2023/11/01 | 35874 | macros/latex-dev/required/tools/tabularx.dtx
-2023/11/01 | 2535 | macros/latex-dev/required/tools/tabularx.ins
-2023/11/01 | 287013 | macros/latex-dev/required/tools/tabularx.pdf
-2023/11/01 | 43446 | macros/latex-dev/required/tools/theorem.dtx
-2023/11/01 | 352315 | macros/latex-dev/required/tools/theorem.pdf
-2023/11/01 | 5680 | macros/latex-dev/required/tools/tools.ins
-2023/11/01 | 73673 | macros/latex-dev/required/tools/tools-overview.pdf
-2023/11/01 | 5211 | macros/latex-dev/required/tools/tools-overview.tex
-2023/11/01 | 25146 | macros/latex-dev/required/tools/trace.dtx
-2023/11/01 | 222074 | macros/latex-dev/required/tools/trace.pdf
-2023/11/01 | 33863 | macros/latex-dev/required/tools/varioref-2016-02-16.sty
-2023/11/01 | 114350 | macros/latex-dev/required/tools/varioref.dtx
-2023/11/01 | 2531 | macros/latex-dev/required/tools/varioref.ins
-2023/11/01 | 393134 | macros/latex-dev/required/tools/varioref.pdf
-2023/11/01 | 72132 | macros/latex-dev/required/tools/verbatim.dtx
-2023/11/01 | 331003 | macros/latex-dev/required/tools/verbatim.pdf
-2023/11/01 | 6219 | macros/latex-dev/required/tools/xr.dtx
-2023/11/01 | 170451 | macros/latex-dev/required/tools/xr.pdf
-2023/11/01 | 17856 | macros/latex-dev/required/tools/xspace.dtx
-2023/11/01 | 257027 | macros/latex-dev/required/tools/xspace.pdf
-2023/11/02 | 7252214 | macros/latex-dev/required/tools.zip
+2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/blocks-code.pdf
+2024/02/14 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex
+2024/02/14 | 485950 | macros/latex-dev/required/latex-lab/blocks-doc.pdf
+2024/02/14 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex
+2024/02/14 | 10215 | macros/latex-dev/required/latex-lab/changes.txt
+2024/02/14 | 531721 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf
+2024/02/14 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex
+2024/02/14 | 419214 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf
+2024/02/14 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex
+2024/02/14 | 20674 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx
+2024/02/14 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex
+2024/02/14 | 6220 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx
+2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf
+2024/02/14 | 14373 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx
+2024/02/14 | 383259 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf
+2024/02/14 | 136797 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx
+2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf
+2024/02/14 | 4973 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx
+2024/02/14 | 273812 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf
+2024/02/14 | 17978 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx
+2024/02/14 | 426817 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf
+2024/02/14 | 87681 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx
+2024/02/14 | 815072 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf
+2024/02/14 | 34457 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx
+2024/02/14 | 517737 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf
+2024/02/14 | 6601 | macros/latex-dev/required/latex-lab/latex-lab.ins
+2024/02/14 | 8891 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx
+2024/02/14 | 389702 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf
+2024/02/14 | 72603 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx
+2024/02/14 | 740461 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf
+2024/02/14 | 2453 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx
+2024/02/14 | 302442 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf
+2024/02/14 | 6266 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx
+2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf
+2024/02/14 | 7315 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx
+2024/02/14 | 280811 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf
+2024/02/14 | 2894 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx
+2024/02/14 | 234649 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf
+2024/02/14 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx
+2024/02/14 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf
+2024/02/14 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx
+2024/02/14 | 632196 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf
+2024/02/14 | 26699 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx
+2024/02/14 | 527096 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf
+2024/02/14 | 40120 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx
+2024/02/14 | 556861 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf
+2024/02/14 | 4819 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx
+2024/02/14 | 298373 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf
+2024/02/14 | 3674 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx
+2024/02/14 | 307812 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf
+2024/02/14 | 17010 | macros/latex-dev/required/latex-lab/latex-lab-title.dtx
+2024/02/14 | 348117 | macros/latex-dev/required/latex-lab/latex-lab-title.pdf
+2024/02/14 | 12805 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx
+2024/02/14 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx
+2024/02/14 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf
+2024/02/14 | 18465 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx
+2024/02/14 | 361081 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf
+2024/02/14 | 396814 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf
+2024/02/14 | 1156 | macros/latex-dev/required/latex-lab/README.md
+2024/02/14 | 12222080 | macros/latex-dev/required/latex-lab.zip
+2024/02/14 | 14075 | macros/latex-dev/required/tools/afterpage.dtx
+2024/02/14 | 2538 | macros/latex-dev/required/tools/afterpage.ins
+2024/02/14 | 198100 | macros/latex-dev/required/tools/afterpage.pdf
+2024/02/14 | 11749 | macros/latex-dev/required/tools/array-2016-10-06.sty
+2024/02/14 | 12559 | macros/latex-dev/required/tools/array-2020-02-10.sty
+2024/02/14 | 12667 | macros/latex-dev/required/tools/array-2023-11-01.sty
+2024/02/14 | 139685 | macros/latex-dev/required/tools/array.dtx
+2024/02/14 | 838028 | macros/latex-dev/required/tools/array.pdf
+2024/02/14 | 61642 | macros/latex-dev/required/tools/bm.dtx
+2024/02/14 | 2524 | macros/latex-dev/required/tools/bm.ins
+2024/02/14 | 323640 | macros/latex-dev/required/tools/bm.pdf
+2024/02/14 | 53167 | macros/latex-dev/required/tools/calc.dtx
+2024/02/14 | 370660 | macros/latex-dev/required/tools/calc.pdf
+2024/02/14 | 64838 | macros/latex-dev/required/tools/changes.txt
+2024/02/14 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx
+2024/02/14 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf
+2024/02/14 | 6789 | macros/latex-dev/required/tools/delarray.dtx
+2024/02/14 | 191058 | macros/latex-dev/required/tools/delarray.pdf
+2024/02/14 | 10637 | macros/latex-dev/required/tools/enumerate.dtx
+2024/02/14 | 215077 | macros/latex-dev/required/tools/enumerate.pdf
+2024/02/14 | 4959 | macros/latex-dev/required/tools/fileerr.dtx
+2024/02/14 | 187725 | macros/latex-dev/required/tools/fileerr.pdf
+2024/02/14 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx
+2024/02/14 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf
+2024/02/14 | 39697 | macros/latex-dev/required/tools/ftnright.dtx
+2024/02/14 | 387253 | macros/latex-dev/required/tools/ftnright.pdf
+2024/02/14 | 11148 | macros/latex-dev/required/tools/hhline.dtx
+2024/02/14 | 189678 | macros/latex-dev/required/tools/hhline.pdf
+2024/02/14 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx
+2024/02/14 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf
+2024/02/14 | 32047 | macros/latex-dev/required/tools/layout.dtx
+2024/02/14 | 260278 | macros/latex-dev/required/tools/layout.pdf
+2024/02/14 | 12133 | macros/latex-dev/required/tools/longtable-2020-01-07.sty
+2024/02/14 | 85710 | macros/latex-dev/required/tools/longtable.dtx
+2024/02/14 | 2538 | macros/latex-dev/required/tools/longtable.ins
+2024/02/14 | 400149 | macros/latex-dev/required/tools/longtable.pdf
+2024/02/14 | 3284 | macros/latex-dev/required/tools/manifest.txt
+2024/02/14 | 29712 | macros/latex-dev/required/tools/multicol-2017-04-11.sty
+2024/02/14 | 31646 | macros/latex-dev/required/tools/multicol-2019-10-01.sty
+2024/02/14 | 188163 | macros/latex-dev/required/tools/multicol.dtx
+2024/02/14 | 2576 | macros/latex-dev/required/tools/multicol.ins
+2024/02/14 | 524502 | macros/latex-dev/required/tools/multicol.pdf
+2024/02/14 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx
+2024/02/14 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf
+2024/02/14 | 1664 | macros/latex-dev/required/tools/README.md
+2024/02/14 | 9559 | macros/latex-dev/required/tools/shellesc.dtx
+2024/02/14 | 176171 | macros/latex-dev/required/tools/shellesc.pdf
+2024/02/14 | 8632 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty
+2024/02/14 | 30368 | macros/latex-dev/required/tools/showkeys.dtx
+2024/02/14 | 252684 | macros/latex-dev/required/tools/showkeys.pdf
+2024/02/14 | 5791 | macros/latex-dev/required/tools/somedefs.dtx
+2024/02/14 | 167583 | macros/latex-dev/required/tools/somedefs.pdf
+2024/02/14 | 37462 | macros/latex-dev/required/tools/tabularx.dtx
+2024/02/14 | 2535 | macros/latex-dev/required/tools/tabularx.ins
+2024/02/14 | 289601 | macros/latex-dev/required/tools/tabularx.pdf
+2024/02/14 | 43446 | macros/latex-dev/required/tools/theorem.dtx
+2024/02/14 | 351765 | macros/latex-dev/required/tools/theorem.pdf
+2024/02/14 | 5680 | macros/latex-dev/required/tools/tools.ins
+2024/02/14 | 73673 | macros/latex-dev/required/tools/tools-overview.pdf
+2024/02/14 | 5211 | macros/latex-dev/required/tools/tools-overview.tex
+2024/02/14 | 25146 | macros/latex-dev/required/tools/trace.dtx
+2024/02/14 | 222074 | macros/latex-dev/required/tools/trace.pdf
+2024/02/14 | 33863 | macros/latex-dev/required/tools/varioref-2016-02-16.sty
+2024/02/14 | 114350 | macros/latex-dev/required/tools/varioref.dtx
+2024/02/14 | 2531 | macros/latex-dev/required/tools/varioref.ins
+2024/02/14 | 393134 | macros/latex-dev/required/tools/varioref.pdf
+2024/02/14 | 72911 | macros/latex-dev/required/tools/verbatim.dtx
+2024/02/14 | 331587 | macros/latex-dev/required/tools/verbatim.pdf
+2024/02/14 | 6219 | macros/latex-dev/required/tools/xr.dtx
+2024/02/14 | 170451 | macros/latex-dev/required/tools/xr.pdf
+2024/02/14 | 17856 | macros/latex-dev/required/tools/xspace.dtx
+2024/02/14 | 257027 | macros/latex-dev/required/tools/xspace.pdf
+2024/02/14 | 7586835 | macros/latex-dev/required/tools.zip
1999/05/03 | 8998 | macros/latex/exptl/delimtxt/delimtxt.dtx
1999/03/28 | 143 | macros/latex/exptl/delimtxt/delimtxt.ins
2006/03/21 | 55074 | macros/latex/exptl/delimtxt/delimtxt.pdf
@@ -260330,15 +260347,15 @@
2007/07/13 | 9394 | macros/omega/latex/contrib/tamil-omega/yudit/Tamil2.my
2007/07/13 | 11462 | macros/omega/latex/contrib/tamil-omega/yudit/yudit.properties
2007/12/12 | 900761 | macros/omega/latex/contrib/tamil-omega.zip
-2023/06/25 | 6948 | macros/optex/base/alloc.opm
-2023/11/11 | 6717 | macros/optex/base/basic-macros.opm
+2023/12/10 | 6949 | macros/optex/base/alloc.opm
+2023/12/15 | 6717 | macros/optex/base/basic-macros.opm
2023/09/15 | 35427 | macros/optex/base/bib-iso690.opm
2023/09/15 | 6522 | macros/optex/base/bib-simple.opm
2023/06/03 | 13902 | macros/optex/base/cite-bib.opm
2023/09/28 | 20447 | macros/optex/base/colors.opm
-2022/12/11 | 15909 | macros/optex/base/doc.opm
+2023/12/10 | 15920 | macros/optex/base/doc.opm
2021/04/22 | 657 | macros/optex/base/f-adventor.opm
-2023/11/07 | 14021 | macros/optex/base/fams-ini.opm
+2024/01/10 | 14394 | macros/optex/base/fams-ini.opm
2021/04/22 | 1156 | macros/optex/base/f-antt.opm
2022/05/02 | 652 | macros/optex/base/f-baskervald.opm
2021/04/22 | 665 | macros/optex/base/f-baskerville.opm
@@ -260354,9 +260371,11 @@
2023/03/23 | 1089 | macros/optex/base/f-draftingmono.opm
2021/04/22 | 1265 | macros/optex/base/f-ebgaramond.opm
2023/02/11 | 971 | macros/optex/base/f-erewhon.opm
+2024/01/10 | 815 | macros/optex/base/f-fbb.opm
2023/03/08 | 2443 | macros/optex/base/f-fira.opm
2023/11/07 | 3072 | macros/optex/base/f-fraunces.opm
2021/04/22 | 882 | macros/optex/base/f-garamondl.opm
+2023/12/02 | 800 | macros/optex/base/f-gentium.opm
2021/04/22 | 635 | macros/optex/base/f-gfsbodoni.opm
2023/02/23 | 10980 | macros/optex/base/f-heros.opm
2023/05/29 | 655 | macros/optex/base/f-heuristica.opm
@@ -260372,16 +260391,16 @@
2021/04/27 | 1527 | macros/optex/base/f-libertinus.opm
2021/04/22 | 658 | macros/optex/base/f-librecaslon.opm
2021/01/07 | 1536 | macros/optex/base/f-lido.opm
-2023/05/12 | 8816 | macros/optex/base/f-lmfonts.opm
+2023/12/07 | 8816 | macros/optex/base/f-lmfonts.opm
2021/04/22 | 1200 | macros/optex/base/f-merriweather.opm
2022/07/11 | 1423 | macros/optex/base/f-montserrat.opm
2021/04/27 | 1337 | macros/optex/base/f-newcm.opm
2023/04/15 | 9058 | macros/optex/base/fnotes.opm
2023/06/06 | 679 | macros/optex/base/f-oldstandard.opm
2023/06/05 | 5291 | macros/optex/base/fonts-catalog.opm
-2022/02/22 | 9448 | macros/optex/base/fonts-opmac.opm
-2022/02/12 | 2423 | macros/optex/base/fonts-preload.opm
-2023/11/06 | 16749 | macros/optex/base/fonts-resize.opm
+2024/01/25 | 9686 | macros/optex/base/fonts-opmac.opm
+2023/12/11 | 2429 | macros/optex/base/fonts-preload.opm
+2024/02/12 | 16778 | macros/optex/base/fonts-resize.opm
2023/06/16 | 42783 | macros/optex/base/fonts-select.opm
2022/05/22 | 893 | macros/optex/base/f-overlock.opm
2021/04/22 | 694 | macros/optex/base/f-pagella.opm
@@ -260402,43 +260421,43 @@
2023/03/02 | 9677 | macros/optex/base/hi-syntax.opm
2023/10/25 | 3087 | macros/optex/base/hisyntax-python.opm
2021/01/07 | 1566 | macros/optex/base/hisyntax-tex.opm
-2023/04/27 | 9984 | macros/optex/base/hyperlinks.opm
-2023/10/17 | 16191 | macros/optex/base/if-macros.opm
-2023/10/31 | 5965 | macros/optex/base/keyval.opm
+2023/12/23 | 10016 | macros/optex/base/hyperlinks.opm
+2023/12/07 | 16251 | macros/optex/base/if-macros.opm
+2023/11/25 | 6672 | macros/optex/base/keyval.opm
2023/08/31 | 9237 | macros/optex/base/lang-data.opm
2023/09/19 | 16581 | macros/optex/base/lang-decl.opm
2022/11/18 | 7314 | macros/optex/base/languages.opm
2023/10/20 | 5428 | macros/optex/base/lists.opm
-2021/01/11 | 2377 | macros/optex/base/logos.opm
+2024/02/12 | 2928 | macros/optex/base/logos.opm
2021/04/06 | 7398 | macros/optex/base/luatex-ini.opm
2023/06/02 | 25765 | macros/optex/base/makeindex.opm
2023/05/01 | 6522 | macros/optex/base/maketoc.opm
-2023/05/01 | 5717 | macros/optex/base/margins.opm
+2023/12/15 | 5822 | macros/optex/base/margins.opm
2021/04/20 | 13569 | macros/optex/base/mathclass.opm
-2023/10/18 | 46628 | macros/optex/base/math-macros.opm
+2023/12/22 | 46814 | macros/optex/base/math-macros.opm
2023/07/03 | 11216 | macros/optex/base/math-preload.opm
-2023/01/24 | 17853 | macros/optex/base/more-macros.opm
+2024/02/10 | 19195 | macros/optex/base/more-macros.opm
2022/11/26 | 6505 | macros/optex/base/multicolumns.opm
-2023/11/12 | 4074 | macros/optex/base/optex.ini
+2024/02/14 | 4074 | macros/optex/base/optex.ini
2023/07/03 | 28327 | macros/optex/base/optex.lua
-2023/11/16 | 30539 | macros/optex/base/optex-tricks.opm
-2023/11/15 | 10692 | macros/optex/base/others.opm
+2024/02/14 | 31498 | macros/optex/base/optex-tricks.opm
+2024/02/13 | 10802 | macros/optex/base/others.opm
2022/11/25 | 4624 | macros/optex/base/outlines.opm
2023/04/29 | 11596 | macros/optex/base/output.opm
-2023/09/19 | 27426 | macros/optex/base/parameters.opm
+2023/12/10 | 27439 | macros/optex/base/parameters.opm
2022/10/29 | 5518 | macros/optex/base/pdfuni-string.opm
-2022/10/14 | 14785 | macros/optex/base/plain-macros.opm
-2023/05/11 | 18535 | macros/optex/base/prefixed.opm
+2023/12/15 | 15140 | macros/optex/base/plain-macros.opm
+2024/02/02 | 18838 | macros/optex/base/prefixed.opm
2022/06/09 | 2309 | macros/optex/base/print-unimath.opm
2023/10/26 | 5533 | macros/optex/base/references.opm
2022/08/30 | 6782 | macros/optex/base/ref-file.opm
-2023/05/02 | 21948 | macros/optex/base/sections.opm
-2022/12/11 | 13009 | macros/optex/base/slides.opm
-2022/01/13 | 2754 | macros/optex/base/styles.opm
+2024/01/19 | 22498 | macros/optex/base/sections.opm
+2024/01/18 | 13009 | macros/optex/base/slides.opm
+2024/01/18 | 2754 | macros/optex/base/styles.opm
2023/06/27 | 28077 | macros/optex/base/table.opm
2022/02/05 | 122830 | macros/optex/base/uni-lcuc.opm
-2023/01/17 | 26493 | macros/optex/base/unimath-codes.opm
-2023/09/03 | 16622 | macros/optex/base/unimath-macros.opm
+2023/12/23 | 26522 | macros/optex/base/unimath-codes.opm
+2023/12/22 | 16751 | macros/optex/base/unimath-macros.opm
2022/02/08 | 241449 | macros/optex/base/unimath-table.opm
2023/06/25 | 30123 | macros/optex/base/usebib.opm
2022/10/29 | 17666 | macros/optex/base/verbatim.opm
@@ -260447,29 +260466,30 @@
2021/01/07 | 1192 | macros/optex/demo/op-letter-cs.tex
2021/01/07 | 573 | macros/optex/demo/op-letter-en.tex
2023/08/31 | 2801 | macros/optex/demo/op-letter-he.tex
-2021/04/08 | 8265 | macros/optex/demo/op-mathalign.tex
+2024/02/12 | 8267 | macros/optex/demo/op-mathalign.tex
2020/05/16 | 512984 | macros/optex/demo/op-ring.png
2020/05/17 | 62385 | macros/optex/demo/op-slides-bg.png
2023/09/19 | 10349 | macros/optex/demo/op-slides.tex
2023/08/01 | 34625 | macros/optex/doc/omls.tex
2020/05/16 | 1460 | macros/optex/doc/optex.1
-2023/11/16 | 1585608 | macros/optex/doc/optex-doc.pdf
-2023/11/12 | 4516 | macros/optex/doc/optex-doc.tex
+2024/02/14 | 1907216 | macros/optex/doc/optex-doc.pdf
+2024/02/14 | 5134 | macros/optex/doc/optex-doc.tex
2023/04/15 | 70994 | macros/optex/doc/optex-math.tex
-2022/11/22 | 8487 | macros/optex/doc/optex-techdoc.tex
-2023/11/15 | 94049 | macros/optex/doc/optex-userdoc.tex
+2023/12/09 | 8505 | macros/optex/doc/optex-techdoc.tex
+2024/02/13 | 94210 | macros/optex/doc/optex-userdoc.tex
+2023/12/23 | 4688 | macros/optex/doc/primitives.tex
2021/05/02 | 1949 | macros/optex/pkg/emoji.opm
2023/04/15 | 41931 | macros/optex/pkg/math.opm
2022/03/05 | 327 | macros/optex/pkg/minim-mp.opm
2023/11/02 | 7513 | macros/optex/pkg/minim.opm
2022/03/06 | 3196 | macros/optex/pkg/minim-pdf.opm
-2022/11/21 | 22083 | macros/optex/pkg/mte.opm
+2024/02/11 | 22087 | macros/optex/pkg/mte.opm
2022/02/19 | 1282 | macros/optex/pkg/plain-at.opm
2020/11/11 | 85045 | macros/optex/pkg/qrcode.opm
2023/03/04 | 5289 | macros/optex/pkg/tikz.opm
2023/06/23 | 7542 | macros/optex/pkg/vlna.opm
-2023/11/16 | 9775 | macros/optex/README
-2023/11/16 | 2628129 | macros/optex.zip
+2024/02/14 | 10016 | macros/optex/README
+2024/02/14 | 2916644 | macros/optex.zip
2024/01/08 | 732 | macros/pdftex/mptopdf/doc/context/scripts/mkii/mptopdf.man
2024/01/08 | 4557 | macros/pdftex/mptopdf/scripts/context/perl/mptopdf.pl
2024/01/08 | 21474 | macros/pdftex/mptopdf/tex/context/base/mkii/supp-mis.mkii
@@ -300667,10 +300687,10 @@
2015/09/07 | 43353 | support/texlog_extract/texlog_extract.pdf
2015/09/07 | 47810 | support/texlog_extract.zip
2022/10/14 | 19106 | support/texlogfilter/LICENSE
-2024/02/13 | 3040 | support/texlogfilter/README
-2024/02/13 | 12502 | support/texlogfilter/texlogfilter
-2024/02/13 | 3920 | support/texlogfilter/texlogfilter.html
-2024/02/13 | 13283 | support/texlogfilter.zip
+2024/02/14 | 3111 | support/texlogfilter/README
+2024/02/14 | 12655 | support/texlogfilter/texlogfilter
+2024/02/14 | 4000 | support/texlogfilter/texlogfilter.html
+2024/02/14 | 13356 | support/texlogfilter.zip
2024/01/15 | 35149 | support/texlogsieve/LICENCE.txt
2024/01/15 | 2810 | support/texlogsieve/README.md
2024/01/15 | 210170 | support/texlogsieve/texlogsieve
@@ -315956,7 +315976,7 @@
2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz
-2024/02/13 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69818.tar.xz
+2024/02/14 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69830.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz
2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz
@@ -315978,7 +315998,7 @@
2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz
-2024/02/13 | 114048 | systems/texlive/tlnet/archive/texlive-scripts.r69818.tar.xz
+2024/02/14 | 114016 | systems/texlive/tlnet/archive/texlive-scripts.r69830.tar.xz
2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz
2023/05/14 | 60312 | systems/texlive/tlnet/archive/texlive-scripts.windows.r67095.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz
@@ -317886,16 +317906,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2024/02/05 | 125030 | systems/texlive/tlnet/install-tl
-2024/02/13 | 5750361 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2024/02/13 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2024/02/13 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2024/02/14 | 5746636 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2024/02/14 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2024/02/14 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2023/05/13 | 5083 | systems/texlive/tlnet/install-tl-windows.bat
-2024/02/13 | 21031685 | systems/texlive/tlnet/install-tl-windows.exe
-2024/02/13 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2024/02/13 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2024/02/13 | 26035589 | systems/texlive/tlnet/install-tl.zip
-2024/02/13 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2024/02/13 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2024/02/14 | 21026355 | systems/texlive/tlnet/install-tl-windows.exe
+2024/02/14 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2024/02/14 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2024/02/14 | 26035553 | systems/texlive/tlnet/install-tl.zip
+2024/02/14 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2024/02/14 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2023/03/19 | 1229 | systems/texlive/tlnet/README.md
2023/03/19 | 0 | systems/texlive/tlnet/TEXLIVE_2023
2024/01/02 | 9011 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -317905,7 +317925,7 @@
2024/01/02 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2024/01/16 | 50726 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2024/02/13 | 7311 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2024/02/14 | 7219 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/12/13 | 226639 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe
2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt
@@ -317947,12 +317967,12 @@
2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2024/01/31 | 5840 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2024/02/13 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2024/02/13 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2024/02/14 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2024/02/14 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2024/01/31 | 87229 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2024/02/13 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2024/02/13 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2024/02/13 | 2547836 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2024/02/14 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2024/02/14 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2024/02/14 | 2545820 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2023/02/20 | 58928 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2023/06/11 | 42749 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2023/02/21 | 16138 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -320659,7 +320679,7 @@
2024/02/11 | 95286 | systems/texlive/tlnet/tlpkg/translations/fr.po
2024/02/11 | 88795 | systems/texlive/tlnet/tlpkg/translations/it.po
2024/02/11 | 63064 | systems/texlive/tlnet/tlpkg/translations/ja.po
-2024/02/13 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot
+2024/02/14 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot
2024/02/11 | 59155 | systems/texlive/tlnet/tlpkg/translations/nl.po
2024/02/11 | 68210 | systems/texlive/tlnet/tlpkg/translations/pl.po
2024/02/11 | 83641 | systems/texlive/tlnet/tlpkg/translations/pt_BR.po
@@ -329105,7 +329125,7 @@
2014/07/05 | 611 | systems/win32/yandy/README
2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz
2014/07/05 | 1012416 | systems/win32/yandy.zip
-2024/02/14 | 186 | timestamp
+2024/02/15 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index d094dcf2aa..e054588b8f 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 4e9dc847a2..80be2b611a 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,54 +1,611 @@
+2024/02/14 | 99 | macros/latex-dev/base/ltpara-code.tex
+2024/02/14 | 9935 | macros/latex-dev/base/ltnews21.tex
+2024/02/14 | 96 | macros/latex-dev/base/doc-code.tex
+2024/02/14 | 9559 | macros/latex-dev/required/tools/shellesc.dtx
+2024/02/14 | 9557 | macros/latex-dev/base/ltcntrl.dtx
+2024/02/14 | 9398 | macros/latex-dev/base/syntonly.dtx
+2024/02/14 | 9345 | macros/latex-dev/base/preload.dtx
+2024/02/14 | 93035 | macros/latex-dev/base/ltdefns.dtx
+2024/02/14 | 92294 | macros/latex-dev/base/utf8ienc.dtx
+2024/02/14 | 92269 | macros/latex-dev/base/lttemplates.dtx
+2024/02/14 | 9068 | macros/latex-dev/base/lppl-1-0.txt
+2024/02/14 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx
+2024/02/14 | 89727 | macros/latex-dev/base/slides.dtx
+2024/02/14 | 8970 | macros/latex-dev/base/ltnews17.tex
+2024/02/14 | 896 | macros/generic/lt3luabridge/README.md
+2024/02/14 | 8891 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx
+2024/02/14 | 87681 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx
+2024/02/14 | 8731 | macros/latex-dev/base/ltthm.dtx
+2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf
+2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/blocks-code.pdf
+2024/02/14 | 864 | biblio/bibtex/contrib/francais-bst/francaisbst.dbj
+2024/02/14 | 8632 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty
+2024/02/14 | 8626 | macros/latex-dev/base/oldlfont.dtx
+2024/02/14 | 85710 | macros/latex-dev/required/tools/longtable.dtx
+2024/02/14 | 84220 | macros/latex-dev/base/ltfssini.dtx
+2024/02/14 | 838028 | macros/latex-dev/required/tools/array.pdf
+2024/02/14 | 82917 | macros/latex-dev/base/ltfssbas.dtx
+2024/02/14 | 821580 | macros/latex-dev/base/ltshipout-code.pdf
+2024/02/14 | 815072 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf
+2024/02/14 | 809033 | macros/latex/contrib/huawei/huawei.pdf
+2024/02/14 | 80747 | macros/latex-dev/base/ltshipout.dtx
+2024/02/14 | 8051 | macros/latex-dev/base/ltnews.tex
+2024/02/14 | 803049 | macros/latex-dev/base/ltfilehook-code.pdf
+2024/02/14 | 7679515 | install/macros/latex-dev/required/latex-tools-dev.tds.zip
+2024/02/14 | 7653968 | graphics/pgf/contrib/pgf-periodictable.zip
+2024/02/14 | 7586835 | macros/latex-dev/required/tools.zip
+2024/02/14 | 758273 | macros/latex-dev/base/lthooks-doc.pdf
+2024/02/14 | 757049 | macros/latex-dev/base/doc.pdf
+2024/02/14 | 75392 | macros/latex-dev/base/ltluatex.dtx
+2024/02/14 | 7528 | macros/latex-dev/base/ltxguide.cls
+2024/02/14 | 752365 | macros/latex-dev/base/ltcmdhooks-code.pdf
+2024/02/14 | 75111 | macros/latex-dev/base/ltfssdcl.dtx
+2024/02/14 | 75109 | macros/latex-dev/base/ltmarks.dtx
+2024/02/14 | 7456869 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
+2024/02/14 | 741 | macros/latex/contrib/eolang/eolang.1
+2024/02/14 | 740461 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf
+2024/02/14 | 73673 | macros/latex-dev/required/tools/tools-overview.pdf
+2024/02/14 | 7315 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx
+2024/02/14 | 72911 | macros/latex-dev/required/tools/verbatim.dtx
+2024/02/14 | 72603 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx
+2024/02/14 | 72493 | macros/latex-dev/base/ltfsstrc.dtx
+2024/02/14 | 7248 | graphics/pgf/contrib/pgf-periodictable/myGroupColors.tex
+2024/02/14 | 7244 | macros/latex-dev/base/ltnews20.tex
+2024/02/14 | 7219 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2024/02/14 | 7216 | macros/latex-dev/base/exscale.dtx
+2024/02/14 | 7200 | macros/latex-dev/base/sample2e.tex
+2024/02/14 | 711767 | macros/latex-dev/base/ltmarks-code.pdf
+2024/02/14 | 7104 | macros/latex-dev/base/alltt.dtx
+2024/02/14 | 7029 | macros/latex-dev/base/ltnews13.tex
+2024/02/14 | 69441 | macros/latex-dev/base/clsguide-historic.tex
+2024/02/14 | 6911 | macros/latex-dev/base/source2edoc.cls
+2024/02/14 | 69002 | macros/latex-dev/base/ltpictur.dtx
+2024/02/14 | 68746 | macros/latex-dev/base/usrguide-historic.tex
+2024/02/14 | 6789 | macros/latex-dev/required/tools/delarray.dtx
+2024/02/14 | 677 | macros/latex/contrib/huawei/DEPENDS.txt
+2024/02/14 | 67672 | macros/latex-dev/base/ltcmdhooks.dtx
+2024/02/14 | 6760 | macros/latex-dev/base/slides.ins
+2024/02/14 | 67585 | macros/latex-dev/base/ltfilehook.dtx
+2024/02/14 | 672114 | macros/latex-dev/base/ltpara-code.pdf
+2024/02/14 | 6709 | macros/latex-dev/base/latexsym.dtx
+2024/02/14 | 6601 | macros/latex-dev/required/latex-lab/latex-lab.ins
+2024/02/14 | 65689 | macros/latex-dev/base/ltmiscen.dtx
+2024/02/14 | 64838 | macros/latex-dev/required/tools/changes.txt
+2024/02/14 | 64605 | macros/latex-dev/base/clsguide.tex
+2024/02/14 | 6424 | macros/latex-dev/base/ltnews14.tex
+2024/02/14 | 641 | macros/latex/contrib/eolang/eolang.bib
+2024/02/14 | 6357 | macros/latex-dev/base/newlfont.dtx
+2024/02/14 | 63280 | macros/latex-dev/base/letter.dtx
+2024/02/14 | 632196 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf
+2024/02/14 | 62897 | macros/latex-dev/base/ltfiles.dtx
+2024/02/14 | 6266 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx
+2024/02/14 | 6248 | macros/latex-dev/base/ltmeta.dtx
+2024/02/14 | 6239225 | macros/latex-dev/base/source2e.pdf
+2024/02/14 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex
+2024/02/14 | 6220 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx
+2024/02/14 | 62209 | macros/latex/contrib/eolang/eolang.dtx
+2024/02/14 | 6219 | macros/latex-dev/required/tools/xr.dtx
+2024/02/14 | 6202 | macros/latex-dev/base/latexrelease.ins
+2024/02/14 | 61642 | macros/latex-dev/required/tools/bm.dtx
+2024/02/14 | 6155 | macros/latex-dev/base/ltpar.dtx
+2024/02/14 | 60434 | macros/latex-dev/base/ltplain.dtx
+2024/02/14 | 60422 | macros/latex-dev/base/fontdef.dtx
+2024/02/14 | 598937 | macros/latex-dev/base/ltsockets-code.pdf
+2024/02/14 | 5986 | macros/latex-dev/base/ltnews15.tex
+2024/02/14 | 5859 | macros/latex-dev/base/ltidxglo.dtx
+2024/02/14 | 58548 | macros/latex-dev/base/ltfssaxes.dtx
+2024/02/14 | 5825 | macros/latex-dev/base/ltnews10.tex
+2024/02/14 | 5791 | macros/latex-dev/required/tools/somedefs.dtx
+2024/02/14 | 5775 | macros/latex-dev/base/ltnews16.tex
+2024/02/14 | 575242 | macros/latex-dev/base/ltmarks-doc.pdf
+2024/02/14 | 5746636 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2024/02/14 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx
+2024/02/14 | 5732 | macros/latex-dev/base/ltnews08.tex
+2024/02/14 | 5714 | macros/latex-dev/base/inputenc.ins
+2024/02/14 | 5699 | macros/latex-dev/base/ltnews05.tex
+2024/02/14 | 5691 | macros/latex-dev/base/ltnews27.tex
+2024/02/14 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx
+2024/02/14 | 5680 | macros/latex-dev/required/tools/tools.ins
+2024/02/14 | 5678 | macros/latex-dev/base/ltnews04.tex
+2024/02/14 | 567728 | macros/latex-dev/base/ltshipout-doc.pdf
+2024/02/14 | 563307 | macros/latex-dev/base/ltnews35.pdf
+2024/02/14 | 560294 | macros/latex-dev/base/classes.pdf
+2024/02/14 | 560037 | macros/latex-dev/base/ltpara-doc.pdf
+2024/02/14 | 5588 | macros/latex-dev/base/ltnews25.tex
+2024/02/14 | 5576 | macros/latex-dev/base/ltnews07.tex
+2024/02/14 | 5574 | macros/latex-dev/base/ltnews12.tex
+2024/02/14 | 557051 | macros/latex-dev/base/ltproperties-code.pdf
+2024/02/14 | 55687 | macros/latex-dev/base/ltfloat.dtx
+2024/02/14 | 556861 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf
+2024/02/14 | 5544 | macros/latex-dev/base/ltnews06.tex
+2024/02/14 | 5533 | biblio/bibtex/contrib/francais-bst/README.md
+2024/02/14 | 5529 | macros/latex-dev/base/ltnews11.tex
+2024/02/14 | 5509 | macros/latex-dev/base/graphpap.dtx
+2024/02/14 | 55017 | macros/latex-dev/base/usrguide.tex
+2024/02/14 | 54826 | macros/latex-dev/base/ltpara.dtx
+2024/02/14 | 548011 | macros/latex-dev/base/ltfilehook-doc.pdf
+2024/02/14 | 546540 | macros/latex-dev/base/ltnews32.pdf
+2024/02/14 | 5462 | macros/latex-dev/base/ltnews02.tex
+2024/02/14 | 5451 | macros/latex-dev/base/ltnews09.tex
+2024/02/14 | 5369 | macros/latex-dev/base/ltnews03.tex
+2024/02/14 | 53334 | macros/latex-dev/base/lb2.err
+2024/02/14 | 531721 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf
+2024/02/14 | 53167 | macros/latex-dev/required/tools/calc.dtx
+2024/02/14 | 52813 | macros/latex-dev/base/encguide.tex
+2024/02/14 | 5273 | macros/latex-dev/base/cmextra.ins
+2024/02/14 | 527096 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf
+2024/02/14 | 526688 | macros/latex-dev/base/ltnews31.pdf
+2024/02/14 | 5246 | macros/latex-dev/base/ltnews01.tex
+2024/02/14 | 524502 | macros/latex-dev/required/tools/multicol.pdf
+2024/02/14 | 523675 | macros/latex-dev/base/ltnews38.pdf
+2024/02/14 | 522757 | macros/latex-dev/base/ltnews33.pdf
+2024/02/14 | 5211 | macros/latex-dev/required/tools/tools-overview.tex
+2024/02/14 | 517934 | macros/latex-dev/base/ltnews36.pdf
+2024/02/14 | 517737 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf
+2024/02/14 | 517708 | macros/latex-dev/base/fntguide.pdf
+2024/02/14 | 5134 | macros/optex/doc/optex-doc.tex
+2024/02/14 | 512240 | macros/latex-dev/base/ltnews30.pdf
+2024/02/14 | 51163 | macros/latex-dev/base/ltfinal.dtx
+2024/02/14 | 508345 | macros/latex-dev/base/ltnews34.pdf
+2024/02/14 | 506365 | macros/latex-dev/base/docstrip.pdf
+2024/02/14 | 5041 | macros/latex-dev/base/latexsym.ins
+2024/02/14 | 500903 | macros/latex/contrib/jnuexam.zip
+2024/02/14 | 4981 | macros/latex/contrib/eolang/eolang.pl
+2024/02/14 | 4973 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx
+2024/02/14 | 497334 | macros/latex-dev/base/ltcmdhooks-doc.pdf
+2024/02/14 | 497075 | macros/generic/lt3luabridge/lt3luabridge.pdf
+2024/02/14 | 4959 | macros/latex-dev/required/tools/fileerr.dtx
+2024/02/14 | 494613 | macros/generic/lt3luabridge.zip
+2024/02/14 | 4945 | macros/latex-dev/base/lthyphen.dtx
+2024/02/14 | 49035 | macros/latex-dev/base/ltboxes.dtx
+2024/02/14 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2024/02/14 | 489795 | macros/latex-dev/base/clsguide.pdf
+2024/02/14 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2024/02/14 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2024/02/14 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2024/02/14 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2024/02/14 | 488 | macros/latex/contrib/eolang/DEPENDS.txt
+2024/02/14 | 485950 | macros/latex-dev/required/latex-lab/blocks-doc.pdf
+2024/02/14 | 483354 | macros/latex-dev/base/usrguide.pdf
+2024/02/14 | 4819 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx
+2024/02/14 | 481774 | macros/latex-dev/base/ltsockets-doc.pdf
+2024/02/14 | 47896 | macros/latex-dev/base/lttab.dtx
+2024/02/14 | 47687 | macros/latex/contrib/eolang/cactus.pdf
+2024/02/14 | 4757 | macros/latex-dev/base/ltlength.dtx
+2024/02/14 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot
+2024/02/14 | 473345 | macros/latex-dev/base/ltnews39.pdf
+2024/02/14 | 47308 | macros/latex-dev/base/ltspace.dtx
+2024/02/14 | 456933 | macros/latex-dev/base/ltnews37.pdf
+2024/02/14 | 455437 | macros/latex-dev/base/ltnews29.pdf
+2024/02/14 | 45347 | macros/latex-dev/base/latexrelease.dtx
+2024/02/14 | 44531 | macros/latex-dev/base/cmfonts.fdd
+2024/02/14 | 44328 | macros/latex-dev/base/tlc3.err
+2024/02/14 | 44296835 | install/macros/latex-dev/latex-base-dev.tds.zip
+2024/02/14 | 439393 | macros/latex-dev/base/usrguide-historic.pdf
+2024/02/14 | 4390 | macros/latex-dev/base/ec.ins
+2024/02/14 | 43765 | biblio/bibtex/contrib/francais-bst/francais-bst.pdf
+2024/02/14 | 43697199 | macros/latex-dev/base.zip
+2024/02/14 | 43446 | macros/latex-dev/required/tools/theorem.dtx
+2024/02/14 | 4324 | macros/latex-dev/base/cmfonts.ins
+2024/02/14 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69830.tar.xz
+2024/02/14 | 432129 | macros/latex-dev/base/ltproperties-doc.pdf
+2024/02/14 | 4298 | macros/latex-dev/base/ltalloc.dtx
+2024/02/14 | 4273 | macros/latex-dev/base/docstrip.ins
+2024/02/14 | 42708 | macros/latex-dev/base/changes.old.txt
+2024/02/14 | 426817 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf
+2024/02/14 | 4254 | macros/latex-dev/base/newdc.ins
+2024/02/14 | 42287 | macros/latex-dev/base/ltmath.dtx
+2024/02/14 | 4219 | macros/latex-dev/base/latex209.ins
+2024/02/14 | 419214 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf
+2024/02/14 | 4190 | macros/latex-dev/base/ltnews19.tex
+2024/02/14 | 415956 | macros/latex-dev/base/clsguide-historic.pdf
+2024/02/14 | 4117477 | biblio/ctan-bibdata.zip
+2024/02/14 | 4087 | macros/latex-dev/base/classes.ins
+2024/02/14 | 408292 | macros/latex-dev/base/changes.txt
+2024/02/14 | 4079 | macros/latex-dev/base/lablst.tex
+2024/02/14 | 4074 | macros/optex/base/optex.ini
+2024/02/14 | 40120 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx
+2024/02/14 | 400149 | macros/latex-dev/required/tools/longtable.pdf
+2024/02/14 | 4000 | support/texlogfilter/texlogfilter.html
+2024/02/14 | 39839 | macros/latex-dev/base/ltnews18.pdf
+2024/02/14 | 39697 | macros/latex-dev/required/tools/ftnright.dtx
+2024/02/14 | 396814 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf
+2024/02/14 | 3960 | macros/latex-dev/base/olddc.ins
+2024/02/14 | 393134 | macros/latex-dev/required/tools/varioref.pdf
+2024/02/14 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf
+2024/02/14 | 389702 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf
+2024/02/14 | 38730 | macros/latex-dev/base/latex209.dtx
+2024/02/14 | 387253 | macros/latex-dev/required/tools/ftnright.pdf
+2024/02/14 | 383259 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf
+2024/02/14 | 38226 | macros/latex-dev/base/ltnews35.tex
+2024/02/14 | 379733 | macros/latex-dev/base/ltnews26.pdf
+2024/02/14 | 3781 | macros/latex-dev/base/tulm.ins
+2024/02/14 | 37710 | macros/latex-dev/base/ltsockets.dtx
+2024/02/14 | 376933 | macros/latex-dev/base/ltnews28.pdf
+2024/02/14 | 375493 | macros/latex-dev/base/slides.pdf
+2024/02/14 | 37462 | macros/latex-dev/required/tools/tabularx.dtx
+2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf
+2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf
+2024/02/14 | 3725 | macros/latex-dev/base/ltlogos.dtx
+2024/02/14 | 3708800 | biblio/ctan-bibdata/ctan.pdf
+2024/02/14 | 370660 | macros/latex-dev/required/tools/calc.pdf
+2024/02/14 | 3674 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx
+2024/02/14 | 36154 | macros/latex-dev/base/ltlists.dtx
+2024/02/14 | 361081 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf
+2024/02/14 | 36003 | macros/latex-dev/base/ltdirchk.dtx
+2024/02/14 | 353399 | macros/latex-dev/base/utf8ienc.pdf
+2024/02/14 | 351765 | macros/latex-dev/required/tools/theorem.pdf
+2024/02/14 | 348117 | macros/latex-dev/required/latex-lab/latex-lab-title.pdf
+2024/02/14 | 345764 | macros/latex-dev/base/tlc3.pdf
+2024/02/14 | 34457 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx
+2024/02/14 | 3434 | macros/latex-dev/base/makeindx.ins
+2024/02/14 | 3401 | macros/latex-dev/base/proc.ins
+2024/02/14 | 33946 | macros/latex-dev/base/ltsect.dtx
+2024/02/14 | 33911 | macros/latex-dev/base/ltnews33.tex
+2024/02/14 | 33863 | macros/latex-dev/required/tools/varioref-2016-02-16.sty
+2024/02/14 | 337772 | macros/latex-dev/base/letter.pdf
+2024/02/14 | 3372 | macros/latex-dev/base/letter.ins
+2024/02/14 | 3367 | macros/latex-dev/base/ltoutenc.ins
+2024/02/14 | 33660 | macros/latex/contrib/huawei/huawei.dtx
+2024/02/14 | 33439 | macros/latex-dev/base/ltproperties.dtx
+2024/02/14 | 3338 | macros/latex-dev/base/exscale.ins
+2024/02/14 | 33243 | macros/latex-dev/base/ltnews32.tex
+2024/02/14 | 331587 | macros/latex-dev/required/tools/verbatim.pdf
+2024/02/14 | 33083 | macros/latex-dev/base/ltnews37.tex
+2024/02/14 | 3284 | macros/latex-dev/required/tools/manifest.txt
+2024/02/14 | 3282 | macros/latex-dev/base/bugs.txt
+2024/02/14 | 325142 | macros/latex-dev/base/ltluatex.pdf
+2024/02/14 | 323640 | macros/latex-dev/required/tools/bm.pdf
+2024/02/14 | 32331 | macros/latex-dev/base/ltnews34.tex
+2024/02/14 | 32047 | macros/latex-dev/required/tools/layout.dtx
+2024/02/14 | 318372 | macros/latex-dev/base/inputenc.pdf
+2024/02/14 | 3181 | macros/latex-dev/base/unpack.ins
+2024/02/14 | 318193 | macros/latex-dev/base/ltnews20.pdf
+2024/02/14 | 318026 | macros/latex-dev/base/ltnews22.pdf
+2024/02/14 | 31646 | macros/latex-dev/required/tools/multicol-2019-10-01.sty
+2024/02/14 | 31498 | macros/optex/base/optex-tricks.opm
+2024/02/14 | 3111 | support/texlogfilter/README
+2024/02/14 | 3100 | macros/latex-dev/base/README.md
+2024/02/14 | 307812 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf
+2024/02/14 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty
+2024/02/14 | 304559 | macros/latex-dev/base/lthooks.dtx
+2024/02/14 | 30452 | macros/latex-dev/base/ltnews31.tex
+2024/02/14 | 30368 | macros/latex-dev/required/tools/showkeys.dtx
+2024/02/14 | 302442 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf
+2024/02/14 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty
+2024/02/14 | 298373 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf
+2024/02/14 | 29712 | macros/latex-dev/required/tools/multicol-2017-04-11.sty
+2024/02/14 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf
+2024/02/14 | 29270 | macros/latex-dev/base/ltfntcmd.dtx
+2024/02/14 | 292600 | macros/latex-dev/base/cmfonts.pdf
+2024/02/14 | 2916644 | macros/optex.zip
+2024/02/14 | 291143 | macros/latex-dev/base/tlc2.pdf
+2024/02/14 | 2896 | macros/latex-dev/base/syntonly.ins
+2024/02/14 | 289601 | macros/latex-dev/required/tools/tabularx.pdf
+2024/02/14 | 2894 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx
+2024/02/14 | 2893 | macros/latex-dev/base/nfssfont.ins
+2024/02/14 | 2892 | macros/latex-dev/base/graphpap.ins
+2024/02/14 | 2892 | macros/latex-dev/base/fix-cm.ins
+2024/02/14 | 2890 | macros/latex-dev/base/alltt.ins
+2024/02/14 | 2888 | macros/latex-dev/base/ifthen.ins
+2024/02/14 | 287727 | macros/latex-dev/base/fix-cm.pdf
+2024/02/14 | 286824 | macros/latex-dev/base/ltnews23.pdf
+2024/02/14 | 2847464 | biblio/ctan-bibdata/ctan.bib
+2024/02/14 | 282095 | macros/latex-dev/base/latexrelease.pdf
+2024/02/14 | 280811 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf
+2024/02/14 | 2778 | graphics/pgf/contrib/pgf-periodictable/README
+2024/02/14 | 273812 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf
+2024/02/14 | 2728 | macros/latex-dev/base/ltpageno.dtx
+2024/02/14 | 27122 | macros/latex-dev/base/ltxcheck.tex
+2024/02/14 | 27069 | macros/latex-dev/base/lterror.dtx
+2024/02/14 | 2705 | macros/latex-dev/base/idx.tex
+2024/02/14 | 26699 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx
+2024/02/14 | 265497 | macros/latex-dev/base/ltnews24.pdf
+2024/02/14 | 264168 | macros/latex-dev/base/cfgguide.pdf
+2024/02/14 | 2628 | macros/latex/contrib/eolang/eolang.ins
+2024/02/14 | 2626 | macros/latex/contrib/huawei/huawei.ins
+2024/02/14 | 26035553 | systems/texlive/tlnet/install-tl.zip
+2024/02/14 | 260278 | macros/latex-dev/required/tools/layout.pdf
+2024/02/14 | 257825 | macros/latex-dev/base/modguide.pdf
+2024/02/14 | 2576 | macros/latex-dev/required/tools/multicol.ins
+2024/02/14 | 257359 | macros/latex-dev/base/cyrguide.pdf
+2024/02/14 | 257027 | macros/latex-dev/required/tools/xspace.pdf
+2024/02/14 | 25598 | macros/latex-dev/base/ltnews39.tex
+2024/02/14 | 2545820 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2024/02/14 | 253 | macros/generic/lt3luabridge/lt3luabridge.ins
+2024/02/14 | 2538 | macros/latex-dev/required/tools/longtable.ins
+2024/02/14 | 2538 | macros/latex-dev/required/tools/afterpage.ins
+2024/02/14 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf
+2024/02/14 | 2535 | macros/latex-dev/required/tools/tabularx.ins
+2024/02/14 | 2531 | macros/latex-dev/required/tools/varioref.ins
+2024/02/14 | 253116 | macros/latex-dev/base/lb2.pdf
+2024/02/14 | 252684 | macros/latex-dev/required/tools/showkeys.pdf
+2024/02/14 | 2524 | macros/latex-dev/required/tools/bm.ins
+2024/02/14 | 25146 | macros/latex-dev/required/tools/trace.dtx
+2024/02/14 | 251283 | macros/latex-dev/base/ltnews27.pdf
+2024/02/14 | 24869 | macros/latex-dev/base/ltcounts.dtx
+2024/02/14 | 24793 | macros/latex-dev/base/lttagging.dtx
+2024/02/14 | 2453 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx
+2024/02/14 | 245228 | macros/latex-dev/base/ltnews21.pdf
+2024/02/14 | 244660 | biblio/bibtex/contrib/francais-bst/francais-bst.mbs
+2024/02/14 | 244141 | macros/latex-dev/base/ltxdoc.pdf
+2024/02/14 | 243 | macros/latex-dev/base/ltproperties-doc.tex
+2024/02/14 | 241 | macros/latex-dev/base/ltfilehook-doc.tex
+2024/02/14 | 241326 | macros/latex-dev/base/doc.dtx
+2024/02/14 | 240 | macros/latex-dev/base/ltsockets-doc.tex
+2024/02/14 | 240 | macros/latex-dev/base/ltshipout-doc.tex
+2024/02/14 | 238 | macros/latex-dev/base/ltmarks-doc.tex
+2024/02/14 | 238 | macros/latex-dev/base/lthooks-doc.tex
+2024/02/14 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex
+2024/02/14 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx
+2024/02/14 | 23646 | macros/latex-dev/base/ltnews30.tex
+2024/02/14 | 23516 | macros/latex-dev/base/fix-cm.dtx
+2024/02/14 | 234 | macros/latex-dev/base/ltpara-doc.tex
+2024/02/14 | 234649 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf
+2024/02/14 | 233905 | macros/latex-dev/base/slifonts.pdf
+2024/02/14 | 23386 | macros/latex-dev/base/lppl.tex
+2024/02/14 | 22946 | macros/latex-dev/base/ltnews38.tex
+2024/02/14 | 22822 | macros/latex-dev/base/ltxdoc.dtx
+2024/02/14 | 22723 | macros/latex-dev/base/cfgguide.tex
+2024/02/14 | 227065 | macros/latex-dev/base/proc.pdf
+2024/02/14 | 225936 | macros/latex-dev/base/ltnews19.pdf
+2024/02/14 | 223861 | macros/latex-dev/base/alltt.pdf
+2024/02/14 | 222074 | macros/latex-dev/required/tools/trace.pdf
+2024/02/14 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx
+2024/02/14 | 221219 | macros/latex-dev/base/ifthen.pdf
+2024/02/14 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf
+2024/02/14 | 219358 | macros/latex-dev/base/ltx3info.pdf
+2024/02/14 | 21882 | macros/latex-dev/base/ltxref.dtx
+2024/02/14 | 217 | macros/generic/lt3luabridge/example.latex
+2024/02/14 | 217659 | macros/latex-dev/base/lgc2.pdf
+2024/02/14 | 215077 | macros/latex-dev/required/tools/enumerate.pdf
+2024/02/14 | 21488 | macros/latex-dev/base/ltnews.cls
+2024/02/14 | 21229 | macros/latex-dev/base/lgc2.err
+2024/02/14 | 211314 | macros/latex-dev/base/nfssfont.pdf
+2024/02/14 | 21026355 | systems/texlive/tlnet/install-tl-windows.exe
+2024/02/14 | 20674 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx
+2024/02/14 | 205100 | macros/latex-dev/base/ltnews25.pdf
+2024/02/14 | 204708 | macros/latex-dev/base/exscale.pdf
+2024/02/14 | 20122 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
+2024/02/14 | 200759 | macros/latex-dev/base/latexsym.pdf
+2024/02/14 | 20011 | macros/latex-dev/base/ltkeys.dtx
+2024/02/14 | 19892 | graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
+2024/02/14 | 198100 | macros/latex-dev/required/tools/afterpage.pdf
+2024/02/14 | 19533 | macros/latex-dev/base/ltexpl.dtx
+2024/02/14 | 1941 | macros/latex-dev/base/minimal.cls
+2024/02/14 | 1940560 | macros/latex/contrib/eolang/eolang.pdf
+2024/02/14 | 1940056 | macros/latex/contrib/eolang.zip
+2024/02/14 | 19333 | macros/latex-dev/base/ltnews36.tex
+2024/02/14 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2024/02/14 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex
+2024/02/14 | 19105 | macros/generic/lt3luabridge/LICENSE
+2024/02/14 | 191058 | macros/latex-dev/required/tools/delarray.pdf
+2024/02/14 | 1907216 | macros/optex/doc/optex-doc.pdf
+2024/02/14 | 19040 | macros/latex-dev/base/lppl.txt
+2024/02/14 | 189678 | macros/latex-dev/required/tools/hhline.pdf
+2024/02/14 | 18944 | macros/latex-dev/base/ltnews29.tex
+2024/02/14 | 189440 | macros/latex-dev/base/syntonly.pdf
+2024/02/14 | 188163 | macros/latex-dev/required/tools/multicol.dtx
+2024/02/14 | 188047 | macros/latex-dev/base/ltcmd.dtx
+2024/02/14 | 187725 | macros/latex-dev/required/tools/fileerr.pdf
+2024/02/14 | 18753 | macros/latex-dev/base/ifthen.dtx
+2024/02/14 | 18618 | biblio/bibtex/contrib/francais-bst/francaissc.dbj
+2024/02/14 | 18612 | biblio/bibtex/contrib/francais-bst/francais.dbj
+2024/02/14 | 18465 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx
+2024/02/14 | 18401 | macros/latex-dev/base/nfssfont.dtx
+2024/02/14 | 18299 | macros/latex-dev/base/ltx3info.tex
+2024/02/14 | 182483 | macros/latex-dev/base/ltnews13.pdf
+2024/02/14 | 181 | macros/generic/lt3luabridge/example.context
+2024/02/14 | 18102 | CTAN.sites
+2024/02/14 | 17978 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx
+2024/02/14 | 17856 | macros/latex-dev/required/tools/xspace.dtx
+2024/02/14 | 178567 | macros/latex-dev/base/ltoutput.dtx
+2024/02/14 | 17782 | macros/latex-dev/base/cyrguide.tex
+2024/02/14 | 176171 | macros/latex-dev/required/tools/shellesc.pdf
+2024/02/14 | 175211 | macros/latex-dev/base/ltnews05.pdf
+2024/02/14 | 1749530 | macros/latex/contrib/l3packages.zip
+2024/02/14 | 17389 | macros/latex-dev/base/ltbibl.dtx
+2024/02/14 | 173013 | macros/latex-dev/base/tlc2.err
+2024/02/14 | 171410 | macros/latex-dev/base/docstrip.dtx
+2024/02/14 | 170876 | macros/latex-dev/base/lamport-manual.pdf
+2024/02/14 | 170722 | macros/latex-dev/base/ltnews14.pdf
+2024/02/14 | 170451 | macros/latex-dev/required/tools/xr.pdf
+2024/02/14 | 17010 | macros/latex-dev/required/latex-lab/latex-lab-title.dtx
+2024/02/14 | 169553 | macros/latex-dev/base/ltnews01.pdf
+2024/02/14 | 1694 | macros/latex-dev/base/small2e.tex
+2024/02/14 | 169433 | macros/latex-dev/base/ltnews10.pdf
+2024/02/14 | 167 | macros/generic/lt3luabridge/example.plaintex
+2024/02/14 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2024/02/14 | 167583 | macros/latex-dev/required/tools/somedefs.pdf
+2024/02/14 | 1664 | macros/latex-dev/required/tools/README.md
+2024/02/14 | 166269 | macros/latex-dev/base/ltnews17.pdf
+2024/02/14 | 165816 | macros/latex-dev/base/makeindx.pdf
+2024/02/14 | 16500 | macros/latex-dev/base/modguide.tex
+2024/02/14 | 1632 | macros/latex/contrib/huawei/README.md
+2024/02/14 | 162773 | macros/latex-dev/base/tulm.pdf
+2024/02/14 | 161722 | macros/latex-dev/base/graphpap.pdf
+2024/02/14 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf
+2024/02/14 | 15693 | macros/latex-dev/base/slifonts.fdd
+2024/02/14 | 156764 | macros/latex-dev/base/ltnews12.pdf
+2024/02/14 | 156260 | macros/latex-dev/base/classes.dtx
+2024/02/14 | 155442 | macros/latex-dev/base/ltnews08.pdf
+2024/02/14 | 15479 | macros/latex-dev/base/source2e.tex
+2024/02/14 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2024/02/14 | 15384 | macros/latex-dev/base/ltvers.dtx
+2024/02/14 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2024/02/14 | 152551 | macros/latex-dev/base/ltnews04.pdf
+2024/02/14 | 151773 | macros/latex-dev/base/ltnews02.pdf
+2024/02/14 | 151324 | macros/latex-dev/base/ltnews03.pdf
+2024/02/14 | 15047 | macros/latex-dev/base/ltnews28.tex
+2024/02/14 | 14878 | macros/generic/lt3luabridge/lt3luabridge.dtx
+2024/02/14 | 148564 | macros/latex-dev/base/ltoutenc.dtx
+2024/02/14 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf
+2024/02/14 | 146197 | macros/latex-dev/base/webcomp.pdf
+2024/02/14 | 146153 | macros/latex-dev/base/ltclass.dtx
+2024/02/14 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2024/02/14 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2024/02/14 | 14421 | macros/latex-dev/base/lppl-1-2.txt
+2024/02/14 | 14373 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx
+2024/02/14 | 14341 | macros/latex-dev/base/lppl-1-1.txt
+2024/02/14 | 142867 | macros/latex-dev/base/ltnews06.pdf
+2024/02/14 | 14091 | macros/latex-dev/base/ltpage.dtx
+2024/02/14 | 14075 | macros/latex-dev/required/tools/afterpage.dtx
+2024/02/14 | 14046736 | macros/latex/contrib/l3kernel.zip
+2024/02/14 | 139685 | macros/latex-dev/required/tools/array.dtx
+2024/02/14 | 1390205 | macros/latex-dev/base/ltnews.pdf
+2024/02/14 | 1389 | macros/generic/lt3luabridge/docstrip.cfg
+2024/02/14 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf
+2024/02/14 | 138214 | macros/latex-dev/base/ltnews07.pdf
+2024/02/14 | 138107 | macros/latex-dev/base/ltnews16.pdf
+2024/02/14 | 13759 | macros/latex-dev/base/lamport-manual.err
+2024/02/14 | 136797 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx
+2024/02/14 | 13589 | macros/latex-dev/base/proc.dtx
+2024/02/14 | 1341 | macros/latex-dev/base/ltnews18.tex
+2024/02/14 | 13356 | support/texlogfilter.zip
+2024/02/14 | 133094 | install/biblio/bibtex/contrib/francais-bst.tds.zip
+2024/02/14 | 132370 | macros/latex-dev/base/lppl.pdf
+2024/02/14 | 1318576 | macros/latex-dev/base/encguide.pdf
+2024/02/14 | 1315 | macros/latex/contrib/eolang/README.md
+2024/02/14 | 130328 | macros/latex-dev/base/ltnews15.pdf
+2024/02/14 | 130028 | macros/latex-dev/base/ltnews09.pdf
+2024/02/14 | 12805 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx
+2024/02/14 | 1279 | macros/latex-dev/base/legal.txt
+2024/02/14 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx
+2024/02/14 | 12667 | macros/latex-dev/required/tools/array-2023-11-01.sty
+2024/02/14 | 12655 | support/texlogfilter/texlogfilter
+2024/02/14 | 12559 | macros/latex-dev/required/tools/array-2020-02-10.sty
+2024/02/14 | 12520 | macros/latex-dev/base/testpage.tex
+2024/02/14 | 1248644 | macros/latex-dev/base/lthooks-code.pdf
+2024/02/14 | 12334 | macros/latex-dev/base/ltnews24.tex
+2024/02/14 | 12314341 | install/macros/latex-dev/required/latex-lab-dev.tds.zip
+2024/02/14 | 12246 | macros/latex-dev/base/tulm.fdd
+2024/02/14 | 12222080 | macros/latex-dev/required/latex-lab.zip
+2024/02/14 | 12133 | macros/latex-dev/required/tools/longtable-2020-01-07.sty
+2024/02/14 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex
+2024/02/14 | 11749 | macros/latex-dev/required/tools/array-2016-10-06.sty
+2024/02/14 | 1156 | macros/latex-dev/required/latex-lab/README.md
+2024/02/14 | 115236 | biblio/bibtex/contrib/francais-bst.zip
+2024/02/14 | 11463 | macros/latex-dev/base/manifest.txt
+2024/02/14 | 114350 | macros/latex-dev/required/tools/varioref.dtx
+2024/02/14 | 114225 | macros/latex-dev/base/lttextcomp.dtx
+2024/02/14 | 114016 | systems/texlive/tlnet/archive/texlive-scripts.r69830.tar.xz
+2024/02/14 | 112208 | macros/latex-dev/base/ltnews11.pdf
+2024/02/14 | 11148 | macros/latex-dev/required/tools/hhline.dtx
+2024/02/14 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex
+2024/02/14 | 1083 | macros/latex/contrib/huawei/LICENSE.txt
+2024/02/14 | 1083 | macros/latex/contrib/eolang/LICENSE.txt
+2024/02/14 | 108248 | macros/latex-dev/base/fntguide.tex
+2024/02/14 | 107 | macros/latex-dev/base/ltproperties-code.tex
+2024/02/14 | 10798 | macros/latex-dev/base/ltnews26.tex
+2024/02/14 | 10792 | macros/latex-dev/base/ltnews22.tex
+2024/02/14 | 10791 | macros/latex-dev/base/ltnews23.tex
+2024/02/14 | 1078428 | macros/latex-dev/base/doc-code.pdf
+2024/02/14 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx
+2024/02/14 | 106906 | macros/latex-dev/base/inputenc.dtx
+2024/02/14 | 10637 | macros/latex-dev/required/tools/enumerate.dtx
+2024/02/14 | 10601 | macros/latex-dev/base/makeindx.dtx
+2024/02/14 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex
+2024/02/14 | 105 | macros/latex-dev/base/ltfilehook-code.tex
+2024/02/14 | 1051694 | macros/latex/contrib/huawei.zip
+2024/02/14 | 104 | macros/latex-dev/base/ltsockets-code.tex
+2024/02/14 | 104 | macros/latex-dev/base/ltshipout-code.tex
+2024/02/14 | 10404 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
+2024/02/14 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex
+2024/02/14 | 10370 | macros/latex-dev/base/ltfsscmp.dtx
+2024/02/14 | 102 | macros/latex-dev/base/ltmarks-code.tex
+2024/02/14 | 102 | macros/latex-dev/base/lthooks-code.tex
+2024/02/14 | 10247 | macros/latex-dev/base/webcomp.err
+2024/02/14 | 10215 | macros/latex-dev/required/latex-lab/changes.txt
+2024/02/14 | 10072 | macros/latex-dev/base/format.ins
+2024/02/14 | 10016 | macros/optex/README
+2024/02/13 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
2024/02/13 | 984 | support/arara/scripts/rules/arara-rule-make.yaml
2024/02/13 | 97684 | systems/texlive/tlnet/archive/texinfo.r69818.tar.xz
2024/02/13 | 950 | support/arara/scripts/rules/arara-rule-gnuplot.yaml
2024/02/13 | 9466 | macros/unicodetex/latex/fontspec/fontspec-code-vars.dtx
+2024/02/13 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
+2024/02/13 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
+2024/02/13 | 94210 | macros/optex/doc/optex-userdoc.tex
2024/02/13 | 941616 | macros/latex/contrib/nicematrix/nicematrix.pdf
2024/02/13 | 9398 | macros/unicodetex/latex/fontspec/fontspec-code-feat-aat.dtx
2024/02/13 | 93819 | macros/latex/contrib/spbmark/spbmark.pdf
2024/02/13 | 9351 | macros/unicodetex/latex/fontspec/fontspec-doc-enc.tex
2024/02/13 | 9303 | macros/jptex/latex/jlreq/jlreq-trimmarks-ja.md
+2024/02/13 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx
+2024/02/13 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx
2024/02/13 | 915 | support/arara/scripts/rules/arara-rule-move.yaml
2024/02/13 | 911886 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
2024/02/13 | 910 | support/arara/scripts/rules/arara-rule-xindex.yaml
2024/02/13 | 9103 | macros/unicodetex/latex/fontspec/fontspec-doc-intro.tex
+2024/02/13 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx
+2024/02/13 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx
2024/02/13 | 878 | support/arara/scripts/rules/arara-rule-ghostscript.yaml
+2024/02/13 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx
2024/02/13 | 87630 | support/albatross/doc/albatross-manual.pdf
+2024/02/13 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
+2024/02/13 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
+2024/02/13 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty
2024/02/13 | 841 | support/arara/scripts/rules/arara-rule-tikzmake.yaml
2024/02/13 | 838 | support/arara/scripts/rules/arara-rule-biber.yaml
+2024/02/13 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx
2024/02/13 | 830 | support/arara/scripts/rules/arara-rule-nomencl.yaml
2024/02/13 | 8304 | macros/unicodetex/latex/fontspec/fontspec-code-msg.dtx
+2024/02/13 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx
+2024/02/13 | 82731 | macros/latex/contrib/l3kernel/l3prefixes.pdf
+2024/02/13 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx
2024/02/13 | 822 | macros/latex/contrib/xfrac/README.md
2024/02/13 | 812 | support/arara/scripts/rules/arara-rule-songidx.yaml
2024/02/13 | 810 | support/arara/scripts/rules/arara-rule-dvipdfmx.yaml
2024/02/13 | 807 | support/arara/scripts/rules/arara-rule-ps2pdf.yaml
2024/02/13 | 806 | support/arara/scripts/rules/arara-rule-dvipdfm.yaml
+2024/02/13 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx
+2024/02/13 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex
2024/02/13 | 797 | support/arara/scripts/rules/arara-rule-dvips.yaml
2024/02/13 | 788 | support/arara/scripts/rules/arara-rule-copy.yaml
+2024/02/13 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx
+2024/02/13 | 7813 | macros/latex/contrib/l3packages/CHANGELOG.md
2024/02/13 | 7756 | macros/jptex/latex/jlreq/README.md
2024/02/13 | 7751 | macros/jptex/latex/jlreq/jlreq-trimmarks.md
+2024/02/13 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx
+2024/02/13 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx
2024/02/13 | 7603 | support/arara/doc/htmlmanualtopdf.sh
+2024/02/13 | 7574815 | macros/latex/contrib/l3kernel/source3.pdf
+2024/02/13 | 75547 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf
2024/02/13 | 7529 | macros/unicodetex/latex/fontspec/fontspec-doc-style.sty
+2024/02/13 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
+2024/02/13 | 7372 | macros/latex/contrib/l3packages/xfp.dtx
2024/02/13 | 732 | macros/unicodetex/latex/emotion/emotion.sty
-2024/02/13 | 7311 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2024/02/13 | 7233 | macros/unicodetex/latex/fontspec/fontspec-code-interfaces.dtx
+2024/02/13 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx
+2024/02/13 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx
+2024/02/13 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex
2024/02/13 | 680 | support/arara/scripts/rules/arara-rule-sketch.yaml
2024/02/13 | 672898 | macros/unicodetex/latex/fontspec/fontspec-code.pdf
+2024/02/13 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
2024/02/13 | 658541 | macros/latex/contrib/xfrac/xfrac.pdf
2024/02/13 | 6572 | macros/unicodetex/latex/fontspec/fontspec-code-scripts.dtx
2024/02/13 | 6541 | support/arara/doc/resources/manual.css
2024/02/13 | 650 | support/arara/scripts/rules/arara-rule-spix.yaml
2024/02/13 | 648838 | macros/latex/contrib/xfrac.zip
+2024/02/13 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
2024/02/13 | 647 | support/arara/scripts/rules/arara-rule-convert.yaml
2024/02/13 | 646 | support/arara/scripts/rules/arara-rule-makeglossarieslite.yaml
+2024/02/13 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex
+2024/02/13 | 6393 | macros/latex/contrib/l3kernel/l3.ins
+2024/02/13 | 62663 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
2024/02/13 | 625 | support/arara/scripts/rules/arara-rule-upbibtex.yaml
2024/02/13 | 623 | macros/latex/contrib/xfrac/CHANGELOG.md
2024/02/13 | 6238 | macros/unicodetex/latex/fontspec/fontspec-code-opening.dtx
+2024/02/13 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
2024/02/13 | 620 | support/arara/scripts/rules/arara-rule-bibtexu.yaml
2024/02/13 | 620 | support/arara/scripts/rules/arara-rule-bibtex8.yaml
2024/02/13 | 620649 | macros/jptex/latex/jlreq.zip
+2024/02/13 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty
+2024/02/13 | 610363 | macros/latex/contrib/l3kernel/expl3.pdf
2024/02/13 | 6049 | graphics/pgf/contrib/pictochrono/doc/pictochrono-doc.tex
2024/02/13 | 5 | support/arara/doc/resources/version.txt
2024/02/13 | 5 | support/albatross/doc/version.tex
+2024/02/13 | 59622 | macros/latex/contrib/l3packages/xparse.dtx
2024/02/13 | 595 | support/arara/scripts/rules/arara-rule-pbibtex.yaml
2024/02/13 | 591 | support/arara/scripts/rules/arara-rule-bibtex.yaml
2024/02/13 | 591860 | macros/latex/contrib/nicematrix/nicematrix-code.dtx
@@ -58,177 +615,256 @@
2024/02/13 | 578717 | macros/unicodetex/latex/fontspec/fontspec.pdf
2024/02/13 | 576 | support/arara/scripts/arara.sh
2024/02/13 | 576 | support/albatross/scripts/albatross.sh
-2024/02/13 | 5750361 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2024/02/13 | 57438 | macros/latex/contrib/l3kernel/CHANGELOG.md
+2024/02/13 | 565282 | macros/latex/contrib/l3kernel/l3doc.pdf
2024/02/13 | 549 | macros/unicodetex/latex/fontspec/fontspec.cfg
2024/02/13 | 546 | support/arara/scripts/rules/arara-rule-qpdf.yaml
+2024/02/13 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
2024/02/13 | 5420924 | support/albatross/scripts/albatross.jar
+2024/02/13 | 534182 | macros/latex/contrib/l3packages/xparse.pdf
+2024/02/13 | 53190 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf
+2024/02/13 | 5302 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex
2024/02/13 | 524840 | support/arara/doc/resources/firasans-italic.otf
2024/02/13 | 52445 | support/arara/doc/resources/arara-logo-with-text-bottom.svg
+2024/02/13 | 5241 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
2024/02/13 | 522236 | support/arara/doc/resources/firasans-lightitalic.otf
2024/02/13 | 521796 | support/arara/doc/resources/firasans-bold.otf
2024/02/13 | 5159812 | install/support/albatross.tds.zip
2024/02/13 | 5158188 | support/albatross.zip
2024/02/13 | 51469 | macros/jptex/latex/jlreq/README-ja.md
+2024/02/13 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
2024/02/13 | 50840 | macros/jptex/latex/jlreq/jlreq-trimmarks.sty
2024/02/13 | 507828 | support/arara/doc/resources/firasans-regular.otf
2024/02/13 | 5065 | macros/unicodetex/latex/fontspec/fontspec-code-xfss.dtx
2024/02/13 | 505308 | support/arara/doc/resources/firasans-light.otf
2024/02/13 | 4980 | support/arara/README.md
+2024/02/13 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
+2024/02/13 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty
2024/02/13 | 4971 | macros/unicodetex/latex/fontspec/fontspec-code-enc.dtx
-2024/02/13 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2024/02/13 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2024/02/13 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2024/02/13 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2024/02/13 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2024/02/13 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex
+2024/02/13 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
+2024/02/13 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx
+2024/02/13 | 4890 | macros/latex/contrib/l3kernel/l3news.tex
+2024/02/13 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx
2024/02/13 | 48897 | macros/jptex/latex/jlreq/jfm-jlreq.lua
-2024/02/13 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot
+2024/02/13 | 48372 | macros/latex/contrib/l3kernel/l3prefixes.csv
+2024/02/13 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
+2024/02/13 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
2024/02/13 | 470306 | macros/latex/contrib/verse.zip
2024/02/13 | 469138 | macros/latex/contrib/verse/verse.pdf
2024/02/13 | 460 | support/arara/scripts/rules/arara-rule-mkdir.yaml
2024/02/13 | 458 | support/arara/scripts/rules/arara-rule-rmdir.yaml
+2024/02/13 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx
+2024/02/13 | 448106 | macros/latex/contrib/l3packages/xtemplate.pdf
2024/02/13 | 44661 | macros/unicodetex/latex/fontspec/fontspec-doc-opentype.tex
2024/02/13 | 4404 | graphics/pgf/contrib/pictochrono/tex/pictochrono.sty
2024/02/13 | 432 | macros/unicodetex/latex/emotion/emotion.def
-2024/02/13 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69818.tar.xz
2024/02/13 | 4253 | support/arara/scripts/rules/arara-rule-context.yaml
2024/02/13 | 42249 | macros/unicodetex/latex/fontspec/fontspec-code-internal.dtx
+2024/02/13 | 41847 | macros/latex/contrib/l3kernel/l3debug.dtx
2024/02/13 | 4169 | macros/unicodetex/latex/fontspec/fontspec-doc-luatex.tex
-2024/02/13 | 4117312 | biblio/ctan-bibdata.zip
+2024/02/13 | 412717 | macros/latex/contrib/l3packages/l3keys2e.pdf
2024/02/13 | 4079 | macros/unicodetex/latex/fontspec/fontspec-code-fontload.dtx
2024/02/13 | 4074 | support/arara/scripts/rules/arara-rule-datatooltk.yaml
+2024/02/13 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx
2024/02/13 | 4010 | macros/unicodetex/latex/fontspec/fontspec-code-graphite.dtx
-2024/02/13 | 3920 | support/texlogfilter/texlogfilter.html
+2024/02/13 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf
+2024/02/13 | 3906 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
2024/02/13 | 38703 | macros/latex/contrib/xfrac/xfrac.dtx
2024/02/13 | 3843 | support/arara/doc/resources/gitlab-icon.svg
2024/02/13 | 383391 | macros/jptex/latex/jlreq/jlreq-ja.pdf
-2024/02/13 | 3708800 | biblio/ctan-bibdata/ctan.pdf
+2024/02/13 | 37950 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf
2024/02/13 | 36791 | macros/unicodetex/latex/emotion.zip
2024/02/13 | 3664 | macros/unicodetex/latex/fontspec/fontspec.dtx
+2024/02/13 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx
+2024/02/13 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx
+2024/02/13 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx
2024/02/13 | 35241 | support/albatross/doc/albatross-manual.tex
2024/02/13 | 342355 | macros/latex/contrib/exesheet/exesheet.pdf
+2024/02/13 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx
2024/02/13 | 335 | graphics/pgf/contrib/pictochrono/README.md
+2024/02/13 | 332421 | macros/latex/contrib/l3packages/xfp.pdf
2024/02/13 | 3251 | support/arara/scripts/rules/arara-rule-pdfcrop.yaml
+2024/02/13 | 32124 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf
2024/02/13 | 320 | support/arara/scripts/rules/arara-rule-halt.yaml
2024/02/13 | 31060 | macros/unicodetex/latex/fontspec/fontspec-doc-fontsel.tex
2024/02/13 | 3099 | macros/unicodetex/latex/fontspec/fontspec-lua.dtx
+2024/02/13 | 3078 | macros/latex/contrib/l3kernel/README.md
2024/02/13 | 30692 | macros/unicodetex/latex/fontspec/fontspec-doc-featset.tex
2024/02/13 | 30553 | macros/unicodetex/latex/emotion/doc/emotion-doc.pdf
-2024/02/13 | 3040 | support/texlogfilter/README
+2024/02/13 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx
+2024/02/13 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx
2024/02/13 | 3007 | macros/unicodetex/latex/emotion/doc/emotion-doc.tex
2024/02/13 | 3006687 | macros/latex/contrib/nicematrix.zip
2024/02/13 | 30051 | macros/unicodetex/latex/fontspec/fontspec-code-keyval.dtx
2024/02/13 | 300237 | macros/latex/contrib/exesheet.zip
2024/02/13 | 2990 | support/arara/scripts/rules/arara-rule-indent.yaml
+2024/02/13 | 29836 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
2024/02/13 | 29804 | support/albatross/README.md
+2024/02/13 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf
2024/02/13 | 2929 | macros/unicodetex/latex/fontspec/README.md
2024/02/13 | 290031 | macros/jptex/latex/jlreq/jlreq.cls
2024/02/13 | 285336 | support/arara/doc/resources/CascadiaMono-Regular.otf
-2024/02/13 | 2846767 | biblio/ctan-bibdata/ctan.bib
2024/02/13 | 282548 | support/arara/doc/resources/CascadiaMono-Light.otf
+2024/02/13 | 28221 | macros/latex/contrib/l3packages/xtemplate.dtx
+2024/02/13 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex
2024/02/13 | 2757360 | support/arara/doc/arara-7.1.3-docsrc.zip
2024/02/13 | 273200 | support/arara/doc/resources/CascadiaMono-ExtraLight.otf
2024/02/13 | 2728 | macros/latex/contrib/verse/README
-2024/02/13 | 26035589 | systems/texlive/tlnet/install-tl.zip
2024/02/13 | 2591 | macros/latex/contrib/verse/verse.ins
2024/02/13 | 258355 | macros/latex/contrib/nicematrix/nicematrix.tex
-2024/02/13 | 2547836 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2024/02/13 | 2543 | support/arara/scripts/rules/arara-rule-ltx2any.yaml
+2024/02/13 | 25278 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf
+2024/02/13 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf
+2024/02/13 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx
2024/02/13 | 248570 | macros/latex/contrib/nicematrix/nicematrix-french.tex
+2024/02/13 | 24830 | macros/latex/contrib/l3kernel/source3body.tex
+2024/02/13 | 24731 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
2024/02/13 | 2434 | support/arara/scripts/rules/arara-rule-makeglossaries.yaml
2024/02/13 | 2428 | support/arara/doc/htmlquickstarttopdf.sh
+2024/02/13 | 242296 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
2024/02/13 | 239299 | graphics/pgf/contrib/pictochrono/doc/pictochrono-doc.pdf
2024/02/13 | 238652 | graphics/pgf/contrib/pictochrono.zip
+2024/02/13 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx
+2024/02/13 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx
+2024/02/13 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx
2024/02/13 | 2326087 | macros/latex/contrib/nicematrix/nicematrix-code.pdf
+2024/02/13 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
+2024/02/13 | 231496 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
2024/02/13 | 23043 | macros/unicodetex/latex/fontspec/CHANGES.md
+2024/02/13 | 2282 | macros/latex/contrib/l3kernel/source3.tex
2024/02/13 | 2176 | macros/unicodetex/latex/fontspec/fontspec-code-load.dtx
2024/02/13 | 21600 | macros/unicodetex/latex/fontspec/fontspec-code-opentype.dtx
2024/02/13 | 2147 | macros/unicodetex/latex/fontspec/fontspec.ins
2024/02/13 | 21304035 | support/arara.zip
2024/02/13 | 21259920 | install/support/arara.tds.zip
2024/02/13 | 21198 | macros/jptex/latex/jlreq/jlreq-helpers.sty
-2024/02/13 | 21031685 | systems/texlive/tlnet/install-tl-windows.exe
2024/02/13 | 2099 | support/arara/scripts/rules/arara-rule-perltex.yaml
2024/02/13 | 20810 | macros/unicodetex/latex/fontspec/fontspec-code-feat-opentype.dtx
+2024/02/13 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf
+2024/02/13 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx
+2024/02/13 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
2024/02/13 | 1985 | support/arara/scripts/rules/arara-rule-frontespizio.yaml
2024/02/13 | 1974 | support/arara/scripts/rules/arara-rule-xindy.yaml
2024/02/13 | 1973 | support/arara/scripts/rules/arara-rule-texindy.yaml
-2024/02/13 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2024/02/13 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
+2024/02/13 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx
+2024/02/13 | 1949 | macros/latex/contrib/l3kernel/interface3.tex
+2024/02/13 | 1923 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex
2024/02/13 | 191524 | support/arara/doc/arara-quickstart.pdf
2024/02/13 | 19106 | macros/unicodetex/latex/fontspec/LICENSE
2024/02/13 | 18998 | macros/latex/contrib/spbmark/spbmark.tex
2024/02/13 | 1883 | support/arara/scripts/rules/arara-rule-latexmk.yaml
+2024/02/13 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx
2024/02/13 | 1836 | support/arara/scripts/rules/arara-rule-detex.yaml
+2024/02/13 | 1792513 | macros/latex/contrib/l3kernel/interface3.pdf
2024/02/13 | 17612 | macros/unicodetex/latex/fontspec/fontspec-code-user.dtx
+2024/02/13 | 1758079 | install/macros/latex/contrib/l3packages.tds.zip
2024/02/13 | 17550 | macros/latex/contrib/spbmark/spbmark.sty
+2024/02/13 | 17497 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
2024/02/13 | 1727 | support/arara/doc/arara.1
2024/02/13 | 1721 | support/arara/scripts/rules/arara-rule-pythontex.yaml
+2024/02/13 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx
2024/02/13 | 1708 | support/arara/scripts/rules/arara-rule-texcount.yaml
+2024/02/13 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf
2024/02/13 | 1687 | macros/unicodetex/latex/fontspec/fontspec-example.tex
2024/02/13 | 168372 | support/arara/doc/resources/CascadiaMono-Italic.otf
-2024/02/13 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2024/02/13 | 1671 | support/arara/scripts/rules/arara-rule-fig2dev.yaml
2024/02/13 | 16715492 | support/arara/scripts/arara.jar
2024/02/13 | 167028 | support/arara/doc/resources/CascadiaMono-LightItalic.otf
+2024/02/13 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx
+2024/02/13 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf
2024/02/13 | 1624 | support/arara/scripts/rules/arara-rule-pdflatex.yaml
2024/02/13 | 1624 | support/arara/scripts/rules/arara-rule-lualatex.yaml
2024/02/13 | 161924 | support/arara/doc/resources/CascadiaMono-ExtraLightItalic.otf
2024/02/13 | 161121 | support/arara/source/arara-7.1.3-src.zip
2024/02/13 | 1609 | support/arara/scripts/rules/arara-rule-latex.yaml
+2024/02/13 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx
2024/02/13 | 1570 | support/arara/scripts/rules/arara-rule-xelatex.yaml
-2024/02/13 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2024/02/13 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2024/02/13 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins
2024/02/13 | 1521 | support/arara/scripts/rules/arara-rule-uplatex.yaml
2024/02/13 | 1516 | support/arara/scripts/rules/arara-rule-platex.yaml
+2024/02/13 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf
+2024/02/13 | 151264 | macros/latex/contrib/l3kernel/l3docstrip.pdf
2024/02/13 | 1511 | support/arara/scripts/rules/arara-rule-xetex.yaml
+2024/02/13 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf
+2024/02/13 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf
2024/02/13 | 1502 | support/arara/scripts/rules/arara-rule-makeindex.yaml
+2024/02/13 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx
2024/02/13 | 1493 | support/albatross/doc/albatross.1
+2024/02/13 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
+2024/02/13 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf
2024/02/13 | 1477 | support/arara/scripts/rules/arara-rule-asymptote.yaml
2024/02/13 | 1469 | support/arara/scripts/rules/arara-rule-knitr.yaml
-2024/02/13 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2024/02/13 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2024/02/13 | 1447 | support/arara/scripts/rules/arara-rule-dvisvgm.yaml
+2024/02/13 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex
+2024/02/13 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx
+2024/02/13 | 14314783 | install/macros/latex/contrib/l3kernel.tds.zip
+2024/02/13 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx
2024/02/13 | 1396 | macros/unicodetex/latex/emotion/README.md
2024/02/13 | 1393093 | install/macros/unicodetex/latex/fontspec.tds.zip
+2024/02/13 | 137539 | macros/latex/contrib/l3kernel/l3basics.dtx
2024/02/13 | 13716 | macros/unicodetex/latex/fontspec/fontspec-doc-api.tex
2024/02/13 | 1348 | macros/jptex/latex/jlreq/LICENSE
2024/02/13 | 1344 | macros/latex/contrib/exesheet/README.md
2024/02/13 | 1341 | support/arara/scripts/rules/arara-rule-clean.yaml
2024/02/13 | 1330044 | macros/unicodetex/latex/fontspec.zip
-2024/02/13 | 13283 | support/texlogfilter.zip
+2024/02/13 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx
2024/02/13 | 1323 | support/arara/scripts/rules/arara-rule-sage.yaml
2024/02/13 | 13206 | support/albatross/source/albatross-0.5.1-src.zip
2024/02/13 | 1306 | macros/latex/contrib/xfrac/xfrac.ins
+2024/02/13 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx
+2024/02/13 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
2024/02/13 | 12937 | macros/unicodetex/latex/fontspec/fontspec-code-lang.dtx
2024/02/13 | 1288 | macros/unicodetex/latex/fontspec/fontspec.ltx
2024/02/13 | 1283 | support/arara/scripts/rules/arara-rule-pdfcsplain.yaml
+2024/02/13 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf
+2024/02/13 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
2024/02/13 | 1280 | support/arara/scripts/rules/arara-rule-llmk.yaml
+2024/02/13 | 12785 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
2024/02/13 | 1275 | support/arara/scripts/rules/arara-rule-luahbtex.yaml
2024/02/13 | 1274 | support/arara/scripts/rules/arara-rule-dvipspdf.yaml
2024/02/13 | 1273 | support/arara/scripts/rules/arara-rule-metapost.yaml
+2024/02/13 | 1272 | macros/latex/contrib/l3packages/xparse.ins
2024/02/13 | 1271 | support/arara/scripts/rules/arara-rule-csplain.yaml
2024/02/13 | 1267 | support/arara/scripts/rules/arara-rule-pdftex.yaml
2024/02/13 | 1267 | support/arara/scripts/rules/arara-rule-luatex.yaml
2024/02/13 | 1259 | macros/unicodetex/latex/fontspec/fontspec-code-closing.dtx
2024/02/13 | 12507 | macros/unicodetex/latex/fontspec/fontspec-code-api.dtx
-2024/02/13 | 12502 | support/texlogfilter/texlogfilter
2024/02/13 | 12321 | macros/unicodetex/latex/fontspec/fontspec-code-math.dtx
+2024/02/13 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx
+2024/02/13 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf
+2024/02/13 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins
2024/02/13 | 1223 | macros/unicodetex/latex/fontspec/fontspec-code.ltx
2024/02/13 | 121523 | macros/jptex/latex/jlreq/jlreq.pdf
2024/02/13 | 11984 | macros/unicodetex/latex/fontspec/fontspec-doc-xetex.tex
2024/02/13 | 11926 | macros/jptex/latex/jlreq/luajfm2pl.lua
+2024/02/13 | 1191 | macros/latex/contrib/l3packages/xfp.ins
+2024/02/13 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex
+2024/02/13 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx
+2024/02/13 | 116935 | macros/latex/contrib/l3kernel/l3token.dtx
2024/02/13 | 1165 | support/arara/scripts/rules/arara-rule-uptex.yaml
2024/02/13 | 1161 | support/arara/scripts/rules/arara-rule-ptex.yaml
2024/02/13 | 1157784 | support/arara/doc/arara-manual.pdf
-2024/02/13 | 114048 | systems/texlive/tlnet/archive/texlive-scripts.r69818.tar.xz
+2024/02/13 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf
+2024/02/13 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx
2024/02/13 | 11357 | macros/unicodetex/latex/emotion/LICENSE
+2024/02/13 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf
+2024/02/13 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx
2024/02/13 | 1109 | support/arara/scripts/rules/arara-rule-xdvipdfmx.yaml
2024/02/13 | 110765 | macros/latex/contrib/exesheet/exesheet.dtx
2024/02/13 | 1105 | support/arara/scripts/rules/arara-rule-animate.yaml
2024/02/13 | 1104 | support/arara/scripts/rules/arara-rule-authorindex.yaml
2024/02/13 | 10980925 | install/macros/jptex/latex/jlreq.tds.zip
+2024/02/13 | 10802 | macros/optex/base/others.opm
+2024/02/13 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
2024/02/13 | 1061 | support/arara/scripts/rules/arara-rule-etex.yaml
+2024/02/13 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
2024/02/13 | 1049 | support/arara/scripts/rules/arara-rule-tex.yaml
+2024/02/13 | 103074 | macros/latex/contrib/l3kernel/l3prop.dtx
2024/02/13 | 101256 | macros/latex/contrib/spbmark.zip
+2024/02/13 | 1005 | macros/latex/contrib/l3packages/README.md
+2024/02/13 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx
2024/02/12 | 98392 | usergrps/dante/dtk.zip
2024/02/12 | 951 | macros/luatex/latex/lua-placeholders/doc/lua-placeholders-deps.bib
2024/02/12 | 9516 | macros/luatex/latex/gitinfo-lua/scripts/gitinfo-lua.lua
@@ -237,6 +873,8 @@
2024/02/12 | 89008 | graphics/gastex/gastex.sty
2024/02/12 | 88659 | macros/latex/contrib/easybook/easybook.tex
2024/02/12 | 88547 | info/kaytannollista-latexia/luku-merkintakieli.tex
+2024/02/12 | 8844 | graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex
+2024/02/12 | 8267 | macros/optex/demo/op-mathalign.tex
2024/02/12 | 8161 | macros/luatex/latex/lua-placeholders/doc/lua-placeholders-example/example.tex
2024/02/12 | 7708 | systems/texlive/tlnet/archive/listofitems.r69774.tar.xz
2024/02/12 | 75689 | macros/latex/contrib/easybook/easybook.dtx
@@ -269,6 +907,7 @@
2024/02/12 | 3078 | macros/luatex/latex/gitinfo-lua/tex/gitinfo-lua.sty
2024/02/12 | 3039 | info/kaytannollista-latexia/kirjallisuutta.bib
2024/02/12 | 29 | info/kaytannollista-latexia/versio.tex
+2024/02/12 | 2928 | macros/optex/base/logos.opm
2024/02/12 | 289 | macros/luatex/latex/lua-placeholders/doc/lua-placeholders-example/example.yaml
2024/02/12 | 2856 | macros/luatex/latex/lua-placeholders/tex/lua-placeholders.sty
2024/02/12 | 2709496 | systems/texlive/tlnet/archive/exam-zh.doc.r69803.tar.xz
@@ -282,6 +921,7 @@
2024/02/12 | 1889 | graphics/gastex/README
2024/02/12 | 1744 | systems/texlive/tlnet/archive/tblr-extras.r69776.tar.xz
2024/02/12 | 17275 | usergrps/dante/dtk/dtk.cls
+2024/02/12 | 16778 | macros/optex/base/fonts-resize.opm
2024/02/12 | 1665 | support/texshop/texshop527.html
2024/02/12 | 16642 | macros/luatex/latex/gitinfo-lua/doc/gitinfo-lua.tex
2024/02/12 | 16604 | systems/texlive/tlnet/archive/easybook.r69805.tar.xz
@@ -308,6 +948,7 @@
2024/02/11 | 82487 | systems/texlive/tlnet/tlpkg/translations/es.po
2024/02/11 | 81473 | systems/texlive/tlnet/tlpkg/translations/uk.po
2024/02/11 | 7700 | graphics/gastex/gastex-doc.tex
+2024/02/11 | 76664 | graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
2024/02/11 | 71328 | systems/texlive/tlnet/tlpkg/translations/sl.po
2024/02/11 | 71105 | macros/xetex/latex/exam-zh/tex/exam-zh.cls
2024/02/11 | 68210 | systems/texlive/tlnet/tlpkg/translations/pl.po
@@ -318,15 +959,21 @@
2024/02/11 | 59155 | systems/texlive/tlnet/tlpkg/translations/nl.po
2024/02/11 | 58581 | systems/texlive/tlnet/tlpkg/translations/da.po
2024/02/11 | 53112 | macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty
+2024/02/11 | 49262 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf
2024/02/11 | 393 | macros/xetex/latex/exam-zh/doc/back/main-changelog.tex
2024/02/11 | 3504556 | macros/latex/contrib/proflycee.zip
2024/02/11 | 34627 | macros/xetex/latex/exam-zh/doc/xdyydoc.cls
+2024/02/11 | 31545 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf
+2024/02/11 | 3060 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
2024/02/11 | 3006575 | macros/xetex/latex/exam-zh.zip
+2024/02/11 | 25812 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
2024/02/11 | 25245 | macros/xetex/latex/exam-zh/tex/exam-zh-textfigure.sty
2024/02/11 | 24945 | macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty
2024/02/11 | 23159 | macros/xetex/latex/exam-zh/examples/example-multiple.tex
2024/02/11 | 2212 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex
+2024/02/11 | 22087 | macros/optex/pkg/mte.opm
2024/02/11 | 2129 | macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex
+2024/02/11 | 208031 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
2024/02/11 | 20720 | macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty
2024/02/11 | 20634 | macros/xetex/latex/exam-zh/tex/exam-zh-font.sty
2024/02/11 | 19106 | macros/xetex/latex/exam-zh/LICENSE
@@ -335,6 +982,7 @@
2024/02/11 | 160276 | macros/xetex/latex/exam-zh/examples/example-multiple.pdf
2024/02/11 | 15513 | macros/xetex/latex/exam-zh/tex/exam-zh-math.sty
2024/02/11 | 148041 | macros/xetex/latex/exam-zh/examples/example-single.pdf
+2024/02/11 | 1393 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf
2024/02/11 | 134976 | graphics/gastex/gastex-doc.pdf
2024/02/11 | 120405 | macros/xetex/latex/exam-zh/doc/body/usage.tex
2024/02/11 | 11537 | macros/xetex/latex/exam-zh/README.md
@@ -367,9 +1015,11 @@
2024/02/10 | 82021 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
2024/02/10 | 81721 | systems/win32/miktex/tm/packages/tkz-euclide__source.tar.lzma
2024/02/10 | 81578 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2024/02/10 | 8133 | graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex
2024/02/10 | 811480 | systems/win32/miktex/tm/packages/next/files.csv.lzma
2024/02/10 | 810237 | systems/win32/miktex/tm/packages/files.csv.lzma
2024/02/10 | 78317 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2024/02/10 | 77977 | graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
2024/02/10 | 773255 | systems/win32/miktex/tm/packages/ysabeau__doc.tar.lzma
2024/02/10 | 77303 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
2024/02/10 | 7667 | systems/win32/miktex/tm/packages/contract.tar.lzma
@@ -499,6 +1149,7 @@
2024/02/10 | 31890 | systems/win32/miktex/tm/packages/litetable__source.tar.lzma
2024/02/10 | 31559 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
2024/02/10 | 3143 | systems/win32/miktex/tm/packages/udepcolor__source.tar.lzma
+2024/02/10 | 30959 | graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex
2024/02/10 | 305331 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
2024/02/10 | 302516 | systems/win32/miktex/tm/packages/latexmk__doc.tar.lzma
2024/02/10 | 3024 | systems/win32/miktex/tm/packages/docshots.tar.lzma
@@ -573,6 +1224,7 @@
2024/02/10 | 196592 | systems/win32/miktex/tm/packages/circuitikz.tar.lzma
2024/02/10 | 195 | macros/generic/listofitems/listofitems.sty
2024/02/10 | 19247 | systems/win32/miktex/tm/packages/dictsym__doc.tar.lzma
+2024/02/10 | 19195 | macros/optex/base/more-macros.opm
2024/02/10 | 19166 | systems/win32/miktex/tm/packages/verifiche__source.tar.lzma
2024/02/10 | 1893448 | systems/texlive/tlnet/archive/circuitikz.doc.r69757.tar.xz
2024/02/10 | 1893415 | systems/win32/miktex/tm/packages/circuitikz__doc.tar.lzma
@@ -583,6 +1235,7 @@
2024/02/10 | 18143 | systems/win32/miktex/tm/packages/bodeplot__source.tar.lzma
2024/02/10 | 17876 | systems/win32/miktex/tm/packages/tkz-elements.tar.lzma
2024/02/10 | 178132 | systems/texlive/tlnet/archive/circuitikz.r69757.tar.xz
+2024/02/10 | 17776 | graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
2024/02/10 | 177067 | systems/win32/miktex/tm/packages/beamerthemeamurmaple__source.tar.lzma
2024/02/10 | 1761582 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
2024/02/10 | 1760 | systems/win32/miktex/tm/packages/leftindex.tar.lzma
@@ -649,6 +1302,7 @@
2024/02/10 | 1051943 | systems/win32/miktex/tm/packages/babel__doc.tar.lzma
2024/02/10 | 1048 | macros/generic/listofitems/README
2024/02/10 | 104428 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2024/02/10 | 10424 | graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex
2024/02/10 | 104152 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
2024/02/10 | 10400 | fonts/cochineal/README
2024/02/10 | 103558 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
@@ -868,111 +1522,3 @@
2024/02/08 | 1021 | macros/latex/contrib/l3build/README.md
2024/02/08 | 10160 | systems/texlive/tlnet/archive/startex.r69742.tar.xz
2024/02/08 | 10077 | macros/luatex/generic/evangelion-jfm/figure/fig-jp.pdf
-2024/02/07 | 9717 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-focus.jpg
-2024/02/07 | 92872 | systems/texlive/tlnet/archive/spbmark.doc.r69725.tar.xz
-2024/02/07 | 9239 | macros/latex/contrib/siunitx/siunitx-symbol.dtx
-2024/02/07 | 8961 | macros/latex/required/babel/base/babel.ins
-2024/02/07 | 8866 | macros/latex/contrib/siunitx/siunitx-command.dtx
-2024/02/07 | 861564 | systems/texlive/tlnet/archive/verifiche.doc.r69726.tar.xz
-2024/02/07 | 800857 | macros/latex/required/babel/base/babel.dtx
-2024/02/07 | 79196 | macros/latex/contrib/siunitx/CHANGELOG.md
-2024/02/07 | 789511 | graphics/pgf/contrib/bodeplot.zip
-2024/02/07 | 7692 | systems/texlive/tlnet/archive/footmisc.r69729.tar.xz
-2024/02/07 | 75306 | graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.tex
-2024/02/07 | 705436 | macros/latex/contrib/siunitx/siunitx.pdf
-2024/02/07 | 647453 | macros/latex/contrib/siunitx/siunitx-code.pdf
-2024/02/07 | 647075 | macros/latex/required/babel/base/babel-code.pdf
-2024/02/07 | 640 | systems/texlive/tlnet/archive/mnhyphn.doc.r69727.tar.xz
-2024/02/07 | 627853 | support/TeX4ht/source/tex4ht-html4.tex
-2024/02/07 | 62756 | systems/texlive/tlnet/archive/acmart.source.r69721.tar.xz
-2024/02/07 | 616 | systems/texlive/tlnet/archive/collection-langcyrillic.r69727.tar.xz
-2024/02/07 | 602 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo_bibliography.bib
-2024/02/07 | 5831 | macros/latex/contrib/siunitx/siunitx-locale.dtx
-2024/02/07 | 57942 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-titlepage-color.jpg
-2024/02/07 | 55728 | macros/latex/contrib/siunitx/siunitx-table.dtx
-2024/02/07 | 5340 | systems/texlive/tlnet/archive/verifiche.r69726.tar.xz
-2024/02/07 | 514744 | systems/texlive/tlnet/archive/footmisc.doc.r69729.tar.xz
-2024/02/07 | 495 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/LICENSE
-2024/02/07 | 4862 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo.tex
-2024/02/07 | 4748 | macros/latex/contrib/siunitx/siunitx-abbreviations.cfg
-2024/02/07 | 473816 | systems/texlive/tlnet/archive/lwarp.source.r69724.tar.xz
-2024/02/07 | 4597 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerinnerthemefocus.sty
-2024/02/07 | 45868 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-typeset.jpg
-2024/02/07 | 4567020 | systems/texlive/tlnet/archive/acmart.doc.r69721.tar.xz
-2024/02/07 | 43869 | macros/latex/contrib/siunitx/siunitx-compound.dtx
-2024/02/07 | 431266 | graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.pdf
-2024/02/07 | 42920 | systems/texlive/tlnet/archive/acmart.r69721.tar.xz
-2024/02/07 | 42671 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo.pdf
-2024/02/07 | 421738 | macros/latex/required/babel/base/babel.pdf
-2024/02/07 | 4142 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/README.md
-2024/02/07 | 4062 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-logo.pdf
-2024/02/07 | 39328 | macros/latex/contrib/siunitx/siunitx-complex.dtx
-2024/02/07 | 3857954 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple.zip
-2024/02/07 | 378979 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-sidebar.pdf
-2024/02/07 | 37836 | macros/latex/contrib/siunitx/siunitx-print.dtx
-2024/02/07 | 3720932 | install/macros/latex/required/babel-base.tds.zip
-2024/02/07 | 3687 | macros/latex/contrib/siunitx/siunitx.ins
-2024/02/07 | 3652 | systems/texlive/tlnet/archive/spbmark.r69725.tar.xz
-2024/02/07 | 362787 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-blue.pdf
-2024/02/07 | 362637 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-test.pdf
-2024/02/07 | 362482 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-green.pdf
-2024/02/07 | 362165 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-black.pdf
-2024/02/07 | 35777 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-titlepage.jpg
-2024/02/07 | 35571 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-subsectionpage.jpg
-2024/02/07 | 3527 | macros/latex/required/babel/base/bbidxglo.dtx
-2024/02/07 | 35149 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/LICENSE.md
-2024/02/07 | 33 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/CHANGELOG.md
-2024/02/07 | 336774 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-leftframetitle.pdf
-2024/02/07 | 3320404 | systems/texlive/tlnet/archive/lwarp.doc.r69724.tar.xz
-2024/02/07 | 32126 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-references.jpg
-2024/02/07 | 31812 | macros/latex/contrib/siunitx/siunitx-emulation.dtx
-2024/02/07 | 31738 | macros/latex/contrib/siunitx/siunitx-version-1.cfg
-2024/02/07 | 31652 | systems/texlive/tlnet/archive/dictsym.r69720.tar.xz
-2024/02/07 | 2968 | systems/texlive/tlnet/archive/mnhyphn.r69727.tar.xz
-2024/02/07 | 2951 | macros/latex/contrib/siunitx/siunitx-binary.dtx
-2024/02/07 | 273398 | macros/latex/contrib/siunitx/siunitx-v2.sty
-2024/02/07 | 27131 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-appendix.jpg
-2024/02/07 | 270492 | macros/latex/contrib/ucph-revy/ucph-revy-en-doc.pdf
-2024/02/07 | 2693 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamercolorthemefocus.sty
-2024/02/07 | 268481 | macros/latex/contrib/ucph-revy/ucph-revy-da-doc.pdf
-2024/02/07 | 265999 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus.zip
-2024/02/07 | 2636 | macros/latex/contrib/siunitx/siunitx-code.tex
-2024/02/07 | 2496 | macros/latex/contrib/ucph-revy/README.md
-2024/02/07 | 24711 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/tex/beamerthemeAmurmaple.sty
-2024/02/07 | 245462 | support/TeX4ht/source/ChangeLog
-2024/02/07 | 2365239 | macros/latex/required/babel/base.zip
-2024/02/07 | 22852 | systems/texlive/tlnet/archive/asmejour.r69722.tar.xz
-2024/02/07 | 22408 | systems/texlive/tlnet/archive/footmisc.source.r69729.tar.xz
-2024/02/07 | 222396 | systems/texlive/tlnet/archive/lwarp.r69724.tar.xz
-2024/02/07 | 22232 | macros/latex/contrib/siunitx/siunitx.dtx
-2024/02/07 | 21890 | macros/latex/required/babel/base/bbcompat.dtx
-2024/02/07 | 2161400 | systems/texlive/tlnet/archive/asmejour.doc.r69722.tar.xz
-2024/02/07 | 2152 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerthemefocus.sty
-2024/02/07 | 20816 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-doc.tex
-2024/02/07 | 2047 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerfontthemefocus.sty
-2024/02/07 | 19788 | systems/texlive/tlnet/archive/dictsym.doc.r69720.tar.xz
-2024/02/07 | 1899 | macros/latex/required/babel/base/README.md
-2024/02/07 | 18688 | systems/texlive/tlnet/archive/verifiche.source.r69726.tar.xz
-2024/02/07 | 18441 | macros/latex/contrib/siunitx/siunitx-angle.dtx
-2024/02/07 | 1729 | macros/latex/contrib/siunitx/siunitx-binary.cfg
-2024/02/07 | 170260 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/logo.png
-2024/02/07 | 169129 | macros/latex/contrib/ucph-revy/ucph-revy-en-man.pdf
-2024/02/07 | 168534 | macros/latex/contrib/siunitx/siunitx.tex
-2024/02/07 | 164864 | macros/latex/contrib/ucph-revy/ucph-revy-da-man.pdf
-2024/02/07 | 1644 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/README.md
-2024/02/07 | 1627435 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-doc.pdf
-2024/02/07 | 162527 | macros/latex/contrib/siunitx/siunitx-number.dtx
-2024/02/07 | 1594222 | install/macros/latex/contrib/siunitx.tds.zip
-2024/02/07 | 1546829 | macros/latex/contrib/siunitx.zip
-2024/02/07 | 154296 | support/TeX4ht/source/tex4ht-mathml.tex
-2024/02/07 | 15311 | macros/latex/contrib/siunitx/siunitx-quantity.dtx
-2024/02/07 | 1488 | systems/texlive/tlnet/archive/hvqrurl.r69723.tar.xz
-2024/02/07 | 13248 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerouterthemefocus.sty
-2024/02/07 | 1184694 | support/TeX4ht/source/tex4ht-4ht.tex
-2024/02/07 | 1179 | macros/latex/contrib/siunitx/README.md
-2024/02/07 | 117728 | systems/texlive/tlnet/archive/hvqrurl.doc.r69723.tar.xz
-2024/02/07 | 113044 | graphics/pgf/contrib/profsio/tex/ProfSio.sty
-2024/02/07 | 11266 | macros/latex/contrib/siunitx/siunitx-abbreviation.dtx
-2024/02/07 | 1086742 | macros/latex/required/babel/base/locale.zip
-2024/02/07 | 107080 | macros/latex/contrib/ucph-revy/ucph-revy.dtx
-2024/02/07 | 103567 | macros/latex/contrib/siunitx/siunitx-unit.dtx
diff --git a/biblio/bibtex/contrib/francais-bst/README.md b/biblio/bibtex/contrib/francais-bst/README.md
index 9efba0e990..aab3466fd2 100644
--- a/biblio/bibtex/contrib/francais-bst/README.md
+++ b/biblio/bibtex/contrib/francais-bst/README.md
@@ -17,7 +17,7 @@ later version.
## Version
-2.0 (2023-10-28)
+2.0a (2024-02-13)
## Author
@@ -93,7 +93,7 @@ auteur-date proposées dans l'ouvrage de référence de Marie Malo,
«Guide de la communication écrite au cégep, à l'université et en
entreprise» (Québec Amérique, 1996).
-Les styles ont été développé à l'origine à l'aide du programme
+Les styles ont été développés à l'origine à l'aide du programme
`makebst` de Patrick W. Daly. Le fichier maitre de styles
bibliographiques dérive étroitement du fichier `merlin.mbs` du
paquetage **custom-bib**.
@@ -105,7 +105,7 @@ version ultérieure.
## Version
-2.0 (2023-10-28)
+2.0a (2024-02-13)
## Auteur
diff --git a/biblio/bibtex/contrib/francais-bst/francais-bst.mbs b/biblio/bibtex/contrib/francais-bst/francais-bst.mbs
index 56a1607481..7a49781733 100644
--- a/biblio/bibtex/contrib/francais-bst/francais-bst.mbs
+++ b/biblio/bibtex/contrib/francais-bst/francais-bst.mbs
@@ -2,7 +2,7 @@
%
% Master bibliography style for francais.bst and francaissc.bst
%
-% Copyright (C) 2012-2023 Vincent Goulet
+% Copyright (C) 2012-2024 Vincent Goulet
%
% This file may be distributed and/or modified under the conditions
% of the LaTeX Project Public License, either version 1.3c of this
@@ -30,7 +30,7 @@
% -------------------------------------------------------------------
% Name and version information of the main mbs file:
%\fi
- % \ProvidesFile{francais-bst.mbs}[2023/10/28 v2.0 (VG, PWD, AO, DPC)]
+ % \ProvidesFile{francais-bst.mbs}[2024/02/13 v2.0a (VG, PWD, AO, DPC)]
%\iffalse
%</!tail>
%<*a&!a>
@@ -49,29 +49,13 @@
%% Le chargement de doc.sty cause des conflits avec memoir. Il faut:
%%
%% - annuler la définition de l'environnement 'glossary' de memoir;
- %% - remettre en place les définitions standards des
- %% commandes pour l'index et le glossaire sur lesquelles se base
- %% doc.sty.
+
+ %% - remettre en place les définitions standards des commandes pour
+ %% le glossaire sur lesquelles se base doc.sty (nécessaire aussi
+ %% pour l'index, mais il n'est pas utilisé).
\let\theglossary\relax % avoid conflict with doc.sty
\let\endtheglossary\relax % avoid conflict with doc.sty
\makeatletter
- \def\makeindex{%
- \newwrite\@indexfile
- \immediate\openout\@indexfile=\jobname.idx
- \def\index{\@bsphack\begingroup
- \@sanitize
- \@wrindex}\typeout
- {Writing index file \jobname.idx}%
- \let\makeindex\@empty
- }
- \@onlypreamble\makeindex
- \def\@wrindex#1{%
- \protected@write\@indexfile{}%
- {\string\indexentry{#1}{\thepage}}%
- \endgroup
- \@esphack}
- \def\index{\@bsphack\begingroup \@sanitize\@index}
- \def\@index#1{\endgroup\@esphack}
\def\makeglossary{%
\newwrite\@glossaryfile
\immediate\openout\@glossaryfile=\jobname.glo
@@ -153,9 +137,11 @@
%% Aligner à gauche l'environnement enumerate
\setlist[enumerate]{leftmargin=*,align=left}
- %% Configurer du glossaire
- \GlossaryPrologue{\section*{Historique des versions}%
- \addcontentsline{toc}{section}{Historique des versions}}
+ %% Configurer le glossaire
+ \addto\extrasfrench{%
+ \def\glossaryname{Historique des versions}}
+ \GlossaryPrologue{\section*{\glossaryname}%
+ \addcontentsline{toc}{section}{\glossaryname}}
\setcounter{GlossaryColumns}{2}
\setlength{\GlossaryMin}{5cm}
@@ -211,6 +197,8 @@
% données).}
% \changes{2.0}{2023-10-28}{La disposition de certains éléments dans
% la notice bibliographique a été révisée.}
+% \changes{2.0a}{2024-02-13}{Correction de coquilles dans la
+% documentation.}
%
% \title{Styles bibliographiques {\frbst} et {\frscbst}}
% \author{Vincent Goulet \\ École d'actuariat, Université Laval}
@@ -226,7 +214,7 @@
% référence de Marie Malo, \emph{Guide de la communication écrite au
% cégep, à l'université et en entreprise} (Québec Amérique, 1996).
%
-% Les styles ont été développé à l'origine à l'aide du programme
+% Les styles ont été développés à l'origine à l'aide du programme
% \code{makebst} de Patrick W.~Daly. Le fichier maitre de styles
% bibliographiques \code{\filename} dérive étroitement du fichier
% \code{merlin.mbs} du paquetage %
@@ -343,7 +331,8 @@
% champs suivants:
% \begin{description}[font=\mdseries\ttfamily,style=nextline,leftmargin=3em]
% \item[doi] L'identificateur d'objet numérique (DOI) d'une ressource.
-% Entrez la valeur sous la forme \code{prefix/suffix} (par exemple:
+% Entrez la valeur sous la forme
+% \meta{préfixe}\code{/}\meta{suffixe} (par exemple:
% \code{10.1000/182}). Les styles créent automatiquement un
% hyperlien vers la ressource.
% \item[isbn] Le numéro international normalisé du livre (ISBN) d'un
@@ -395,7 +384,7 @@
% \code{latex francaisbst.dbj}
% \end{quote}
%
-% \section{Changements par rapport à \code{merlin.mbs}}
+% \section{Changements par rapport à \texorpdfstring{\code{merlin.mbs}}{merlin.mbs}}
% \label{sec:changements}
%
% Cette section documente les changements apportés au fichier
@@ -422,7 +411,7 @@
% dans votre document pour l'adapter à vos besoins, si désiré.
% \item La commande \cmd{\urlprefix} est vide, de sorte que «URL»
% n'apparait pas devant les URL dans la bibliographie. De nouveau,
-% vous pouvez redéfinir la commande dans votre document ni désiré.
+% vous pouvez redéfinir la commande dans votre document si désiré.
% \item Les guillemets français «~» sont produits par la commande
% \cmd{\frquote} de \pkg{babel-french} (version $\geq$ 3.1) plutôt
% qu'avec les commandes \cmd{\guillemotleft} et
diff --git a/biblio/bibtex/contrib/francais-bst/francais-bst.pdf b/biblio/bibtex/contrib/francais-bst/francais-bst.pdf
index bd71ee574d..2bc8a5d6ab 100644
--- a/biblio/bibtex/contrib/francais-bst/francais-bst.pdf
+++ b/biblio/bibtex/contrib/francais-bst/francais-bst.pdf
Binary files differ
diff --git a/biblio/bibtex/contrib/francais-bst/francais.dbj b/biblio/bibtex/contrib/francais-bst/francais.dbj
index 8d5804bbab..137c4d099a 100644
--- a/biblio/bibtex/contrib/francais-bst/francais.dbj
+++ b/biblio/bibtex/contrib/francais-bst/francais.dbj
@@ -9,7 +9,7 @@
\preamble
-Copyright (C) 2012-2023 Vincent Goulet
+Copyright (C) 2012-2024 Vincent Goulet
This file may be distributed and/or modified under the conditions
of the LaTeX Project Public License, either version 1.3c of this
diff --git a/biblio/bibtex/contrib/francais-bst/francaisbst.dbj b/biblio/bibtex/contrib/francais-bst/francaisbst.dbj
index c177a3dde4..5f6186977e 100644
--- a/biblio/bibtex/contrib/francais-bst/francaisbst.dbj
+++ b/biblio/bibtex/contrib/francais-bst/francaisbst.dbj
@@ -6,7 +6,7 @@
\preamble
-Copyright (C) 2012-2023 Vincent Goulet
+Copyright (C) 2012-2024 Vincent Goulet
This file may be distributed and/or modified under the conditions
of the LaTeX Project Public License, either version 1.3c of this
diff --git a/biblio/bibtex/contrib/francais-bst/francaissc.dbj b/biblio/bibtex/contrib/francais-bst/francaissc.dbj
index 257e4f99e1..736269ebe6 100644
--- a/biblio/bibtex/contrib/francais-bst/francaissc.dbj
+++ b/biblio/bibtex/contrib/francais-bst/francaissc.dbj
@@ -9,7 +9,7 @@
\preamble
-Copyright (C) 2012-2023 Vincent Goulet
+Copyright (C) 2012-2024 Vincent Goulet
This file may be distributed and/or modified under the conditions
of the LaTeX Project Public License, either version 1.3c of this
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index ec3fb6c967..70684ab288 100644
--- a/biblio/ctan-bibdata/ctan.bib
+++ b/biblio/ctan-bibdata/ctan.bib
@@ -1,7 +1,7 @@
%% bib file of all CTAN packages
%% (C) Herbert Voß
%%
-%% created at 13-02-2024, 02:00:03
+%% created at 14-02-2024, 02:00:04
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -1402,8 +1402,8 @@
title = {The \texttt{albatross} package},
subtitle = {Find fonts that contain a given glyph},
author = {{Island of TeX}},
- date = {2023-01-27},
- version = {0.5.0},
+ date = {2024-02-13},
+ version = {0.5.1},
license = {bsd3},
mirror = {https://mirror.ctan.org/support/albatross},
url = {https://ctan.org/pkg/albatross},
@@ -3048,8 +3048,8 @@
title = {The \texttt{arara} package},
subtitle = {Automation of \LaTeX{} compilation},
author = {Paulo Roberto Massa Cereda},
- date = {2023-10-02},
- version = {7.1.2},
+ date = {2024-02-13},
+ version = {7.1.3},
license = {bsd},
mirror = {https://mirror.ctan.org/support/arara},
url = {https://ctan.org/pkg/arara},
@@ -21969,8 +21969,8 @@
title = {The \texttt{emotion} package},
subtitle = {Make emojis more easy to use in \XeLaTeX{} and LuaLaTeX},
author = {Xuwang Zeng},
- date = {2024-02-12},
- version = {0.1},
+ date = {2024-02-13},
+ version = {0.2},
license = {apache2},
mirror = {https://mirror.ctan.org/macros/unicodetex/latex/emotion},
url = {https://ctan.org/pkg/emotion},
@@ -24164,8 +24164,8 @@
title = {The \texttt{exesheet} package},
subtitle = {Typesetting exercise or exam sheets},
author = {Antoine Missier},
- date = {2024-02-03},
- version = {2.6},
+ date = {2024-02-13},
+ version = {2.7},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/exesheet},
url = {https://ctan.org/pkg/exesheet},
@@ -27108,8 +27108,8 @@
title = {The \texttt{fontspec} package},
subtitle = {Advanced font selection in \XeLaTeX{} and LuaLaTeX},
author = {Will Robertson and {The LaTeX Project Team}},
- date = {2022-05-18},
- version = {2.8a},
+ date = {2024-02-13},
+ version = {2.9a},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/unicodetex/latex/fontspec},
url = {https://ctan.org/pkg/fontspec},
@@ -35673,7 +35673,7 @@
title = {The \texttt{jlreq} package},
subtitle = {Japanese document class based on requirements for Japanese text layout},
author = {Noriyuki Abe},
- date = {2023-06-18},
+ date = {2024-02-13},
version = {},
license = {bsd2},
mirror = {https://mirror.ctan.org/macros/jptex/latex/jlreq},
@@ -37306,7 +37306,7 @@
title = {The \texttt{l3packages} package},
subtitle = {High-level \LaTeX{}3 concepts},
author = {{The LaTeX Project Team}},
- date = {2023-10-10},
+ date = {2024-02-13},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3packages},
@@ -49042,8 +49042,8 @@
title = {The \texttt{nicematrix} package},
subtitle = {Improve the typesetting of mathematical matrices with PGF},
author = {François Pantigny},
- date = {2024-01-25},
- version = {6.26d},
+ date = {2024-02-13},
+ version = {6.27},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/nicematrix},
url = {https://ctan.org/pkg/nicematrix},
@@ -53800,6 +53800,17 @@
url = {https://ctan.org/pkg/pictexwd},
}
+@manual{ctan-pictochrono,
+ title = {The \texttt{pictochrono} package},
+ subtitle = {Insert “chronometer pictograms” with a duration},
+ author = {Cédric Pierquet},
+ date = {2024-02-13},
+ version = {0.1.0},
+ license = {lppl1.3c},
+ mirror = {https://mirror.ctan.org/graphics/pgf/contrib/pictochrono},
+ url = {https://ctan.org/pkg/pictochrono},
+}
+
@manual{ctan-picture,
title = {The \texttt{picture} package},
subtitle = {Dimens for picture macros},
@@ -64786,8 +64797,8 @@
title = {The \texttt{spbmark} package},
subtitle = {Customize superscripts and subscripts},
author = {Qu Yi},
- date = {2024-02-12},
- version = {1.46c},
+ date = {2024-02-13},
+ version = {1.46d},
license = {cc-by-4},
mirror = {https://mirror.ctan.org/macros/latex/contrib/spbmark},
url = {https://ctan.org/pkg/spbmark},
@@ -67345,7 +67356,7 @@
title = {The \texttt{tblr-extras} package},
subtitle = {Extra libraries for tabularray for caption and babel compatibility},
author = {Manuel Merino},
- date = {2024-02-10},
+ date = {2024-02-13},
version = {1.0},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/tblr-extras},
@@ -69032,8 +69043,8 @@
title = {The \texttt{texlogfilter} package},
subtitle = {Filter \LaTeX{} engines output or log file},
author = {Julien Labbé},
- date = {2022-03-30},
- version = {1.1},
+ date = {2024-02-13},
+ version = {1.2},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/support/texlogfilter},
url = {https://ctan.org/pkg/texlogfilter},
@@ -75892,8 +75903,8 @@
title = {The \texttt{verse} package},
subtitle = {Aids for typesetting simple verse},
author = {Will Robertson and Peter R. Wilson},
- date = {2016-06-24},
- version = {2.4b},
+ date = {2024-02-13},
+ version = {2.4c},
license = {lppl},
mirror = {https://mirror.ctan.org/macros/latex/contrib/verse},
url = {https://ctan.org/pkg/verse},
@@ -78140,13 +78151,18 @@
@manual{ctan-xfrac,
title = {The \texttt{xfrac} package},
- subtitle = {Split-level fractions in \LaTeX{}2e*},
- author = {Morten Høgholm and Lars Madsen and Will Robertson and Joseph Wright},
- date = {2023-10-10},
+ subtitle = {Split-level fractions},
+ author = {Morten Høgholm and Lars Madsen and Will Robertson and Joseph Wright and {The LaTeX Project Team}},
+ date = {2024-02-13},
version = {},
license = {lppl1.3c},
- mirror = {https://mirror.ctan.org/macros/latex/contrib/l3packages},
+ mirror = {https://mirror.ctan.org/macros/latex/contrib/xfrac},
url = {https://ctan.org/pkg/xfrac},
+ annotation = {This package uses the interface defined by \LaTeX{} templates
+ to provide flexible split-level fractions
+ the macro.
+ This is both a demonstration of the power of the template concept
+ and also a useful addition to the available functionality in \LaTeX{}2e.},
}
@manual{ctan-xgalley,
diff --git a/graphics/pgf/contrib/pgf-periodictable/README b/graphics/pgf/contrib/pgf-periodictable/README
index e3ddefda0a..31f05f7dfa 100644
--- a/graphics/pgf/contrib/pgf-periodictable/README
+++ b/graphics/pgf/contrib/pgf-periodictable/README
@@ -1,25 +1,39 @@
-This is pgf-PeriodicTable, version 2.0.1 (2023/05/29).
+This is pgf-PeriodicTable, version 2.1.0 (2024/02/14).
The purpose of this package is to provide the Periodic Table of Elements in
a simple way. It relies on pgf/TikZ to offer a full or partial periodic table with
a variety of options and displaying the desired data for all the 118
-elements. It can be done in six languages: English, French, German,
-Portuguese (from Portugal and from Brazil), Spanish and Italian.
+elements. It can be done in different languages: English, French, German,
+Portuguese (from Portugal and from Brazil), Spanish, Italian and translations
+by user contributions (currently Dutch).
____________________________________________________________
Just typeset \pgfPT to get a Periodic Table of Elements or \pgfPT[<options list>]
to do it at your custom way.
____________________________________________________________
-** Requirements: TikZ package.
+** Requirements: TikZ and fontenc (pdfLaTeX) or fontspec (XeLaTeX or LuaLaTeX) packages.
** Installation: unpack everything in a directory in the TeX search path and refresh the TeX database.
** Usage: just place \usepackage{pgf-PeriodicTable} in the preamble.
** Contact the author: Hugo Gomes (hugo.parelho@gmail.com)
** Licence: released under the LaTeX Project Public License v1.3 or later, see http://www.latex-project.org/lppl.txt
-
+____________________________________________________________
____________________________________________________________
Major changes:
+
+*** v2.1.0 (14/02/2024) ***
+New options for package loading:
+- numerals (supporting Devanagari or Mandarin numerals);
+- userlang (supporting a user defined language, currently only Dutch translation, provided by Wim De Borggraeve).
+New commands:
+- \pgfPTdvnfont (provides font selection for use with Devanagari);
+- \pgfPTzhfont (provides font selection for use with Mandarin numerals);
+- \pgfPTzhnumber (to enable/disable showing the atomic number, period or group number in Mandarin numerals).
+Fixed wrong interaction with fontspec and babel packages: font selection schemes and \babelfont usage now work as expected.
+Fixed incorrect capitalization of some elements in German.
+Correction of the title in Spanish.
+
*** v2.0.1 (29/05/2023) ***
Capitalized element names (in German) and improved German language after suggestions made by Ole Schwen
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
index bce897a17c..b9b76f64d1 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex
@@ -168,9 +168,9 @@ For the \textbf{\textit{representative elements}} (groups \textbf{1}, \textbf{2}
\item identify group 2 elements of the Periodic Table.%: \hrulefill
\item identify the elements of the 2\raisebox{3pt}{\scriptsize nd} period of the Periodic Table.%: \hrulefill
\item identify group 17 elements of the Periodic Table.%: \hrulefill
-\item identify the elements of block s.%: \hrulefill
-\item identify the elements of block p.%: \hrulefill
-\item identify the elements of block d.%: \hrulefill
+\item identify the elements of s-block.%: \hrulefill
+\item identify the elements of p-block.%: \hrulefill
+\item identify the elements of d-block.%: \hrulefill
\item identify the metallic elements.%: \hrulefill
\item identify the non-metallic elements.%: \hrulefill
\item identify the transition metals.%: \hrulefill
@@ -189,9 +189,9 @@ For the \textbf{\textit{representative elements}} (groups \textbf{1}, \textbf{2}
\blue{\textit{For the source of this example please see the file} pgf-PeriodicTableManual\_Examples.tex}
\vfill%
\newpage
-\def\xbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt] (x) {\vbox to 15pt{\vfil\color{gray}x\vfil}};}}%
-\def\obox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,draw,thick,rounded corners=.5pt,inner sep=0pt] (x) {\vbox to 15pt{\vfil\color{gray}$\bigcirc$\vfil}};}}%
-\def\dbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt] (x) {\vbox to 15pt{\vfil\color{gray}$\Delta$\vfil}};}}%
+\def\xbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt,fill=white] (x) {\vbox to 15pt{\vfil\color{gray}x\vfil}};}}%
+\def\obox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,draw,thick,rounded corners=.5pt,inner sep=0pt,fill=white] (x) {\vbox to 15pt{\vfil\color{gray}$\bigcirc$\vfil}};}}%
+\def\dbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt,fill=white] (x) {\vbox to 15pt{\vfil\color{gray}$\Delta$\vfil}};}}%
\mymfbox{%
\textbf{\underline{EXERCISE}:}
\\ [3pt]Using the following notation,
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
index 74526e352d..3d1f256bd6 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex
@@ -1,4 +1,4 @@
-\subsubsection{\texorpdfstring{\ding{224} The atomic number}{The atomic number}}\vspace{6pt}%
+\subsubsection{\texorpdfstring{\ding{224} The atomic number}{The atomic number}}%\vspace{6pt}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Z backcolor
\pgfPTMoption{4}{Z backcolor}{black}{%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
index dde2c854d7..9e1ba55405 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex
@@ -189,7 +189,7 @@ Writing a color scheme can be painstaking work, so a \textit{script} is provided
\subsection*{}{\normalfont\large\bfseries\raisebox{1.25pt}{$\mathbf{\blacktriangleright}$}\ Utilization of \tmpSection}%
\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTsetLanguage}%
\label{command:pgfPTsetLanguage}\addcontentsline{toc}{subsection}{\texorpdfstring{\tmpSection{}}{\textbackslash pgfPTsetLanguage}}%
-\\ [4pt]This command globally changes the default language of the Periodic Table.
+\\ [4pt]This command globally changes the default language of the Periodic Table. If a user language has been loaded, the corresponding ISO 639-1 code can also be used as a \red{language flag}.
\\ [10pt]\pgfPTMsetLanguage{pt}%
\pgfPTsetLanguage{pt}%
\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
@@ -199,4 +199,11 @@ Writing a color scheme can be painstaking work, so a \textit{script} is provided
\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[]}}%
\\ [5pt]\pgfPTMline%
+\newpage
+\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=nl]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\pgfPTMsetLanguage{nl}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_nl.pdf}}}%
+\\ [5pt]\pgfPTMline%
\endinput
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex
index 06203b75dd..2a33c0371e 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex
@@ -1,4 +1,4 @@
-\subsubsection{\texorpdfstring{\ding{224} The density}{The density}}\vspace{6pt}%
+\subsubsection{\texorpdfstring{\ding{224} The density}{The density}}%\vspace{6pt}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% d color
\pgfPTMoption{4}{d color}{black}{%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex
index fc69c471e4..320b2d042c 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex
@@ -2,6 +2,7 @@
\subsubsection{\texorpdfstring{\ding{224} \itshape The electron distribution}{The electron distribution}}\vspace{6pt}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% eDist color
+\pgfPTresetstyle\pgfPTresetcell%
\pgfPTMbuildcellstyle{electron}(6,3)%
[(1;1-2;Z),(1;3;radio),(2-3;1.5-3.5;CS),(4;1-3;name), %
(5;1-3;eDist),(6;1-3;eConfignl)]%
@@ -32,7 +33,8 @@ Sets the separator character between energy levels in electron distribution. \te
}%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=electron,eDist sep=-]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=electron,eDist sep=-]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=electron,eDist sep={,}]%
+\newpage%\\ [10pt]
+\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=electron,eDist sep={,}]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=electron,eDist sep={,}]}}%
\\ [0pt]\pgfPTendoption%
\endinput
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
index ffa5841e22..2eb989abae 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex
@@ -29,7 +29,7 @@ The \red{keys} described in this section enable the \textit{exercise layout} of
\\ [5pt]\pgfPTendoption%
\vfill%
% only cells with periods and group numbers=false
-\pgfPTMoption{4}{only cells with periods and group numbers\ \ \ }{false}%
+\pgfPTMoption{4}{only cells with periods and group numbers}{false}%
{When set to \red{true} the Periodic Table is drawn with only the cells without any contents. The period and group numbers are shown.
\\ [10pt]\tikz{\node[text width=\linewidth-.6666em,fill=orange!5!white,draw=orange,rounded corners=2pt] {\textbf{\orange{NOTE}}:
\\ The following \red{keys} are also set: \red{back color scheme=solid, show title=false, show legend=false, show MNM line=false}};}
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
index 4c07b00d7a..6658536639 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex
@@ -1,4 +1,4 @@
-\subsubsection{\texorpdfstring{\ding{224} General layout}{General layout}}\vspace{6pt}%
+\subsubsection{\texorpdfstring{\ding{224} General layout}{General layout}}%\vspace{6pt}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Z list
\label{option_Z list}%
@@ -24,7 +24,7 @@ The possible \lblue{name} is one of the following:
any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\}
\end{itembar}%
}%
-\\ [-5pt]\pgfPTendoption%
+\\ [-10pt]\pgfPTendoption%
\newpage\vspace{-34pt}\ %
% cell width
\label{option_cell width}%
@@ -82,14 +82,18 @@ any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\}
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell={w=40pt,h=50pt,lw=.6pt,lc=blue}]}}%
\\ [5pt]\pgfPTendstyle%
% font
+\vfill%
\label{option_font}%
-\pgfPTMoption{4}{font}{phv}%
-{Sets the font family, via the proper \textit{\textrm{\LaTeX} font name}, to use in the Periodic Table. The \textit{default} font is \textit{phv}, \ie, the Helvetica font.
-The value of the \red{font} key can be any \textit{\textrm{\LaTeX} font name} known to the local \textrm{\LaTeX} installation.
-\\ \hfill\scriptsize See \textit{\textrm{\LaTeX} font names} below for further details.}%
+\pgfPTMoption[\pgfPTchangedinversion{2.1.0}]{4}{font}{phv (\textrm{pdf\LaTeX}); TeX Gyre Heros (\textrm{Xe\LaTeX} or \textrm{Lua\LaTeX})}%
+{Sets the font family, via the proper \textit{\textrm{\LaTeX} font name}, to use in the Periodic Table.
+\\ [2pt]When \textrm{pdf\LaTeX} is used to typeset the Periodic Table the \textit{default} font is \textit{phv}, \ie, the Helvetica font. In this case the value of the \red{font} key can be any \textit{\textrm{\LaTeX} font name} known to the local \textrm{\LaTeX} installation.
+\\ [2pt]When \textrm{Xe\LaTeX} or \textrm{Lua\LaTeX} are used to typeset the Periodic Table the \textit{default} font is \textit{TeX Gyre Heros}, a closest alternative to Helvetica font. In this case the value of the \red{font} key can be any \textit{font name known to your Operating System} and with \textrm{Lua\LaTeX} it can also be any \textit{font name available in your \textrm{TEXMF} tree}.
+\\ \hfill\scriptsize See \textit{\textrm{\LaTeX} font names} below or the \href{https://ftp.eq.uc.pt/software/TeX/macros/unicodetex/latex/fontspec/fontspec.pdf\#page=9}{fontspec documentation} for further details.\normalsize\\ \ }%
+\\ [10pt]Examples with \textrm{pdf\LaTeX}:
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=ptm]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},font=ptm]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=RobotoSlab-TLF]%
+\newpage%
+\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=RobotoSlab-TLF]%
\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},font=RobotoSlab-TLF]}}%
\\ [10pt]\pgfPTMoptiontxt{%
\textit{\textrm{\LaTeX} font names}:
@@ -137,14 +141,22 @@ The value of the \red{font} key can be any \textit{\textrm{\LaTeX} font name} kn
\makebox[\linewidth][c]{For more information about fonts visit the \href{https://tug.org/FontCatalogue/}{TUG Font Catalogue}}
\\ \ %
}%
+\\ [10pt]Examples with \textrm{Xe\LaTeX} or \textrm{Lua\LaTeX}:
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=Verdana,CS font=\string\fontspec{Mistral}\string\selectfont]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTfontLuaXeLaTeX1.pdf}}}%
+\newpage
+\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=Arial,CS font=\string\fontspec{LCALLIG.TTF}\string\selectfont]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTfontLuaXeLaTeX2.pdf}}}%
\\ [5pt]\pgfPTendoption%
% back color scheme
\label{option_back color scheme}%
+\vfill
\pgfPTMoption{4}{back color scheme}{default}%
{Sets a \blue{named} back color scheme for the Periodic Table.}%
\\ [5pt]\pgfPTMmacrobox{pgfPT}[back color scheme=Soft]%
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[back color scheme=Soft]}}%
-\\ [10pt]\pgfPTMoptiontxt{%
+\newpage%
+\pgfPTMoptiontxt{%
The possible \lblue{name} is one of the following:
\begin{itembar}
\item\textbf{built-in}:
@@ -249,27 +261,30 @@ elements in molecular models. The scheme is named after the CPK molecular models
% languages
\vfill
\label{option_languages}%
-\pgfPTMoption{4}{languages}{\{\}}%
-{Sets a language list to use in the Periodic Table. It is a comma separated list of language flags: \sq{pt}, \sq{en}, \sq{fr}, \sq{de}, \sq{it}, \sq{es} or \sq{br}.
-\textit{This key overrides the default language, that is, the language loaded at package inclusion}.}%
-\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},languages=pt]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},languages=pt]}}%
-\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=pgfPT2lang,languages={en,fr}]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=pgfPT2lang,languages={en,fr}]}}%
+\pgfPTMoption[\pgfPTchangedinversion{2.1.0}]{4}{languages}{\{\}}%
+{Sets a language list to use in the Periodic Table. It is a comma separated list of language flags: \sq{pt}, \sq{en}, \sq{fr}, \sq{de}, \sq{it}, \sq{es} or \sq{br}. If a user language has been loaded, the corresponding ISO 639-1 code can also be used as a language flag. \textit{This key overrides the default language, that is, the language loaded at package inclusion}.\\ \ }%
+\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},languages=pt]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},languages=pt]}}%
+\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPT2lang,languages={en,fr}]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPT2lang,languages={en,fr}]}}%
\newpage%\\ [10pt]
-\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=pgfPT3lang,languages={pt,fr,it}]%
-\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=pgfPT3lang,languages={pt,fr,it}]}}%
+\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=nl]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPT2lang,languages={nl,en}]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_nl_en.pdf}}}%
+\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPT3lang,languages={pt,fr,it}]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPT3lang,languages={pt,fr,it}]}}%
\\ [10pt]\pgfPTMoptiontxt{%
When using a set of languages, space to accommodate the names in each cell must be provided by building a suitable cell - typically one cell row per language. The cell styles used in the two examples above are built-in and serve this purpose.
-\vspace{5pt}%
+\vspace{2.5pt}%
\begin{itembar}
-\item\pgfPTpreviewcellstyle[2]{pgfPT2lang}\item\pgfPTpreviewcellstyle[2]{pgfPT3lang}
+\item\pgfPTpreviewcellstyle[1.5]{pgfPT2lang}\vspace{-10pt}\item\pgfPTpreviewcellstyle[1.5]{pgfPT3lang}
\end{itembar}
-\vspace{5pt}%
+\vspace{2.5pt}%
Also, the space for the title should be taken into account -- if using more then three languages, the legend must be \textit{turned off}, otherwise the title overlaps the legend.
}%
-\\ [-5pt]\pgfPTendoption%
-\vfill%
+\\ [-10pt]\pgfPTendoption%
+%\newpage%\vfill%
% other languages font
\label{option_other languages font}%
\pgfPTMoption{4}{other languages font}{\string\tiny}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
index 14c47b57f9..78f8178826 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex
@@ -11,7 +11,7 @@ Sets the color of the element name.
\\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},name color=red]}}%
\\ [0pt]\pgfPTendoption%
% name font
-\pgfPTMoption{4}{name font}{\string\fontseries{l}\string\selectfont\string\tiny}{%
+\pgfPTMoption{4}{name font}{\string\fontseries\{l\}\string\selectfont\string\tiny}{%
Sets the font of the element name.
}
\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},name font=\string\itshape\string\tiny]%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
index fa8b95b530..59e27e553e 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex
@@ -1,5 +1,5 @@
%\vfill\vfill%
-\subsubsection{\texorpdfstring{\ding{224} Periods and Groups}{Periods and Groups}}\vspace{6pt}%
+\subsubsection{\texorpdfstring{\ding{224} Periods and Groups}{Periods and Groups}}%\vspace{6pt}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% show period numbers
\label{option_show period numbers}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf
new file mode 100644
index 0000000000..9e380d0dee
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf
new file mode 100644
index 0000000000..2eaef9dec3
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf
new file mode 100644
index 0000000000..b8868d5814
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf
new file mode 100644
index 0000000000..c67788f884
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf
new file mode 100644
index 0000000000..352e48008c
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
index a62db8b8da..4d672d4b20 100644
--- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex
@@ -1,10 +1,11 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definitions for pgf-PeriodicTable Manual
+% Hugo Gomes @ 14/02/2024 v2.1.0
% Hugo Gomes @ 29/05/2023 v2.0.1
% Hugo Gomes @ 20/02/2023 v2.0.0
% Hugo Gomes @ 08/11/2022 v1.0.1
% Hugo Gomes @ 10/10/2022 v1.0.0
-\def\pgfPTversion{2.0.1}%
+\def\pgfPTversion{2.1.0}%
\def\pgfPTnewinversion#1{new in v#1}%
\def\pgfPTchangedinversion#1{changed in v#1}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -230,7 +231,7 @@ pdfproducer = {pdfeTeX-1.\the\pdftexversion\pdftexrevision},
% \pgfPTMbuildcellstyle{name}(lines,columns)[entries]
\def\pgfPTMbuildcellstyle#1(#2,#3)[#4]{\ignorespaces%
\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
-{\textcolor{blue!50!black}{\textbackslash pgfPTbuilcellstyle\{}\textcolor{red!50!black}{#1}\textcolor{blue!50!black}{\}}%
+{\textcolor{blue!50!black}{\textbackslash pgfPTbuildcellstyle\{}\textcolor{red!50!black}{#1}\textcolor{blue!50!black}{\}}%
\textcolor{blue!50!black}{(}\textcolor{red!50!black}{#2,#3}\textcolor{blue!50!black}{)}%
\textcolor{black!50}{\% #2\ rows by #3 columns}\\ \textcolor{blue!50!black}{[}%
\textcolor{red!50!black}{\detokenize\expandafter{#4}}\textcolor{blue!50!black}{]}};}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf
new file mode 100644
index 0000000000..e233c94a31
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf
new file mode 100644
index 0000000000..6489e39532
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf
new file mode 100644
index 0000000000..370116c4e6
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
index 1553ecc910..39da6e976c 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty
@@ -1,18 +1,52 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hugo Gomes @ 14/02/2024 v2.1.0
% Hugo Gomes @ 29/05/2023 v2.0.1
% Hugo Gomes @ 20/02/2023 v2.0.0
% Hugo Gomes @ 08/11/2022 v1.0.1
% Hugo Gomes @ 10/10/2022 v1.0.0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NeedsTeXFormat{LaTeX2e}%
-\ProvidesPackage{pgf-PeriodicTable}[29/05/2023 pgf-PeriodicTable v2.0.1]%%
+\ProvidesPackage{pgf-PeriodicTable}[14/02/2024 pgf-PeriodicTable v2.1.0]%%
\RequirePackage{tikz}%
\usetikzlibrary{fadings}%
\tikzfading[name=aumentax, left color=transparent!80, right color=transparent!1]%
\tikzfading[name=diminuix, left color=transparent!1, right color=transparent!80]%
\tikzfading[name=aumentay, top color=transparent!80, bottom color=transparent!1]%
\tikzfading[name=diminuiy, bottom color=transparent!80, top color=transparent!1]%
-\RequirePackage[T1]{fontenc}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% check the engine and load font packages
+\ifx\pdfliteral\undefined\relax% XeLaTeX or LuaLaTeX
+\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}%
+\else% pdfLaTeX
+\RequirePackage[T1]{fontenc}\edef\pgfPT@fontspec{0}%
+\fi%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% ifs to user language and list of user translations available
+\newif\ifpgfPT@user@lang\pgfPT@user@langfalse%
+\newif\ifpgfPT@user@lang@isvalid\pgfPT@user@lang@isvalidfalse%
+% ISO code language list ------------------------------------->
+\def\pggPT@userlanguage@ISOcode@list{nl/Nederlands}%
+% ----------------------------------------------------------------
+\def\pggPT@userlanguage@ISOcode@check#1{%
+\edef\pgfPT@tmpISOcode{#1}%
+\def\pggPT@userlanguage@ISOcode@validate##1/##2\relax{\edef\pggPT@userlanguage@ISOcode@curr{##1}\edef\pggPT@userlanguage@ISOcode@currName{##2}}%
+\@for\@pgfPT@tmp:=\pggPT@userlanguage@ISOcode@list\do{\expandafter\pggPT@userlanguage@ISOcode@validate\@pgfPT@tmp\relax%
+\ifx\pggPT@userlanguage@ISOcode@curr\pgfPT@tmpISOcode\relax\global\pgfPT@user@lang@isvalidtrue%
+\edef\pggPT@userlanguage@ISOcode{\pggPT@userlanguage@ISOcode@curr}%
+\edef\pggPT@userlanguage@ISOcode@Name{\pggPT@userlanguage@ISOcode@currName}\fi%
+}% END \@for
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% ifs to typeset with \zhnumber
+\newif\ifpgfPT@zhnumbers@Z\pgfPT@zhnumbers@Zfalse%
+\newif\ifpgfPT@zhnumbers@per\pgfPT@zhnumbers@perfalse%
+\newif\ifpgfPT@zhnumbers@gr\pgfPT@zhnumbers@grfalse%
+% macro to set the zhnumber ifs to true or false
+% \pgfPTzhnumber[true|false]{what list} -> default [true]
+\def\pgfPTzhnumber{\@ifnextchar[{\@pgfPT@zhnumber}{\@pgfPT@zhnumber[true]}}%
+\def\@pgfPT@zhnumber[#1]#2{%
+\@for\@pgfPT@tmp:=#2\do{\csname pgfPT@zhnumbers@\@pgfPT@tmp#1\endcsname}%
+}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\DeclareOption{pt}{\def\pgfPT@defaultLanguage{pt}}%
\DeclareOption{en}{\def\pgfPT@defaultLanguage{en}}%
@@ -21,8 +55,75 @@
\DeclareOption{it}{\def\pgfPT@defaultLanguage{it}}%
\DeclareOption{es}{\def\pgfPT@defaultLanguage{es}}%
\DeclareOption{br}{\def\pgfPT@defaultLanguage{br}}%
+\DeclareOption{dvnnumerals}{%
+\ifnum\pgfPT@fontspec=0\relax%
+\def\pgfPT@dvn@wrn{\PackageError{pgfPT}{package option 'numerals=dvn' (Devanagari Numerals) requires 'fontspec' package with XeLaTeX engine...}}%
+\else\ifx\pdfextension\undefined\relax% XeLaTeX%
+\newfontfamily\pgfPTdvn[Mapping=devanagarinumerals]{Eczar}%
+\def\pgfPTdvnfont{\@ifnextchar[{\@pgfPTdvnfont}{\@pgfPTdvnfont[]}}%
+\def\@pgfPTdvnfont[#1]#2{\renewfontfamily\pgfPTdvn[Mapping=devanagarinumerals,#1]{#2}}%
+\let\pgfPTnumberfont\pgfPTdvn\let\pgfPT@printnum\relax%
+\else\def\pgfPT@dvn@wrn{\PackageError{pgfPT}{package option 'numerals=dvn' (Devanagari Numerals) requires XeLaTeX engine...}}%
+\fi\fi%
+}%
+\DeclareOption{zhnumerals}{%
+\ifnum\pgfPT@fontspec=0\relax%
+\def\pgfPT@zh@wrn{\PackageError{pgfPT}{package option 'numerals=zh' (Mandarin Numerals) requires 'fontspec' package with XeLaTeX or LuaLaTeX engines...}}%
+\else\def\pgfPT@zhnumerals{}\fi}%
+\DeclareOption*{%
+\edef\pgfPT@processOption@equal{=}\edef\pgfPT@processOption@STOP{}%
+\def\pgfPT@processOption#1#2\relax{\edef\pgfPT@processOption@curchar{#1}\edef\pgfPT@processOption@remain{#2}%
+\def\pgfPT@getOption##1=##2\relax{%
+% option numerals=<dvn|zh>
+\edef\pgfPT@tmpOptionA{##1}\edef\pgfPT@tmpOptionB{numerals}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB%
+\edef\pgfPT@tmpOptionA{##2}\edef\pgfPT@tmpOptionB{zh}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB\ExecuteOptions{zhnumerals}\else%
+\edef\pgfPT@tmpOptionA{##2}\edef\pgfPT@tmpOptionB{dvn}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB\ExecuteOptions{dvnnumerals}\else%
+\@latex@error{Unknown value '\pgfPT@tmpOptionA' for option 'numerals' passed to '\@currname'}%
+{The option '\CurrentOption' was not declared in \@cls@pkg\space'\@currname', perhaps you\MessageBreak misspelled its name. Try typing \space <return>\space to proceed.}%
+\fi\fi% END option numerals
+% option userlang=<language ISO code>
+\else\edef\pgfPT@tmpOptionB{userlang}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB%
+\pggPT@userlanguage@ISOcode@check{##2}%
+\ifpgfPT@user@lang@isvalid%
+\message{Loading \pggPT@userlanguage@ISOcode@Name\space language data...}%
+\pgfPT@user@langtrue\def\pgfPT@defaultLanguage{user}%
+\else%
+\@latex@error{Unknown language ISO code '\pgfPT@tmpISOcode' for \@cls@pkg\space`\@currname'}%
+{The language ISO code '\pgfPT@tmpISOcode' was not declared in \@cls@pkg\space'\@currname', perhaps you\MessageBreak misspelled its name. Try typing \space <return>\space to proceed.}%
+\fi% \ifpgfPT@user@lang@isvalid%
+\else%
+\@latex@error{Unknown option '\pgfPT@tmpOptionA' for \@cls@pkg\space`\@currname'}%
+{The option '\CurrentOption' was not declared in \@cls@pkg\space'\@currname', perhaps you\MessageBreak misspelled its name. Try typing \space <return>\space to proceed with the default language (en).}%
+\fi\fi% % END option userlang
+}% END \pgfPT@getOption
+\ifx\pgfPT@processOption@curchar\pgfPT@processOption@equal\relax%
+\expandafter\pgfPT@getOption\CurrentOption\relax%
+\else\ifx\pgfPT@processOption@remain\pgfPT@processOption@STOP\relax%
+\else\expandafter\pgfPT@processOption#2\pgfPT@processOption@STOP\relax\fi\fi%
+}% END \pgfPT@processOption
+\expandafter\pgfPT@processOption\CurrentOption\pgfPT@processOption@STOP\relax%
+}% END \DeclareOption*
\ExecuteOptions{en}%
\ProcessOptions\relax%
+\ifx\pgfPT@dvn@wrn\undefined\relax\else\pgfPT@dvn@wrn\fi%
+\ifx\pgfPT@zh@wrn\undefined\relax\else\pgfPT@zh@wrn\fi%
+\ifx\pgfPT@zhnumerals\undefined\relax\else%
+\RequirePackage{zhnumber}%
+\pgfPT@zhnumbers@Ztrue\pgfPT@zhnumbers@pertrue\pgfPT@zhnumbers@grtrue%
+\newfontfamily\pgfPTzhnumberfont[Script=CJK,AutoFakeBold=4]{SimSun}%
+\def\pgfPTzhfont{\@ifnextchar[{\@pgfPTzhfont}{\@pgfPTzhfont[]}}%
+\def\@pgfPTzhfont[#1]#2{\renewfontfamily\pgfPTzhnumberfont[Script=CJK,#1]{#2}}%
+\let\pgfPTnumberfont\pgfPTzhnumberfont%
+\let\pgfPT@printnum\zhnumber%
+\fi%
+\ifx\pgfPT@printnum\undefined\relax\let\pgfPT@printnum\relax\let\pgfPTnumberfont\relax\fi%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% process user language
+\ifpgfPT@user@lang%
+\input{translations/lang.\pggPT@userlanguage@ISOcode.tex}%
+\else%
+\input{translations/lang.undefined.tex}%
+\fi%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcount\pgfPT@counta\newcount\pgfPT@countb%
\newcount\pgfPT@countc\newcount\pgfPT@countd%
@@ -34,6 +135,7 @@
\newdimen\pgfPT@boxwd%
\newdimen\pgfPT@boxht%
\newdimen\pgfPT@data@Z@natwd%
+\newdimen\pgfPT@data@DiscY@natwd%
\newif\ifpgfPT@temp%
\newif\ifpgfPT@found%
\newif\ifpgfPTis@backcolorsolid%
@@ -57,6 +159,8 @@
\newsavebox\pgfPT@tmpbox%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\@pgfPT@setlayers{%
+\ifx\@pgfPT@resetlayers\undefined\relax\edef\@pgfPT@resetlayers{\pgf@layerlist}\fi%
+\pgfsetlayers{\@pgfPT@resetlayers}%
\edef\@pgfPT@layers{pgfPTpaperlayer,pgfPTbacklayer,\pgf@layerlist}%
\pgfdeclarelayer{pgfPTbacklayer}%
\pgfdeclarelayer{pgfPTpaperlayer}%
@@ -113,7 +217,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\@pgfPT@setlayers%
\tikz[every node/.append style={inner sep=0pt,below right}]{%
\pgfkeys{/pgfPerTable/.cd,#1}%
-\fontfamily{\pgfPTglobalfont}\selectfont\renewcommand*\rmdefault{\pgfPTglobalfont}%
+% setting the font
+\ifnum\pgfPT@fontspec=1\relax% fontspec is loaded
+\edef\pgfPT@defaultfont{phv}%
+\ifx\pgfPTglobalfont\pgfPT@defaultfont\relax\edef\pgfPTglobalfont{TeX Gyre Heros}\fi% replacing 'phv' by 'TeX Gyre Heros'
+\setmainfont{\pgfPTglobalfont}%
+\ifx\NoAutoSpacing\undefined\relax\else\NoAutoSpacing\fi% XeLaTeX/LuaLaTeX -> removing extra space before ':' for babel:french
+\else% fontenc is loaded (with T1 option)
+\fontfamily{\pgfPTglobalfont}\selectfont\renewcommand*\rmdefault{\pgfPTglobalfont}\fi%
\edef\pgfPT@doc@fsize{\f@size}%
\input{pgfPT.coordinates.tex}%
% loading the cell style
@@ -205,13 +316,42 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\edef\pgfPT@teststra{Radio}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{61}\fill[cpgfPTTMP] ([xshift={4/15*\pgfPTcellwd}]xLa) rectangle ++(\pgfPTcellwd/15,-\pgfPTcellht);\draw (xLa) -- ++(\pgfPTcellwd,0);\draw ([yshift=-\pgfPTcellht]xLa) -- ++(\pgfPTcellwd,0);\fi%
\edef\pgfPT@teststra{Blocks}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{58}\fill[cpgfPTTMP] ([xshift={1/15*\pgfPTcellwd}]xLa) rectangle ++(\pgfPTcellwd*14/15,-\pgfPTcellht);\draw (xLa) -- ++(\pgfPTcellwd,0);\fi%
\ifpgfPT@Z
- \ifpgfZuseboxwidth%
- \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}57--71\hspace{\pgfPTZspace}\vfil}};%
- \else%
- {\pgfPTZfont\selectfont\pgfmathparse{width("57--71")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
- \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
- at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil57--71\vfil}};}%
+ \ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax%
+ \pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}}\hspace{\pgfPTZspace}\vfil}};%
+ \else%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}\hspace{\pgfPTZspace}\vfil}};%
+ \fi%
+ \else\let\pgfPT@printnum\relax%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57--71}\hspace{\pgfPTZspace}\vfil}};%
+ \fi%
+ }%
+ \else{%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}%
+ \pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi%
+ \else\let\pgfPT@printnum\relax%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \fi%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
+ at (xLa) {%
+ \ifpgfPT@zhnumbers@Z%
+ \ifnum\@pgfPT@resizebox=1\relax%
+ \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}}\vfil}%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}\vfil}%
+ \fi%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{57--71}\vfil}%
+ \fi%
+ };}%
\fi%
\fi%
\ifpgfPT@name\pgfPT@setlabels[\pgfPTlanguages]{La}%
@@ -247,13 +387,42 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\edef\pgfPT@teststra{PS}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{93}\fill[cpgfPTTMP] ([xshift={4/15*\pgfPTcellwd}]xAc) rectangle ++(\pgfPTcellwd*11/15,-\pgfPTcellht);\draw (xAc) -- ++(\pgfPTcellwd,0);\draw ([yshift=-\pgfPTcellht]xAc) -- ++(\pgfPTcellwd,0);\fi%
\edef\pgfPT@teststra{Blocks}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{90}\fill[cpgfPTTMP] ([xshift={1/15*\pgfPTcellwd}]xAc) rectangle ++(\pgfPTcellwd*14/15,-\pgfPTcellht);\draw (xAc) -- ++(\pgfPTcellwd,0);\draw ([yshift=-\pgfPTcellht]xAc) -- ++(\pgfPTcellwd,0);\fi%
\ifpgfPT@Z%
- \ifpgfZuseboxwidth%
- \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}89--103\hspace{\pgfPTZspace}\vfil}};%
- \else%
- {\pgfPTZfont\selectfont\pgfmathparse{width("89--103")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
- \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
- at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil89--103\vfil}};}%
+ \ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax%
+ \pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}}\hspace{\pgfPTZspace}\vfil}};%
+ \else%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}\hspace{\pgfPTZspace}\vfil}};%
+ \fi%
+ \else\let\pgfPT@printnum\relax%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89--103}\hspace{\pgfPTZspace}\vfil}};%
+ \fi%
+ }%
+ \else{%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}%
+ \pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi%
+ \else\let\pgfPT@printnum\relax%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \fi%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
+ at (xAc) {%
+ \ifpgfPT@zhnumbers@Z%
+ \ifnum\@pgfPT@resizebox=1\relax%
+ \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}}\vfil}%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}\vfil}%
+ \fi%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{89--103}\vfil}%
+ \fi%
+ };}%
\fi%
\fi%
\ifpgfPT@name\pgfPT@setlabels[\pgfPTlanguages]{Ac}%
@@ -293,13 +462,46 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\draw[fill=cpgfPTTMP,line width=\pgfPTcelllinewd,draw=\pgfPTcelllinecolor] (\Z) rectangle ++(\pgfPTcellwd,-\pgfPTcellht);
% append the Z box
\ifpgfPT@Z%
- \ifpgfZuseboxwidth%
- \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
- at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\Z\hspace{\pgfPTZspace}\vfil}};%
+ \ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax%
+ \pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z)
+ {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{\Z}}\hspace{\pgfPTZspace}\vfil}};
+ \else%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z)
+ {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{\Z}\hspace{\pgfPTZspace}\vfil}};
+ \fi%
+ \else\let\pgfPT@printnum\relax%
+ \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]%
+ at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z)
+ {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{\Z}\hspace{\pgfPTZspace}\vfil}};
+ \fi%
+ }%
\else%
- {\pgfPTZfont\pgfmathparse{width(\Z)}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ {%
+ \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}%
+ \pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi%
+ \else\let\pgfPT@printnum\relax%
+ \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}%
+ \fi%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]%
- at ([xshift=\pgfPT@data@Z@x+.5*\@pgfPT@Zxshift,yshift=-\pgfPT@data@Z@y-.5*\@pgfPT@Zyshift]\Z) {\vbox to\pgfPT@data@Z@ht{\vfil\Z\vfil}};}%
+ at ([xshift=\pgfPT@data@Z@x+.5*\@pgfPT@Zxshift,yshift=-\pgfPT@data@Z@y-.5*\@pgfPT@Zyshift]\Z) {%
+ \ifpgfPT@zhnumbers@Z%
+ \ifnum\@pgfPT@resizebox=1\relax%
+ \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{\Z}}\vfil}%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{\Z}\vfil}%
+ \fi%
+ \else%
+ \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{\Z}\vfil}%
+ \fi%
+ };}%
\fi%
\fi%
% the Chemical Symbol
@@ -318,12 +520,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\@for\pgfPT@tmp:=\pgfPTlanguages\do{%
\ifnum\pgfPT@counta=0\relax%
\edef\pgfPT@tmp@name@defaultLanguage{\csname pgfPTdata@name@\@roman{\Z}@\pgfPT@tmp\endcsname}%
- %\ifpgfPTNames\edef\pgfPT@tmp@name@defaultLanguage{\expandafter\pgfPT@namec@p\pgfPT@tmp@name@defaultLanguage\relax}\fi% v1.0.1
\ifx\pgfPTNames\pgfPT@true\relax\edef\pgfPT@tmp@name@defaultLanguage{\expandafter\pgfPT@namec@p\pgfPT@tmp@name@defaultLanguage\relax}\else%
\ifx\pgfPTNames\pgfPT@TRUE\relax\edef\pgfPT@tmp@name@defaultLanguage{\pgfPT@makeUppercase\pgfPT@tmp@name@defaultLanguage\relax}\fi\fi%
\else%
\edef\pgfPT@tmp@n@me{\csname pgfPTdata@name@\@roman{\Z}@\pgfPT@tmp\endcsname}%
- %\ifpgfPTNames\edef\pgfPT@tmp@n@me{\expandafter\pgfPT@namec@p\pgfPT@tmp@n@me\relax}\fi% v1.0.1
\ifx\pgfPTNames\pgfPT@true\relax\edef\pgfPT@tmp@n@me{\expandafter\pgfPT@namec@p\pgfPT@tmp@n@me\relax}\else%
\ifx\pgfPTNames\pgfPT@TRUE\relax\edef\pgfPT@tmp@n@me{\pgfPT@makeUppercase\pgfPT@tmp@n@me\relax}\fi\fi%
\edef\pgfPT@tmp@name@otherLanguages{\pgfPT@tmp@name@otherLanguages\vskip-\pgfPT@dima\hbox to %
@@ -353,7 +553,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{\vbox to \pgfPT@boxht{\vfil\vbox to \pgfPT@dimb{\vfil\pgfPT@tmp@name@otherLanguages}\vfil}};%
\fi%
\fi%
- \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document
\fi%
% the Atomic weight
\ifpgfPT@Ar%
@@ -797,8 +996,8 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi\fi%
\fi%
% DiscY -> Discover Year
- \ifpgfPT@DiscY\relax%
- \node[font=\pgfPTDiscYfont,text=\pgfPTDiscYcolor,text width=\pgfPT@data@DiscY@wd,text centered]%
+ \ifpgfPT@DiscY\relax
+ \node[font=\pgfPTDiscYfont,text=\pgfPTDiscYcolor,text width=\pgfPT@data@DiscY@wd,text centered]%
at ([xshift=\pgfPT@data@DiscY@x,yshift=-\pgfPT@data@DiscY@y]\Z) {\vbox to\pgfPT@data@DiscY@ht{\vfil\mbox{\pgfPT@data@DiscY}\vfil}};%
\fi%
% spectra -> spectra
@@ -849,8 +1048,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
\ifpgfPTIUPACMMIX\edef\pgfPT@teststrb{\pgfPTcells}\edef\pgfPT@teststra{d}\ifx\pgfPT@teststra\pgfPT@teststrb\ifnum\Z>48\pgfmathparse{-1.075*\pgfPTcellwd}\edef\pgfPT@perlabel@xshift{\pgfmathresult}\fi\fi\fi%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
\node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at%
- ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\per};\breakforeach\fi%
+ ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{\per}};%
+ }\breakforeach\fi%
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
}%
@@ -878,15 +1079,15 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\advance\pgfPT@counta by 1\relax%
}%
\pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}%
- \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}%
+ \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}%
\edef\pgfPT@labelboxwd{\pgfmathresult}%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\foreach \Zsearch in \pgfPT@cells@lanthanoids{%
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
- \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {6};%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
+ \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{6}};}%
\ifpgfPTLaAclabels\pgfPT@processbackcolor{57}%
- %\node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt] at ([xshift=\pgfPT@perlabel@xshift]\Z)%
- %{\pgfPT@labels@La};\fi%
\node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)%
{\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi%
\breakforeach\fi%
@@ -905,12 +1106,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\advance\pgfPT@counta by 1\relax%
}%
\pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}%
- \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}%
+ \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}%
\edef\pgfPT@labelboxwd{\pgfmathresult}%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\foreach \Zsearch in \pgfPT@cells@La{%
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
- \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {6};%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
+ \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{6}};}%
\ifpgfPTLaAclabels\pgfPT@processbackcolor{57}%
\node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)%
{\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi%
@@ -918,9 +1121,9 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
}%
- \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
-\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
% actinoids -->
\global\pgfPTis@labeldrawnfalse%
\ifpgfPTIUPACMMIX%
@@ -935,12 +1138,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\advance\pgfPT@counta by 1\relax%
}%
\pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}%
- \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}%
+ \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}%
\edef\pgfPT@labelboxwd{\pgfmathresult}%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\foreach \Zsearch in \pgfPT@cells@actinoids{%
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
- \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {7};%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
+ \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{7}};}%
\ifpgfPTLaAclabels\pgfPT@processbackcolor{89}%
\node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)%
{\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi%
@@ -960,12 +1165,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\advance\pgfPT@counta by 1\relax%
}%
\pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}%
- \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}%
+ \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}%
\edef\pgfPT@labelboxwd{\pgfmathresult}%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\foreach \Zsearch in \pgfPT@cells@Ac{%
\foreach \Z in \pgfPT@@cellslist {%
\ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
- \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {7};%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
+ \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{7}};}%
\ifpgfPTLaAclabels\pgfPT@processbackcolor{89}%
\node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)%
{\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi%
@@ -973,9 +1180,9 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
}%
- \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
-\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% groups -->
\ifpgfPTgrlabels%
@@ -985,8 +1192,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\edef\pgfPT@@grlist{\csname pgfPT@cells@G\@Roman\group\endcsname}%
\foreach \Zsearch in \pgfPT@@grlist{%
\foreach \Z in \pgfPT@@cellslist {%
- \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue\node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at%
- ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\group};\breakforeach\fi%
+ \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
+ \node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at%
+ ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{\group}};}\breakforeach\fi%
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
}%
@@ -994,8 +1203,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\global\pgfPTis@labeldrawnfalse%
\foreach \Zsearch in \pgfPT@cells@GIIILaAc{%
\foreach \Z in \pgfPT@@cellslist {%
- \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue\node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at%
- ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {3};\breakforeach\fi%
+ \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
+ \node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at%
+ ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{3}};}\breakforeach\fi%
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
}%
@@ -1004,8 +1215,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\edef\pgfPT@@grlist{\csname pgfPT@cells@G\@Roman\group\endcsname}%
\foreach \Zsearch in \pgfPT@@grlist{%
\foreach \Z in \pgfPT@@cellslist {%
- \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue\node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at%
- ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\group};\breakforeach\fi%
+ \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue%
+ {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi%
+ \node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at%
+ ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{\group}};}\breakforeach\fi%
}%
\ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi%
}%
@@ -1034,7 +1247,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\pgfPTtitlefont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}%
\node[font=\pgfPTotherLangFont\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont,text=\pgfPTotherLangColor,below,text width=18*\pgfPTcellwd,text centered,inner xsep=0pt] at ([yshift={-.075*\pgfPTcellht}]theTitle.south)%
{\vbox{\pgfPT@tmp@titulo@otherLanguages}};%
- \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
\fi%
% legend -->
@@ -1043,14 +1256,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPTlegacro% use acronyms ##############################################
\draw[fill=\pgfPTlegendbackcolor,draw=\pgfPTcelllinecolor,line width=\pgfPTcelllinewd] (0) rectangle ++(\pgfPTcellwd,-\pgfPTcellht);
% append the Z box
- \ifpgfPT@Z\fontfamily{\pgfPTglobalfont}\pgfPTZfont\selectfont%
+ \ifpgfPT@Z%
\node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,below right,inner sep=1.5pt] (LZ)%
at ([xshift=\pgfPT@data@Z@x,yshift=-\pgfPT@data@Z@y]0) {Z};%
\fi%
% the Chemical Symbol
\ifpgfPT@CS%
\pgfPT@extract@rgb@fill{\pgfPTlegendCScolor}%
- \fontfamily{\pgfPTglobalfont}\pgfPTCSfont\selectfont%
+ \pgfPTCSfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.35*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{.6*\f@size}\fi\fi%
@@ -1067,7 +1280,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\else\pgfmathsetlength{\pgfPT@dima}{.4*\f@size}\fi%
\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax%
\node[legendpins,%
- text width={.7*\pgfPTcellwd+.2*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},font=\fontfamily{\pgfPTglobalfont}\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt]
+ text width={.7*\pgfPTcellwd+.2*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt]%
at ([xshift={\pgfPT@dimc+.2*\pgfPTcellwd},yshift={.25*\pgfPT@data@CS@ht}]LCS.east)%
{%
\pgfPT@extract@rgb@fill{solido}\pgfPT@pinEstado{solido}%
@@ -1096,9 +1309,9 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
}\fi%
};%
\fi\fi%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
% the Name
\ifpgfPT@name%
- \fontfamily{\pgfPTglobalfont}\pgfPTnamefont\selectfont%
\node[font=\pgfPTnamefont,text=\pgfPTnamecolor,text width=\pgfPT@data@name@wd,align=\pgfPTnamealign,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@name@ht]%
at ([xshift=\pgfPT@data@name@x,yshift=-\pgfPT@data@name@y]0)%
@@ -1108,7 +1321,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@Ar%
\edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}%
\ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Ar\pgfPT@labels@Ar@m\else\let\pgfPT@labels@Ar\pgfPT@labels@Ar@w\fi%
- \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont%
\node[font=\pgfPTArfont,text=\pgfPTArcolor,text width=\pgfPT@data@Ar@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Ar@ht]%
at ([xshift=\pgfPT@data@Ar@x,yshift=-\pgfPT@data@Ar@y]0)%
@@ -1117,26 +1329,25 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifpgfPT@Arstar%
\edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}%
\ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@m\else\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@w\fi%
- \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont%
\node[font=\pgfPTArfont,text=\pgfPTArcolor,text width=\pgfPT@data@Arstar@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Arstar@ht]%
at ([xshift=\pgfPT@data@Arstar@x,yshift=-\pgfPT@data@Arstar@y]0)%
{Ar};%
\fi%
% radioactivity
- \ifpgfPT@radio\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}%
- \fontfamily{\pgfPTglobalfont}\pgfPTotherLangFont\selectfont%
+ \ifpgfPT@radio%
+ \pgfPTotherLangFont\selectfont%
+ \pgfmathsetlength{\pgfPT@dima}{.85*\f@size}%
\node[text width=\pgfPT@data@radio@wd,text centered,inner sep=0pt,opacity=.25] (Lradio)%
at ([xshift=\pgfPT@data@radio@x,yshift=-\pgfPT@data@radio@y]0)
{\includegraphics[height=\pgfPT@data@radio@ht]{pgfPT_radio_symbol.pdf}};
\node[text width=\pgfPT@data@radio@wd,text centered,inner sep=0pt,font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,%
text depth=0pt,minimum height=\pgfPT@data@radio@ht,text=\pgfPTlegendradiocolor]%
- at ([xshift=\pgfPT@data@radio@x,yshift=-\pgfPT@data@radio@y]0)
- {Ra};
+ at ([xshift=\pgfPT@data@radio@x,yshift=-\pgfPT@data@radio@y]0) {Ra};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
- % R -> Atomic Radius (Empirycal)
+ % R -> Atomic Radius (Empirycal)
\ifpgfPT@R%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTRfont,text=\pgfPTRcolor,text width=\pgfPT@data@R@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@R@ht]%
at ([xshift=\pgfPT@data@R@x,yshift=-\pgfPT@data@R@y]0)%
@@ -1144,7 +1355,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% Rcov -> Covalente Radius
\ifpgfPT@Rcov%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTRcovfont,text=\pgfPTRcovcolor,text width=\pgfPT@data@Rcov@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Rcov@ht]%
at ([xshift=\pgfPT@data@Rcov@x,yshift=-\pgfPT@data@Rcov@y]0)%
@@ -1152,7 +1362,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% Rion -> Ionic Radius
\ifpgfPT@Rion%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTRionfont,text=\pgfPTRioncolor,text width=\pgfPT@data@Rion@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Rion@ht]%
at ([xshift=\pgfPT@data@Rion@x,yshift=-\pgfPT@data@Rion@y]0)%
@@ -1160,7 +1369,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% Ei -> First Ionization Energy
\ifpgfPT@Ei%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTEifont,text=\pgfPTEicolor,text width=\pgfPT@data@Ei@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Ei@ht]%
at ([xshift=\pgfPT@data@Ei@x,yshift=-\pgfPT@data@Ei@y]0)%
@@ -1168,7 +1376,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% eneg -> Electronegativity (Pauling)
\ifpgfPT@eneg%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTenegfont,text=\pgfPTenegcolor,text width=\pgfPT@data@eneg@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@eneg@ht]%
at ([xshift=\pgfPT@data@eneg@x,yshift=-\pgfPT@data@eneg@y]0)%
@@ -1176,7 +1383,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% eaff -> Electroaffinity
\ifpgfPT@eaff%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTeafffont,text=\pgfPTeaffcolor,text width=\pgfPT@data@eaff@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@eaff@ht]%
at ([xshift=\pgfPT@data@eaff@x,yshift=-\pgfPT@data@eaff@y]0)%
@@ -1184,7 +1390,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% O -> Oxidation States
\ifpgfPT@O%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTOfont,text=\pgfPTOcolor,text width=\pgfPT@data@O@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@O@ht]%
at ([xshift=\pgfPT@data@O@x,yshift=-\pgfPT@data@O@y]0)%
@@ -1192,7 +1397,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% Tmelt -> Melting Point (Kelvin)
\ifpgfPT@Tmelt%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{Tmelt}%
\node[font=\pgfPTTmeltfont,text=\pgfPTTmeltcolor,text width=\pgfPT@data@Tmelt@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Tmelt@ht]%
@@ -1201,7 +1405,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% TmeltC -> Melting Point (degrees Celsius)
\ifpgfPT@TmeltC%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{TmeltC}%
\node[font=\pgfPTTmeltCfont,text=\pgfPTTmeltCcolor,text width=\pgfPT@data@TmeltC@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@TmeltC@ht]%
@@ -1210,7 +1413,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% Tboil -> Boiling Point (Kelvin)
\ifpgfPT@Tboil%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{Tboil}%
\node[font=\pgfPTTboilfont,text=\pgfPTTboilcolor,text width=\pgfPT@data@Tboil@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Tboil@ht]%
@@ -1219,7 +1421,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% TboilC -> Boiling Point (degrees Celsius)
\ifpgfPT@TboilC%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{TboilC}%
\node[font=\pgfPTTboilCfont,text=\pgfPTTboilCcolor,text width=\pgfPT@data@TboilC@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@TboilC@ht]%
@@ -1228,7 +1429,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% eDist -> Electron Distribuition
\ifpgfPT@eDist%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{eDist}%
\node[font=\pgfPTeDistfont,text=\pgfPTeDistcolor,text width=\pgfPT@data@eDist@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@eDist@ht]%
@@ -1237,7 +1437,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% eConfign -> Electronic Configuration (increasing n)
\ifpgfPT@eConfign%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{eConfign}%
\node[font=\pgfPTeConfignfont,text=\pgfPTeConfigncolor,text width=\pgfPT@data@eConfign@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@eConfign@ht]%
@@ -1246,7 +1445,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% eConfignl -> Electronic Configuration (increasing n+l)
\ifpgfPT@eConfignl%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{eConfignl}%
\node[font=\pgfPTeConfignlfont,text=\pgfPTeConfignlcolor,text width=\pgfPT@data@eConfignl@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@eConfignl@ht]%
@@ -1255,7 +1453,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% d -> Density
\ifpgfPT@d%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTdfont,text=\pgfPTdcolor,text width=\pgfPT@data@d@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@d@ht]%
at ([xshift=\pgfPT@data@d@x,yshift=-\pgfPT@data@d@y]0)%
@@ -1263,7 +1460,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% Cp -> Specific heat capacity (25C, 100kPa)
\ifpgfPT@Cp%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTCpfont,text=\pgfPTCpcolor,text width=\pgfPT@data@Cp@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@Cp@ht]%
at ([xshift=\pgfPT@data@Cp@x,yshift=-\pgfPT@data@Cp@y]0)%
@@ -1271,7 +1467,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% kT -> Thermal Condutivity (25C)
\ifpgfPT@kT%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\node[font=\pgfPTkTfont,text=\pgfPTkTcolor,text width=\pgfPT@data@kT@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@kT@ht]%
at ([xshift=\pgfPT@data@kT@x,yshift=-\pgfPT@data@kT@y]0)%
@@ -1279,14 +1474,13 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% ls -> Lattice Structure
\ifpgfPT@ls%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{ls}%
\node[font=\pgfPTlsfont,text=\pgfPTlscolor,text width=\pgfPT@data@ls@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@ls@ht]%
at ([xshift=\pgfPT@data@ls@x,yshift=-\pgfPT@data@ls@y]0)%
{\pgfPT@theacro};%
\ifpgfPTlegendaextra%
- \fontfamily{\pgfPTglobalfont}\pgfPTlsfont\selectfont%
+ \pgfPTlsfont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.67*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{.78*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.625*\f@size}\fi%
\ifpgfPT@DiscC% insere a legenda extra para a estrutura da rede (existindo as bandeiras)
@@ -1334,11 +1528,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
}%
};
\fi%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi% legenda extra
\fi%
% lsa -> Lattice constant: a
\ifpgfPT@lsa%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{lsa}%
\node[font=\pgfPTlsafont,text=\pgfPTlsacolor,text width=\pgfPT@data@lsa@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@lsa@ht]%
@@ -1347,7 +1541,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% lsb -> Lattice constant: b
\ifpgfPT@lsb%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{lsb}%
\node[font=\pgfPTlsbfont,text=\pgfPTlsbcolor,text width=\pgfPT@data@lsb@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@lsb@ht]%
@@ -1356,7 +1549,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% lsc -> Lattice constant: c
\ifpgfPT@lsc%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{lsc}%
\node[font=\pgfPTlscfont,text=\pgfPTlsccolor,text width=\pgfPT@data@lsc@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@lsc@ht]%
@@ -1365,7 +1557,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% lsca -> Lattice c/a ratio:
\ifpgfPT@lsca%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{lsca}%
\node[font=\pgfPTlscafont,text=\pgfPTlscacolor,text width=\pgfPT@data@lsca@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@lsca@ht]%
@@ -1374,7 +1565,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% DiscY -> Discover Year
\ifpgfPT@DiscY%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{DiscY}%
\node[font=\pgfPTDiscYfont,text=\pgfPTDiscYcolor,text width=\pgfPT@data@DiscY@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@DiscY@ht]%
@@ -1383,14 +1573,13 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
% DiscC -> Discover Country
\ifpgfPT@DiscC%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{DiscC}%
\node[font=\pgfPTDiscCfont,text=\pgfPTDiscCcolor,text width=\pgfPT@data@DiscC@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@DiscC@ht]%
at ([xshift=\pgfPT@data@DiscC@x,yshift=-\pgfPT@data@DiscC@y]0)%
{\pgfPT@theacro};%
\ifpgfPTlegendaextra%
- \fontfamily{\pgfPTglobalfont}\pgfPTDiscCfont\selectfont%
+ \pgfPTDiscCfont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.67*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}\edef\pgfPT@nodepos{below right}\edef\pgfPT@nodeat{north east}%
\else\pgfmathsetlength{\pgfPT@dima}{.78*\f@size}\edef\pgfPT@nodepos{right}\edef\pgfPT@nodeat{east}\fi%
\ifpgfPT@ls% insere a legenda extra para as bandeiras (existindo a estrutura da rede)
@@ -1448,11 +1637,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
}%
};
\fi%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi% legenda extra
\fi%
% spectra -> spectra
\ifpgfPT@spectra%
- \fontfamily{\pgfPTglobalfont}\selectfont%
\pgfPT@setacro[\pgfPTlanguages]{spectra}%
\node[font=\pgfPTspectrafont,text=\pgfPTspectracolor,text width=\pgfPT@data@spectra@wd,text centered,inner xsep=0pt,%
text depth=0pt,minimum height=\pgfPT@data@spectra@ht]%
@@ -1460,11 +1649,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{\pgfPT@theacro};%
\fi%
% acronyms description
- \fontfamily{\pgfPTglobalfont}\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont%
+ \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.4*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.3*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\fi\fi%
- \node[below right,text width={2.5*\pgfPTcellwd+.3*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},inner sep=2pt,font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,%
+ \node[below right,text width={2.5*\pgfPTcellwd+.3*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},inner sep=2pt,%
+ font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,%
fill=\pgfPTlegendbackcolor,line width=\pgfPTcelllinewd] (legend) %
at ([yshift={-\pgfPTcellht-.3*\pgfPT@doc@fsize}]0)%
{%
@@ -1472,8 +1662,8 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifx\pgfPTlegendZcolor\@empty\relax\edef\pgfPTZcolor{\pgfPTZback}\else\edef\pgfPTZcolor{\pgfPTlegendZcolor}\fi%
\@for\pgfPT@tmp:=\pgfPT@legend@content\do{%
\tikz{\node[text={\csname pgfPT\pgfPT@tmp color\endcsname},text depth=0pt,
- font=\fontfamily{\pgfPTglobalfont}\selectfont\csname pgfPT\pgfPT@tmp font\endcsname\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont] %
- {\pgfPT@setacro[\pgfPTlanguages]{\pgfPT@tmp}\pgfPT@theacro%
+ font=\csname pgfPT\pgfPT@tmp font\endcsname\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont] %
+ {\pgfPT@setacro[\pgfPTlanguages]{\pgfPT@tmp}\pgfPT@theacro%
\edef\pgfPT@test@tmp{\pgfPT@tmp}%
\ifpgfPT@TboilC\ifpgfPT@Tboil\edef\pgfPT@test@TboilC{TboilC}\ifx\pgfPT@test@tmp\pgfPT@test@TboilC\hspace{.15ex}C\fi\fi\fi%
\ifpgfPT@Tboil\ifpgfPT@TboilC\edef\pgfPT@test@Tboil{Tboil}\ifx\pgfPT@test@tmp\pgfPT@test@Tboil\hspace{.15ex}K\fi\fi\fi%
@@ -1489,7 +1679,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\path[line width=\pgfPTcelllinewd,legendbox,rounded corners=2pt] %
([xshift=2pt,yshift=-2pt]legend.south east) rectangle ([xshift=-2pt,yshift=2pt]0);%
\end{pgfonlayer}
- \fontfamily{\pgfPTglobalfont}\selectfont%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\else% use full description #################################################
\pgfPT@count@note=0%
\ifnum\pgfPT@countb>1\relax%
@@ -1516,43 +1706,46 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\fi%
\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax%
\draw[fill=\pgfPTlegendbackcolor] (0) rectangle ++({\pgfPT@legendscaleX*\pgfPTcellwd},-\pgfPT@legendscaleY*\pgfPTcellht);
- \ifpgfPT@Z\fontfamily{\pgfPTglobalfont}\pgfPTZfont\selectfont\pgfmathsetlength{\pgfPT@dima}{1.5*\pgfPT@loadcell@scaleX*\f@size}%
+ \ifpgfPT@Z\pgfPTZfont\selectfont\pgfmathsetlength{\pgfPT@dima}{1.5*\pgfPT@loadcell@scaleX*\f@size}%
\node[fill=\pgfPTZback,font=\pgfPTZfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text=\pgfPTZcolor,below right,inner sep=1.5pt] (LZ)%
at ([xshift=\pgfPT@legendscaleX*\pgfPT@data@Z@x,yshift=-\pgfPT@legendscaleY*\pgfPT@data@Z@y]0) {Z};%
- \fontfamily{\pgfPTglobalfont}\pgfPTZfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.4*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.4*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\fi\fi%
\pgfPT@leglabel{Z}%
\node[right,font=\pgfPTZfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text=\pgfPTZback,text width=\pgfPT@data@Z@wd,inner xsep=1pt]%
at (LZ.east) {\pgfPT@putleglabel{Z}};%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% the Chemical Symbol
\ifpgfPT@CS\pgfPT@extract@rgb@fill{\pgfPTlegendCScolor}%
- \fontfamily{\pgfPTglobalfont}\pgfPTCSfont\selectfont%
+ \pgfPTCSfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.35*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\fi\fi%
\pgfPT@legend{CS}%
\edef\pgfPT@checkf@nt{fmm}\edef\pgfPT@f@nt{\f@family}%
\ifx\pgfPT@f@nt\pgfPT@checkf@nt\relax\pgfmathsetlength{\pgfPT@dima}{.65*\pgfPT@dima}\pgfmathparse{-.75*\pgfPT@dima}\edef\pgfPT@extra@shift{\pgfmathresult}\else\edef\pgfPT@extra@shift{0pt}\fi%
- \node[font=\fontfamily{\pgfPTglobalfont}\selectfont\pgfPTCSfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text width={\pgfPT@legendscaleX*\pgfPT@data@CS@wd},text centered,text depth=0pt] (LCS)%
+ \node[font=\pgfPTCSfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text width={\pgfPT@legendscaleX*\pgfPT@data@CS@wd},text centered,text depth=0pt] (LCS)%
at ([xshift=\pgfPT@legendscaleX*\pgfPT@data@CS@x,yshift=-\pgfPT@legendscaleY*\pgfPT@data@CS@y+\pgfPT@extra@shift]0)
{\pgfPT@lt[\pgfPTCSolwd](\pgfPT@tmp@label@defaultLanguage)(\pgfPT@rs,\pgfPT@gs,\pgfPT@bs)(\pgfPT@rf,\pgfPT@gf,\pgfPT@bf)(\pgfPT@CS@txt@render)%
- \ifnum\pgfPT@counta>1\relax\\ %[-.5ex]%
+ \ifnum\pgfPT@counta>1\relax\\ %
{\fontsize{\the\pgfPT@dimb}{\the\pgfPT@dimb}\selectfont%
\pgfPT@lt[\pgfPTCSolwd](\pgfPT@tmp@labels@otherLanguages)(\pgfPT@rs,\pgfPT@gs,\pgfPT@bs)(\pgfPT@rf,\pgfPT@gf,\pgfPT@bf)(\pgfPT@CS@txt@render)%
}\fi};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
% pin it...
\ifpgfPTlegendapins%
\pgfmathsetlength{\pgfPT@dimc}{\pgfPT@data@CS@x+\pgfPT@data@CS@wd}%
\ifdim\pgfPT@dimc<\pgfPTcellwd\pgfmathsetlength{\pgfPT@dimc}{\pgfPTcellwd-\pgfPT@dimc}\else\pgfmathsetlength{\pgfPT@dimc}{0pt}\fi%
\draw[fill=black!30,line width=.05pt,draw=black!50] (LCS.east) circle(.05*\pgfPTcellwd) ++(.05*\pgfPTcellwd,0) -- ++(\pgfPT@dimc+.35*\pgfPTcellwd,0);
- \pgfPTCSfont\selectfont\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size}
+ \pgfPTCSfont\selectfont%
+ \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size}
\else\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\fi%
- \fontfamily{\pgfPTglobalfont}\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
+ \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax%
\node[legendpins,%
- text width={.7*\pgfPT@legendscale*\pgfPTcellwd-4pt},font=\fontfamily{\pgfPTglobalfont}\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt]
+ text width={.7*\pgfPT@legendscale*\pgfPTcellwd-4pt},font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt]
at ([xshift={\pgfPT@legendscaleX*\pgfPT@dimc+.2*\pgfPTcellwd},yshift={.25*\pgfPT@data@CS@ht}]LCS.east)%
{%
\pgfPT@extract@rgb@fill{solido}\pgfPT@pinEstado{solido}%
@@ -1581,9 +1774,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
}\fi%
};%
\fi\fi%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
% the Name
\ifpgfPT@name%
- \fontfamily{\pgfPTglobalfont}\pgfPTnamefont\selectfont%
+ \pgfPTnamefont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1594,12 +1788,13 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{%
\pgfPT@putleglabel{name}%
};%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% the Atomic weight
\ifpgfPT@Ar%
\edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}%
\ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Ar\pgfPT@labels@Ar@m\else\let\pgfPT@labels@Ar\pgfPT@labels@Ar@w\fi%
- \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont%
+ \pgfPTArfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1610,11 +1805,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{%
\pgfPT@putleglabel{Ar}%
};%
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
\ifpgfPT@Arstar%
\edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}%
\ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@m\else\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@w\fi%
- \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont%
+ \pgfPTArfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1625,6 +1821,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{Arstar}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% radioactivity
\ifpgfPT@radio%
@@ -1634,7 +1831,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{\includegraphics[height=\pgfPT@dima]{pgfPT_radio_symbol.pdf}};
% pin it...
\ifpgfPTlegendapins%
- \fontfamily{\pgfPTglobalfont}\pgfPTotherLangFont\selectfont%
+ \pgfPTotherLangFont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.65*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.45*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\fi%
\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax%
@@ -1650,11 +1847,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifnum\pgfPT@counta>1\relax\\ [-.25ex]{\fontsize{\the\pgfPT@dimb}{\the\pgfPT@dimb}\selectfont\color{\pgfPTotherLangColor}%
\pgfPT@tmp@labels@otherLanguages}\fi%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
\fi%
% R -> Atomic Radius (Empirycal)
\ifpgfPT@R%
- \fontfamily{\pgfPTglobalfont}\pgfPTRfont\selectfont%
+ \pgfPTRfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1665,10 +1863,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{R}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Rcov -> Covalente Radius
\ifpgfPT@Rcov%
- \fontfamily{\pgfPTglobalfont}\pgfPTRcovfont\selectfont%
+ \pgfPTRcovfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1679,10 +1878,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@pm]{Rcov}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Rion -> Ionic Radius
\ifpgfPT@Rion%
- \fontfamily{\pgfPTglobalfont}\pgfPTRionfont\selectfont%
+ \pgfPTRionfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1693,10 +1893,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@pm]{Rion}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Ei -> First Ionization Energy
\ifpgfPT@Ei%
- \fontfamily{\pgfPTglobalfont}\pgfPTEifont\selectfont%
+ \pgfPTEifont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1707,10 +1908,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@kJmol]{Ei}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% eneg -> Electronegativity (Pauling)
\ifpgfPT@eneg%
- \fontfamily{\pgfPTglobalfont}\pgfPTenegfont\selectfont%
+ \pgfPTenegfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1721,10 +1923,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{eneg}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% eaff -> Electroaffinity
\ifpgfPT@eaff%
- \fontfamily{\pgfPTglobalfont}\pgfPTeafffont\selectfont%
+ \pgfPTeafffont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1735,10 +1938,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@kJmol]{eaff}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% O -> Oxidation States
\ifpgfPT@O%
- \fontfamily{\pgfPTglobalfont}\pgfPTOfont\selectfont%
+ \pgfPTOfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1749,10 +1953,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{O}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Tmelt -> Melting Point (Kelvin)
\ifpgfPT@Tmelt%
- \fontfamily{\pgfPTglobalfont}\pgfPTTmeltfont\selectfont%
+ \pgfPTTmeltfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1763,10 +1968,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@kelvin]{Tmelt}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% TmeltC -> Melting Point (degrees Celsius)
\ifpgfPT@TmeltC%
- \fontfamily{\pgfPTglobalfont}\pgfPTTmeltCfont\selectfont%
+ \pgfPTTmeltCfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1777,10 +1983,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@degC]{TmeltC}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Tboil -> Boiling Point (Kelvin)
\ifpgfPT@Tboil%
- \fontfamily{\pgfPTglobalfont}\pgfPTTboilfont\selectfont%
+ \pgfPTTboilfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1791,10 +1998,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@kelvin]{Tboil}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% TboilC -> Boiling Point (degrees Celsius)
\ifpgfPT@TboilC%
- \fontfamily{\pgfPTglobalfont}\pgfPTTboilCfont\selectfont%
+ \pgfPTTboilCfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1805,10 +2013,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@degC]{TboilC}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% eDist -> Electron Distribuition
\ifpgfPT@eDist%
- \fontfamily{\pgfPTglobalfont}\pgfPTeDistfont\selectfont%
+ \pgfPTeDistfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1819,10 +2028,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{eDist}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% eConfign -> Electronic Configuration (increasing n)
\ifpgfPT@eConfign%
- \fontfamily{\pgfPTglobalfont}\pgfPTeConfignfont\selectfont%
+ \pgfPTeConfignfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1833,10 +2043,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{eConfign}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% eConfignl -> Electronic Configuration (increasing n+l)
\ifpgfPT@eConfignl%
- \fontfamily{\pgfPTglobalfont}\pgfPTeConfignlfont\selectfont%
+ \pgfPTeConfignlfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1847,10 +2058,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{eConfignl}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% d -> Density
\ifpgfPT@d%
- \fontfamily{\pgfPTglobalfont}\pgfPTdfont\selectfont%
+ \pgfPTdfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1861,10 +2073,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@d]{d}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Cp -> Specific heat capacity (25C, 100kPa)
\ifpgfPT@Cp%
- \fontfamily{\pgfPTglobalfont}\pgfPTCpfont\selectfont\advance\pgfPT@count@note by1\relax%
+ \pgfPTCpfont\selectfont\advance\pgfPT@count@note by1\relax%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1875,10 +2088,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@Cp]{Cp}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% kT -> Thermal Condutivity (25C)
\ifpgfPT@kT%
- \fontfamily{\pgfPTglobalfont}\pgfPTkTfont\selectfont\advance\pgfPT@count@note by1\relax%
+ \pgfPTkTfont\selectfont\advance\pgfPT@count@note by1\relax%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -1889,11 +2103,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@kT]{kT}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% NOTES for Cp & kT:
\ifnum\pgfPT@count@note=1\relax%
\ifpgfPT@Cp%
- \fontfamily{\pgfPTglobalfont}\pgfPTCpfont\selectfont%
+ \pgfPTCpfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\fi\fi%
@@ -1995,10 +2210,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
@ 25\raisebox{.777ex}{\fontsize{\pgfPT@dimc}{\pgfPT@dimc}\selectfont o}C,100\hspace{.1ex}kPa};%
\fi\fi%
\fi\fi% \else\ifnum\pgfPT@count@note=2
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
% END OF NOTES for Cp & kT <-------
% ls -> Lattice Structure
\ifpgfPT@ls%
- \fontfamily{\pgfPTglobalfont}\pgfPTlsfont\selectfont%
+ \pgfPTlsfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.3*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2059,10 +2275,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
};
\fi%
\fi% legenda extra
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% lsa -> Lattice constant: a
\ifpgfPT@lsa%
- \fontfamily{\pgfPTglobalfont}\pgfPTlsafont\selectfont%
+ \pgfPTlsafont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2073,10 +2290,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@ls]{lsa}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% lsb -> Lattice constant: b
\ifpgfPT@lsb%
- \fontfamily{\pgfPTglobalfont}\pgfPTlsbfont\selectfont%
+ \pgfPTlsbfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2087,10 +2305,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@ls]{lsb}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% lsc -> Lattice constant: c
\ifpgfPT@lsc%
- \fontfamily{\pgfPTglobalfont}\pgfPTlscfont\selectfont%
+ \pgfPTlscfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2101,10 +2320,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel[\pgfPT@labels@unit@ls]{lsc}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% lsca -> Lattice c/a ratio:
\ifpgfPT@lsca%
- \fontfamily{\pgfPTglobalfont}\pgfPTlscafont\selectfont%
+ \pgfPTlscafont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2115,10 +2335,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{lsca}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% DiscY -> Discover Year
\ifpgfPT@DiscY%
- \fontfamily{\pgfPTglobalfont}\pgfPTDiscYfont\selectfont%
+ \pgfPTDiscYfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2129,10 +2350,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{DiscY}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% DiscC -> Discover Country
\ifpgfPT@DiscC%
- \fontfamily{\pgfPTglobalfont}\pgfPTDiscCfont\selectfont%
+ \pgfPTDiscCfont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2202,10 +2424,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
};
\fi%
\fi% legenda extra
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% spectra -> spectra
\ifpgfPT@spectra%
- \fontfamily{\pgfPTglobalfont}\pgfPTspectrafont\selectfont%
+ \pgfPTspectrafont\selectfont%
\ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}%
\else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}%
\else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi%
@@ -2216,6 +2439,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
{
\pgfPT@putleglabel{spectra}%
};
+ \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
\global\pgfPT@dima=0pt\relax%
\fi\fi% end legend
@@ -2240,7 +2464,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT
\ifnum\pgfPT@limits@min=1\relax\ifnum\pgfPT@limits@max=118\relax\ifnum\pgfPT@element@count>87\relax%
% draw the blocks
\pgfPT@countb=0\relax\@for\pgfPT@tmp:=\pgfPTlanguages\do{\advance\pgfPT@countb by 1\relax}%
-\fontfamily{\pgfPTglobalfont}\pgfPTblocksfont\selectfont%
+\pgfPTblocksfont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi%
% bloco s
@@ -2350,6 +2574,7 @@ at (15*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@de
\fi% IUPAC
\fi%
\fi\fi\fi\fi% END Blocks
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
%
% Families
\ifpgfPTfamilias%
@@ -2358,7 +2583,7 @@ at (15*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@de
\ifnum\pgfPT@limits@min=1\relax\ifnum\pgfPT@limits@max=118\relax\ifnum\pgfPT@element@count>87\relax%
% draw the families
\pgfPT@countb=0\relax\@for\pgfPT@tmp:=\pgfPTlanguages\do{\advance\pgfPT@countb by 1\relax}%
-\fontfamily{\pgfPTglobalfont}\pgfPTfamiliesfont\selectfont%
+\pgfPTfamiliesfont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi%
% elementos representativos
@@ -2456,6 +2681,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def
\fi%
\fi%
\fi\fi\fi\fi% END Families
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
% Variacoes
\edef\@pgfPT@varpage@xshift{0pt}%
\edef\@pgfPT@varpage@yshift{0pt}%
@@ -2600,7 +2826,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def
% end of shifts
% R var
\ifpgfPT@R%
-\fontfamily{\pgfPTglobalfont}\pgfPTvarRfont\selectfont%
+\pgfPTvarRfont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.65*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi%
\colorlet{pgfPTcolortemp}{\pgfPTvarRcolor}\colorlet{pgfPTfontcolortemp}{\pgfPTvarRfontcolor}%
@@ -2630,10 +2856,11 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def
at ([xshift=-.0375*\pgfPTcellwd]variacao.south) {\pgfPT@tmp@labels@otherLanguages};\fi%
\draw[fill=pgfPTcolortemp!60!black,draw=pgfPTcolortemp!60!black] (-\pgfPTcellwd-\pgfPT@Rvar@shift,\pgfPTcellht+\pgfPT@Rvar@shift) circle(.3125*\pgfPTcellwd) %
node[font=\pgfPTvarRfont,text=pgfPTcolortemp!25!white,anchor=mid] {R};%
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Ei var
\ifpgfPT@Ei%
-\fontfamily{\pgfPTglobalfont}\pgfPTvarEifont\selectfont%
+\pgfPTvarEifont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.65*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi%
\colorlet{pgfPTcolortemp}{\pgfPTvarEicolor}\colorlet{pgfPTfontcolortemp}{\pgfPTvarEifontcolor}%
@@ -2663,10 +2890,11 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def
at ([xshift=-.0375*\pgfPTcellwd]variacao.south) {\pgfPT@tmp@labels@otherLanguages};\fi%
\draw[fill=pgfPTcolortemp!60!black,draw=pgfPTcolortemp!60!black] (-\pgfPTcellwd-\pgfPT@Eivar@shift,\pgfPTcellht+\pgfPT@Eivar@shift) circle(.3125*\pgfPTcellwd) %
node[font=\pgfPTvarEifont,text=pgfPTcolortemp!25!white,anchor=mid] {E\raisebox{-.2ex}{i}};%
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
% Eaff var
\ifpgfPT@eaff%
-\fontfamily{\pgfPTglobalfont}\pgfPTvareafffont\selectfont%
+\pgfPTvareafffont\selectfont%
\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.65*\f@size}%
\else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi%
\colorlet{pgfPTcolortemp}{\pgfPTvareaffcolor}\colorlet{pgfPTfontcolortemp}{\pgfPTvareafffontcolor}%
@@ -2696,6 +2924,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def
at ([xshift=-.0375*\pgfPTcellwd]variacao.south) {\pgfPT@tmp@labels@otherLanguages};\fi%
\draw[fill=pgfPTcolortemp!60!black,draw=pgfPTcolortemp!60!black] (-\pgfPTcellwd-\pgfPT@eaffvar@shift,\pgfPTcellht+\pgfPT@eaffvar@shift) circle(.3125*\pgfPTcellwd) %
node[font=\pgfPTvareafffont,text=pgfPTcolortemp!25!white,anchor=mid] {E\raisebox{-.2ex}{ea}};%
+\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}%
\fi%
\fi\fi\fi\fi% END Variacoes
%
@@ -2706,7 +2935,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def
\pgfPT@dima=0pt\pgfPT@dimb=0pt\relax%
\ifpgfPTperlabels%
\begin{pgfinterruptpicture}%
-\setbox0=\hbox{\fontfamily{\pgfPTglobalfont}\pgfPTlabfont\selectfont7}\global\pgfPT@dima=\wd0%
+\setbox0=\hbox{\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\pgfPTlabfont\selectfont7}\global\pgfPT@dima=\wd0%
\end{pgfinterruptpicture}%
\pgfmathsetlength{\pgfPT@dima}{-\pgfPT@dima+2*\pgfPT@perlabel@xshift}%
\else%
@@ -2714,13 +2943,13 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def
\fi% pgfPTperlabels
\ifpgfPTtitulo%
\begin{pgfinterruptpicture}%
-\setbox0=\hbox{\fontfamily{\pgfPTglobalfont}\pgfPTtitlefont\selectfont P}\global\pgfPT@dimb=\ht0%
+\setbox0=\hbox{\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\pgfPTtitlefont\selectfont P}\global\pgfPT@dimb=\ht0%
\end{pgfinterruptpicture}%
\pgfmathsetlength{\pgfPT@dimb}{\pgfPT@dimb+.5*\pgfPTcellht+5pt}%
\else%
\ifpgfPTgrlabels%
\begin{pgfinterruptpicture}%
-\setbox0=\hbox{\fontfamily{\pgfPTglobalfont}\pgfPTlabfont\selectfont7}\global\pgfPT@dimb=\ht0%
+\setbox0=\hbox{\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\pgfPTlabfont\selectfont7}\global\pgfPT@dimb=\ht0%
\end{pgfinterruptpicture}%
\pgfmathsetlength{\pgfPT@dimb}{\pgfPT@dimb+5pt}%
\else%
@@ -2749,7 +2978,8 @@ rectangle
\fi% \pgfPT@element@count=118
\fi\fi% min=1 & max 118
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document
+\@pgfPT@resetlayers% Restoring pgf layers to those used in the document
+\fontseries{\seriesdefault}\fontshape{\shapedefault}\fontfamily{\familydefault}\selectfont% Restoring the font settings to normal mode in the document
}% end tikz
}%
% END !! \pgfPT -----------------------------------------------------------------------------------
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
index 08ddf4d787..e957a47bae 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
index 38f33f1710..659f09fd72 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex
@@ -10,6 +10,7 @@
\date{\today}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}%
+\usefont{T1}{verdana}{m}{n}%
\begin{titlepage}
\vspace{\stretch{1}}%
\maketitle\thispagestyle{empty}%
@@ -20,7 +21,7 @@
\makebox[\linewidth][c]{\tikz{%
\node[text width=.9\linewidth+.5cm,text justified,draw=blue!10!black,rounded corners=10pt,fill=blue!5] at (0,0) {\color{blue!10!black}
\begin{abstract}
-\noindent The purpose of this package is to provide the Periodic Table of Elements in a simple way. It relies on pgf/\txttikz{} to offer a full or partial periodic table with a variety of options and displaying the desired data. The data available, from all the actual 118 elements, is: atomic number, element name, chemical symbol, relative atomic mass, standard relative atomic mass, radioactivity, atomic radius (empirycal), covalente radius, ionic radius, first ionization energy, electronegati\-vity (Pauling), electroaffinity, oxidation states, melting point (in Kelvin and Celsius degrees), boiling point (in Kelvin and Celsius degrees), electron distribuition, electronic configuration (increasing $n$ and increasing $n+\ell$), density, specific heat capacity, thermal condutivity, lattice structure, lattice constants (a, b, c and c/a ratio), discovery year, discovery country and visible range spectral lines. It is possible to get the Periodic Table in six languages: English, French, German, Portuguese (from Portugal and from Brazil), Spanish and Italian.
+\noindent The purpose of this package is to provide the Periodic Table of Elements in a simple way. It relies on pgf/\txttikz{} to offer a full or partial periodic table with a variety of options and displaying the desired data. The data available, from all the actual 118 elements, is: atomic number, element name, chemical symbol, relative atomic mass, standard relative atomic mass, radioactivity, atomic radius (empirycal), covalente radius, ionic radius, first ionization energy, electronegati\-vity (Pauling), electroaffinity, oxidation states, melting point (in Kelvin and Celsius degrees), boiling point (in Kelvin and Celsius degrees), electron distribuition, electronic configuration (increasing $n$ and increasing $n+\ell$), density, specific heat capacity, thermal condutivity, lattice structure, lattice constants (a, b, c and c/a ratio), discovery year, discovery country and visible range spectral lines. It is possible to get the Periodic Table in different languages: English, French, German, Portuguese (from Portugal and from Brazil), Spanish, Italian and translations provided by user contributions -- currently in Dutch only.
\\ [6pt]
\end{abstract}
};}}
@@ -35,22 +36,93 @@
\newpage\setcounter{page}{1}%
\pagestyle{pgfPTManual}%
\ \vfill%
-\section{Installation and usage}
+\section{Getting started}
+\subsection{Installation}
\noindent
-\pack{} is placed under the terms of the \textrm{\LaTeX} Project Public License, version 1.3 or later (http://www.latex-project.org/lppl.txt). \pack{} loads and only requires the \href{https://www.ctan.org/pkg/pgf}{\txttikz{}} package.
+\pack{} is placed under the terms of the \textrm{\LaTeX} Project Public License, version 1.3 or later (http://www.latex-project.org/lppl.txt). \pack{} loads and requires the \href{https://www.ctan.org/pkg/pgf}{\txttikz{}} and \href{https://ctan.org/pkg/fontenc}{fontenc} or \href{https://ctan.org/pkg/fontspec}{fontspec} (at least v2.7h -- 2020/02/03) packages.
\\ [6pt]You need to put the package files (pgf-PeriodicTable.sty \&\ \textit{friends}) in a location where \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} can find them. According to the TDS conventions this may be a subdirectory named \textit{tex/latex/pgf-PeriodicTable/} or \textit{tex/latex/misc/} in your (site specific) installation tree (insert your appropriate directory delimiter instead of /, if needed).
-\\ [6pt]If you are using \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} you can just simply include the style file without any option via the \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}} command, \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
-\\ [6pt]It can also be loaded with \textit{one option} to select the desired language:\\ \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{language flag}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\subsection{Package loading and options}
+If you are using \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} you can just simply include the style file without any option via the \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}} command, \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\\ [6pt]It can also be loaded with a comma separated list of \textit{options} to select the desired default language or to use Devanagari or Mandarin numerals in the Atomic Number, Periods and/or Groups.
+\subsubsection{Language Option}
+There are six \textit{built-in }languages -- English, French, German, Portuguese (from Portugal and Brazil), Spanish and Italian. The default language used in the package may be selected at package loading:
+\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{language flag}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
\\ [6pt]\textit{The \textcolor{brown!60!black}{language flags} available are:}
+\vspace{2pt}\hrule\vspace{4pt}
+\begin{minipage}[t]{.5\linewidth}
\begin{itemize}
\item[$\checkmark$]\textbf{en} for English (default),
\item[$\checkmark$]\textbf{fr} for French,
\item[$\checkmark$]\textbf{de} for German,
\item[$\checkmark$]\textbf{pt} for Portuguese (Portugal),
+\end{itemize}\end{minipage}\begin{minipage}[t]{.5\linewidth}
+\begin{itemize}
\item[$\checkmark$]\textbf{br} for Portuguese (Brazil),
\item[$\checkmark$]\textbf{es} for Spanish and
\item[$\checkmark$]\textbf{it} for Italian.
-\end{itemize}
+\end{itemize}\end{minipage}
+\vspace{4pt}\hrule\vspace{12pt}
+A \textit{user language} can also be chosen as default language loading the package with the following option syntax:
+\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=<ISO 639-1 CODE>}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\\ [6pt]In the present version only a Dutch translation is available. It can be loaded by:
+\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=nl}%
+\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=green!70,rounded corners=2pt,fill=black!10!green!10,inner sep=3mm] {Anyone who wishes to contribute with translations for use in this package can go to the \tikz[baseline=(b.base)]{\node[inner sep=0pt] (a) {\includegraphics[height=10pt]{manualfiles/pgfPTgithub-mark.pdf}}; \node[right,inner sep=0pt,xshift=.1em] (b) at (a.east) {\href{https://github.com/HugoPGomes/pgf-periodictable}{pgf-periodictable}};} project page.};}
+\\ [6pt]\textbf{Note that the \textit{built-in} languages are always available for the \textcolor{red!60!black}{languages} option of the \bs{pgfPT} command, but the \textit{user language} is only available if loaded with the package.}
+\subsubsection{Devanagari numerals}
+It is possible to get some numbers in the Periodic Table with Devanagari numerals: the atomic number and the numeration of periods and groups. To get this feature enabled the package must be loaded with the option \textit{numerals} set to \textbf{dvn}:
+\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{numerals=dvn}%
+\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=orange!70,rounded corners=2pt,fill=black!10!orange!10,inner sep=3mm] {
+This option requires the \textrm{Xe\LaTeX} engine to typeset the document.};}
+\\ [10pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[numerals=dvn]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumDeva.pdf}}}%
+\\ [3pt]\pgfPTMline
+\\ [6pt]It is also possible to load a font for the Devanagari numerals using the following command:
+\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTdvnfont}%
+\\ [3pt]\bs{pgfPTdvnfont}\lp\red{font options}\rp\lb\red{font name}\rb
+\\ [3pt]The default font is \textit{Eczar}.
+\vfill
+\subsubsection{Mandarin numerals}
+To get some numbers of the Periodic Table with Mandarin numerals (the atomic number and the numeration of periods and groups) the package must be loaded with the above option \textit{numerals} set to \textbf{zh}:
+\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{numerals=zh}%
+\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}}
+\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=orange!70,rounded corners=2pt,fill=black!10!orange!10,inner sep=3mm] {
+This option works with the \textrm{Xe\LaTeX} and \textrm{Lua\LaTeX} engines to typeset the document and requires the \texttt{\large zhnumber} package, which is automatically loaded.};}
+\newpage%\\ [10pt]
+\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[numerals=zh]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumMand1.pdf}}}%
+\\ [3pt]\pgfPTMline
+\\ [6pt]As with the Devanagari numerals, the following command loads the specified font for the Mandarin numerals:
+\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhfont}%
+\\ [3pt]\bs{pgfPTzhfont}\lp\red{font options}\rp\lb\red{font name}\rb
+\\ [3pt]The default font is \textit{SimSun} loaded with the \textit{AutoFakeBold=4} option.
+\\ [6pt]It is also possible to enable or disable the numbers shown in Mandarin with the command:
+\\ [3pt]\bs{pgfPTzhnumber}\lp\red{<true|false>}\rp\lb\red{comma separated list}\rb
+\\ [3pt] The list can have \red{Z} for the atomic number, \red{per} for the period numbers and \red{gr} for the group numbers. At package loading, with this option, they are set to \red{true}.
+\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhnumber}%
+\\ [10pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] %
+{\small\textcolor{black!50}{\%\ \string\usepackage[numerals=zh]\{pgf-PeriodicTable\}}};}%
+\\ [-4pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=center,fill=black!10,rounded corners=2pt] %
+{\bs{pgfPTzhnumber}\lp\red{false}\rp\lb\red{Z}\rb};}%
+\\ [-4pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36}]%
+\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumMand2.pdf}}}%
+\\ [3pt]\pgfPTMline
+\subsection{Interaction with other packages}
+\subsubsection{fontspec}
+To correctly set the font in each cell contents the command \bs{fontspec} must be used. For example if you want to use \textit{Arial} for the \red{name font}, it must be set using \red{font name=\bs{fontspec}\lb Arial\rb\bs{selectfont}}.\\ All other font selection commands, \eg, \bs{large}, \mbox{\bs{itshape}}, are used as usual. For example if you want to use \textit{Arial}\hfil\ in\hfil\ \textit{large}\hfil\ size\hfil\ and\hfil\ \textit{bold}\hfil\ weight\hfil\ for\hfil\ the \red{name font}, then you type
+\\ \makebox[\linewidth][s]{\red{font name=\bs{large}\bs{bfseries}\bs{fontspec}\lb Arial\rb\bs{selectfont}}\hfil\ or\hfil\ \red{font name=\bs{fontspec}\lb Arial\rb}}
+\\ \bs{large}\bs{bfseries}\bs{selectfont}.
+\subsubsection{ragged2e}
+Using \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{document}%
+\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{ragged2e}\textcolor{purple!40!black}{\}}} and \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}%
+\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} together, the Periodic Table will be completely fractured and out of the page.
+\\ [6pt]\textit{Solution}:
+\vspace{4pt}\hrule\vspace{4pt}Use a local group: \{\bs{justifying}\bs{pgfPT}\}\vspace{4pt}\hrule
\vfill\vfill\vfill\newpage\ \vfill%
\section{The data}
The data available in \pack{} was mainly compiled with selected and filtered data from Wikipedia, taken from November 2021 to July 2022.
@@ -73,7 +145,7 @@ Commission on Isotopic Abundances and Atomic Weights,\newline\bfseries\textsf{\t
\\ [-1pt]\linhapar{TboilC}{Boiling Point}{$\mathsf{^oC}$}{at standard pressure (Wikidata @21/dez/2021)}%
\\ [-1pt]\linhaimpar{eDist}{Electron Distribution}{}{(Wikidata @01/nov/2021)}%
\\ [-1pt]\linhapar{eConfign}{Electronic Configuration (increasing n)}{}{(Wikidata @01/nov/2021)}%
-\\ [-1pt]\linhaimpar{eConfign}{Electronic Configuration (increasing $\mathsf{n+\ell}$)}{}{(Wikidata @01/nov/2021)}%
+\\ [-1pt]\linhaimpar{eConfignl}{Electronic Configuration (increasing $\mathsf{n+\ell}$)}{}{(Wikidata @01/nov/2021)}%
\\ [-1pt]\linhapar{d}{Density}{$\mathsf{g\cdot dm^{-3}}$ {\tiny for gases}\newline$\mathsf{g\cdot cm^{-3}}$ {\tiny all other physical states}}{physical state at $\mathsf{25^oC, 1\,atm}$ (Wikidata @01/nov/2021)}%
\\ [-1pt]\linhaimpar{Cp}{Specific heat capacity}{$\mathsf{J\cdot mol^{-1}\cdot K^{-1}}$}{at $\mathsf{25^oC}$ and $\mathsf{100\,kPa}$ (Wikidata @20/nov/2021)}%
\\ [-1pt]\linhapar{kT}{Thermal Conductivity}{$\mathsf{W\cdot m^{-1}\cdot K^{-1}}$}{at $\mathsf{25^oC}$ (Wikidata @21/nov/2021)}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
index 3567ca1be3..a9a3699c36 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex
@@ -326,8 +326,8 @@ at (-.5*\pgfPT@cell@collumnwd+\pgfPT@cell@collumnwd*\coluna,\pgfPT@cell@lineht)
\newif\ifpgfPT@spectra\pgfPT@spectrafalse%
%\newif\ifpgfPT@DiscBy\pgfPT@DiscByfalse%
% --------------------------------------------------------------------------------------------------
-\def\loadcell#1{Loading cell data\\ --\ #1\ -- CONTENTS\pgfPT@loadcell[#1]% DEBUG
-\@for\@tmp:=\pgfPT@load@cellcontents\do{\\ \@tmp}}% DEBUG
+%\def\loadcell#1{Loading cell data\\ --\ #1\ -- CONTENTS\pgfPT@loadcell[#1]% DEBUG
+%\@for\@tmp:=\pgfPT@load@cellcontents\do{\\ \@tmp}}% DEBUG
% --------------------------------------------------------------------------------------------------
\def\pgfPT@loadcell[#1]{\ignorespaces%
\edef\pgfPT@testa{#1}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
index da64b41a06..62d62e0f89 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex
@@ -3,6 +3,7 @@
% --------------------------------------------------------------------------------------------------
% the data of the elements of the Periodic Table ---------------------------------------------
% --------------------------------------------------------------------------------------------------
+% v2.1.0: Added support for user language
%
% data available for each element:
% Z: Atomic Number
@@ -76,52 +77,52 @@
\def\pgfPT@set@country#1{%
\edef\pgfPT@country@flag{pgfPT_flag#1}%
\ifcase#1%
-% 0: Asia Minor
-\def\pgfPT@country@name@pt{\'{A}sia Menor}\def\pgfPT@country@name@en{Asia Minor}\def\pgfPT@country@name@fr{Asie Mineure}\def\pgfPT@country@name@de{Kleinasien}\def\pgfPT@country@name@it{Asia minore}\def\pgfPT@country@name@es{Asia Menor}\def\pgfPT@country@name@br{\'{A}sia Menor}%
-\or% 1: Austria
-\def\pgfPT@country@name@pt{\'{A}ustria}\def\pgfPT@country@name@en{Austria}\def\pgfPT@country@name@fr{Autriche}\def\pgfPT@country@name@de{\"{O}sterreich}\def\pgfPT@country@name@it{Austria}\def\pgfPT@country@name@es{Austria}\def\pgfPT@country@name@br{\'{A}ustria}%
-\or% 2: Denmark
-\def\pgfPT@country@name@pt{Dinamarca}\def\pgfPT@country@name@en{Denmark}\def\pgfPT@country@name@fr{Danemark}\def\pgfPT@country@name@de{D\"{a}nemark}\def\pgfPT@country@name@it{Danimarca}\def\pgfPT@country@name@es{Dinamarca}\def\pgfPT@country@name@br{Dinamarca}%
-\or% 3: Egypt
-\def\pgfPT@country@name@pt{Egito}\def\pgfPT@country@name@en{Egypt}\def\pgfPT@country@name@fr{Egypte}\def\pgfPT@country@name@de{\"{A}gypten}\def\pgfPT@country@name@it{Egitto}\def\pgfPT@country@name@es{Egipto}\def\pgfPT@country@name@br{Egito}%
-\or% 4: Finland
-\def\pgfPT@country@name@pt{Finl\^{a}ndia}\def\pgfPT@country@name@en{Finland}\def\pgfPT@country@name@fr{Finlande}\def\pgfPT@country@name@de{Finnland}\def\pgfPT@country@name@it{Finlandia}\def\pgfPT@country@name@es{Finlandia}\def\pgfPT@country@name@br{Finl\^{a}ndia}%
-\or% 5: France
-\def\pgfPT@country@name@pt{Fran\c{c}a}\def\pgfPT@country@name@en{France}\def\pgfPT@country@name@fr{France}\def\pgfPT@country@name@de{Frankreich}\def\pgfPT@country@name@it{Francia}\def\pgfPT@country@name@es{Francia}\def\pgfPT@country@name@br{Fran\c{c}a}%
+% 0: Asia Minor AM
+\def\pgfPT@country@name@pt{\'{A}sia Menor}\def\pgfPT@country@name@en{Asia Minor}\def\pgfPT@country@name@fr{Asie Mineure}\def\pgfPT@country@name@de{Kleinasien}\def\pgfPT@country@name@it{Asia minore}\def\pgfPT@country@name@es{Asia Menor}\def\pgfPT@country@name@br{\'{A}sia Menor}\def\pgfPT@country@name@user{\pgfPT@user@country@AM}%
+\or% 1: Austria au
+\def\pgfPT@country@name@pt{\'{A}ustria}\def\pgfPT@country@name@en{Austria}\def\pgfPT@country@name@fr{Autriche}\def\pgfPT@country@name@de{\"{O}sterreich}\def\pgfPT@country@name@it{Austria}\def\pgfPT@country@name@es{Austria}\def\pgfPT@country@name@br{\'{A}ustria}\def\pgfPT@country@name@user{\pgfPT@user@country@au}%
+\or% 2: Denmark dn
+\def\pgfPT@country@name@pt{Dinamarca}\def\pgfPT@country@name@en{Denmark}\def\pgfPT@country@name@fr{Danemark}\def\pgfPT@country@name@de{D\"{a}nemark}\def\pgfPT@country@name@it{Danimarca}\def\pgfPT@country@name@es{Dinamarca}\def\pgfPT@country@name@br{Dinamarca}\def\pgfPT@country@name@user{\pgfPT@user@country@dn}%
+\or% 3: Egypt eg
+\def\pgfPT@country@name@pt{Egito}\def\pgfPT@country@name@en{Egypt}\def\pgfPT@country@name@fr{Egypte}\def\pgfPT@country@name@de{\"{A}gypten}\def\pgfPT@country@name@it{Egitto}\def\pgfPT@country@name@es{Egipto}\def\pgfPT@country@name@br{Egito}\def\pgfPT@country@name@user{\pgfPT@user@country@eg}%
+\or% 4: Finland fl
+\def\pgfPT@country@name@pt{Finl\^{a}ndia}\def\pgfPT@country@name@en{Finland}\def\pgfPT@country@name@fr{Finlande}\def\pgfPT@country@name@de{Finnland}\def\pgfPT@country@name@it{Finlandia}\def\pgfPT@country@name@es{Finlandia}\def\pgfPT@country@name@br{Finl\^{a}ndia}\def\pgfPT@country@name@user{\pgfPT@user@country@fl}%
+\or% 5: France fr
+\def\pgfPT@country@name@pt{Fran\c{c}a}\def\pgfPT@country@name@en{France}\def\pgfPT@country@name@fr{France}\def\pgfPT@country@name@de{Frankreich}\def\pgfPT@country@name@it{Francia}\def\pgfPT@country@name@es{Francia}\def\pgfPT@country@name@br{Fran\c{c}a}\def\pgfPT@country@name@user{\pgfPT@user@country@fr}%
\or% 6: France and Germany
\or% 7: France and The United Kingdom
-\or% 8: Germany
-\def\pgfPT@country@name@pt{Alemanha}\def\pgfPT@country@name@en{Germany}\def\pgfPT@country@name@fr{Allemagne}\def\pgfPT@country@name@de{Deutschland}\def\pgfPT@country@name@it{Germania}\def\pgfPT@country@name@es{Alemania}\def\pgfPT@country@name@br{Alemanha}%
+\or% 8: Germany de
+\def\pgfPT@country@name@pt{Alemanha}\def\pgfPT@country@name@en{Germany}\def\pgfPT@country@name@fr{Allemagne}\def\pgfPT@country@name@de{Deutschland}\def\pgfPT@country@name@it{Germania}\def\pgfPT@country@name@es{Alemania}\def\pgfPT@country@name@br{Alemanha}\def\pgfPT@country@name@user{\pgfPT@user@country@de}%
\or% 9: Germany and Sweden
\or% 10: Germany and The United Kingdom
-\or% 11: Italy
-\def\pgfPT@country@name@pt{It\'{a}lia}\def\pgfPT@country@name@en{Italy}\def\pgfPT@country@name@fr{Italie}\def\pgfPT@country@name@de{Italien}\def\pgfPT@country@name@it{Italia}\def\pgfPT@country@name@es{Italia}\def\pgfPT@country@name@br{It\'{a}lia}%
-\or% 12: Middle East
-\def\pgfPT@country@name@pt{M\'{e}dio Oriente}\def\pgfPT@country@name@en{Middle East}\def\pgfPT@country@name@fr{Moyen-Orient}\def\pgfPT@country@name@de{Mittlerer Osten}\def\pgfPT@country@name@it{Medio Oriente}\def\pgfPT@country@name@es{Medio Oriente}\def\pgfPT@country@name@br{M\'{e}dio Oriente}%
-\or% 13: Peru
-\def\pgfPT@country@name@pt{Peru}\def\pgfPT@country@name@en{Peru}\def\pgfPT@country@name@fr{P\'{e}rou}\def\pgfPT@country@name@de{Peru}\def\pgfPT@country@name@it{Per\`{u}}\def\pgfPT@country@name@es{Per\'{u}}\def\pgfPT@country@name@br{Peru}%
-\or% 14: Romania
-\def\pgfPT@country@name@pt{Rom\'{e}nia}\def\pgfPT@country@name@en{Romania}\def\pgfPT@country@name@fr{Roumanie}\def\pgfPT@country@name@de{Rum\"{a}nien}\def\pgfPT@country@name@it{Romania}\def\pgfPT@country@name@es{Rumania}\def\pgfPT@country@name@br{Rom\^{e}nia}%
-\or% 15: Russia
-\def\pgfPT@country@name@pt{R\'{u}ssia}\def\pgfPT@country@name@en{Russia}\def\pgfPT@country@name@fr{Russie}\def\pgfPT@country@name@de{Russland}\def\pgfPT@country@name@it{Russia}\def\pgfPT@country@name@es{Rusia}\def\pgfPT@country@name@br{R\'{u}ssia}%
+\or% 11: Italy it
+\def\pgfPT@country@name@pt{It\'{a}lia}\def\pgfPT@country@name@en{Italy}\def\pgfPT@country@name@fr{Italie}\def\pgfPT@country@name@de{Italien}\def\pgfPT@country@name@it{Italia}\def\pgfPT@country@name@es{Italia}\def\pgfPT@country@name@br{It\'{a}lia}\def\pgfPT@country@name@user{\pgfPT@user@country@it}%
+\or% 12: Middle East ME
+\def\pgfPT@country@name@pt{M\'{e}dio Oriente}\def\pgfPT@country@name@en{Middle East}\def\pgfPT@country@name@fr{Moyen-Orient}\def\pgfPT@country@name@de{Mittlerer Osten}\def\pgfPT@country@name@it{Medio Oriente}\def\pgfPT@country@name@es{Medio Oriente}\def\pgfPT@country@name@br{M\'{e}dio Oriente}\def\pgfPT@country@name@user{\pgfPT@user@country@ME}%
+\or% 13: Peru pe
+\def\pgfPT@country@name@pt{Peru}\def\pgfPT@country@name@en{Peru}\def\pgfPT@country@name@fr{P\'{e}rou}\def\pgfPT@country@name@de{Peru}\def\pgfPT@country@name@it{Per\`{u}}\def\pgfPT@country@name@es{Per\'{u}}\def\pgfPT@country@name@br{Peru}\def\pgfPT@country@name@user{\pgfPT@user@country@pe}%
+\or% 14: Romania ro
+\def\pgfPT@country@name@pt{Rom\'{e}nia}\def\pgfPT@country@name@en{Romania}\def\pgfPT@country@name@fr{Roumanie}\def\pgfPT@country@name@de{Rum\"{a}nien}\def\pgfPT@country@name@it{Romania}\def\pgfPT@country@name@es{Rumania}\def\pgfPT@country@name@br{Rom\^{e}nia}\def\pgfPT@country@name@user{\pgfPT@user@country@ro}%
+\or% 15: Russia ru
+\def\pgfPT@country@name@pt{R\'{u}ssia}\def\pgfPT@country@name@en{Russia}\def\pgfPT@country@name@fr{Russie}\def\pgfPT@country@name@de{Russland}\def\pgfPT@country@name@it{Russia}\def\pgfPT@country@name@es{Rusia}\def\pgfPT@country@name@br{R\'{u}ssia}\def\pgfPT@country@name@user{\pgfPT@user@country@ru}%
\or% 16: Russia and The United States
-\or% 17: Spain
-\def\pgfPT@country@name@pt{Espanha}\def\pgfPT@country@name@en{Spain}\def\pgfPT@country@name@fr{Espagne}\def\pgfPT@country@name@de{Spanien}\def\pgfPT@country@name@it{Spagna}\def\pgfPT@country@name@es{Espa\~{n}a}\def\pgfPT@country@name@br{Espanha}%
-\or% 18: Sweden
-\def\pgfPT@country@name@pt{Su\'{e}cia}\def\pgfPT@country@name@en{Sweden}\def\pgfPT@country@name@fr{Su\`{e}de}\def\pgfPT@country@name@de{Schweden}\def\pgfPT@country@name@it{Svezia}\def\pgfPT@country@name@es{Suecia}\def\pgfPT@country@name@br{Su\'{e}cia}%
+\or% 17: Spain es
+\def\pgfPT@country@name@pt{Espanha}\def\pgfPT@country@name@en{Spain}\def\pgfPT@country@name@fr{Espagne}\def\pgfPT@country@name@de{Spanien}\def\pgfPT@country@name@it{Spagna}\def\pgfPT@country@name@es{Espa\~{n}a}\def\pgfPT@country@name@br{Espanha}\def\pgfPT@country@name@user{\pgfPT@user@country@es}%
+\or% 18: Sweden sw
+\def\pgfPT@country@name@pt{Su\'{e}cia}\def\pgfPT@country@name@en{Sweden}\def\pgfPT@country@name@fr{Su\`{e}de}\def\pgfPT@country@name@de{Schweden}\def\pgfPT@country@name@it{Svezia}\def\pgfPT@country@name@es{Suecia}\def\pgfPT@country@name@br{Su\'{e}cia}\def\pgfPT@country@name@user{\pgfPT@user@country@sw}%
\or% 19: Sweden and The United Kingdom
-\or% 20: Switzerland
-\def\pgfPT@country@name@pt{Su\'{i}\c{c}a}\def\pgfPT@country@name@en{Switzerland}\def\pgfPT@country@name@fr{Suisse}\def\pgfPT@country@name@de{Schweiz}\def\pgfPT@country@name@it{Svizzera}\def\pgfPT@country@name@es{Suiza}\def\pgfPT@country@name@br{Su\'{i}\c{c}a}%
-\or% 21: The United Kingdom
-\def\pgfPT@country@name@pt{Reino Unido}\def\pgfPT@country@name@en{The United Kingdom}\def\pgfPT@country@name@fr{Royaume-Uni}\def\pgfPT@country@name@de{Vereinigtes K\"{o}nigreich}\def\pgfPT@country@name@it{Regno Unito}\def\pgfPT@country@name@es{Reino Unido}\def\pgfPT@country@name@br{Reino Unido}%
-\or% 22: The United States
-\def\pgfPT@country@name@pt{Estados Unidos}\def\pgfPT@country@name@en{The United States}\def\pgfPT@country@name@fr{\'{E}tats-Unis}\def\pgfPT@country@name@de{Vereinigte Staaten}\def\pgfPT@country@name@it{Stati Uniti}\def\pgfPT@country@name@es{Estados Unidos}\def\pgfPT@country@name@br{Estados Unidos}%
+\or% 20: Switzerland ch
+\def\pgfPT@country@name@pt{Su\'{i}\c{c}a}\def\pgfPT@country@name@en{Switzerland}\def\pgfPT@country@name@fr{Suisse}\def\pgfPT@country@name@de{Schweiz}\def\pgfPT@country@name@it{Svizzera}\def\pgfPT@country@name@es{Suiza}\def\pgfPT@country@name@br{Su\'{i}\c{c}a}\def\pgfPT@country@name@user{\pgfPT@user@country@ch}%
+\or% 21: The United Kingdom uk
+\def\pgfPT@country@name@pt{Reino Unido}\def\pgfPT@country@name@en{The United Kingdom}\def\pgfPT@country@name@fr{Royaume-Uni}\def\pgfPT@country@name@de{Vereinigtes K\"{o}nigreich}\def\pgfPT@country@name@it{Regno Unito}\def\pgfPT@country@name@es{Reino Unido}\def\pgfPT@country@name@br{Reino Unido}\def\pgfPT@country@name@user{\pgfPT@user@country@uk}%
+\or% 22: The United States us
+\def\pgfPT@country@name@pt{Estados Unidos}\def\pgfPT@country@name@en{The United States}\def\pgfPT@country@name@fr{\'{E}tats-Unis}\def\pgfPT@country@name@de{Vereinigte Staaten}\def\pgfPT@country@name@it{Stati Uniti}\def\pgfPT@country@name@es{Estados Unidos}\def\pgfPT@country@name@br{Estados Unidos}\def\pgfPT@country@name@user{\pgfPT@user@country@us}%
\or% 23: Mexico and Sweden
\or% 24: Sweden and The United States
-\or% 25: Mexico (and Sweden)
-\def\pgfPT@country@name@pt{M\'{e}xico}\def\pgfPT@country@name@en{Mexico}\def\pgfPT@country@name@fr{Mexique}\def\pgfPT@country@name@de{Mexico}\def\pgfPT@country@name@it{Messico}\def\pgfPT@country@name@es{M\'{e}xico}\def\pgfPT@country@name@br{M\'{e}xico}%
+\or% 25: Mexico (and Sweden) mx
+\def\pgfPT@country@name@pt{M\'{e}xico}\def\pgfPT@country@name@en{Mexico}\def\pgfPT@country@name@fr{Mexique}\def\pgfPT@country@name@de{Mexico}\def\pgfPT@country@name@it{Messico}\def\pgfPT@country@name@es{M\'{e}xico}\def\pgfPT@country@name@br{M\'{e}xico}\def\pgfPT@country@name@user{\pgfPT@user@country@mx}%
\else% 100:
-\def\pgfPT@country@name@pt{}\def\pgfPT@country@name@en{}\def\pgfPT@country@name@fr{}\def\pgfPT@country@name@de{}\def\pgfPT@country@name@it{}\def\pgfPT@country@name@es{}\def\pgfPT@country@name@br{}%
+\def\pgfPT@country@name@pt{}\def\pgfPT@country@name@en{}\def\pgfPT@country@name@fr{}\def\pgfPT@country@name@de{}\def\pgfPT@country@name@it{}\def\pgfPT@country@name@es{}\def\pgfPT@country@name@br{}\def\pgfPT@country@name@user{}%
\fi%
}%
% --------------------------------------------------------------------------------------------------
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
index 18620fea26..8c09f620e1 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex
@@ -4,11 +4,9 @@
% --------------------------------------------------------------------------------------------------
% The keys for the layout and drawing the Periodic Table ------------------------------------
% --------------------------------------------------------------------------------------------------
-%% defining PGF keys: language list to use in the Periodic Table ------------------------------
\pgfkeys{/pgfPerTable/.cd,%
-languages/.get=\pgfPTlanguages,%
-languages/.store in=\pgfPTlanguages,%
-languages/.default=\pgfPT@defaultLanguage,%
+languages/.code=\pgfPT@otherlanguages{#1},% v2.1.0
+languages/.default=\pgfPT@defaultLanguage,% v2.1.0
other languages font/.get=\pgfPTotherLangFont,%
other languages font/.store in=\pgfPTotherLangFont,%
other languages font/.default=\tiny,%
@@ -18,6 +16,20 @@ other languages color/.default=black!70,%
other lang/.code=\pgfPT@otherlangstyle{#1},%
other lang/.default={f=\tiny,c=black!70}%
}%
+% replace user ISO flag, if found, with 'user' (v2.1.0) -------------------------------------
+\newcount\pgfPT@nlang@count%
+\def\pgfPT@otherlanguages#1{%
+\pgfPT@nlang@count=0\relax%
+\edef\pgfPTlanguages{}%
+\@for\pgfPT@tmp:=#1\do{\advance\pgfPT@nlang@count by1\relax%
+\ifnum\pgfPT@nlang@count=1\relax%
+\ifx\pggPT@userlanguage@ISOcode\pgfPT@tmp\relax\edef\pgfPTlanguages{user}%
+\else\edef\pgfPTlanguages{\pgfPT@tmp}\fi%
+\else%
+\ifx\pggPT@userlanguage@ISOcode\pgfPT@tmp\relax\edef\pgfPTlanguages{\pgfPTlanguages,user}%
+\else\edef\pgfPTlanguages{\pgfPTlanguages,\pgfPT@tmp}\fi%
+\fi}%
+}% -------------------------------------------------------------------------------------------------
% setting key with default value -----------------------------------------------------------------
\pgfkeys{/pgfPerTable/.cd,languages,other languages font,other languages color}%
% end !! PGF keys: language to use in the Periodic Table ---------------------------------------
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex
index 809899c684..d4e5586f3e 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex
@@ -3,55 +3,56 @@
% --------------------------------------------------------------------------------------------------
% The language labels to use in the title and the legend of the Periodic Table --------------
% v2.0.1: Improved German language after suggestions made by Ole Schwen
+% v2.1.0: Added support for user language
% --------------------------------------------------------------------------------------------------
%
-% The labels available in pt, en, fr, de, it, es, br are:
+% The labels available in pt, en, fr, de, it, es, br, user are:
% titulo, La, Ac, solido, liquido, gasoso, sintetico,
% Z, name, CS, Ar, Arstar, radio, R, Rcov, Rion,
% Ei, eneg, eaff, O, Tmelt, TmeltC, Tboil, TboilC, eDist, eConfign,
% eConfignl, d, Cp, kT, ls, lsa, lsb, lsc, lsca, DiscY, DiscC, spectra
%
% --------------------------------------------------------------------------------------------------
-\def\pgfPT@labels@titulo{Tabela Peri\'{o}dica dos Elementos/pt,Periodic Table of Elements/en,Tableau P\'{e}riodique des \'{E}l\'{e}ments/fr,Periodensystem der Elemente/de,Tavola Periodica degli Elementi/it,Tabla Periodica de los Elementos/es,Tabela Peri\'{o}dica dos Elementos/br}%
-\def\pgfPT@labels@La{lantan\'{o}ides/pt,lanthanoids/en,lanthano\"{i}des/fr,Lanthanoide/de,lantanoidi/it,lantanoides/es,lantan\'{o}ides/br}%
-\def\pgfPT@labels@Ac{actin\'{o}ides/pt,actinoids/en,actino\"{i}de/fr,Actinoide/de,actinoidi/it,actinoides/es,actin\'{o}ides/br}%
-\def\pgfPT@labels@solido{s\'{o}lido/pt,solid/en,solide/fr,fest/de,solido/it,s\'{o}lido/es,s\'{o}lido/br}%
-\def\pgfPT@labels@liquido{l\'{i}quido/pt,liquid/en,liquide/fr,fl\"{u}ssig/de,liquido/it,l\'{i}quido/es,l\'{i}quido/br}%
-\def\pgfPT@labels@gasoso{gasoso/pt,gaseous/en,gazeux/fr,gasf\"{o}rmig/de,gassoso/it,gaseoso/es,gasoso/br}%
-\def\pgfPT@labels@sintetico{sint\'{e}tico/pt,synthetic/en,synth\'{e}tique/fr,synthetisch/de,sintetico/it,sint\'{e}tico/es,sint\'{e}tico/br}%
+\def\pgfPT@labels@titulo{Tabela Peri\'{o}dica dos Elementos/pt,Periodic Table of Elements/en,Tableau P\'{e}riodique des \'{E}l\'{e}ments/fr,Periodensystem der Elemente/de,Tavola Periodica degli Elementi/it,Tabla Peri\'{o}dica de los Elementos/es,Tabela Peri\'{o}dica dos Elementos/br,\pgfPT@user@labels@titulo/user}%
+\def\pgfPT@labels@La{lantan\'{o}ides/pt,lanthanoids/en,lanthano\"{i}des/fr,Lanthanoide/de,lantanoidi/it,lantanoides/es,lantan\'{o}ides/br,\pgfPT@user@labels@La/user}%
+\def\pgfPT@labels@Ac{actin\'{o}ides/pt,actinoids/en,actino\"{i}de/fr,Actinoide/de,actinoidi/it,actinoides/es,actin\'{o}ides/br,\pgfPT@user@labels@Ac/user}%
+\def\pgfPT@labels@solido{s\'{o}lido/pt,solid/en,solide/fr,fest/de,solido/it,s\'{o}lido/es,s\'{o}lido/br,\pgfPT@user@labels@solido/user}%
+\def\pgfPT@labels@liquido{l\'{i}quido/pt,liquid/en,liquide/fr,fl\"{u}ssig/de,liquido/it,l\'{i}quido/es,l\'{i}quido/br,\pgfPT@user@labels@liquido/user}%
+\def\pgfPT@labels@gasoso{gasoso/pt,gaseous/en,gazeux/fr,gasf\"{o}rmig/de,gassoso/it,gaseoso/es,gasoso/br,\pgfPT@user@labels@gasoso/user}%
+\def\pgfPT@labels@sintetico{sint\'{e}tico/pt,synthetic/en,synth\'{e}tique/fr,synthetisch/de,sintetico/it,sint\'{e}tico/es,sint\'{e}tico/br,\pgfPT@user@labels@sintetico/user}%
%
-\def\pgfPT@labels@Z{N\'{u}mero At\'{o}mico/pt,Atomic \mbox{Number}/en,Num\'{e}ro \mbox{Atomique}/fr,Ord\-nungs\-zahl/de,Numero \mbox{Atomico}/it,N\'{u}mero \mbox{At\'{o}mico}/es,N\'{u}mero At\^{o}mico/br}%
-\def\pgfPT@labels@name{Nome/pt,Name/en,Nom/fr,Name/de,Nome/it,Nombre/es,Nome/br}%
-\def\pgfPT@labels@CS{S\'{i}mbolo Qu\'{i}mico/pt,Chemical Symbol/en,Symbole Chimique/fr,Chemisches Symbol/de,Simbolo Chimico/it,S\'{i}mbolo Qu\'{i}mico/es,S\'{i}mbolo Qu\'{i}mico/br}%
-\def\pgfPT@labels@Ar@m{Massa \mbox{At\'{o}mica} Relativa/pt,Relative \mbox{Atomic} Mass/en,Masse \mbox{Atomique} Relative/fr,Relative Atom\-masse/de,Massa \mbox{Atomica} Relativa/it,Masa \mbox{At\'{o}mica} Relativa/es,Massa \mbox{At\^{o}mica} Relativa/br}%
-\def\pgfPT@labels@Arstar@m{Massa At\'{o}mica Relativa Padr\~{a}o/pt,Standard Relative Atomic Mass/en,Masse Atomique Relative Standard/fr,Relative Standard\-atommasse/de,Massa Atomica Relativa Standard/it,Masa At\'{o}mica Relativa Est\'{a}ndar/es,Massa At\^{o}mica Relativa Padr\~{a}o/br}%
-\def\pgfPT@labels@Ar@w{Peso At\'{o}mico/pt,Atomic Weight/en,Poids Atomique/fr,Atom\-gewicht/de,Peso Atomico/it,Peso At\'{o}mico/es,Peso At\^{o}mico/br}%
-\def\pgfPT@labels@Arstar@w{Peso At\'{o}mico Padr\~{a}o/pt,Standard Atomic Weight/en,Standard\-atomgewicht/de,Poids Atomique Standard/fr,Peso Atomico Standard/it,Peso At\'{o}mico Est\'{a}ndar/es,Peso At\^{o}mico Padr\~{a}o/br}%
-\def\pgfPT@labels@radio{Radioativo/pt,Radioactive/en,Radioactif/fr,radioaktiv/de,Radioattivo/it,Radioactivo/es,Radioativo/br}%
-\def\pgfPT@labels@R{Raio At\'{o}mico/pt,Atomic Radius/en,Rayon Ato\-mi\-que/fr,Atom\-radius/de,Raggio Atomico/it,Radio At\'{o}mico/es,Raio At\^{o}mico/br}%
-\def\pgfPT@labels@Rcov{Raio \mbox{Covalente}/pt,Covalente Radius/en,Rayon Covalent/fr,Kovalenz\-radius/de,Raggio Covalente/it,Radio Covalente/es,Raio Covalente/br}%
-\def\pgfPT@labels@Rion{Raio I\'{o}nico/pt,Ionic Radius/en,Rayon ionique/fr,Ionen\-radius/de,Raggio Ionico/it,Radio I\'{o}nico/es,Raio I\^{o}nico/br}%
-\def\pgfPT@labels@Ei{Energia de Ioniza\c{c}\~{a}o/pt,Ionization Energy/en,\'{E}nergie d'Ionisation/fr,Ionisierungs\-energie/de,Energia di Ionizzazione/it,Energ\'{i}a de Ionizaci\'{o}n/es,Energia de Ioniza\c{c}\~{a}o/br}%
-\def\pgfPT@labels@eneg{Eletrone\-gatividade/pt,Electrone\-gativity/en,\'{E}lectron\'{e}\-gativit\'{e}/fr,Elektro\-negativit\"{a}t/de,Elettrone\-gativit\`{a}/it,Electrone\-gatividad/es,Eletrone\-gatividade/br}%
-\def\pgfPT@labels@eaff{Eletro\-afinidade/pt,Electro\-affinity/en,\'{E}lectro\-affinit\'{e}/fr,Elektro\-affinit\"{a}t/de,Elettro\-affinit\`{a}/it,Electro\-afinidad/es,Eletro\-afinidade/br}%
-\def\pgfPT@labels@O{Estados de Oxida\c{c}\~{a}o/pt,Oxidation States/en,\'{E}tats d'Oxydation/fr,Oxidations\-zust\"{a}nde/de,Stati di \mbox{ossidazione}/it,Estados de Oxidaci\'{o}n/es,Estados de Oxida\c{c}\~{a}o/br}%
-\def\pgfPT@labels@Tmelt{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br}%
-\def\pgfPT@labels@TmeltC{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br}%
-\def\pgfPT@labels@Tboil{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,Punto di Ebollizione/it,Punto de Ebullici\'{o}n/es,Ponto de Ebuli\c{c}\~{a}o/br}%
-\def\pgfPT@labels@TboilC{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,\mbox{Punto di} \mbox{Ebollizione}/it,\mbox{Punto de} \mbox{Ebullici\'{o}n}/es,Ponto de Ebuli\c{c}\~{a}o/br}%
-\def\pgfPT@labels@eDist{Distribui\c{c}\~{a}o Eletr\'{o}nica/pt,Electron \mbox{Distribuition}/en,Distribution d'\'{E}lectrons/fr,Elektronen\-verteilung/de,Distribuzione degli Elettroni/it,Distribuci\'{o}n de Electrones/es,Distribui\c{c}\~{a}o de El\'{e}trons/br}%
-\def\pgfPT@labels@eConfig{Configura\c{c}\~{a}o Eletr\'{o}nica/pt,Electronic Configuration/en,Configuration \'{E}lectronique/fr,Elektronen\-konfiguration/de,Configurazione Elettronica/it,Configuraci\'{o}n Electr\'{o}nica/es,Configura\c{c}\~{a}o Eletr\^{o}nica/br}%
+\def\pgfPT@labels@Z{N\'{u}mero At\'{o}mico/pt,Atomic \mbox{Number}/en,Num\'{e}ro \mbox{Atomique}/fr,Ord\-nungs\-zahl/de,Numero \mbox{Atomico}/it,N\'{u}mero \mbox{At\'{o}mico}/es,N\'{u}mero At\^{o}mico/br,\pgfPT@user@labels@Z/user}%
+\def\pgfPT@labels@name{Nome/pt,Name/en,Nom/fr,Name/de,Nome/it,Nombre/es,Nome/br,\pgfPT@user@labels@name/user}%
+\def\pgfPT@labels@CS{S\'{i}mbolo Qu\'{i}mico/pt,Chemical Symbol/en,Symbole Chimique/fr,Chemisches Symbol/de,Simbolo Chimico/it,S\'{i}mbolo Qu\'{i}mico/es,S\'{i}mbolo Qu\'{i}mico/br,\pgfPT@user@labels@CS/user}%
+\def\pgfPT@labels@Ar@m{Massa \mbox{At\'{o}mica} Relativa/pt,Relative \mbox{Atomic} Mass/en,Masse \mbox{Atomique} Relative/fr,Relative Atom\-masse/de,Massa \mbox{Atomica} Relativa/it,Masa \mbox{At\'{o}mica} Relativa/es,Massa \mbox{At\^{o}mica} Relativa/br,\pgfPT@user@labels@Ar@m/user}%
+\def\pgfPT@labels@Arstar@m{Massa At\'{o}mica Relativa Padr\~{a}o/pt,Standard Relative Atomic Mass/en,Masse Atomique Relative Standard/fr,Relative Standard\-atommasse/de,Massa Atomica Relativa Standard/it,Masa At\'{o}mica Relativa Est\'{a}ndar/es,Massa At\^{o}mica Relativa Padr\~{a}o/br,\pgfPT@user@labels@Arstar@m/user}%
+\def\pgfPT@labels@Ar@w{Peso At\'{o}mico/pt,Atomic Weight/en,Poids Atomique/fr,Atom\-gewicht/de,Peso Atomico/it,Peso At\'{o}mico/es,Peso At\^{o}mico/br,\pgfPT@user@labels@Ar@w/user}%
+\def\pgfPT@labels@Arstar@w{Peso At\'{o}mico Padr\~{a}o/pt,Standard Atomic Weight/en,Standard\-atomgewicht/de,Poids Atomique Standard/fr,Peso Atomico Standard/it,Peso At\'{o}mico Est\'{a}ndar/es,Peso At\^{o}mico Padr\~{a}o/br,\pgfPT@user@labels@Arstar@w/user}%
+\def\pgfPT@labels@radio{Radioativo/pt,Radioactive/en,Radioactif/fr,radioaktiv/de,Radioattivo/it,Radioactivo/es,Radioativo/br,\pgfPT@user@labels@radio/user}%
+\def\pgfPT@labels@R{Raio At\'{o}mico/pt,Atomic Radius/en,Rayon Ato\-mi\-que/fr,Atom\-radius/de,Raggio Atomico/it,Radio At\'{o}mico/es,Raio At\^{o}mico/br,\pgfPT@user@labels@R/user}%
+\def\pgfPT@labels@Rcov{Raio \mbox{Covalente}/pt,Covalente Radius/en,Rayon Covalent/fr,Kovalenz\-radius/de,Raggio Covalente/it,Radio Covalente/es,Raio Covalente/br,\pgfPT@user@labels@Rcov/user}%
+\def\pgfPT@labels@Rion{Raio I\'{o}nico/pt,Ionic Radius/en,Rayon ionique/fr,Ionen\-radius/de,Raggio Ionico/it,Radio I\'{o}nico/es,Raio I\^{o}nico/br,\pgfPT@user@labels@Rion/user}%
+\def\pgfPT@labels@Ei{Energia de Ioniza\c{c}\~{a}o/pt,Ionization Energy/en,\'{E}nergie d'Ionisation/fr,Ionisierungs\-energie/de,Energia di Ionizzazione/it,Energ\'{i}a de Ionizaci\'{o}n/es,Energia de Ioniza\c{c}\~{a}o/br,\pgfPT@user@labels@Ei/user}%
+\def\pgfPT@labels@eneg{Eletrone\-gatividade/pt,Electrone\-gativity/en,\'{E}lectron\'{e}\-gativit\'{e}/fr,Elektro\-negativit\"{a}t/de,Elettrone\-gativit\`{a}/it,Electrone\-gatividad/es,Eletrone\-gatividade/br,\pgfPT@user@labels@eneg/user}%
+\def\pgfPT@labels@eaff{Eletro\-afinidade/pt,Electro\-affinity/en,\'{E}lectro\-affinit\'{e}/fr,Elektro\-affinit\"{a}t/de,Elettro\-affinit\`{a}/it,Electro\-afinidad/es,Eletro\-afinidade/br,\pgfPT@user@labels@eaff/user}%
+\def\pgfPT@labels@O{Estados de Oxida\c{c}\~{a}o/pt,Oxidation States/en,\'{E}tats d'Oxydation/fr,Oxidations\-zust\"{a}nde/de,Stati di \mbox{ossidazione}/it,Estados de Oxidaci\'{o}n/es,Estados de Oxida\c{c}\~{a}o/br,\pgfPT@user@labels@O/user}%
+\def\pgfPT@labels@Tmelt{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br,\pgfPT@user@labels@Tmelt/user}%
+\def\pgfPT@labels@TmeltC{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br,\pgfPT@user@labels@TmeltC/user}%
+\def\pgfPT@labels@Tboil{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,Punto di Ebollizione/it,Punto de Ebullici\'{o}n/es,Ponto de Ebuli\c{c}\~{a}o/br,\pgfPT@user@labels@Tboil/user}%
+\def\pgfPT@labels@TboilC{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,\mbox{Punto di} \mbox{Ebollizione}/it,\mbox{Punto de} \mbox{Ebullici\'{o}n}/es,Ponto de Ebuli\c{c}\~{a}o/br,\pgfPT@user@labels@TboilC/user}%
+\def\pgfPT@labels@eDist{Distribui\c{c}\~{a}o Eletr\'{o}nica/pt,Electron \mbox{Distribution}/en,Distribution d'\'{E}lectrons/fr,Elektronen\-verteilung/de,Distribuzione degli Elettroni/it,Distribuci\'{o}n de Electrones/es,Distribui\c{c}\~{a}o de El\'{e}trons/br,\pgfPT@user@labels@eDist/user}%
+\def\pgfPT@labels@eConfig{Configura\c{c}\~{a}o Eletr\'{o}nica/pt,Electronic Configuration/en,Configuration \'{E}lectronique/fr,Elektronen\-konfiguration/de,Configurazione Elettronica/it,Configuraci\'{o}n Electr\'{o}nica/es,Configura\c{c}\~{a}o Eletr\^{o}nica/br,\pgfPT@user@labels@eConfig/user}%
\let\pgfPT@labels@eConfign\pgfPT@labels@eConfig%
\let\pgfPT@labels@eConfignl\pgfPT@labels@eConfig%
-\def\pgfPT@labels@d{Densidade/pt,Density/en,Densit\'{e}/fr,Dichte/de,Densit\`{a}/it,Densidad/es,Densidade/br}%
-\def\pgfPT@labels@Cp{Calor \mbox{Espec\'{i}fico}/pt,\mbox{Specific Heat} Capacity/en,Capacit\'{e} \mbox{Thermique} \mbox{Sp\'{e}cifique}/fr,Spezifische \mbox{W\"{a}rme\-kapazit\"{a}t}/de,Calore specifico/it,Calor \mbox{Espec\'{i}fico}/es,Calor \mbox{Espec\'{i}fico}/br}%
-\def\pgfPT@labels@kT{Condutividade T\'{e}rmica/pt,Thermal \mbox{Condutivity}/en,Conductivit\'{e} \mbox{Thermique}/fr,W\"{a}rme\-leit\-f\"{a}higkeit/de,Conducibilit\`{a} Termica/it,Condutividad T\'{e}rmica/es,Condutividade T\'{e}rmica/br}%
-\def\pgfPT@labels@ls{Estrutura da Rede Cristalina/pt,Lattice Structure/en,Structure de R\'{e}seau Cristaline/fr,Gitter\-struktur/de,Struttura Reticolare/it,Estructura Reticular/es,Estrutura da Rede Cristalina/br}%
-\def\pgfPT@labels@lsa{Constante da Rede: a/pt,Lattice constant: a/en,Constante \mbox{de R\'{e}seau}: a/fr,Gitter\-konstante: a/de,Costante \mbox{Reticolare}: a/it,Constante de la Reticula: a/es,Constante da Rede: a/br}%
-\def\pgfPT@labels@lsb{Constante da Rede: b/pt,Lattice constant: b/en,Constante \mbox{de R\'{e}seau}: b/fr,Gitter\-konstante: b/de,Costante \mbox{Reticolare}: b/it,Constante de la Reticula: b/es,Constante da Rede: b/br}%
-\def\pgfPT@labels@lsc{Constante da Rede: c/pt,Lattice constant: c/en,Constante \mbox{de R\'{e}seau}: c/fr,Gitter\-konstante: c/de,Costante \mbox{Reticolare}: c/it,Constante de la Reticula: c/es,Constante da Rede: c/br}%
-\def\pgfPT@labels@lsca{Raz\~{a}o c\mbox{/}a da Rede/pt,Lattice c\mbox{/}a ratio/en,Rapport c\mbox{/}a du R\'{e}seau/fr,Gitter c\mbox{/}a-Verh\"{a}ltnis/de,Rapporto c\mbox{/}a del Reticolo/it,Relaci\'{o}n c\mbox{/}a de la Reticula/es,Raz\~{a}o c\mbox{/}a da Rede/br}%
-\def\pgfPT@labels@DiscY{Ano da \mbox{Descoberta}/pt,Year of \mbox{Discovery}/en,\mbox{Ann\'{e}e de la} \mbox{D\'{e}couverte}/fr,Jahr der Entdeckung/de,\mbox{Anno della} Scoperta/it,A\~{n}o del Descubri\-miento/es,Ano da \mbox{Descoberta}/br}%
+\def\pgfPT@labels@d{Densidade/pt,Density/en,Densit\'{e}/fr,Dichte/de,Densit\`{a}/it,Densidad/es,Densidade/br,\pgfPT@user@labels@d/user}%
+\def\pgfPT@labels@Cp{Calor \mbox{Espec\'{i}fico}/pt,\mbox{Specific Heat} Capacity/en,Capacit\'{e} \mbox{Thermique} \mbox{Sp\'{e}cifique}/fr,Spezifische \mbox{W\"{a}rme\-kapazit\"{a}t}/de,Calore specifico/it,Calor \mbox{Espec\'{i}fico}/es,Calor \mbox{Espec\'{i}fico}/br,\pgfPT@user@labels@Cp/user}%
+\def\pgfPT@labels@kT{Condutividade T\'{e}rmica/pt,Thermal \mbox{Conductivity}/en,Conductivit\'{e} \mbox{Thermique}/fr,W\"{a}rme\-leit\-f\"{a}higkeit/de,Conducibilit\`{a} Termica/it,Condutividad T\'{e}rmica/es,Condutividade T\'{e}rmica/br,\pgfPT@user@labels@kT/user}%
+\def\pgfPT@labels@ls{Estrutura da Rede Cristalina/pt,Lattice Structure/en,Structure de R\'{e}seau Cristaline/fr,Gitter\-struktur/de,Struttura Reticolare/it,Estructura Reticular/es,Estrutura da Rede Cristalina/br,\pgfPT@user@labels@ls/user}%
+\def\pgfPT@labels@lsa{Constante da Rede: a/pt,Lattice constant: a/en,Constante \mbox{de R\'{e}seau}: a/fr,Gitter\-konstante: a/de,Costante \mbox{Reticolare}: a/it,Constante de la Reticula: a/es,Constante da Rede: a/br,\pgfPT@user@labels@lsa/user}%
+\def\pgfPT@labels@lsb{Constante da Rede: b/pt,Lattice constant: b/en,Constante \mbox{de R\'{e}seau}: b/fr,Gitter\-konstante: b/de,Costante \mbox{Reticolare}: b/it,Constante de la Reticula: b/es,Constante da Rede: b/br,\pgfPT@user@labels@lsb/user}%
+\def\pgfPT@labels@lsc{Constante da Rede: c/pt,Lattice constant: c/en,Constante \mbox{de R\'{e}seau}: c/fr,Gitter\-konstante: c/de,Costante \mbox{Reticolare}: c/it,Constante de la Reticula: c/es,Constante da Rede: c/br,\pgfPT@user@labels@lsc/user}%
+\def\pgfPT@labels@lsca{Raz\~{a}o c\mbox{/}a da Rede/pt,Lattice c\mbox{/}a ratio/en,Rapport c\mbox{/}a du R\'{e}seau/fr,Gitter c\mbox{/}a-Verh\"{a}ltnis/de,Rapporto c\mbox{/}a del Reticolo/it,Relaci\'{o}n c\mbox{/}a de la Reticula/es,Raz\~{a}o c\mbox{/}a da Rede/br,\pgfPT@user@labels@lsca/user}%
+\def\pgfPT@labels@DiscY{Ano da \mbox{Descoberta}/pt,Year of \mbox{Discovery}/en,\mbox{Ann\'{e}e de la} \mbox{D\'{e}couverte}/fr,Jahr der Entdeckung/de,\mbox{Anno della} Scoperta/it,A\~{n}o del Descubri\-miento/es,Ano da \mbox{Descoberta}/br,\pgfPT@user@labels@DiscY/user}%
\def\pgfPT@labels@BC@en{BC}%
\def\pgfPT@labels@BC@pt{a.C.}%
\def\pgfPT@labels@BC@fr{av.J-C.}%
@@ -59,71 +60,72 @@
\def\pgfPT@labels@BC@it{a.C.}%
\def\pgfPT@labels@BC@es{a.C.}%
\def\pgfPT@labels@BC@br{a.C.}%
-\def\pgfPT@labels@DiscC{Pa\'{i}s da \mbox{Descoberta}/pt,\mbox{Country of} \mbox{Discovery}/en,Pays de \mbox{D\'{e}couverte}/fr,Land der Entdeckung/de,Paese di Scoperta/it,Pa\'{i}s de Descubri\-miento/es,Pa\'{i}s da \mbox{Descoberta}/br}%
-\def\pgfPT@labels@spectra{Espetro de Emiss\~{a}o/pt,Emission Spectrum/en,Spectre d'\'{E}mission/fr,Emissions\-spektrum/de,Spettro di \mbox{Emissione}/it,Espectro de Emisi\'{o}n/es,Espectro de Emiss\~{a}o/br}%
+\def\pgfPT@labels@BC@user{\pgfPT@user@labels@BC}%
+\def\pgfPT@labels@DiscC{Pa\'{i}s da \mbox{Descoberta}/pt,\mbox{Country of} \mbox{Discovery}/en,Pays de \mbox{D\'{e}couverte}/fr,Land der Entdeckung/de,Paese di Scoperta/it,Pa\'{i}s de Descubri\-miento/es,Pa\'{i}s da \mbox{Descoberta}/br,\pgfPT@user@labels@DiscC/user}%
+\def\pgfPT@labels@spectra{Espetro de Emiss\~{a}o/pt,Emission Spectrum/en,Spectre d'\'{E}mission/fr,Emissions\-spektrum/de,Spettro di \mbox{Emissione}/it,Espectro de Emisi\'{o}n/es,Espectro de Emiss\~{a}o/br,\pgfPT@user@labels@spectra/user}%
% acronyms for legend:
-\def\pgfPT@acr@Z{Z/pt,Z/en,Z/fr,Z/de,Z/it,Z/es,Z/br}%
-\def\pgfPT@acr@name{N/pt,N/en,N/fr,N/de,N/it,N/es,N/br}%
-\def\pgfPT@acr@CS{SQ/pt,CS/en,SC/fr,CS/de,SC/it,SQ/es,SQ/br}%
-\def\pgfPT@acr@Ar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br}%
-\def\pgfPT@acr@Arstar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br}%
-\def\pgfPT@acr@radio{Ra/pt,Ra/en,Ra/fr,Ra/de,Ra/it,Ra/es,Ra/br}%
-\def\pgfPT@acr@R{R/pt,R/en,R/fr,R/de,R/it,R/es,R/br}%
-\def\pgfPT@acr@Rcov{Rc/pt,Rc/en,Rc/fr,Rc/de,Rc/it,Rc/es,Rc/br}%
-\def\pgfPT@acr@Rion{Ri/pt,Ri/en,Ri/fr,Ri/de,Ri/it,Ri/es,Ri/br}%
-\def\pgfPT@acr@Ei{Ei/pt,Ei/en,Ei/fr,Ei/de,Ei/it,Ei/es,Ei/br}%
-\def\pgfPT@acr@eneg{en/pt,en/en,en/fr,en/de,en/it,en/es,en/br}%
-\def\pgfPT@acr@eaff{Eea/pt,Eea/en,Eea/fr,Eea/de,Eea/it,Eea/es,Eea/br}%
-\def\pgfPT@acr@O{O/pt,O/en,O/fr,O/de,O/it,O/es,O/br}%
-\def\pgfPT@acr@Tmelt{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br}%
-\def\pgfPT@acr@TmeltC{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br}%
-\def\pgfPT@acr@Tboil{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br}%
-\def\pgfPT@acr@TboilC{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br}%
-\def\pgfPT@acr@eDist{de/pt,ed/en,de/fr,ev/de,de/it,de/es,de/br}%
-\def\pgfPT@acr@eConfign{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br}%
-\def\pgfPT@acr@eConfignl{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br}%
-\def\pgfPT@acr@d{d/pt,d/en,d/fr,d/de,d/it,d/es,d/br}%
-\def\pgfPT@acr@Cp{Cp/pt,Cp/en,Cp/fr,Cp/de,Cp/it,Cp/es,Cp/br}%
-\def\pgfPT@acr@kT{kT/pt,kT/en,kT/fr,kT/de,kT/it,kT/es,kT/br}%
-\def\pgfPT@acr@ls{er/pt,ls/en,sr/fr,gs/de,sr/it,er/es,er/br}%
-\def\pgfPT@acr@lsa{er a/pt,ls a/en,sr a/fr,gs a/de,sr a/it,er a/es,er a/br}%
-\def\pgfPT@acr@lsb{er b/pt,ls b/en,sr b/fr,gs b/de,sr b/it,er b/es,er b/br}%
-\def\pgfPT@acr@lsc{er c/pt,ls c/en,sr c/fr,gs c/de,sr c/it,er c/es,er c/br}%
-\def\pgfPT@acr@lsca{er ca/pt,ls ca/en,sr ca/fr,gs ca/de,sr ca/it,er ca/es,er ca/br}%
-\def\pgfPT@acr@DiscY{ad/pt,yd/en,ad/fr,je/de,as/it,ad/es,ad/br}%
-\def\pgfPT@acr@DiscC{pd/pt,cd/en,pa/fr,le/de,ps/it,pd/es,pd/br}%
-\def\pgfPT@acr@spectra{ee/pt,es/en,se/fr,es/de,se/it,ee/es,ee/br}%
+\def\pgfPT@acr@Z{Z/pt,Z/en,Z/fr,Z/de,Z/it,Z/es,Z/br,Z/user}%
+\def\pgfPT@acr@name{N/pt,N/en,N/fr,N/de,N/it,N/es,N/br,\pgfPT@user@acr@name/user}%
+\def\pgfPT@acr@CS{SQ/pt,CS/en,SC/fr,CS/de,SC/it,SQ/es,SQ/br,\pgfPT@user@acr@CS/user}%
+\def\pgfPT@acr@Ar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br,Ar/user}%
+\def\pgfPT@acr@Arstar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br,Ar/user}%
+\def\pgfPT@acr@radio{Ra/pt,Ra/en,Ra/fr,Ra/de,Ra/it,Ra/es,Ra/br,\pgfPT@user@acr@radio/user}%
+\def\pgfPT@acr@R{R/pt,R/en,R/fr,R/de,R/it,R/es,R/br,R/user}%
+\def\pgfPT@acr@Rcov{Rc/pt,Rc/en,Rc/fr,Rc/de,Rc/it,Rc/es,Rc/br,Rc/user}%
+\def\pgfPT@acr@Rion{Ri/pt,Ri/en,Ri/fr,Ri/de,Ri/it,Ri/es,Ri/br,Ri/user}%
+\def\pgfPT@acr@Ei{Ei/pt,Ei/en,Ei/fr,Ei/de,Ei/it,Ei/es,Ei/br,Ei/user}%
+\def\pgfPT@acr@eneg{en/pt,en/en,en/fr,en/de,en/it,en/es,en/br,en/user}%
+\def\pgfPT@acr@eaff{Eea/pt,Eea/en,Eea/fr,Eea/de,Eea/it,Eea/es,Eea/br,Eaa/user}%
+\def\pgfPT@acr@O{O/pt,O/en,O/fr,O/de,O/it,O/es,O/br,O/user}%
+\def\pgfPT@acr@Tmelt{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br,\pgfPT@user@acr@Tmelt/user}%
+\def\pgfPT@acr@TmeltC{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br,\pgfPT@user@acr@Tmelt/user}%
+\def\pgfPT@acr@Tboil{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br,\pgfPT@user@acr@Tboil/user}%
+\def\pgfPT@acr@TboilC{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br,\pgfPT@user@acr@Tboil/user}%
+\def\pgfPT@acr@eDist{de/pt,ed/en,de/fr,ev/de,de/it,de/es,de/br,\pgfPT@user@acr@eDist/user}%
+\def\pgfPT@acr@eConfign{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br,\pgfPT@user@acr@eConfign/user}%
+\def\pgfPT@acr@eConfignl{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br,\pgfPT@user@acr@eConfign/user}%
+\def\pgfPT@acr@d{d/pt,d/en,d/fr,d/de,d/it,d/es,d/br,d/user}%
+\def\pgfPT@acr@Cp{Cp/pt,Cp/en,Cp/fr,Cp/de,Cp/it,Cp/es,Cp/br,Cp/user}%
+\def\pgfPT@acr@kT{kT/pt,kT/en,kT/fr,kT/de,kT/it,kT/es,kT/br,kT/user}%
+\def\pgfPT@acr@ls{er/pt,ls/en,sr/fr,gs/de,sr/it,er/es,er/br,\pgfPT@user@acr@ls/user}%
+\def\pgfPT@acr@lsa{er a/pt,ls a/en,sr a/fr,gs a/de,sr a/it,er a/es,er a/br,\pgfPT@user@acr@lsa/user}%
+\def\pgfPT@acr@lsb{er b/pt,ls b/en,sr b/fr,gs b/de,sr b/it,er b/es,er b/br,\pgfPT@user@acr@lsb/user}%
+\def\pgfPT@acr@lsc{er c/pt,ls c/en,sr c/fr,gs c/de,sr c/it,er c/es,er c/br,\pgfPT@user@acr@lsc/user}%
+\def\pgfPT@acr@lsca{er ca/pt,ls ca/en,sr ca/fr,gs ca/de,sr ca/it,er ca/es,er ca/br,\pgfPT@user@acr@lsca/user}%
+\def\pgfPT@acr@DiscY{ad/pt,yd/en,ad/fr,je/de,as/it,ad/es,ad/br,\pgfPT@user@acr@DiscY/user}%
+\def\pgfPT@acr@DiscC{pd/pt,cd/en,pa/fr,le/de,ps/it,pd/es,pd/br,\pgfPT@user@acr@DiscC/user}%
+\def\pgfPT@acr@spectra{ee/pt,es/en,se/fr,es/de,se/it,ee/es,ee/br,\pgfPT@user@acr@spectra/user}%
% BLOCOS
-\def\pgfPT@labels@blocos{Bloco s/pt,s-block/en,Bloc s/fr,s-Block/de,Blocco s/it,Bloque s/es,Bloco s/br}%
-\def\pgfPT@labels@blocop{Bloco p/pt,p-block/en,Bloc p/fr,p-Block/de,Blocco p/it,Bloque p/es,Bloco p/br}%
-\def\pgfPT@labels@blocod{Bloco d/pt,d-block/en,Bloc d/fr,d-Block/de,Blocco d/it,Bloque d/es,Bloco d/br}%
-\def\pgfPT@labels@blocof{Bloco f/pt,f-block/en,Bloc f/fr,f-Block/de,Blocco f/it,Bloque f/es,Bloco f/br}%
+\def\pgfPT@labels@blocos{Bloco s/pt,s-block/en,Bloc s/fr,s-Block/de,Blocco s/it,Bloque s/es,Bloco s/br,\pgfPT@user@labels@blocos/user}%
+\def\pgfPT@labels@blocop{Bloco p/pt,p-block/en,Bloc p/fr,p-Block/de,Blocco p/it,Bloque p/es,Bloco p/br,\pgfPT@user@labels@blocop/user}%
+\def\pgfPT@labels@blocod{Bloco d/pt,d-block/en,Bloc d/fr,d-Block/de,Blocco d/it,Bloque d/es,Bloco d/br,\pgfPT@user@labels@blocod/user}%
+\def\pgfPT@labels@blocof{Bloco f/pt,f-block/en,Bloc f/fr,f-Block/de,Blocco f/it,Bloque f/es,Bloco f/br,\pgfPT@user@labels@blocof/user}%
% FAMILIAS
-\def\pgfPT@labels@blocor{ELEMENTOS REPRESENTATIVOS/pt,REPRESENTATIVE ELEMENTS/en,\'{E}L\'{E}MENTS DU GROUPE PRINCIPAL/fr,HAUPTGRUPPENELEMENTE/de,ELEMENTI RAPPRESENTATIVI/it,ELEMENTOS REPRESENTATIVOS/es,ELEMENTOS REPRESENTATIVOS/br}%
-\def\pgfPT@labels@blocot{METAIS DE TRANSI\c{C}\~{A}O/pt,TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION/fr,\"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE/it,METALES DE TRANSICI\'{O}N/es,METAIS DE TRANSI\c{C}\~{A}O/br}%
-\def\pgfPT@labels@blocoi{METAIS DE TRANSI\c{C}\~{A}O INTERNOS/pt,INTERNAL TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION INTERNES/fr,INTERNE \"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE INTERNI/it,METALES DE TRANSICI\'{O}N INTERNOS/es,METAIS DE TRANSI\c{C}\~{A}O INTERNOS/br}%
+\def\pgfPT@labels@blocor{ELEMENTOS REPRESENTATIVOS/pt,REPRESENTATIVE ELEMENTS/en,\'{E}L\'{E}MENTS DU GROUPE PRINCIPAL/fr,HAUPTGRUPPENELEMENTE/de,ELEMENTI RAPPRESENTATIVI/it,ELEMENTOS REPRESENTATIVOS/es,ELEMENTOS REPRESENTATIVOS/br,\pgfPT@user@labels@blocor/user}%
+\def\pgfPT@labels@blocot{METAIS DE TRANSI\c{C}\~{A}O/pt,TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION/fr,\"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE/it,METALES DE TRANSICI\'{O}N/es,METAIS DE TRANSI\c{C}\~{A}O/br,\pgfPT@user@labels@blocot/user}%
+\def\pgfPT@labels@blocoi{METAIS DE TRANSI\c{C}\~{A}O INTERNOS/pt,INTERNAL TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION INTERNES/fr,INTERNE \"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE INTERNI/it,METALES DE TRANSICI\'{O}N INTERNOS/es,METAIS DE TRANSI\c{C}\~{A}O INTERNOS/br,\pgfPT@user@labels@blocoi/user}%
% VARIACOES
-\def\pgfPT@labels@Raum{O raio at\'{o}mico aumenta ao longo do grupo/pt,The atomic radius increases along the group/en,Le rayon atomique augmente le long du groupe/fr,Der Atomradius nimmt entlang der Gruppe zu/de,Il raggio atomico aumenta lungo il gruppo/it,El radio at\'{o}mico aumenta a lo largo del grupo/es,O raio at\^{o}mico aumenta ao longo do grupo/br}%
-\def\pgfPT@labels@Rdim{O raio at\'{o}mico diminui ao longo do per\'{i}odo/pt,The atomic radius decreases over the period/en,Le rayon atomique diminue au cours de la p\'{e}riode/fr,Der Atomradius nimmt mit der Periode ab/de,Il raggio atomico diminuisce nel periodo/it,El radio at\'{o}mico disminuye a lo largo del per\'{i}odo/es,O raio at\^{o}mico diminui ao longo do per\'{i}odo/br}%
-\def\pgfPT@labels@Eiaum{A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/pt,The ionization energy increases over the period/en,L'\'{e}nergie d'ionisation augmente au cours de la p\'{e}riode/fr,Die Ionisationsenergie nimmt mit der Periode zu/de,L'energia di ionizzazione aumenta nel periodo/it,La energ\'{i}a de ionizaci\'{o}n aumenta a lo largo del per\'{i}odo/es,A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/br}%
-\def\pgfPT@labels@Eidim{A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/pt,The ionization energy decreases along the group/en,L'\'{e}nergie d'ionisation diminue le long du groupe/fr,Die Ionisationsenergie nimmt entlang der Gruppe ab/de,L'energia di ionizzazione diminuisce lungo il gruppo/it,La energ\'{i}a de ionizaci\'{o}n disminuye a lo largo del grupo/es,A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/br}%
-\def\pgfPT@labels@eaffaum{A eletroafinidade aumenta ao longo do per\'{i}odo/pt,The electron affinity increases over the period/en,L'\'{e}lectroaffinit\'{e} augmente au cours de la p\'{e}riode/fr,Die Elektroaffinit\"{a}t nimmt mit der Periode zu/de,L'elettroaffinit\`{a} di ionizzazione aumenta nel periodo/it,La electroafinidad aumenta a lo largo del per\'{i}odo/es,A eletroafinidade aumenta ao longo do per\'{i}odo/br}%
-\def\pgfPT@labels@eaffdim{A eletroafinidade diminui ao longo do grupo/pt,The electron affinity decreases along the group/en,L'\'{e}lectroaffinit\'{e} diminue le long du groupe/fr,Die Elektroaffinit\"{a}t nimmt entlang der Gruppe ab/de,L'elettroaffinit\`{a} diminuisce lungo il gruppo/it,La electroafinidad disminuye a lo largo del grupo/es,A eletroafinidade diminui ao longo do grupo/br}%
+\def\pgfPT@labels@Raum{O raio at\'{o}mico aumenta ao longo do grupo/pt,The atomic radius increases along the group/en,Le rayon atomique augmente le long du groupe/fr,Der Atomradius nimmt entlang der Gruppe zu/de,Il raggio atomico aumenta lungo il gruppo/it,El radio at\'{o}mico aumenta a lo largo del grupo/es,O raio at\^{o}mico aumenta ao longo do grupo/br,\pgfPT@user@labels@Raum/user}%
+\def\pgfPT@labels@Rdim{O raio at\'{o}mico diminui ao longo do per\'{i}odo/pt,The atomic radius decreases over the period/en,Le rayon atomique diminue au cours de la p\'{e}riode/fr,Der Atomradius nimmt mit der Periode ab/de,Il raggio atomico diminuisce nel periodo/it,El radio at\'{o}mico disminuye a lo largo del per\'{i}odo/es,O raio at\^{o}mico diminui ao longo do per\'{i}odo/br,\pgfPT@user@labels@Rdim/user}%
+\def\pgfPT@labels@Eiaum{A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/pt,The ionization energy increases over the period/en,L'\'{e}nergie d'ionisation augmente au cours de la p\'{e}riode/fr,Die Ionisationsenergie nimmt mit der Periode zu/de,L'energia di ionizzazione aumenta nel periodo/it,La energ\'{i}a de ionizaci\'{o}n aumenta a lo largo del per\'{i}odo/es,A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/br,\pgfPT@user@labels@Eiaum/user}%
+\def\pgfPT@labels@Eidim{A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/pt,The ionization energy decreases along the group/en,L'\'{e}nergie d'ionisation diminue le long du groupe/fr,Die Ionisationsenergie nimmt entlang der Gruppe ab/de,L'energia di ionizzazione diminuisce lungo il gruppo/it,La energ\'{i}a de ionizaci\'{o}n disminuye a lo largo del grupo/es,A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/br,\pgfPT@user@labels@Eidim/user}%
+\def\pgfPT@labels@eaffaum{A eletroafinidade aumenta ao longo do per\'{i}odo/pt,The electron affinity increases over the period/en,L'\'{e}lectroaffinit\'{e} augmente au cours de la p\'{e}riode/fr,Die Elektroaffinit\"{a}t nimmt mit der Periode zu/de,L'elettroaffinit\`{a} di ionizzazione aumenta nel periodo/it,La electroafinidad aumenta a lo largo del per\'{i}odo/es,A eletroafinidade aumenta ao longo do per\'{i}odo/br,\pgfPT@user@labels@eaffaum/user}%
+\def\pgfPT@labels@eaffdim{A eletroafinidade diminui ao longo do grupo/pt,The electron affinity decreases along the group/en,L'\'{e}lectroaffinit\'{e} diminue le long du groupe/fr,Die Elektroaffinit\"{a}t nimmt entlang der Gruppe ab/de,L'elettroaffinit\`{a} diminuisce lungo il gruppo/it,La electroafinidad disminuye a lo largo del grupo/es,A eletroafinidade diminui ao longo do grupo/br,\pgfPT@user@labels@eaffdim/user}%
%
%%%%%%%%%%%%%%% Lattice Names %%%%%%%%%%%%%%%%%%%%%%%
-\def\pgfPT@labels@ls@bcc{c\'{u}bica de corpo centrado/pt,body centered cubic/en,cubique centr\'{e}e/fr,kubisch raumzentriert/de,cubico a corpo centrato/it,c\'{u}bica centrado/es,c\'{u}bica de corpo centrado/br}%
-\def\pgfPT@labels@ls@bcort{ortorr\^{o}mbica de bases centradas/pt,base centered orthorhombic/en,orthorhombique \`{a} base centr\'{e}e/fr,orthorhombisch basiszentriert/de,ortorombico a base centrata/it,ortorr\'{o}mbico con bases centradas/es,ortorr\^{o}mbica de bases centradas/br}%
-\def\pgfPT@labels@ls@ctetr{tetragonal de corpo centrado/pt,body centered tetragonal/en,quadratique centr\'{e}e/fr,tetragonal innenzentriert/de,tetragonale a corpo centrato/it,tetragonal centrado/es,tetragonal de corpo centrado/br}%
-\def\pgfPT@labels@ls@dia{diamante/pt,diamond/en,diamant/fr,diamant/de,diamante/it,diamante/es,diamante/br}%
-\def\pgfPT@labels@ls@fcc{c\'{u}bica de faces centradas/pt,face centered cubic/en,cubique \`{a} faces centr\'{e}es/fr,kubisch fl\"{a}chenzentriert/de,cubico a facce centrate/it,c\'{u}bica centrada en las caras/es,c\'{u}bica de faces centradas/br}%
-\def\pgfPT@labels@ls@fcort{ortorr\^{o}mbica de faces centradas/pt,face centered orthorhombic/en,orthorhombique \`{a} faces centr\'{e}es/fr,orthorhombisch fl\"{a}chenzentriert/de,ortorombico a facce centrate/it,ortorr\'{o}mbica centrada en la cara/es,ortorr\^{o}mbica de faces centradas/br}%
-\def\pgfPT@labels@ls@hcp{hexagonal compacta/pt,hexagonal close packed/en,hexagonal compact/fr,hexagonal-dichteste Packung/de,esagonale compatto/it,empaquetado hexagonal cerrado/es,hexagonal compacta/br}%
-\def\pgfPT@labels@ls@hex{hexagonal /pt,hexagonal/en,hexagonal/fr,hexagonal/de,esagonale/it,hexagonal/es,hexagonal /br}%
-\def\pgfPT@labels@ls@mono{monocl\'{i}nica/pt,monoclinic/en,monoclinique/fr,monoklin/de,monoclino/it,monocl\'{i}nico/es,monocl\'{i}nica/br}%
-\def\pgfPT@labels@ls@rho{rombo\'{e}drica/pt,rhombohedral/en,rhombo\'{e}drique/fr,rhomboedrisch/de,romboedrico/it,rombo\'{e}drico/es,rombo\'{e}drica/br}%
-\def\pgfPT@labels@ls@sc{c\'{u}bica simples/pt,simple cubic/en,cubique simple/fr,kubisch primitiv/de,cubico semplice/it,c\'{u}bica simple/es,c\'{u}bica simples/br}%
-\def\pgfPT@labels@ls@tric{tricl\'{i}nica simples/pt,simple triclinic/en,triclinique simple/fr,triklin/de,triclino/it,tricl\'{i}nica simple/es,tricl\'{i}nica simples/br}%
-\def\pgfPT@labels@ls@tetr{tetragonal/pt,tetragonal/en,quadratique/fr,tetragonal/de,tetragonale/it,tetragonal/es,tetragonal/br}%
+\def\pgfPT@labels@ls@bcc{c\'{u}bica de corpo centrado/pt,body centered cubic/en,cubique centr\'{e}e/fr,kubisch raumzentriert/de,cubico a corpo centrato/it,c\'{u}bica centrado/es,c\'{u}bica de corpo centrado/br,\pgfPT@user@labels@ls@bcc/user}%
+\def\pgfPT@labels@ls@bcort{ortorr\^{o}mbica de bases centradas/pt,base centered orthorhombic/en,orthorhombique \`{a} base centr\'{e}e/fr,orthorhombisch basiszentriert/de,ortorombico a base centrata/it,ortorr\'{o}mbico con bases centradas/es,ortorr\^{o}mbica de bases centradas/br,\pgfPT@user@labels@ls@bcort/user}%
+\def\pgfPT@labels@ls@ctetr{tetragonal de corpo centrado/pt,body centered tetragonal/en,quadratique centr\'{e}e/fr,tetragonal innenzentriert/de,tetragonale a corpo centrato/it,tetragonal centrado/es,tetragonal de corpo centrado/br,\pgfPT@user@labels@ls@ctetr/user}%
+\def\pgfPT@labels@ls@dia{diamante/pt,diamond/en,diamant/fr,diamant/de,diamante/it,diamante/es,diamante/br,\pgfPT@user@labels@ls@dia/user}%
+\def\pgfPT@labels@ls@fcc{c\'{u}bica de faces centradas/pt,face centered cubic/en,cubique \`{a} faces centr\'{e}es/fr,kubisch fl\"{a}chenzentriert/de,cubico a facce centrate/it,c\'{u}bica centrada en las caras/es,c\'{u}bica de faces centradas/br,\pgfPT@user@labels@ls@fcc/user}%
+\def\pgfPT@labels@ls@fcort{ortorr\^{o}mbica de faces centradas/pt,face centered orthorhombic/en,orthorhombique \`{a} faces centr\'{e}es/fr,orthorhombisch fl\"{a}chenzentriert/de,ortorombico a facce centrate/it,ortorr\'{o}mbica centrada en la cara/es,ortorr\^{o}mbica de faces centradas/br,\pgfPT@user@labels@ls@fcort/user}%
+\def\pgfPT@labels@ls@hcp{hexagonal compacta/pt,hexagonal close packed/en,hexagonal compact/fr,hexagonal-dichteste Packung/de,esagonale compatto/it,empaquetado hexagonal cerrado/es,hexagonal compacta/br,\pgfPT@user@labels@ls@hcp/user}%
+\def\pgfPT@labels@ls@hex{hexagonal /pt,hexagonal/en,hexagonal/fr,hexagonal/de,esagonale/it,hexagonal/es,hexagonal /br,\pgfPT@user@labels@ls@hex/user}%
+\def\pgfPT@labels@ls@mono{monocl\'{i}nica/pt,monoclinic/en,monoclinique/fr,monoklin/de,monoclino/it,monocl\'{i}nico/es,monocl\'{i}nica/br,\pgfPT@user@labels@ls@mono/user}%
+\def\pgfPT@labels@ls@rho{rombo\'{e}drica/pt,rhombohedral/en,rhombo\'{e}drique/fr,rhomboedrisch/de,romboedrico/it,rombo\'{e}drico/es,rombo\'{e}drica/br,\pgfPT@user@labels@ls@rho/user}%
+\def\pgfPT@labels@ls@sc{c\'{u}bica simples/pt,simple cubic/en,cubique simple/fr,kubisch primitiv/de,cubico semplice/it,c\'{u}bica simple/es,c\'{u}bica simples/br,\pgfPT@user@labels@ls@sc/user}%
+\def\pgfPT@labels@ls@tric{tricl\'{i}nica simples/pt,simple triclinic/en,triclinique simple/fr,triklin/de,triclino/it,tricl\'{i}nica simple/es,tricl\'{i}nica simples/br,\pgfPT@user@labels@ls@tric/user}%
+\def\pgfPT@labels@ls@tetr{tetragonal/pt,tetragonal/en,quadratique/fr,tetragonal/de,tetragonale/it,tetragonal/es,tetragonal/br,\pgfPT@user@labels@ls@tetr/user}%
%
%%%%%%%%%%%%%%% Units %%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcount\pgfPT@count@note%
@@ -148,7 +150,7 @@
% gas
;\hspace{.2ex}\mbox{\hspace{.1ex}\pgfPT@box@zerodepth{g}\hspace{.1ex}/dm%
\pgfmathsetlength{\pgfPT@dimc}{.666*\pgfPT@dima}\raisebox{.555ex}{\fontsize{\pgfPT@dimc}{\pgfPT@dimc}\selectfont3}\hspace{.6ex}}%
-\edef\pgfPT@lang@pt{pt}\edef\pgfPT@lang@en{en}\edef\pgfPT@lang@fr{fr}\edef\pgfPT@lang@de{de}\edef\pgfPT@lang@it{it}\edef\pgfPT@lang@es{es}\edef\pgfPT@lang@br{br}%
+\edef\pgfPT@lang@pt{pt}\edef\pgfPT@lang@en{en}\edef\pgfPT@lang@fr{fr}\edef\pgfPT@lang@de{de}\edef\pgfPT@lang@it{it}\edef\pgfPT@lang@es{es}\edef\pgfPT@lang@br{br}\edef\pgfPT@lang@user{user}%
\expandafter\pgfPT@getFirstLanguage\pgfPTlanguages, \relax%
\ifx\pgfPT@FirstLanguage\pgfPT@lang@pt\relax%
para os \textcolor{gasoso}{gases}%pt
@@ -164,9 +166,11 @@ per i \textcolor{gasoso}{gas}%it
para los \textcolor{gasoso}{gases}%es
\else\ifx\pgfPT@FirstLanguage\pgfPT@lang@br\relax%
para os \textcolor{gasoso}{gases}%br
+\else\ifx\pgfPT@FirstLanguage\pgfPT@lang@user\relax%
+-- \textcolor{gasoso}{\pgfPT@user@labels@gasoso}%user
\else% use en
for the \textcolor{gasoso}{gases}%en
-\fi\fi\fi\fi\fi\fi\fi%
+\fi\fi\fi\fi\fi\fi\fi\fi%
)\fi\fi%
}%
\def\pgfPT@labels@unit@Cp{\ignorespaces\pgfmathsetlength{\pgfPT@dimc}{.666*\pgfPT@dima}%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
index b57ca45dcd..2c321dcd34 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex
@@ -9,6 +9,7 @@
% - it -> Italian
% - es -> Spanish
% - br -> Portuguese (Brazil)
+% - user -> user language (v2.1.0)
% --------------------------------------------------------------------------------------------------
% Turn the 'name' in 'Name'
% USE -> \expandafter\pgfPT@namec@p#1#2\pgfPT@nomes@xx\relax
@@ -21,122 +22,122 @@
% --------------------------------------------------------------------------------------------------
% The names list from Z=1 to 118 ---------------------------------------------------------------
% --------------------------------------------------------------------------------------------------
-\def\pgfPT@nomes@i{hidrog\'{e}nio/pt,hydrogen/en,hydrog\`{e}ne/fr,Wasserstoff/de,idrogeno/it,hidr\'{o}geno/es,hidrog\^{e}nio/br}%
-\def\pgfPT@nomes@ii{h\'{e}lio/pt,helium/en,h\'{e}lium/fr,Helium/de,elio/it,helio/es,h\'{e}lio/br}%
-\def\pgfPT@nomes@iii{l\'{i}tio/pt,lithium/en,lithium/fr,Lithium/de,litio/it,litio/es,l\'{i}tio/br}%
-\def\pgfPT@nomes@iv{ber\'{i}lio/pt,beryllium/en,b\'{e}ryllium/fr,Beryllium/de,berillio/it,berilio/es,ber\'{i}lio/br}%
-\def\pgfPT@nomes@v{boro/pt,boron/en,bore/fr,Bor/de,boro/it,boro/es,boro/br}%
-\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carb\'{o}n/es,carbono/br}%
-\def\pgfPT@nomes@vii{azoto/pt,nitrogen/en,azote/fr,Stickstoff/de,azoto/it,nitr\'{o}geno/es,nitrog\^{e}nio/br}%
-\def\pgfPT@nomes@viii{oxig\'{e}nio/pt,oxygen/en,oxyg\`{e}ne/fr,Sauerstoff/de,ossigeno/it,ox\'{i}geno/es,oxig\^{e}nio/br}%
-\def\pgfPT@nomes@ix{fl\'{u}or/pt,fluorine/en,fluor/fr,Fluor/de,fluoro/it,fl\'{u}or/es,fl\'{u}or/br}%
-\def\pgfPT@nomes@x{n\'{e}on/pt,neon/en,n\'{e}on/fr,Neon/de,neon/it,ne\'{o}n/es,ne\^{o}nio/br}%
-\def\pgfPT@nomes@xi{s\'{o}dio/pt,sodium/en,sodium/fr,Natrium/de,sodio/it,sodio/es,s\'{o}dio/br}%
-\def\pgfPT@nomes@xii{magn\'{e}sio/pt,magnesium/en,magn\'{e}sium/fr,Magnesium/de,magnesio/it,magnesio/es,magn\'{e}sio/br}%
-\def\pgfPT@nomes@xiii{alum\'{i}nio/pt,aluminium/en,aluminium/fr,Aluminium/de,alluminio/it,aluminio/es,alum\'{i}nio/br}%
-\def\pgfPT@nomes@xiv{sil\'{i}cio/pt,silicon/en,silicium/fr,Silizium/de,silicio/it,silicio/es,sil\'{i}cio/br}%
-\def\pgfPT@nomes@xv{f\'{o}sforo/pt,phosphorus/en,phosphore/fr,Phosphor/de,fosforo/it,f\'{o}sforo/es,f\'{o}sforo/br}%
-\def\pgfPT@nomes@xvi{enxofre/pt,sulfur/en,soufre/fr,Schwefel/de,zolfo/it,azufre/es,enxofre/br}%
-\def\pgfPT@nomes@xvii{cloro/pt,chlorine/en,chlore/fr,Chlor/de,cloro/it,cloro/es,cloro/br}%
-\def\pgfPT@nomes@xviii{\'{a}rgon/pt,argon/en,argon/fr,Argon/de,argo/it,arg\'{o}n/es,arg\^{o}nio/br}%
-\def\pgfPT@nomes@xix{pot\'{a}ssio/pt,potassium/en,potassium/fr,Kalium/de,potassio/it,potasio/es,pot\'{a}ssio/br}%
-\def\pgfPT@nomes@xx{c\'{a}lcio/pt,calcium/en,calcium/fr,Kalzium/de,calcio/it,calcio/es,c\'{a}lcio/br}%
-\def\pgfPT@nomes@xxi{esc\^{a}ndio/pt,scandium/en,scandium/fr,Scandium/de,scandio/it,escandio/es,esc\^{a}ndio/br}%
-\def\pgfPT@nomes@xxii{tit\^{a}nio/pt,titanium/en,titane/fr,Titan/de,titanio/it,titanio/es,tit\^{a}nio/br}%
-\def\pgfPT@nomes@xxiii{van\'{a}dio/pt,vanadium/en,vanadium/fr,Vanadium/de,vanadio/it,vanadio/es,van\'{a}dio/br}%
-\def\pgfPT@nomes@xxiv{cr\'{o}mio/pt,chromium/en,chrome/fr,Chrom/de,cromo/it,cromo/es,cr\^{o}mio/br}%
-\def\pgfPT@nomes@xxv{mangan\'{e}sio/pt,manganese/en,mangan\`{e}se/fr,Mangan/de,manganese/it,manganeso/es,mangan\^{e}s/br}%
-\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,planchar/es,ferro/br}%
-\def\pgfPT@nomes@xxvii{cobalto/pt,cobalt/en,cobalt/fr,Kobalt/de,cobalto/it,cobalto/es,cobalto/br}%
-\def\pgfPT@nomes@xxviii{n\'{i}quel/pt,nickel/en,nickel/fr,Nickel/de,nichel/it,n\'{i}quel/es,n\'{i}quel/br}%
-\def\pgfPT@nomes@xxix{cobre/pt,copper/en,cuivre/fr,Kupfer/de,rame/it,cobre/es,cobre/br}%
-\def\pgfPT@nomes@xxx{zinco/pt,zinc/en,zinc/fr,Zink/de,zinco/it,zinc/es,zinco/br}%
-\def\pgfPT@nomes@xxxi{g\'{a}lio/pt,gallium/en,gallium/fr,Gallium/de,gallio/it,galio/es,g\'{a}lio/br}%
-\def\pgfPT@nomes@xxxii{germ\^{a}nio/pt,germanium/en,germanium/fr,Germanium/de,germanio/it,germanio/es,germ\^{a}nio/br}%
-\def\pgfPT@nomes@xxxiii{ars\'{e}nio/pt,arsenic/en,arsenic/fr,Arsen/de,arsenico/it,ars\'{e}nico/es,ars\^{e}nio/br}%
-\def\pgfPT@nomes@xxxiv{sel\'{e}nio/pt,selenium/en,s\'{e}l\'{e}nium/fr,Selen/de,selenio/it,selenio/es,sel\^{e}nio/br}%
-\def\pgfPT@nomes@xxxv{bromo/pt,bromine/en,brome/fr,Brom/de,bromo/it,bromo/es,bromo/br}%
-\def\pgfPT@nomes@xxxvi{cr\'{i}pton/pt,krypton/en,krypton/fr,Krypton/de,krypton/it,cript\'{o}n/es,cript\^{o}nio/br}%
-\def\pgfPT@nomes@xxxvii{rub\'{i}dio/pt,rubidium/en,rubidium/fr,Rubidium/de,rubidio/it,rubidio/es,rub\'{i}dio/br}%
-\def\pgfPT@nomes@xxxviii{estr\^{o}ncio/pt,strontium/en,strontium/fr,Strontium/de,stronzio/it,estroncio/es,estr\^{o}ncio/br}%
-\def\pgfPT@nomes@xxxix{\'{i}trio/pt,yttrium/en,yttrium/fr,Yttrium/de,ittrio/it,itrio/es,\'{i}trio/br}%
-\def\pgfPT@nomes@xl{zirc\'{o}nio/pt,zirconium/en,zirconium/fr,Zirkonium/de,zirconio/it,circonio/es,zirc\^{o}nio/br}%
-\def\pgfPT@nomes@xli{ni\'{o}bio/pt,niobium/en,niobium/fr,Niob/de,niobio/it,niobio/es,ni\'{o}bio/br}%
-\def\pgfPT@nomes@xlii{molibd\'{e}nio/pt,molybdenum/en,molybd\`{e}ne/fr,Molybd\"{a}n/de,molibdeno/it,molibdeno/es,molibd\^{e}nio/br}%
-\def\pgfPT@nomes@xliii{tecn\'{e}cio/pt,technetium/en,techn\'{e}tium/fr,Technetium/de,tecnezio/it,tecnecio/es,tecn\'{e}cio/br}%
-\def\pgfPT@nomes@xliv{rut\'{e}nio/pt,ruthenium/en,ruth\'{e}nium/fr,Ruthenium/de,rutenio/it,rutenio/es,rut\^{e}nio/br}%
-\def\pgfPT@nomes@xlv{r\'{o}dio/pt,rhodium/en,rhodium/fr,Rhodium/de,rodio/it,rodio/es,r\'{o}dio/br}%
-\def\pgfPT@nomes@xlvi{pal\'{a}dio/pt,palladium/en,palladium/fr,Palladium/de,palladio/it,paladio/es,pal\'{a}dio/br}%
-\def\pgfPT@nomes@xlvii{prata/pt,silver/en,argent/fr,Silber/de,argento/it,plata/es,prata/br}%
-\def\pgfPT@nomes@xlviii{c\'{a}dmio/pt,cadmium/en,cadmium/fr,Cadmium/de,cadmio/it,cadmio/es,c\'{a}dmio/br}%
-\def\pgfPT@nomes@xlix{\'{i}ndio/pt,indium/en,indium/fr,Indium/de,indio/it,indio/es,\'{i}ndio/br}%
-\def\pgfPT@nomes@l{estanho/pt,tin/en,\'{e}tain/fr,Zinn/de,lattina/it,esta\~{n}o/es,estanho/br}%
-\def\pgfPT@nomes@li{antim\'{o}nio/pt,antimony/en,antimoine/fr,Antimon/de,antimonio/it,antimonio/es,antim\^{o}nio/br}%
-\def\pgfPT@nomes@lii{tel\'{u}rio/pt,tellurium/en,tellure/fr,Tellur/de,tellurio/it,telurio/es,tel\'{u}rio/br}%
-\def\pgfPT@nomes@liii{iodo/pt,iodine/en,iode/fr,Iod/de,iodio/it,yodo/es,iodo/br}%
-\def\pgfPT@nomes@liv{x\'{e}non/pt,xenon/en,x\'{e}non/fr,Xenon/de,xeno/it,xen\'{o}n/es,xen\^{o}nio/br}%
-\def\pgfPT@nomes@lv{c\'{e}sio/pt,caesium/en,c\'{e}sium/fr,Caesium/de,cesio/it,cesio/es,c\'{e}sio/br}%
-\def\pgfPT@nomes@lvi{b\'{a}rio/pt,barium/en,baryum/fr,Barium/de,bario/it,bario/es,b\'{a}rio/br}%
-\def\pgfPT@nomes@lvii{lant\^{a}nio/pt,lanthanum/en,lanthane/fr,Lanthan/de,lantanio/it,lantano/es,lant\^{a}nio/br}%
-\def\pgfPT@nomes@lviii{c\'{e}rio/pt,cerium/en,c\'{e}rium/fr,Cer/de,cerio/it,cerio/es,c\'{e}rio/br}%
-\def\pgfPT@nomes@lix{praseod\'{i}mio/pt,praseodymium/en,pras\'{e}odyme/fr,Praseodym/de,praseodimio/it,praseodimio/es,praseod\'{i}mio/br}%
-\def\pgfPT@nomes@lx{neod\'{i}mio/pt,neodymium/en,n\'{e}odyme/fr,Neodym/de,neodimio/it,neodimio/es,neod\'{i}mio/br}%
-\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometeo/es,prom\'{e}cio/br}%
-\def\pgfPT@nomes@lxii{sam\'{a}rio/pt,samarium/en,samarium/fr,Samarium/de,samario/it,samario/es,sam\'{a}rio/br}%
-\def\pgfPT@nomes@lxiii{eur\'{o}pio/pt,europium/en,europium/fr,Europium/de,europium/it,europio/es,eur\'{o}pio/br}%
-\def\pgfPT@nomes@lxiv{gadol\'{i}nio/pt,gadolinium/en,gadolinium/fr,Gadolinium/de,gadolinio/it,gadolinio/es,gadol\'{i}nio/br}%
-\def\pgfPT@nomes@lxv{t\'{e}rbio/pt,terbium/en,terbium/fr,Terbium/de,terbio/it,terbio/es,t\'{e}rbio/br}%
-\def\pgfPT@nomes@lxvi{dispr\'{o}sio/pt,dysprosium/en,dysprosium/fr,Dysprosium/de,dysprosium/it,disprosio/es,dispr\'{o}sio/br}%
-\def\pgfPT@nomes@lxvii{h\'{o}lmio/pt,holmium/en,holmium/fr,Holmium/de,olmio/it,holmio/es,h\'{o}lmio/br}%
-\def\pgfPT@nomes@lxviii{\'{e}rbio/pt,erbium/en,erbium/fr,Erbium/de,erbio/it,erbio/es,\'{e}rbio/br}%
-\def\pgfPT@nomes@lxix{t\'{u}lio/pt,thulium/en,thulium/fr,Thulium/de,tulio/it,tulio/es,t\'{u}lio/br}%
-\def\pgfPT@nomes@lxx{it\'{e}rbio/pt,ytterbium/en,ytterbium/fr,Ytterbium/de,itterbio/it,iterbio/es,it\'{e}rbio/br}%
-\def\pgfPT@nomes@lxxi{lut\'{e}cio/pt,lutetium/en,lut\'{e}tium/fr,Lutetium/de,lutezio/it,lutecio/es,lut\'{e}cio/br}%
-\def\pgfPT@nomes@lxxii{h\'{a}fnio/pt,hafnium/en,hafnium/fr,Hafnium/de,afnio/it,hafnio/es,h\'{a}fnio/br}%
-\def\pgfPT@nomes@lxxiii{t\^{a}ntalo/pt,tantalum/en,tantale/fr,Tantal/de,tantalio/it,tantalio/es,t\^{a}ntalo/br}%
-\def\pgfPT@nomes@lxxiv{tungst\'{e}nio/pt,tungsten/en,tungst\`{e}ne/fr,Wolfram/de,tungsteno/it,tungsteno/es,tungst\^{e}nio/br}%
-\def\pgfPT@nomes@lxxv{r\'{e}nio/pt,rhenium/en,rh\'{e}nium/fr,Rhenium/de,rhenium/it,renio/es,r\^{e}nio/br}%
-\def\pgfPT@nomes@lxxvi{\'{o}smio/pt,osmium/en,osmium/fr,Osmium/de,osmio/it,osmio/es,\'{o}smio/br}%
-\def\pgfPT@nomes@lxxvii{ir\'{i}dio/pt,iridium/en,iridium/fr,Iridium/de,iridio/it,iridio/es,ir\'{i}dio/br}%
-\def\pgfPT@nomes@lxxviii{platina/pt,platinum/en,platine/fr,Platin/de,platino/it,platino/es,platina/br}%
-\def\pgfPT@nomes@lxxix{ouro/pt,gold/en,or/fr,Gold/de,oro/it,oro/es,ouro/br}%
-\def\pgfPT@nomes@lxxx{merc\'{u}rio/pt,mercury/en,mercure/fr,Quecksilber/de,mercurio/it,mercurio/es,merc\'{u}rio/br}%
-\def\pgfPT@nomes@lxxxi{t\'{a}lio/pt,thallium/en,thallium/fr,Thallium/de,tallio/it,talio/es,t\'{a}lio/br}%
-\def\pgfPT@nomes@lxxxii{chumbo/pt,lead/en,conduire/fr,Blei/de,piombo/it,plomo/es,chumbo/br}%
-\def\pgfPT@nomes@lxxxiii{bismuto/pt,bismuth/en,bismuth/fr,Bismut/de,bismuto/it,bismuto/es,bismuto/br}%
-\def\pgfPT@nomes@lxxxiv{pol\'{o}nio/pt,polonium/en,polonium/fr,Polonium/de,polonio/it,polonio/es,pol\^{o}nio/br}%
-\def\pgfPT@nomes@lxxxv{astato/pt,astatine/en,astatine/fr,Astat/de,astato/it,astato/es,\'{a}stato/br}%
-\def\pgfPT@nomes@lxxxvi{r\'{a}don/pt,radon/en,radon/fr,Radon/de,radon/it,rad\'{o}n/es,rad\^{o}nio/br}%
-\def\pgfPT@nomes@lxxxvii{fr\^{a}ncio/pt,francium/en,francium/fr,Francium/de,francio/it,francio/es,fr\^{a}ncio/br}%
-\def\pgfPT@nomes@lxxxviii{r\'{a}dio/pt,radium/en,radium/fr,Radium/de,radio/it,radio/es,r\'{a}dio/br}%
-\def\pgfPT@nomes@lxxxix{act\'{i}nio/pt,actinium/en,actinium/fr,Actinium/de,attinio/it,actinio/es,act\'{i}nio/br}%
-\def\pgfPT@nomes@xc{t\'{o}rio/pt,thorium/en,thorium/fr,Thorium/de,torio/it,torio/es,t\'{o}rio/br}%
-\def\pgfPT@nomes@xci{protact\'{i}nio/pt,protactinium/en,protactinium/fr,Protactinium/de,protactinio/it,protactinio/es,protact\'{i}nio/br}%
-\def\pgfPT@nomes@xcii{ur\^{a}nio/pt,uranium/en,uranium/fr,Uran/de,uranio/it,uranio/es,ur\^{a}nio/br}%
-\def\pgfPT@nomes@xciii{nept\'{u}nio/pt,neptunium/en,neptunium/fr,Neptunium/de,nettunio/it,neptunio/es,net\'{u}nio/br}%
-\def\pgfPT@nomes@xciv{plut\'{o}nio/pt,plutonium/en,plutonium/fr,Plutonium/de,plutonio/it,plutonio/es,plut\^{o}nio/br}%
-\def\pgfPT@nomes@xcv{amer\'{i}cio/pt,americium/en,am\'{e}ricium/fr,Americium/de,americio/it,americio/es,amer\'{i}cio/br}%
-\def\pgfPT@nomes@xcvi{c\'{u}rio/pt,curium/en,curium/fr,Curium/de,curio/it,curio/es,c\'{u}rio/br}%
-\def\pgfPT@nomes@xcvii{berqu\'{e}lio/pt,berkelium/en,Berkelium/fr,berkelium/de,berkelium/it,berkelio/es,berqu\'{e}lio/br}%
-\def\pgfPT@nomes@xcviii{calif\'{o}rnio/pt,californium/en,Californium/fr,californium/de,californio/it,californio/es,calif\'{o}rnio/br}%
-\def\pgfPT@nomes@xcix{einst\'{e}nio/pt,einsteinium/en,Einsteinium/fr,einsteinium/de,einsteinio/it,einstenio/es,einst\^{e}nio/br}%
-\def\pgfPT@nomes@c{f\'{e}rmio/pt,fermium/en,fermium/fr,Rermium/de,fermium/it,fermio/es,f\'{e}rmio/br}%
-\def\pgfPT@nomes@ci{mendel\'{e}vio/pt,mendelevium/en,mendelevium/fr,Mendelevium/de,mendelevio/it,mendelevio/es,mendel\'{e}vio/br}%
-\def\pgfPT@nomes@cii{nob\'{e}lio/pt,nobelium/en,nobelium/fr,Nobelium/de,nobelium/it,nobelio/es,nob\'{e}lio/br}%
-\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencium/es,laur\^{e}ncio/br}%
-\def\pgfPT@nomes@civ{rutherf\'{o}rdio/pt,rutherfordium/en,rutherfordium/fr,Rutherfordium/de,rutherfordium/it,rutherfordio/es,rutherf\'{o}rdio/br}%
-\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnium/es,d\'{u}bnio/br}%
-\def\pgfPT@nomes@cvi{seab\'{o}rgio/pt,seaborgium/en,seaborgium/fr,Seaborgium/de,seaborgio/it,seaborgio/es,seab\'{o}rgio/br}%
-\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrium/es,b\'{o}hrio/br}%
-\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hassium/es,h\'{a}ssio/br}%
-\def\pgfPT@nomes@cix{meitn\'{e}rio/pt,meitnerium/en,meitnerium/fr,Meitnerium/de,meitnerio/it,meitnerio/es,meitn\'{e}rio/br}%
-\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstadtium/es,darmst\'{a}dtio/br}%
-\def\pgfPT@nomes@cxi{roentg\'{e}nio/pt,roentgenium/en,roentgenium/fr,R\"{o}ntgenium/de,roentgenio/it,roentgenio/es,roentg\^{e}nio/br}%
-\def\pgfPT@nomes@cxii{copern\'{i}cio/pt,copernicium/en,copernicium/fr,Copernicium/de,copernicium/it,copernicio/es,copern\'{i}cio/br}%
-\def\pgfPT@nomes@cxiii{nip\'{o}nio/pt,nihonium/en,nihonium/fr,Nihonium/de,nihonium/it,nihonio/es,nip\^{o}nio/br}%
-\def\pgfPT@nomes@cxiv{fler\'{o}vio/pt,flerovium/en,flerovium/fr,Flerovium/de,flerovio/it,flerovio/es,fler\'{o}vio/br}%
-\def\pgfPT@nomes@cxv{mosc\'{o}vio/pt,moscovium/en,moscovium/fr,Moscovium/de,moscovium/it,moscovio/es,mosc\'{o}vio/br}%
-\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorium/es,liverm\'{o}rio/br}%
-\def\pgfPT@nomes@cxvii{tenesso/pt,tennessine/en,tennessine/fr,Tenness/de,tennessine/it,teneso/es,tenesso/br}%
-\def\pgfPT@nomes@cxviii{ogan\'{e}sson/pt,oganesson/en,oganesson/fr,Oganesson/de,oganesson/it,oganes\'{o}n/es,oganess\^{o}nio/br}%
+\def\pgfPT@nomes@i{hidrog\'{e}nio/pt,hydrogen/en,hydrog\`{e}ne/fr,Wasserstoff/de,idrogeno/it,hidr\'{o}geno/es,hidrog\^{e}nio/br,\pgfPT@user@CSname@H/user}%
+\def\pgfPT@nomes@ii{h\'{e}lio/pt,helium/en,h\'{e}lium/fr,Helium/de,elio/it,helio/es,h\'{e}lio/br,\pgfPT@user@CSname@He/user}%
+\def\pgfPT@nomes@iii{l\'{i}tio/pt,lithium/en,lithium/fr,Lithium/de,litio/it,litio/es,l\'{i}tio/br,\pgfPT@user@CSname@Li/user}%
+\def\pgfPT@nomes@iv{ber\'{i}lio/pt,beryllium/en,b\'{e}ryllium/fr,Beryllium/de,berillio/it,berilio/es,ber\'{i}lio/br,\pgfPT@user@CSname@Be/user}%
+\def\pgfPT@nomes@v{boro/pt,boron/en,bore/fr,Bor/de,boro/it,boro/es,boro/br,\pgfPT@user@CSname@B/user}%
+\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carb\'{o}n/es,carbono/br,\pgfPT@user@CSname@C/user}%
+\def\pgfPT@nomes@vii{azoto/pt,nitrogen/en,azote/fr,Stickstoff/de,azoto/it,nitr\'{o}geno/es,nitrog\^{e}nio/br,\pgfPT@user@CSname@N/user}%
+\def\pgfPT@nomes@viii{oxig\'{e}nio/pt,oxygen/en,oxyg\`{e}ne/fr,Sauerstoff/de,ossigeno/it,ox\'{i}geno/es,oxig\^{e}nio/br,\pgfPT@user@CSname@O/user}%
+\def\pgfPT@nomes@ix{fl\'{u}or/pt,fluorine/en,fluor/fr,Fluor/de,fluoro/it,fl\'{u}or/es,fl\'{u}or/br,\pgfPT@user@CSname@F/user}%
+\def\pgfPT@nomes@x{n\'{e}on/pt,neon/en,n\'{e}on/fr,Neon/de,neon/it,ne\'{o}n/es,ne\^{o}nio/br,\pgfPT@user@CSname@Ne/user}%
+\def\pgfPT@nomes@xi{s\'{o}dio/pt,sodium/en,sodium/fr,Natrium/de,sodio/it,sodio/es,s\'{o}dio/br,\pgfPT@user@CSname@Na/user}%
+\def\pgfPT@nomes@xii{magn\'{e}sio/pt,magnesium/en,magn\'{e}sium/fr,Magnesium/de,magnesio/it,magnesio/es,magn\'{e}sio/br,\pgfPT@user@CSname@Mg/user}%
+\def\pgfPT@nomes@xiii{alum\'{i}nio/pt,aluminium/en,aluminium/fr,Aluminium/de,alluminio/it,aluminio/es,alum\'{i}nio/br,\pgfPT@user@CSname@Al/user}%
+\def\pgfPT@nomes@xiv{sil\'{i}cio/pt,silicon/en,silicium/fr,Silizium/de,silicio/it,silicio/es,sil\'{i}cio/br,\pgfPT@user@CSname@Si/user}%
+\def\pgfPT@nomes@xv{f\'{o}sforo/pt,phosphorus/en,phosphore/fr,Phosphor/de,fosforo/it,f\'{o}sforo/es,f\'{o}sforo/br,\pgfPT@user@CSname@P/user}%
+\def\pgfPT@nomes@xvi{enxofre/pt,sulfur/en,soufre/fr,Schwefel/de,zolfo/it,azufre/es,enxofre/br,\pgfPT@user@CSname@S/user}%
+\def\pgfPT@nomes@xvii{cloro/pt,chlorine/en,chlore/fr,Chlor/de,cloro/it,cloro/es,cloro/br,\pgfPT@user@CSname@Cl/user}%
+\def\pgfPT@nomes@xviii{\'{a}rgon/pt,argon/en,argon/fr,Argon/de,argo/it,arg\'{o}n/es,arg\^{o}nio/br,\pgfPT@user@CSname@Ar/user}%
+\def\pgfPT@nomes@xix{pot\'{a}ssio/pt,potassium/en,potassium/fr,Kalium/de,potassio/it,potasio/es,pot\'{a}ssio/br,\pgfPT@user@CSname@K/user}%
+\def\pgfPT@nomes@xx{c\'{a}lcio/pt,calcium/en,calcium/fr,Kalzium/de,calcio/it,calcio/es,c\'{a}lcio/br,\pgfPT@user@CSname@Ca/user}%
+\def\pgfPT@nomes@xxi{esc\^{a}ndio/pt,scandium/en,scandium/fr,Scandium/de,scandio/it,escandio/es,esc\^{a}ndio/br,\pgfPT@user@CSname@Sc/user}%
+\def\pgfPT@nomes@xxii{tit\^{a}nio/pt,titanium/en,titane/fr,Titan/de,titanio/it,titanio/es,tit\^{a}nio/br,\pgfPT@user@CSname@Ti/user}%
+\def\pgfPT@nomes@xxiii{van\'{a}dio/pt,vanadium/en,vanadium/fr,Vanadium/de,vanadio/it,vanadio/es,van\'{a}dio/br,\pgfPT@user@CSname@V/user}%
+\def\pgfPT@nomes@xxiv{cr\'{o}mio/pt,chromium/en,chrome/fr,Chrom/de,cromo/it,cromo/es,cr\^{o}mio/br,\pgfPT@user@CSname@Cr/user}%
+\def\pgfPT@nomes@xxv{mangan\'{e}sio/pt,manganese/en,mangan\`{e}se/fr,Mangan/de,manganese/it,manganeso/es,mangan\^{e}s/br,\pgfPT@user@CSname@Mn/user}%
+\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,planchar/es,ferro/br,\pgfPT@user@CSname@Fe/user}%
+\def\pgfPT@nomes@xxvii{cobalto/pt,cobalt/en,cobalt/fr,Kobalt/de,cobalto/it,cobalto/es,cobalto/br,\pgfPT@user@CSname@Co/user}%
+\def\pgfPT@nomes@xxviii{n\'{i}quel/pt,nickel/en,nickel/fr,Nickel/de,nichel/it,n\'{i}quel/es,n\'{i}quel/br,\pgfPT@user@CSname@Ni/user}%
+\def\pgfPT@nomes@xxix{cobre/pt,copper/en,cuivre/fr,Kupfer/de,rame/it,cobre/es,cobre/br,\pgfPT@user@CSname@Cu/user}%
+\def\pgfPT@nomes@xxx{zinco/pt,zinc/en,zinc/fr,Zink/de,zinco/it,zinc/es,zinco/br,\pgfPT@user@CSname@Zn/user}%
+\def\pgfPT@nomes@xxxi{g\'{a}lio/pt,gallium/en,gallium/fr,Gallium/de,gallio/it,galio/es,g\'{a}lio/br,\pgfPT@user@CSname@Ga/user}%
+\def\pgfPT@nomes@xxxii{germ\^{a}nio/pt,germanium/en,germanium/fr,Germanium/de,germanio/it,germanio/es,germ\^{a}nio/br,\pgfPT@user@CSname@Ge/user}%
+\def\pgfPT@nomes@xxxiii{ars\'{e}nio/pt,arsenic/en,arsenic/fr,Arsen/de,arsenico/it,ars\'{e}nico/es,ars\^{e}nio/br,\pgfPT@user@CSname@As/user}%
+\def\pgfPT@nomes@xxxiv{sel\'{e}nio/pt,selenium/en,s\'{e}l\'{e}nium/fr,Selen/de,selenio/it,selenio/es,sel\^{e}nio/br,\pgfPT@user@CSname@Se/user}%
+\def\pgfPT@nomes@xxxv{bromo/pt,bromine/en,brome/fr,Brom/de,bromo/it,bromo/es,bromo/br,\pgfPT@user@CSname@Br/user}%
+\def\pgfPT@nomes@xxxvi{cr\'{i}pton/pt,krypton/en,krypton/fr,Krypton/de,krypton/it,cript\'{o}n/es,cript\^{o}nio/br,\pgfPT@user@CSname@Kr/user}%
+\def\pgfPT@nomes@xxxvii{rub\'{i}dio/pt,rubidium/en,rubidium/fr,Rubidium/de,rubidio/it,rubidio/es,rub\'{i}dio/br,\pgfPT@user@CSname@Rb/user}%
+\def\pgfPT@nomes@xxxviii{estr\^{o}ncio/pt,strontium/en,strontium/fr,Strontium/de,stronzio/it,estroncio/es,estr\^{o}ncio/br,\pgfPT@user@CSname@Sr/user}%
+\def\pgfPT@nomes@xxxix{\'{i}trio/pt,yttrium/en,yttrium/fr,Yttrium/de,ittrio/it,itrio/es,\'{i}trio/br,\pgfPT@user@CSname@Y/user}%
+\def\pgfPT@nomes@xl{zirc\'{o}nio/pt,zirconium/en,zirconium/fr,Zirkonium/de,zirconio/it,circonio/es,zirc\^{o}nio/br,\pgfPT@user@CSname@Zr/user}%
+\def\pgfPT@nomes@xli{ni\'{o}bio/pt,niobium/en,niobium/fr,Niob/de,niobio/it,niobio/es,ni\'{o}bio/br,\pgfPT@user@CSname@Nb/user}%
+\def\pgfPT@nomes@xlii{molibd\'{e}nio/pt,molybdenum/en,molybd\`{e}ne/fr,Molybd\"{a}n/de,molibdeno/it,molibdeno/es,molibd\^{e}nio/br,\pgfPT@user@CSname@Mo/user}%
+\def\pgfPT@nomes@xliii{tecn\'{e}cio/pt,technetium/en,techn\'{e}tium/fr,Technetium/de,tecnezio/it,tecnecio/es,tecn\'{e}cio/br,\pgfPT@user@CSname@Tc/user}%
+\def\pgfPT@nomes@xliv{rut\'{e}nio/pt,ruthenium/en,ruth\'{e}nium/fr,Ruthenium/de,rutenio/it,rutenio/es,rut\^{e}nio/br,\pgfPT@user@CSname@Ru/user}%
+\def\pgfPT@nomes@xlv{r\'{o}dio/pt,rhodium/en,rhodium/fr,Rhodium/de,rodio/it,rodio/es,r\'{o}dio/br,\pgfPT@user@CSname@Rh/user}%
+\def\pgfPT@nomes@xlvi{pal\'{a}dio/pt,palladium/en,palladium/fr,Palladium/de,palladio/it,paladio/es,pal\'{a}dio/br,\pgfPT@user@CSname@Pd/user}%
+\def\pgfPT@nomes@xlvii{prata/pt,silver/en,argent/fr,Silber/de,argento/it,plata/es,prata/br,\pgfPT@user@CSname@Ag/user}%
+\def\pgfPT@nomes@xlviii{c\'{a}dmio/pt,cadmium/en,cadmium/fr,Cadmium/de,cadmio/it,cadmio/es,c\'{a}dmio/br,\pgfPT@user@CSname@Cd/user}%
+\def\pgfPT@nomes@xlix{\'{i}ndio/pt,indium/en,indium/fr,Indium/de,indio/it,indio/es,\'{i}ndio/br,\pgfPT@user@CSname@In/user}%
+\def\pgfPT@nomes@l{estanho/pt,tin/en,\'{e}tain/fr,Zinn/de,lattina/it,esta\~{n}o/es,estanho/br,\pgfPT@user@CSname@Sn/user}%
+\def\pgfPT@nomes@li{antim\'{o}nio/pt,antimony/en,antimoine/fr,Antimon/de,antimonio/it,antimonio/es,antim\^{o}nio/br,\pgfPT@user@CSname@Sb/user}%
+\def\pgfPT@nomes@lii{tel\'{u}rio/pt,tellurium/en,tellure/fr,Tellur/de,tellurio/it,telurio/es,tel\'{u}rio/br,\pgfPT@user@CSname@Te/user}%
+\def\pgfPT@nomes@liii{iodo/pt,iodine/en,iode/fr,Iod/de,iodio/it,yodo/es,iodo/br,\pgfPT@user@CSname@I/user}%
+\def\pgfPT@nomes@liv{x\'{e}non/pt,xenon/en,x\'{e}non/fr,Xenon/de,xeno/it,xen\'{o}n/es,xen\^{o}nio/br,\pgfPT@user@CSname@Xe/user}%
+\def\pgfPT@nomes@lv{c\'{e}sio/pt,caesium/en,c\'{e}sium/fr,Caesium/de,cesio/it,cesio/es,c\'{e}sio/br,\pgfPT@user@CSname@Cs/user}%
+\def\pgfPT@nomes@lvi{b\'{a}rio/pt,barium/en,baryum/fr,Barium/de,bario/it,bario/es,b\'{a}rio/br,\pgfPT@user@CSname@Ba/user}%
+\def\pgfPT@nomes@lvii{lant\^{a}nio/pt,lanthanum/en,lanthane/fr,Lanthan/de,lantanio/it,lantano/es,lant\^{a}nio/br,\pgfPT@user@CSname@La/user}%
+\def\pgfPT@nomes@lviii{c\'{e}rio/pt,cerium/en,c\'{e}rium/fr,Cer/de,cerio/it,cerio/es,c\'{e}rio/br,\pgfPT@user@CSname@Ce/user}%
+\def\pgfPT@nomes@lix{praseod\'{i}mio/pt,praseodymium/en,pras\'{e}odyme/fr,Praseodym/de,praseodimio/it,praseodimio/es,praseod\'{i}mio/br,\pgfPT@user@CSname@Pr/user}%
+\def\pgfPT@nomes@lx{neod\'{i}mio/pt,neodymium/en,n\'{e}odyme/fr,Neodym/de,neodimio/it,neodimio/es,neod\'{i}mio/br,\pgfPT@user@CSname@Nd/user}%
+\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometeo/es,prom\'{e}cio/br,\pgfPT@user@CSname@Pm/user}%
+\def\pgfPT@nomes@lxii{sam\'{a}rio/pt,samarium/en,samarium/fr,Samarium/de,samario/it,samario/es,sam\'{a}rio/br,\pgfPT@user@CSname@Sm/user}%
+\def\pgfPT@nomes@lxiii{eur\'{o}pio/pt,europium/en,europium/fr,Europium/de,europium/it,europio/es,eur\'{o}pio/br,\pgfPT@user@CSname@Eu/user}%
+\def\pgfPT@nomes@lxiv{gadol\'{i}nio/pt,gadolinium/en,gadolinium/fr,Gadolinium/de,gadolinio/it,gadolinio/es,gadol\'{i}nio/br,\pgfPT@user@CSname@Gd/user}%
+\def\pgfPT@nomes@lxv{t\'{e}rbio/pt,terbium/en,terbium/fr,Terbium/de,terbio/it,terbio/es,t\'{e}rbio/br,\pgfPT@user@CSname@Tb/user}%
+\def\pgfPT@nomes@lxvi{dispr\'{o}sio/pt,dysprosium/en,dysprosium/fr,Dysprosium/de,dysprosium/it,disprosio/es,dispr\'{o}sio/br,\pgfPT@user@CSname@Dy/user}%
+\def\pgfPT@nomes@lxvii{h\'{o}lmio/pt,holmium/en,holmium/fr,Holmium/de,olmio/it,holmio/es,h\'{o}lmio/br,\pgfPT@user@CSname@Ho/user}%
+\def\pgfPT@nomes@lxviii{\'{e}rbio/pt,erbium/en,erbium/fr,Erbium/de,erbio/it,erbio/es,\'{e}rbio/br,\pgfPT@user@CSname@Er/user}%
+\def\pgfPT@nomes@lxix{t\'{u}lio/pt,thulium/en,thulium/fr,Thulium/de,tulio/it,tulio/es,t\'{u}lio/br,\pgfPT@user@CSname@Tm/user}%
+\def\pgfPT@nomes@lxx{it\'{e}rbio/pt,ytterbium/en,ytterbium/fr,Ytterbium/de,itterbio/it,iterbio/es,it\'{e}rbio/br,\pgfPT@user@CSname@Yb/user}%
+\def\pgfPT@nomes@lxxi{lut\'{e}cio/pt,lutetium/en,lut\'{e}tium/fr,Lutetium/de,lutezio/it,lutecio/es,lut\'{e}cio/br,\pgfPT@user@CSname@Lu/user}%
+\def\pgfPT@nomes@lxxii{h\'{a}fnio/pt,hafnium/en,hafnium/fr,Hafnium/de,afnio/it,hafnio/es,h\'{a}fnio/br,\pgfPT@user@CSname@Hf/user}%
+\def\pgfPT@nomes@lxxiii{t\^{a}ntalo/pt,tantalum/en,tantale/fr,Tantal/de,tantalio/it,tantalio/es,t\^{a}ntalo/br,\pgfPT@user@CSname@Ta/user}%
+\def\pgfPT@nomes@lxxiv{tungst\'{e}nio/pt,tungsten/en,tungst\`{e}ne/fr,Wolfram/de,tungsteno/it,tungsteno/es,tungst\^{e}nio/br,\pgfPT@user@CSname@W/user}%
+\def\pgfPT@nomes@lxxv{r\'{e}nio/pt,rhenium/en,rh\'{e}nium/fr,Rhenium/de,rhenium/it,renio/es,r\^{e}nio/br,\pgfPT@user@CSname@Re/user}%
+\def\pgfPT@nomes@lxxvi{\'{o}smio/pt,osmium/en,osmium/fr,Osmium/de,osmio/it,osmio/es,\'{o}smio/br,\pgfPT@user@CSname@Os/user}%
+\def\pgfPT@nomes@lxxvii{ir\'{i}dio/pt,iridium/en,iridium/fr,Iridium/de,iridio/it,iridio/es,ir\'{i}dio/br,\pgfPT@user@CSname@Ir/user}%
+\def\pgfPT@nomes@lxxviii{platina/pt,platinum/en,platine/fr,Platin/de,platino/it,platino/es,platina/br,\pgfPT@user@CSname@Pt/user}%
+\def\pgfPT@nomes@lxxix{ouro/pt,gold/en,or/fr,Gold/de,oro/it,oro/es,ouro/br,\pgfPT@user@CSname@Au/user}%
+\def\pgfPT@nomes@lxxx{merc\'{u}rio/pt,mercury/en,mercure/fr,Quecksilber/de,mercurio/it,mercurio/es,merc\'{u}rio/br,\pgfPT@user@CSname@Hg/user}%
+\def\pgfPT@nomes@lxxxi{t\'{a}lio/pt,thallium/en,thallium/fr,Thallium/de,tallio/it,talio/es,t\'{a}lio/br,\pgfPT@user@CSname@Tl/user}%
+\def\pgfPT@nomes@lxxxii{chumbo/pt,lead/en,conduire/fr,Blei/de,piombo/it,plomo/es,chumbo/br,\pgfPT@user@CSname@Pb/user}%
+\def\pgfPT@nomes@lxxxiii{bismuto/pt,bismuth/en,bismuth/fr,Bismut/de,bismuto/it,bismuto/es,bismuto/br,\pgfPT@user@CSname@Bi/user}%
+\def\pgfPT@nomes@lxxxiv{pol\'{o}nio/pt,polonium/en,polonium/fr,Polonium/de,polonio/it,polonio/es,pol\^{o}nio/br,\pgfPT@user@CSname@Po/user}%
+\def\pgfPT@nomes@lxxxv{astato/pt,astatine/en,astatine/fr,Astat/de,astato/it,astato/es,\'{a}stato/br,\pgfPT@user@CSname@At/user}%
+\def\pgfPT@nomes@lxxxvi{r\'{a}don/pt,radon/en,radon/fr,Radon/de,radon/it,rad\'{o}n/es,rad\^{o}nio/br,\pgfPT@user@CSname@Rn/user}%
+\def\pgfPT@nomes@lxxxvii{fr\^{a}ncio/pt,francium/en,francium/fr,Francium/de,francio/it,francio/es,fr\^{a}ncio/br,\pgfPT@user@CSname@Fr/user}%
+\def\pgfPT@nomes@lxxxviii{r\'{a}dio/pt,radium/en,radium/fr,Radium/de,radio/it,radio/es,r\'{a}dio/br,\pgfPT@user@CSname@Ra/user}%
+\def\pgfPT@nomes@lxxxix{act\'{i}nio/pt,actinium/en,actinium/fr,Actinium/de,attinio/it,actinio/es,act\'{i}nio/br,\pgfPT@user@CSname@Ac/user}%
+\def\pgfPT@nomes@xc{t\'{o}rio/pt,thorium/en,thorium/fr,Thorium/de,torio/it,torio/es,t\'{o}rio/br,\pgfPT@user@CSname@Th/user}%
+\def\pgfPT@nomes@xci{protact\'{i}nio/pt,protactinium/en,protactinium/fr,Protactinium/de,protactinio/it,protactinio/es,protact\'{i}nio/br,\pgfPT@user@CSname@Pa/user}%
+\def\pgfPT@nomes@xcii{ur\^{a}nio/pt,uranium/en,uranium/fr,Uran/de,uranio/it,uranio/es,ur\^{a}nio/br,\pgfPT@user@CSname@U/user}%
+\def\pgfPT@nomes@xciii{nept\'{u}nio/pt,neptunium/en,neptunium/fr,Neptunium/de,nettunio/it,neptunio/es,net\'{u}nio/br,\pgfPT@user@CSname@Np/user}%
+\def\pgfPT@nomes@xciv{plut\'{o}nio/pt,plutonium/en,plutonium/fr,Plutonium/de,plutonio/it,plutonio/es,plut\^{o}nio/br,\pgfPT@user@CSname@Pu/user}%
+\def\pgfPT@nomes@xcv{amer\'{i}cio/pt,americium/en,am\'{e}ricium/fr,Americium/de,americio/it,americio/es,amer\'{i}cio/br,\pgfPT@user@CSname@Am/user}%
+\def\pgfPT@nomes@xcvi{c\'{u}rio/pt,curium/en,curium/fr,Curium/de,curio/it,curio/es,c\'{u}rio/br,\pgfPT@user@CSname@Cm/user}%
+\def\pgfPT@nomes@xcvii{berqu\'{e}lio/pt,berkelium/en,berkelium/fr,Berkelium/de,berkelium/it,berkelio/es,berqu\'{e}lio/br,\pgfPT@user@CSname@Bk/user}%
+\def\pgfPT@nomes@xcviii{calif\'{o}rnio/pt,californium/en,californium/fr,Californium/de,californio/it,californio/es,calif\'{o}rnio/br,\pgfPT@user@CSname@Cf/user}%
+\def\pgfPT@nomes@xcix{einst\'{e}nio/pt,einsteinium/en,einsteinium/fr,Einsteinium/de,einsteinio/it,einstenio/es,einst\^{e}nio/br,\pgfPT@user@CSname@Es/user}%
+\def\pgfPT@nomes@c{f\'{e}rmio/pt,fermium/en,fermium/fr,Rermium/de,fermium/it,fermio/es,f\'{e}rmio/br,\pgfPT@user@CSname@Fm/user}%
+\def\pgfPT@nomes@ci{mendel\'{e}vio/pt,mendelevium/en,mendelevium/fr,Mendelevium/de,mendelevio/it,mendelevio/es,mendel\'{e}vio/br,\pgfPT@user@CSname@Md/user}%
+\def\pgfPT@nomes@cii{nob\'{e}lio/pt,nobelium/en,nobelium/fr,Nobelium/de,nobelium/it,nobelio/es,nob\'{e}lio/br,\pgfPT@user@CSname@No/user}%
+\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencium/es,laur\^{e}ncio/br,\pgfPT@user@CSname@Lr/user}%
+\def\pgfPT@nomes@civ{rutherf\'{o}rdio/pt,rutherfordium/en,rutherfordium/fr,Rutherfordium/de,rutherfordium/it,rutherfordio/es,rutherf\'{o}rdio/br,\pgfPT@user@CSname@Rf/user}%
+\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnium/es,d\'{u}bnio/br,\pgfPT@user@CSname@Db/user}%
+\def\pgfPT@nomes@cvi{seab\'{o}rgio/pt,seaborgium/en,seaborgium/fr,Seaborgium/de,seaborgio/it,seaborgio/es,seab\'{o}rgio/br,\pgfPT@user@CSname@Sg/user}%
+\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrium/es,b\'{o}hrio/br,\pgfPT@user@CSname@Bh/user}%
+\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hassium/es,h\'{a}ssio/br,\pgfPT@user@CSname@Hs/user}%
+\def\pgfPT@nomes@cix{meitn\'{e}rio/pt,meitnerium/en,meitnerium/fr,Meitnerium/de,meitnerio/it,meitnerio/es,meitn\'{e}rio/br,\pgfPT@user@CSname@Mt/user}%
+\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstadtium/es,darmst\'{a}dtio/br,\pgfPT@user@CSname@Ds/user}%
+\def\pgfPT@nomes@cxi{roentg\'{e}nio/pt,roentgenium/en,roentgenium/fr,R\"{o}ntgenium/de,roentgenio/it,roentgenio/es,roentg\^{e}nio/br,\pgfPT@user@CSname@Rg/user}%
+\def\pgfPT@nomes@cxii{copern\'{i}cio/pt,copernicium/en,copernicium/fr,Copernicium/de,copernicium/it,copernicio/es,copern\'{i}cio/br,\pgfPT@user@CSname@Cn/user}%
+\def\pgfPT@nomes@cxiii{nip\'{o}nio/pt,nihonium/en,nihonium/fr,Nihonium/de,nihonium/it,nihonio/es,nip\^{o}nio/br,\pgfPT@user@CSname@Nh/user}%
+\def\pgfPT@nomes@cxiv{fler\'{o}vio/pt,flerovium/en,flerovium/fr,Flerovium/de,flerovio/it,flerovio/es,fler\'{o}vio/br,\pgfPT@user@CSname@Fl/user}%
+\def\pgfPT@nomes@cxv{mosc\'{o}vio/pt,moscovium/en,moscovium/fr,Moscovium/de,moscovium/it,moscovio/es,mosc\'{o}vio/br,\pgfPT@user@CSname@Mc/user}%
+\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorium/es,liverm\'{o}rio/br,\pgfPT@user@CSname@Lv/user}%
+\def\pgfPT@nomes@cxvii{tenesso/pt,tennessine/en,tennessine/fr,Tenness/de,tennessine/it,teneso/es,tenesso/br,\pgfPT@user@CSname@Ts/user}%
+\def\pgfPT@nomes@cxviii{ogan\'{e}sson/pt,oganesson/en,oganesson/fr,Oganesson/de,oganesson/it,oganes\'{o}n/es,oganess\^{o}nio/br,\pgfPT@user@CSname@Og/user}%
\endinput%
diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex
index fa52c916eb..54e5befb4c 100644
--- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex
+++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex
@@ -4,7 +4,8 @@
% --------------------------------------------------------------------------------------------------
% The macros for process the language(s) data to display in the Periodic Table ------------
% --------------------------------------------------------------------------------------------------
-% Labels available in: pt, en, fr, de, it, es, br
+% v2.1.0: Added support for user language
+% Labels available in: pt, en, fr, de, it, es, br, user
% --------------------------------------------------------------------------------------------------
% \pgfPTsetLanguage{<language flag>}
% --------------------------------------------------------------------------------------------------
@@ -17,17 +18,23 @@
% - it, Italian
% - es, Spanish
% - br, Portuguese (Brazil)
+% - user, user language
\def\pgfPTsetLanguage#1{%
-\pgfPT@validLang{#1}%
+% changed in v2.1.0
+\edef\pgfPT@tmp{#1}%
+\ifx\pggPT@userlanguage@ISOcode\pgfPT@tmp\relax\edef\pgfPT@tmp{user}\fi%
+%\pgfPT@validLang{#1}%
+\pgfPT@validLang{\pgfPT@tmp}%
+%
\ifx\pgfPT@langOK\undefined\relax%
\PackageError{pgfPT}{invalid language flag '#1'. It will be ignored (default 'en'\space will be used)}{}%
\xdef\pgfPT@defaultLanguage{en}%
-\else\xdef\pgfPT@defaultLanguage{#1}\global\let\pgfPT@langOK\undefined\relax%
+\else\xdef\pgfPT@defaultLanguage{#1}\global\let\pgfPT@langOK\undefined\relax\global\let\pgfPTlanguages\pgfPT@tmp\relax%
\fi}%
% --------------------------------------------------------------------------------------------------
% List of available languages
% --------------------------------------------------------------------------------------------------
-\def\pgfPT@languagesList{pt,en,fr,de,it,es,br}%
+\def\pgfPT@languagesList{pt,en,fr,de,it,es,br,user}%
% --------------------------------------------------------------------------------------------------
% Validating language
\def\pgfPT@validLang#1{\ignorespaces%
diff --git a/graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex b/graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex
new file mode 100644
index 0000000000..1f7f634f08
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex
@@ -0,0 +1,269 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% --------------------------------------------------------------------------------------------------
+% subfile of pgf-PeriodicTable package ----------------------------------------------------------
+% --------------------------------------------------------------------------------------------------
+%
+% Translation file for Nederlands
+% Author: Wim De Borggraeve @2024/01/21
+%
+% --------------------------------------------------------------------------------------------------
+% This is file lang.nl.tex
+% Version: 1
+% Revision: 0
+% Date: 2024/02/10
+% Provides translation of data used
+% in pgf-PeriodicTable files
+% Language: Dutch
+% ISO 639-1 code: nl
+% ----------------------------
+\def\pgfPT@user@labels@titulo{Periodiek Systeem van de Elementen}%
+% ----------------------------
+\def\pgfPT@user@labels@La{lanthaniden}%
+\def\pgfPT@user@labels@Ac{actiniden}%
+% ----------------------------
+\def\pgfPT@user@labels@solido{vast}%
+\def\pgfPT@user@labels@liquido{vloeibaar}%
+\def\pgfPT@user@labels@gasoso{gasvormig}%
+\def\pgfPT@user@labels@sintetico{synthetisch}%
+% ----------------------------
+% labels for legend
+\def\pgfPT@user@labels@Z{Atoomnummer}%
+\def\pgfPT@user@labels@name{Naam}%
+\def\pgfPT@user@labels@CS{Chemisch Symbool}%
+\def\pgfPT@user@labels@Ar@m{Relatieve Atoommassa}%
+\def\pgfPT@user@labels@Arstar@m{Standaard Relatieve Atoommassa}%
+\def\pgfPT@user@labels@Ar@w{Gemiddelde Atoommassa}%
+\def\pgfPT@user@labels@Arstar@w{Standaard Gemiddelde Atoommassa}%
+\def\pgfPT@user@labels@radio{Radioactief}%
+\def\pgfPT@user@labels@R{Atoomstraal}%
+\def\pgfPT@user@labels@Rcov{Covalente Straal}%
+\def\pgfPT@user@labels@Rion{Ionstraal}%
+\def\pgfPT@user@labels@Ei{Ionisatie-energie}%
+\def\pgfPT@user@labels@eneg{Elektronegativiteit}%
+\def\pgfPT@user@labels@eaff{Elektronenaffiniteit}%
+\def\pgfPT@user@labels@O{Oxidatietrappen}%
+\def\pgfPT@user@labels@Tmelt{Smeltpunt}%
+\def\pgfPT@user@labels@TmeltC{Smeltpunt}%
+\def\pgfPT@user@labels@Tboil{Kookpunt}%
+\def\pgfPT@user@labels@TboilC{Kookpunt}%
+\def\pgfPT@user@labels@eDist{Elektronenverdeling}%
+\def\pgfPT@user@labels@eConfig{Elektronenconfiguratie}%
+\def\pgfPT@user@labels@d{Dichtheid}%
+\def\pgfPT@user@labels@Cp{Specifieke Warmtecapaciteit}%
+\def\pgfPT@user@labels@kT{Thermische Geleidbaarheid}%
+\def\pgfPT@user@labels@ls{Roosterstructuur}%
+\def\pgfPT@user@labels@lsa{Roosterparameter: a}%
+\def\pgfPT@user@labels@lsb{Roosterparameter: b}%
+\def\pgfPT@user@labels@lsc{Roosterparameter: c}%
+\def\pgfPT@user@labels@lsca{Verhouding roosterparameters c/a}%
+\def\pgfPT@user@labels@DiscY{Jaar van Ontdekking}%
+% Before Christ acronym:
+\def\pgfPT@user@labels@BC{VC}%
+\def\pgfPT@user@labels@DiscC{Land van Ontdekking}%
+\def\pgfPT@user@labels@spectra{Emissiespectrum}%
+% ----------------------------
+% acronym to use in legend
+% for 'Name'
+\def\pgfPT@user@acr@name{N}%
+% for 'Chemical Symbol'
+\def\pgfPT@user@acr@CS{CS}%
+% for 'Radioactive'
+\def\pgfPT@user@acr@radio{Ra}%
+% for 'Melting Point'
+\def\pgfPT@user@acr@Tmelt{Smeltpt}%
+% for 'Boiling Point'
+\def\pgfPT@user@acr@Tboil{Kookpt}%
+% for 'Electron Distribution'
+\def\pgfPT@user@acr@eDist{ev}%
+% for 'Electronic Configuration'
+\def\pgfPT@user@acr@eConfign{ec}%
+% for 'Lattice Structure'
+\def\pgfPT@user@acr@ls{rs}%
+% for 'Lattice constant: a'
+\def\pgfPT@user@acr@lsa{rs a}%
+% for 'Lattice constant: b'
+\def\pgfPT@user@acr@lsb{rs b}%
+% for 'Lattice constant: c'
+\def\pgfPT@user@acr@lsc{rs c}%
+% for 'Lattice c/a ratio'
+\def\pgfPT@user@acr@lsca{rs ca}%
+% for 'Year of Discovery'
+\def\pgfPT@user@acr@DiscY{jo}%
+% for 'Country of Discovery'
+\def\pgfPT@user@acr@DiscC{lo}%
+% for 'Emission Spectrum'
+\def\pgfPT@user@acr@spectra{es}%
+% ----------------------------
+% blocks
+\def\pgfPT@user@labels@blocos{s-blok}%
+\def\pgfPT@user@labels@blocop{p-blok}%
+\def\pgfPT@user@labels@blocod{d-blok}%
+\def\pgfPT@user@labels@blocof{f-blok}%
+% ----------------------------
+\def\pgfPT@user@labels@blocor{REPRESENTATIEVE ELEMENTEN}%
+\def\pgfPT@user@labels@blocot{TRANSITIEMETALEN}%
+\def\pgfPT@user@labels@blocoi{INWENDIGE TRANSITIEMETALEN}%
+% ----------------------------
+% periodic variations
+\def\pgfPT@user@labels@Raum{De atoomstraal neemt toe binnen de groep}%
+\def\pgfPT@user@labels@Rdim{De atoomstraal neemt af binnen de periode}%
+\def\pgfPT@user@labels@Eiaum{De ionisatie-energie neemt toe binnen de periode}%
+\def\pgfPT@user@labels@Eidim{De ionisatie-energie neemt af binnen de groep}%
+\def\pgfPT@user@labels@eaffaum{De elektronenaffiniteit neemt toe binnen de periode}%
+\def\pgfPT@user@labels@eaffdim{De elektronenaffiniteit neemt af binnen de groep}%
+% ----------------------------
+% lattice structure:
+\def\pgfPT@user@labels@ls@bcc{kubisch I-gecenterd}%
+\def\pgfPT@user@labels@ls@bcort{orthorhombisch C-gecenterd}%
+\def\pgfPT@user@labels@ls@ctetr{tetragonaal I-gecenterd}%
+\def\pgfPT@user@labels@ls@dia{diamant}%
+\def\pgfPT@user@labels@ls@fcc{kubisch F-gecenterd}%
+\def\pgfPT@user@labels@ls@fcort{orthorombisch F-gecenterd}%
+\def\pgfPT@user@labels@ls@hcp{hexagonale dichtste bolstapeling}%
+\def\pgfPT@user@labels@ls@hex{hexagonaal}%
+\def\pgfPT@user@labels@ls@mono{monoklien}%
+\def\pgfPT@user@labels@ls@rho{rhombo\"{e}drisch}%
+\def\pgfPT@user@labels@ls@sc{kubisch primitief}%
+\def\pgfPT@user@labels@ls@tric{triklien}%
+\def\pgfPT@user@labels@ls@tetr{tetragonaal}%
+% ----------------------------
+% element names
+\def\pgfPT@user@CSname@H{waterstof}%
+\def\pgfPT@user@CSname@He{helium}%
+\def\pgfPT@user@CSname@Li{lithium}%
+\def\pgfPT@user@CSname@Be{beryllium}%
+\def\pgfPT@user@CSname@B{boor}%
+\def\pgfPT@user@CSname@C{koolstof}%
+\def\pgfPT@user@CSname@N{stikstof}%
+\def\pgfPT@user@CSname@O{zuurstof}%
+\def\pgfPT@user@CSname@F{fluor}%
+\def\pgfPT@user@CSname@Ne{neon}%
+\def\pgfPT@user@CSname@Na{natrium}%
+\def\pgfPT@user@CSname@Mg{magnesium}%
+\def\pgfPT@user@CSname@Al{aluminium}%
+\def\pgfPT@user@CSname@Si{silicium}%
+\def\pgfPT@user@CSname@P{fosfor}%
+\def\pgfPT@user@CSname@S{zwavel}%
+\def\pgfPT@user@CSname@Cl{chloor}%
+\def\pgfPT@user@CSname@Ar{argon}%
+\def\pgfPT@user@CSname@K{kalium}%
+\def\pgfPT@user@CSname@Ca{calcium}%
+\def\pgfPT@user@CSname@Sc{scandium}%
+\def\pgfPT@user@CSname@Ti{titanium}%
+\def\pgfPT@user@CSname@V{vanadium}%
+\def\pgfPT@user@CSname@Cr{chroom}%
+\def\pgfPT@user@CSname@Mn{mangaan}%
+\def\pgfPT@user@CSname@Fe{ijzer}%
+\def\pgfPT@user@CSname@Co{kobalt}%
+\def\pgfPT@user@CSname@Ni{nikkel}%
+\def\pgfPT@user@CSname@Cu{koper}%
+\def\pgfPT@user@CSname@Zn{zink}%
+\def\pgfPT@user@CSname@Ga{gallium}%
+\def\pgfPT@user@CSname@Ge{germanium}%
+\def\pgfPT@user@CSname@As{arseen}%
+\def\pgfPT@user@CSname@Se{seleen}%
+\def\pgfPT@user@CSname@Br{broom}%
+\def\pgfPT@user@CSname@Kr{krypton}%
+\def\pgfPT@user@CSname@Rb{rubidium}%
+\def\pgfPT@user@CSname@Sr{strontium}%
+\def\pgfPT@user@CSname@Y{yttrium}%
+\def\pgfPT@user@CSname@Zr{zirkonium}%
+\def\pgfPT@user@CSname@Nb{niobium}%
+\def\pgfPT@user@CSname@Mo{molybdeen}%
+\def\pgfPT@user@CSname@Tc{technetium}%
+\def\pgfPT@user@CSname@Ru{ruthenium}%
+\def\pgfPT@user@CSname@Rh{rhodium}%
+\def\pgfPT@user@CSname@Pd{palladium}%
+\def\pgfPT@user@CSname@Ag{zilver}%
+\def\pgfPT@user@CSname@Cd{cadmium}%
+\def\pgfPT@user@CSname@In{indium}%
+\def\pgfPT@user@CSname@Sn{tin}%
+\def\pgfPT@user@CSname@Sb{antimoon}%
+\def\pgfPT@user@CSname@Te{telluur}%
+\def\pgfPT@user@CSname@I{jood}%
+\def\pgfPT@user@CSname@Xe{xenon}%
+\def\pgfPT@user@CSname@Cs{cesium}%
+\def\pgfPT@user@CSname@Ba{barium}%
+\def\pgfPT@user@CSname@La{lanthaan}%
+\def\pgfPT@user@CSname@Ce{cerium}%
+\def\pgfPT@user@CSname@Pr{praseodymium}%
+\def\pgfPT@user@CSname@Nd{neodymium}%
+\def\pgfPT@user@CSname@Pm{promethium}%
+\def\pgfPT@user@CSname@Sm{samarium}%
+\def\pgfPT@user@CSname@Eu{europium}%
+\def\pgfPT@user@CSname@Gd{gadolinium}%
+\def\pgfPT@user@CSname@Tb{terbium}%
+\def\pgfPT@user@CSname@Dy{dysprosium}%
+\def\pgfPT@user@CSname@Ho{holmium}%
+\def\pgfPT@user@CSname@Er{erbium}%
+\def\pgfPT@user@CSname@Tm{thulium}%
+\def\pgfPT@user@CSname@Yb{ytterbium}%
+\def\pgfPT@user@CSname@Lu{lutetium}%
+\def\pgfPT@user@CSname@Hf{hafnium}%
+\def\pgfPT@user@CSname@Ta{tantaal}%
+\def\pgfPT@user@CSname@W{wolfraam}%
+\def\pgfPT@user@CSname@Re{renium}%
+\def\pgfPT@user@CSname@Os{osmium}%
+\def\pgfPT@user@CSname@Ir{iridium}%
+\def\pgfPT@user@CSname@Pt{platina}%
+\def\pgfPT@user@CSname@Au{goud}%
+\def\pgfPT@user@CSname@Hg{kwik}%
+\def\pgfPT@user@CSname@Tl{thallium}%
+\def\pgfPT@user@CSname@Pb{lood}%
+\def\pgfPT@user@CSname@Bi{bismut}%
+\def\pgfPT@user@CSname@Po{polonium}%
+\def\pgfPT@user@CSname@At{astaat}%
+\def\pgfPT@user@CSname@Rn{radon}%
+\def\pgfPT@user@CSname@Fr{francium}%
+\def\pgfPT@user@CSname@Ra{radium}%
+\def\pgfPT@user@CSname@Ac{actinium}%
+\def\pgfPT@user@CSname@Th{thorium}%
+\def\pgfPT@user@CSname@Pa{protactinium}%
+\def\pgfPT@user@CSname@U{uranium}%
+\def\pgfPT@user@CSname@Np{neptunium}%
+\def\pgfPT@user@CSname@Pu{plutonium}%
+\def\pgfPT@user@CSname@Am{americium}%
+\def\pgfPT@user@CSname@Cm{curium}%
+\def\pgfPT@user@CSname@Bk{berkelium}%
+\def\pgfPT@user@CSname@Cf{californium}%
+\def\pgfPT@user@CSname@Es{einsteinium}%
+\def\pgfPT@user@CSname@Fm{fermium}%
+\def\pgfPT@user@CSname@Md{mendelevium}%
+\def\pgfPT@user@CSname@No{nobelium}%
+\def\pgfPT@user@CSname@Lr{lawrencium}%
+\def\pgfPT@user@CSname@Rf{rutherfordium}%
+\def\pgfPT@user@CSname@Db{dubnium}%
+\def\pgfPT@user@CSname@Sg{seaborgium}%
+\def\pgfPT@user@CSname@Bh{bohrium}%
+\def\pgfPT@user@CSname@Hs{hassium}%
+\def\pgfPT@user@CSname@Mt{meitnerium}%
+\def\pgfPT@user@CSname@Ds{darmstadtium}%
+\def\pgfPT@user@CSname@Rg{r\"{o}ntgenium}%
+\def\pgfPT@user@CSname@Cn{copernicium}%
+\def\pgfPT@user@CSname@Nh{nihonium}%
+\def\pgfPT@user@CSname@Fl{flerovium}%
+\def\pgfPT@user@CSname@Mc{moscovium}%
+\def\pgfPT@user@CSname@Lv{livermorium}%
+\def\pgfPT@user@CSname@Ts{tennessine}%
+\def\pgfPT@user@CSname@Og{oganesson}%
+% ----------------------------
+% Country (or Region) names
+\def\pgfPT@user@country@AM{Klein-Azi\"{e}}%
+\def\pgfPT@user@country@au{Oostenrijk}%
+\def\pgfPT@user@country@dn{Denemarken}%
+\def\pgfPT@user@country@eg{Egypte}%
+\def\pgfPT@user@country@fl{Finland}%
+\def\pgfPT@user@country@fr{Frankrijk}%
+\def\pgfPT@user@country@de{Duitsland}%
+\def\pgfPT@user@country@it{Itali\"{e}}%
+\def\pgfPT@user@country@ME{Midden-Oosten}%
+\def\pgfPT@user@country@pe{Peru}%
+\def\pgfPT@user@country@ro{Roemeni\"{e}}%
+\def\pgfPT@user@country@ru{Rusland}%
+\def\pgfPT@user@country@es{Spanje}%
+\def\pgfPT@user@country@sw{Zweden}%
+\def\pgfPT@user@country@ch{Zwitserland}%
+\def\pgfPT@user@country@uk{Verenigd Koninkrijk}%
+\def\pgfPT@user@country@us{Verenigde Staten}%
+\def\pgfPT@user@country@mx{Mexico}%
+\endinput%
diff --git a/graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex b/graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex
new file mode 100644
index 0000000000..ce93b70612
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex
@@ -0,0 +1,268 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% --------------------------------------------------------------------------------------------------
+% subfile of pgf-PeriodicTable package ----------------------------------------------------------
+% --------------------------------------------------------------------------------------------------
+%
+% Translation file for user undefined
+% Author: Hugo Gomes @2024/02/10
+% Dummy language file to make empty user definitions
+% --------------------------------------------------------------------------------------------------
+% This is file lang.undefined.tex
+% Version: 1
+% Revision: 0
+% Date: 2024/02/10
+% Provides translation of data used
+% in pgf-PeriodicTable files
+% Language: undefined
+% ----------------------------
+\def\pgfPT@user@labels@titulo{}%
+% ----------------------------
+\def\pgfPT@user@labels@La{}%
+\def\pgfPT@user@labels@Ac{}%
+% ----------------------------
+\def\pgfPT@user@labels@solido{}%
+\def\pgfPT@user@labels@liquido{}%
+\def\pgfPT@user@labels@gasoso{}%
+\def\pgfPT@user@labels@sintetico{}%
+% ----------------------------
+% labels for legend
+\def\pgfPT@user@labels@Z{}%
+\def\pgfPT@user@labels@name{}%
+\def\pgfPT@user@labels@CS{}%
+\def\pgfPT@user@labels@Ar@m{}%
+\def\pgfPT@user@labels@Arstar@m{}%
+\def\pgfPT@user@labels@Ar@w{}%
+\def\pgfPT@user@labels@Arstar@w{}%
+\def\pgfPT@user@labels@radio{}%
+\def\pgfPT@user@labels@R{}%
+\def\pgfPT@user@labels@Rcov{}%
+\def\pgfPT@user@labels@Rion{}%
+\def\pgfPT@user@labels@Ei{}%
+\def\pgfPT@user@labels@eneg{}%
+\def\pgfPT@user@labels@eaff{}%
+\def\pgfPT@user@labels@O{}%
+\def\pgfPT@user@labels@Tmelt{}%
+\def\pgfPT@user@labels@TmeltC{}%
+\def\pgfPT@user@labels@Tboil{}%
+\def\pgfPT@user@labels@TboilC{}%
+\def\pgfPT@user@labels@eDist{}%
+\def\pgfPT@user@labels@eConfig{}%
+\def\pgfPT@user@labels@d{}%
+\def\pgfPT@user@labels@Cp{}%
+\def\pgfPT@user@labels@kT{}%
+\def\pgfPT@user@labels@ls{}%
+\def\pgfPT@user@labels@lsa{}%
+\def\pgfPT@user@labels@lsb{}%
+\def\pgfPT@user@labels@lsc{}%
+\def\pgfPT@user@labels@lsca{}%
+\def\pgfPT@user@labels@DiscY{}%
+% Before Christ acronym:
+\def\pgfPT@user@labels@BC{}%
+\def\pgfPT@user@labels@DiscC{}%
+\def\pgfPT@user@labels@spectra{}%
+% ----------------------------
+% acronym to use in legend
+% for 'Name'
+\def\pgfPT@user@acr@name{}%
+% for 'Chemical Symbol'
+\def\pgfPT@user@acr@CS{}%
+% for 'Radioactive'
+\def\pgfPT@user@acr@radio{}%
+% for 'Melting Point'
+\def\pgfPT@user@acr@Tmelt{}%
+% for 'Boiling Point'
+\def\pgfPT@user@acr@Tboil{}%
+% for 'Electron Distribution'
+\def\pgfPT@user@acr@eDist{}%
+% for 'Electronic Configuration'
+\def\pgfPT@user@acr@eConfign{}%
+% for 'Lattice Structure'
+\def\pgfPT@user@acr@ls{}%
+% for 'Lattice constant: a'
+\def\pgfPT@user@acr@lsa{}%
+% for 'Lattice constant: b'
+\def\pgfPT@user@acr@lsb{}%
+% for 'Lattice constant: c'
+\def\pgfPT@user@acr@lsc{}%
+% for 'Lattice c/a ratio'
+\def\pgfPT@user@acr@lsca{}%
+% for 'Year of Discovery'
+\def\pgfPT@user@acr@DiscY{}%
+% for 'Country of Discovery'
+\def\pgfPT@user@acr@DiscC{}%
+% for 'Emission Spectrum'
+\def\pgfPT@user@acr@spectra{}%
+% ----------------------------
+% blocks
+\def\pgfPT@user@labels@blocos{}%
+\def\pgfPT@user@labels@blocop{}%
+\def\pgfPT@user@labels@blocod{}%
+\def\pgfPT@user@labels@blocof{}%
+% ----------------------------
+\def\pgfPT@user@labels@blocor{}%
+\def\pgfPT@user@labels@blocot{}%
+\def\pgfPT@user@labels@blocoi{}%
+% ----------------------------
+% periodic variations
+\def\pgfPT@user@labels@Raum{}%
+\def\pgfPT@user@labels@Rdim{}%
+\def\pgfPT@user@labels@Eiaum{}%
+\def\pgfPT@user@labels@Eidim{}%
+\def\pgfPT@user@labels@eaffaum{}%
+\def\pgfPT@user@labels@eaffdim{}%
+% ----------------------------
+% lattice structure:
+\def\pgfPT@user@labels@ls@bcc{}%
+\def\pgfPT@user@labels@ls@bcort{}%
+\def\pgfPT@user@labels@ls@ctetr{}%
+\def\pgfPT@user@labels@ls@dia{}%
+\def\pgfPT@user@labels@ls@fcc{}%
+\def\pgfPT@user@labels@ls@fcort{}%
+\def\pgfPT@user@labels@ls@hcp{}%
+\def\pgfPT@user@labels@ls@hex{}%
+\def\pgfPT@user@labels@ls@mono{}%
+\def\pgfPT@user@labels@ls@rho{}%
+\def\pgfPT@user@labels@ls@sc{}%
+\def\pgfPT@user@labels@ls@tric{}%
+\def\pgfPT@user@labels@ls@tetr{}%
+% ----------------------------
+% element names
+\def\pgfPT@user@CSname@H{Hugo}%
+\def\pgfPT@user@CSname@He{Gomes}%
+\def\pgfPT@user@CSname@Li{}%
+\def\pgfPT@user@CSname@Be{}%
+\def\pgfPT@user@CSname@B{}%
+\def\pgfPT@user@CSname@C{}%
+\def\pgfPT@user@CSname@N{}%
+\def\pgfPT@user@CSname@O{}%
+\def\pgfPT@user@CSname@F{}%
+\def\pgfPT@user@CSname@Ne{}%
+\def\pgfPT@user@CSname@Na{}%
+\def\pgfPT@user@CSname@Mg{}%
+\def\pgfPT@user@CSname@Al{}%
+\def\pgfPT@user@CSname@Si{}%
+\def\pgfPT@user@CSname@P{}%
+\def\pgfPT@user@CSname@S{}%
+\def\pgfPT@user@CSname@Cl{}%
+\def\pgfPT@user@CSname@Ar{}%
+\def\pgfPT@user@CSname@K{}%
+\def\pgfPT@user@CSname@Ca{}%
+\def\pgfPT@user@CSname@Sc{}%
+\def\pgfPT@user@CSname@Ti{}%
+\def\pgfPT@user@CSname@V{}%
+\def\pgfPT@user@CSname@Cr{}%
+\def\pgfPT@user@CSname@Mn{}%
+\def\pgfPT@user@CSname@Fe{}%
+\def\pgfPT@user@CSname@Co{}%
+\def\pgfPT@user@CSname@Ni{}%
+\def\pgfPT@user@CSname@Cu{}%
+\def\pgfPT@user@CSname@Zn{}%
+\def\pgfPT@user@CSname@Ga{}%
+\def\pgfPT@user@CSname@Ge{}%
+\def\pgfPT@user@CSname@As{}%
+\def\pgfPT@user@CSname@Se{}%
+\def\pgfPT@user@CSname@Br{}%
+\def\pgfPT@user@CSname@Kr{}%
+\def\pgfPT@user@CSname@Rb{}%
+\def\pgfPT@user@CSname@Sr{}%
+\def\pgfPT@user@CSname@Y{}%
+\def\pgfPT@user@CSname@Zr{}%
+\def\pgfPT@user@CSname@Nb{}%
+\def\pgfPT@user@CSname@Mo{}%
+\def\pgfPT@user@CSname@Tc{}%
+\def\pgfPT@user@CSname@Ru{}%
+\def\pgfPT@user@CSname@Rh{}%
+\def\pgfPT@user@CSname@Pd{}%
+\def\pgfPT@user@CSname@Ag{}%
+\def\pgfPT@user@CSname@Cd{}%
+\def\pgfPT@user@CSname@In{}%
+\def\pgfPT@user@CSname@Sn{}%
+\def\pgfPT@user@CSname@Sb{}%
+\def\pgfPT@user@CSname@Te{}%
+\def\pgfPT@user@CSname@I{}%
+\def\pgfPT@user@CSname@Xe{}%
+\def\pgfPT@user@CSname@Cs{}%
+\def\pgfPT@user@CSname@Ba{}%
+\def\pgfPT@user@CSname@La{}%
+\def\pgfPT@user@CSname@Ce{}%
+\def\pgfPT@user@CSname@Pr{}%
+\def\pgfPT@user@CSname@Nd{}%
+\def\pgfPT@user@CSname@Pm{}%
+\def\pgfPT@user@CSname@Sm{}%
+\def\pgfPT@user@CSname@Eu{}%
+\def\pgfPT@user@CSname@Gd{}%
+\def\pgfPT@user@CSname@Tb{}%
+\def\pgfPT@user@CSname@Dy{}%
+\def\pgfPT@user@CSname@Ho{}%
+\def\pgfPT@user@CSname@Er{}%
+\def\pgfPT@user@CSname@Tm{}%
+\def\pgfPT@user@CSname@Yb{}%
+\def\pgfPT@user@CSname@Lu{}%
+\def\pgfPT@user@CSname@Hf{}%
+\def\pgfPT@user@CSname@Ta{}%
+\def\pgfPT@user@CSname@W{}%
+\def\pgfPT@user@CSname@Re{}%
+\def\pgfPT@user@CSname@Os{}%
+\def\pgfPT@user@CSname@Ir{}%
+\def\pgfPT@user@CSname@Pt{}%
+\def\pgfPT@user@CSname@Au{}%
+\def\pgfPT@user@CSname@Hg{}%
+\def\pgfPT@user@CSname@Tl{}%
+\def\pgfPT@user@CSname@Pb{}%
+\def\pgfPT@user@CSname@Bi{}%
+\def\pgfPT@user@CSname@Po{}%
+\def\pgfPT@user@CSname@At{}%
+\def\pgfPT@user@CSname@Rn{}%
+\def\pgfPT@user@CSname@Fr{}%
+\def\pgfPT@user@CSname@Ra{}%
+\def\pgfPT@user@CSname@Ac{}%
+\def\pgfPT@user@CSname@Th{}%
+\def\pgfPT@user@CSname@Pa{}%
+\def\pgfPT@user@CSname@U{}%
+\def\pgfPT@user@CSname@Np{}%
+\def\pgfPT@user@CSname@Pu{}%
+\def\pgfPT@user@CSname@Am{}%
+\def\pgfPT@user@CSname@Cm{}%
+\def\pgfPT@user@CSname@Bk{}%
+\def\pgfPT@user@CSname@Cf{}%
+\def\pgfPT@user@CSname@Es{}%
+\def\pgfPT@user@CSname@Fm{}%
+\def\pgfPT@user@CSname@Md{}%
+\def\pgfPT@user@CSname@No{}%
+\def\pgfPT@user@CSname@Lr{}%
+\def\pgfPT@user@CSname@Rf{}%
+\def\pgfPT@user@CSname@Db{}%
+\def\pgfPT@user@CSname@Sg{}%
+\def\pgfPT@user@CSname@Bh{}%
+\def\pgfPT@user@CSname@Hs{}%
+\def\pgfPT@user@CSname@Mt{}%
+\def\pgfPT@user@CSname@Ds{}%
+\def\pgfPT@user@CSname@Rg{}%
+\def\pgfPT@user@CSname@Cn{}%
+\def\pgfPT@user@CSname@Nh{}%
+\def\pgfPT@user@CSname@Fl{}%
+\def\pgfPT@user@CSname@Mc{}%
+\def\pgfPT@user@CSname@Lv{}%
+\def\pgfPT@user@CSname@Ts{}%
+\def\pgfPT@user@CSname@Og{}%
+% ----------------------------
+% Country (or Region) names
+\def\pgfPT@user@country@AM{}%
+\def\pgfPT@user@country@au{}%
+\def\pgfPT@user@country@dn{}%
+\def\pgfPT@user@country@eg{}%
+\def\pgfPT@user@country@fl{}%
+\def\pgfPT@user@country@fr{}%
+\def\pgfPT@user@country@de{}%
+\def\pgfPT@user@country@it{}%
+\def\pgfPT@user@country@ME{}%
+\def\pgfPT@user@country@pe{}%
+\def\pgfPT@user@country@ro{}%
+\def\pgfPT@user@country@ru{}%
+\def\pgfPT@user@country@es{}%
+\def\pgfPT@user@country@sw{}%
+\def\pgfPT@user@country@ch{}%
+\def\pgfPT@user@country@uk{}%
+\def\pgfPT@user@country@us{}%
+\def\pgfPT@user@country@mx{}%
+\endinput%
diff --git a/macros/generic/lt3luabridge/docstrip.cfg b/macros/generic/lt3luabridge/docstrip.cfg
index 4e131f1849..e562506f72 100644
--- a/macros/generic/lt3luabridge/docstrip.cfg
+++ b/macros/generic/lt3luabridge/docstrip.cfg
@@ -1,6 +1,6 @@
\preamble
-Copyright (C) 2016-2022 Vít Novotný
+Copyright (C) 2016-2024 Vít Novotný
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/macros/generic/lt3luabridge/lt3luabridge.dtx b/macros/generic/lt3luabridge/lt3luabridge.dtx
index 3b9c483ba8..67cc73c738 100644
--- a/macros/generic/lt3luabridge/lt3luabridge.dtx
+++ b/macros/generic/lt3luabridge/lt3luabridge.dtx
@@ -39,7 +39,7 @@
% }
%
% \author{^^A
-% Vít Novotný\thanks
+% Vít Starý Novotný\thanks
% {^^A
% E-mail:
% \href{mailto:witiko@mail.muni.cz}
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Released 2022-10-24}
+% \date{Released 2024-02-14}
%
% \maketitle
%
@@ -108,6 +108,14 @@
% the \cs{luabridge_now:e} function.
% \end{function}
%
+% \begin{function}[added = 2024-02-14]{\luabridge_tl_set:Nn}
+% \begin{syntax}
+% \cs{luabridge_tl_set:Nn} \meta{tl var} \Arg{token list}
+% \end{syntax}
+% Like \cs{lua_now:n} but the result of executing the Lua code is stored in
+% \meta{tl var} instead of being inserted into \TeX's input stream.
+% \end{function}
+%
% \section{Setting and getting the method to execute \Lua{} code}
%
% There are several methods that can be used to execute \Lua{} code. This
@@ -286,7 +294,7 @@
\c_luabridge_default_error_output_filename_str
}
\cs_new:Nn
- \luabridge_now:n
+ \luabridge_tl_set:Nn
{
\iow_open:NV
\g_tmpa_iow
@@ -304,7 +312,7 @@
% \begin{macrocode}
\tl_set:Nx
\l_tmpa_tl
- { \tl_to_str:n { #1 } }
+ { \tl_to_str:n { #2 } }
\regex_replace_all:nnN
{ [\\"] }
{ \\\0 }
@@ -355,9 +363,8 @@
\g_luabridge_helper_script_filename_str
}
{ }
- \l_tmpa_tl
+ #1
{
- \l_tmpa_tl
}
{
\msg_error:nn
@@ -420,11 +427,11 @@
{ \c_luabridge_method_directlua_int }
{
\cs_new:Nn
- \luabridge_now:n
+ \luabridge_tl_set:Nn
{
\tl_set:Nn
\l_tmpa_tl
- { #1 }
+ { #2 }
\tl_set:Nx
\l_tmpa_tl
{
@@ -442,13 +449,26 @@
end~
\exp_not:V \l_tmpa_tl
}
- \lua_now:V
- \l_tmpa_tl
+ \tl_set:Nf
+ #1
+ {
+ \lua_now:V
+ \l_tmpa_tl
+ }
}
\cs_generate_variant:Nn
\lua_now:n
{ V }
}
+\cs_new:Nn
+ \luabridge_now:n
+ {
+ \luabridge_tl_set:Nn
+ \l_tmpb_tl
+ { #1 }
+ \tl_use:N
+ \l_tmpb_tl
+ }
\cs_new_protected:Npn
\luabridgeExecute
#1
@@ -472,8 +492,8 @@
\RequirePackage{expl3}
\ProvidesExplPackage
{lt3luabridge}%
- {2022-10-24}%
- {2.0.2}%
+ {2024-02-14}%
+ {2.1.0}%
{An expl3 package that allows you to execute Lua code in LuaTeX or any other
TeX engine that exposes the shell}
\input lt3luabridge\relax
diff --git a/macros/generic/lt3luabridge/lt3luabridge.pdf b/macros/generic/lt3luabridge/lt3luabridge.pdf
index 79d59210e7..2972fad79f 100644
--- a/macros/generic/lt3luabridge/lt3luabridge.pdf
+++ b/macros/generic/lt3luabridge/lt3luabridge.pdf
Binary files differ
diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md
index fcfee6ef01..ed14347e98 100644
--- a/macros/latex-dev/base/README.md
+++ b/macros/latex-dev/base/README.md
@@ -1,7 +1,7 @@
The LaTeX kernel
================
-Release 2024-06-01 pre-release 0
+Release 2024-06-01 pre-release 1
Overview
--------
diff --git a/macros/latex-dev/base/alltt.dtx b/macros/latex-dev/base/alltt.dtx
index 548b91bcea..4718c004b4 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -40,7 +40,7 @@
%<package>\ProvidesPackage{alltt}
%<driver>\ProvidesFile{alltt.drv}
%\ProvidesFile{alltt.dtx}
- [2021/01/29 v2.0g defines alltt environment]
+ [2024/02/08 v2.0g defines alltt environment]
%
%<*driver>
\documentclass{ltxdoc}
@@ -97,7 +97,7 @@
% \end{itemize}
%
% \textbf{NB} When you are using \textsf{OT1} encoded fonts you might
-% be surprsied when you switch to italics, becuase those fonts have
+% be surprised when you switch to italics, because those fonts have
% a different set of glyphs:
% \begin{alltt}
% The glyph at the position of the $ in a slanted font: \textsl{$}.
diff --git a/macros/latex-dev/base/alltt.ins b/macros/latex-dev/base/alltt.ins
index 3f40ddc0f0..6d702c1cc7 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 074d5b4de9..54c606fcf2 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 16a9f23b96..2456f57219 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 e0f76b74fb..9b750593c4 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/changes.txt b/macros/latex-dev/base/changes.txt
index 812143d3e3..dec230e890 100644
--- a/macros/latex-dev/base/changes.txt
+++ b/macros/latex-dev/base/changes.txt
@@ -1,22 +1,133 @@
-================================================================================
-This file lists changes to the LaTeX2e files in reverse chronological order
-of publication (therefore the dates might be out of sequence if there are
-hotfixes). It is provided for convenience only. It therefore makes no claims
-to completeness or accuracy and it contains some references to files that are
-not part of the distribution.
-================================================================================
+================================================================================
+This file lists changes to the LaTeX2e files in reverse chronological order
+of publication (therefore the dates might be out of sequence if there are
+hotfixes). It is provided for convenience only. It therefore makes no claims
+to completeness or accuracy and it contains some references to files that are
+not part of the distribution.
+================================================================================
+
+2024-01-30 David Carlisle <David.Carlisle@latex-project.org>
+ * ltclass.dtx: check that \RequirePackage, \documentclass, \usepackage
+ and related commands are at top level (gh/1185)
+
+2023-11-12 Joseph Wright <Joseph.Wright@latex-project.org>
+ * lttemplates.dtx
+ New file to replace loading xtemplate
+
+2024-01-30 Jérôme Laurens <jerome.laurens@u-bourgogn.fr>
+ * lthooks.dtx:
+ Fix rollback to 2020-10-01.
+
+2024-01-29 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmarks.dtx:
+ Generalized the support for extracting marks to cover cases like multicols.
+
+ Some internal commands renamed and extended.
+ Renamed \__mark_update_structure:nn to \__mark_update_structure_from_material:nn
+ Added \__mark_get_marks_for_reinsertion:nNN
+ Added \ShowMarksAt for debugging (might not stay this way)
+
+2024-01-27 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * lttextcomp.dtx (section{Font family sub-encodings setup}):
+ Adjusted/corrected TS1 sub-encoding declarations for various families.
+ Some families have changed their names (due to licensing issues),
+ some got new glyphs added, and some were simply incorrectly categorized
+ (gh/1257)
+
+ * lttextcomp.dtx (section{The \texttt{checkencodingsubset.tex} file}):
+ Added check file for encoding subset
+
+2024-01-03 Phelype Oleinik <phelype.oleinik@latex-project.org>
+ * lthooks.dtx:
+ Correct expansion of \@@_print_args:nn argument (gh/1221).
+
+2023-12-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+ * doc.dtx (subsection{Macros surrounding the `definition parts'}):
+ Use \@noligs from the LaTeX kernel, so that the upquote
+ package can add its patch (gh/1230)
+
+2023-12-26 Yukai Chou <muzimuzhi@gmai.com>
+ * ltproperties.dtx:
+ Correct typo (gh/1223)
+ * doc.dtx, ltfntcmd.dtx, lthooks.dtx
+ Correct similar typos of missing backslashes
+ * ltfilehook.dtx
+ Change flag markup in macro env
+
+2023-12-22 Yukai Chou <muzimuzhi@gmail.com>
+ * ltcmd.dtx (subsection{Normalizing the argument specifications})
+ Clarify error message when an argument prefix `!' is applied to
+ a non-trailing optional argument. (gh/1198)
+
+2023-12-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+ * lttagging.dtx:
+ First version of lttagging module added
+
+2023-12-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltproperties.dtx: use \protected@write, (gh1200)
+
+2023-12-02 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+ * doc.dtx (subsection{API creation}):
+ Provide \ProvideDocElement for use cases where files are processed
+ individually as well as together, e.g., the LaTeX kernel documentation.
+
+2023-12-01 Joseph Wright <Joseph.Wright@latex-project.org>
+ * ltcmd.dtx (subsection{Declaring commands and environments}):
+ Optimize creation of simple document commands (gh/1189)
+ * usrguide.tex (subsection{Performance}):
+ Document efficiency of ltcmd definitions
+
+2023-11-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+ * ltpara.dtx (subsection{Providing hooks for paragraphs}):
+ Correct error message: hook left horizontal not vertical mode (gh/1182)
+
+2023-11-15 Joseph Wright <Joseph.Wright@latex-project.org>
+ * ltfiles.dtx (subsection{Listing files}):
+ Extend \listfiles to optionally include file sizes and hashes
+ * usrguide.tex
+ Re-introduce \listfiles (extended) description
+
+2023-11-09 Yukai Chou <muzimuzhi@gmail.com>
+ * clsguide-historic.tex, usrguide.tex:
+ Replace quotation with quote envs for zero para indent
+
+ * clsguide-historic.tex, usrguide-historic.tex
+ Mention correct source file names in license footnotes
+
+2023-11-07 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+ * ltoutenc.dtx (subsection{The fontenc package}):
+ Add more explanation to error message about missing encoding (gh/1102)
+
+ * nfssfont.dtx (section{The code}):
+ Corrected spelling in error message.
+
+ * ltcounts.dtx (subsection{Environment Counter Macros}):
+ In \newcounter do not change \the... if already defined (gh/823)
+
+ * ltplain.dtx (section{Plain \TeX}):
+ Set \tracinglostchars to 2 in \tracingnone (gh/549)
================================================================================
All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2023-11-01 PL1 Release
+#########################
+
+2024-01-13 Jonathan P. Spratte <jspratte@yahoo.de>
+ * ltkeys.dtx:
+ Trim spaces off key names taken from the raw-lists (gh1238)
+
+#########################
# 2023-11-01 Release
#########################
-2023-10-15 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
- * ltproperties.dtx:
- Add support for pagetarget property.
+2023-10-15 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * ltproperties.dtx:
+ Add support for pagetarget property.
2023-10-26 David Carlisle <David.Carlisle@latex-project.org>
* ltboxes.dtx:
@@ -48,9 +159,9 @@ All changes above are only part of the development branch for the next release.
Explain the steps carried out by the replacement algorithm for @@.
2023-09-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
- * ltproperties.dtx:
+ * ltproperties.dtx:
Use \protected@edef for expansion in the LaTeX2e commands.
-
+
2023-09-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
* ltproperties.dtx:
Expand consistently the label/property names in the LaTeX2e commands.
@@ -135,7 +246,7 @@ All changes above are only part of the development branch for the next release.
* ltfiles.dtx
Allow for pipes in \input, etc.
-2023-06-16 Phelype Oleinik <Joseph.Wright@latex-project.org>
+2023-06-16 Phelype Oleinik <phelype.oleinik@latex-project.org>
* lthooks.dtx, ltcmdhooks.dtx
Correct some rollback labels and dates.
diff --git a/macros/latex-dev/base/classes.dtx b/macros/latex-dev/base/classes.dtx
index 58690e8375..f7c53f0f71 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -53,7 +53,7 @@
%<*driver>
\ProvidesFile{classes.drv}
%</driver>
- [2023/05/17 v1.4n
+ [2024/02/08 v1.4n
%<article|report|book> Standard LaTeX document class]
%<10pt|11pt|12pt> Standard LaTeX file (size option)]
% \end{macrocode}
@@ -1882,7 +1882,7 @@
% \changes{v1.3a}{1995/05/17}{Use \cs{@makefnmark} in definition of
% \cs{@makefntext}}
% \changes{v1.3g}{1995/06/26}{Fix definition of \cs{@makefnmark} and
-% \cs{@makefntext} to a) work and b) without using math}
+% \cs{@makefntext} to (a) work and (b) without using math}
% \begin{macrocode}
\else
\newcommand\maketitle{\par
@@ -2002,7 +2002,7 @@
% `section'.
% \item[\meta{level}] A number, denoting the depth of the section
% -- e.g., chapter=1, section = 2, etc. A section number
-% will be printed if and only if \meta{level} $<=$ the value
+% will be printed if and only if \meta{level} $\leq$ the value
% of the \Lcount{secnumdepth} counter.
% \item[\meta{indent}] The indentation of the heading from the left
% margin
@@ -3068,7 +3068,7 @@
% list environment's parameters. The user types |\\| to end a line.
% This is implemented by |\let|'ing |\\| equal |\@centercr|.
%
-% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with
+% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with ^^A ]
% \cs{relax}}
% \begin{macrocode}
\newenvironment{verse}
@@ -3091,7 +3091,7 @@
% are set smaller than |\textwidth|. The first line of a paragraph
% inside this environment is indented.
%
-% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with
+% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with ^^A ]
% \cs{relax}}
% \begin{macrocode}
\newenvironment{quotation}
@@ -3110,7 +3110,7 @@
% The quote environment is like the quotation environment except
% that paragraphs are not indented.
%
-% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with
+% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with ^^A ]
% \cs{relax}}
% \begin{macrocode}
\newenvironment{quote}
diff --git a/macros/latex-dev/base/classes.ins b/macros/latex-dev/base/classes.ins
index 50a51ea666..7fa35896a4 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 6ba6e988b6..c45fd63ac0 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-historic.pdf b/macros/latex-dev/base/clsguide-historic.pdf
index c40cf8d8d7..89df4cf17e 100644
--- a/macros/latex-dev/base/clsguide-historic.pdf
+++ b/macros/latex-dev/base/clsguide-historic.pdf
Binary files differ
diff --git a/macros/latex-dev/base/clsguide-historic.tex b/macros/latex-dev/base/clsguide-historic.tex
index d7a27e3c40..bb5e4b5e96 100644
--- a/macros/latex-dev/base/clsguide-historic.tex
+++ b/macros/latex-dev/base/clsguide-historic.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -34,15 +34,15 @@
\title{\LaTeXe~for class and package writers --- historic version}
-\author{Copyright \copyright~1995--2006 The \LaTeX\ Project\\
+\author{Copyright \copyright~1995--2023 The \LaTeX\ Project\\
All rights reserved.%
\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.}%
+ \texttt{clsguide-historic.tex} for full details.}%
}
-\date{11 January 2023}
+\date{09 November 2023}
\begin{document}
@@ -1481,7 +1481,7 @@ problem, \LaTeX{} provides two new commands |\MakeUppercase| and
|\MakeLowercase| to do this.
For example:
-\begin{quotation}
+\begin{quote}
\begin{tabular}{rl}
|\uppercase{aBcD\ae\AA\ss\OE}| & \uppercase{aBcD\ae\AA\ss\OE}\\
|\lowercase{aBcD\ae\AA\ss\OE}| & \lowercase{aBcD\ae\AA\ss\OE}\\
@@ -1489,7 +1489,7 @@ For example:
\MakeUppercase{aBcD\ae\AA\ss\OE}\\
|\MakeLowercase{aBcD\ae\AA\ss\OE}| & \MakeLowercase{aBcD\ae\AA\ss\OE}
\end{tabular}
-\end{quotation}
+\end{quote}
The commands |\MakeUppercase| and |\MakeLowercase| themselves are
robust, but they have moving arguments.
diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf
index c8c14014da..b6146de10e 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 457f74f287..c23f0a55e9 100644
--- a/macros/latex-dev/base/clsguide.tex
+++ b/macros/latex-dev/base/clsguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2023
+% Copyright (C) 2023-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -42,7 +42,7 @@
\texttt{clsguide.tex} for full details.}%
}
-\date{2023-10-24}
+\date{2023-12-02}
\NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}}
\NewDocumentCommand\marg{m}{\arg{#1}}
@@ -891,7 +891,7 @@ unknown option on to a non-keyval class such as \pkg{article}:
The |\ProcessKeyOptions| function is used to check the current option list
against the keys defined for \m{family}. Global (class) options and local
(package) options are checked when this function is called in a package.
-The command will process \emph{all} options given the the current
+The command will process \emph{all} options given the current
package or class: there is no need to also apply \cs{ProcessOptions}.
\begin{decl}
diff --git a/macros/latex-dev/base/cmextra.ins b/macros/latex-dev/base/cmextra.ins
index 0fa45183fc..3f06c1548b 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/base/cmfonts.fdd b/macros/latex-dev/base/cmfonts.fdd
index af898e47b2..556db5be81 100644
--- a/macros/latex-dev/base/cmfonts.fdd
+++ b/macros/latex-dev/base/cmfonts.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% 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 af5ac7e5f8..fb9d08f440 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 fe88b5af3b..e417fb5389 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 5678806510..f9f6644c9a 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 394cd59e20..9a79a80e59 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/doc-code.pdf b/macros/latex-dev/base/doc-code.pdf
index 51e6dad9e8..67ab8bf64d 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.dtx b/macros/latex-dev/base/doc.dtx
index 75e04cc299..82eb8dc5b8 100644
--- a/macros/latex-dev/base/doc.dtx
+++ b/macros/latex-dev/base/doc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -45,7 +45,7 @@
%<+package>
%<+package>\ProvidesPackage{doc}
%<+shortvrb>\ProvidesPackage{shortvrb}
-%<+package|shortvrb> [2022/11/13 v3.0m
+%<+package|shortvrb> [2024/02/08 v3.0o
%<+package|shortvrb> Standard LaTeX documentation package V3 (FMi)]
%\catcode`\<=12
%
@@ -57,7 +57,7 @@
%
%
%% Package `doc' to use with LaTeX 2e
-%% Copyright (C) 1989-2022 Frank Mittelbach, all rights reserved.
+%% Copyright (C) 1989-2023 Frank Mittelbach, all rights reserved.
%
%
% Version: Date: Changes:
@@ -143,8 +143,8 @@
% \MakeShortVerb{\|}
% \setcounter{StandardModuleDepth}{1}
%
-% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print
-% \gdef\dimenvalue#1pt{$#1$pt}} ^^A a register value with a - sign
+% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print a
+% \gdef\dimenvalue#1pt{$#1$pt}} ^^A register value with a - sign
%
% \newcommand{\DOC}{\texttt{doc}\xspace}
%
@@ -167,7 +167,7 @@
%\RenewDocElement[macrolike = true ,
% toplevel = false,
% idxtype = ,
-% idxgroup = LaTeX comands\actualchar\LaTeX{} commands ,
+% idxgroup = LaTeX commands\actualchar\LaTeX{} commands ,
% printtype =
% ]{Macro}{macro}
%
@@ -237,7 +237,7 @@
% \changes{v1.9t}{1995/05/11}{Use \cs{GetFileInfo}}
% \GetFileInfo{doc.sty}
%
-% \CheckSum{0} ^^A % keep the checksum in this file but not now :-)
+% \CheckSum{0}
%
% \title{The \DOC{} and \texttt{shortvrb} Packages\thanks
% {This file has version number \fileversion{} dated \filedate{}.}}
@@ -595,7 +595,16 @@
% class file (like \texttt{ltugboat.cls}) use the |\DocstyleParms|
% command described below. Starting with release 2.0a it can now
% be changed directly as long as the redefinition happens before
-% the |\begin{document}|.
+% the |\begin{document}| (if you change it later you might see strange
+% typesetting effects if you are unlucky).
+%
+% |\MacroFont| does not alter the font of
+% |\verb| or |\verb*| because it is often used to make the font size of
+% the code displays smaller, which would look odd if used within a
+% paragraph. If you decide to use a different font family and want to
+% use the same family with
+% |\verb| you need to alter the font setup for |\ttfamily| in addition
+% to |\MacroFont|.
%
% \DescribeEnv{environment}
% For documenting the definition of environments one can use the
@@ -695,6 +704,12 @@
% |\NewDocElement{Env}{environment}|
% though that's not quite what has been done, as we will see later.
%
+% \DescribeInterfaceMacro{\ProvideDocElement}
+% This declaration does nothing when the doc element is already
+% declared, otherwise it works like \cs{NewDocElement}. It can be
+% useful if you have many documentation files that you may want to
+% process individually as well as together.
+%
% \DescribeOption[noprint]{macrolike}
% \DescribeOption[noprint]{envlike}
% \DescribeOption[noprint]{toplevel}
@@ -1367,7 +1382,7 @@
%\RenewDocElement[macrolike = true ,
% toplevel = false,
% idxtype = ,
-% idxgroup = LaTeX comands\actualchar\LaTeX{} commands ,
+% idxgroup = LaTeX commands\actualchar\LaTeX{} commands ,
% printtype =
% ]{Macro}{macro}
%\end{verbatim}
@@ -1515,7 +1530,7 @@
%
% Thirty years is a long time in the life of computer programs, so
% there are a good number of interfaces within \DOC that are really
-% only of historical interest (or when processing equally old sources.
+% only of historical interest (or when processing equally old sources).
% We list them here, but in general we suggest that for new
% documentation they should not be used.
%
@@ -2108,9 +2123,12 @@
% that is, they must be given |\catcode| $12$.
% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim,
% which handles more ligatures.}
+% \changes{v3.0o}{2023/12/30}{Use \cs{@noligs} from the \LaTeX\
+% kernel, so that the \texttt{upquote} package can
+% add its patch (gh/1230)}
% \begin{macrocode}
\obeylines
- \let\do\do@noligs \verbatim@nolig@list
+ \@noligs
\let\do\@makeother \dospecials
% \end{macrocode}
% \changes{v1.5t}{1989/11/07}{Common code added.}
@@ -2183,7 +2201,7 @@
% \changes{v1.7a}{1992/03/13}{Added \cs{reset@font} for NFSS.}
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different
-% math setup /pr1622}
+% math setup /pr1622)}
% \begin{macrocode}
\@ifundefined{MacroFont}{%
\if@compatibility
@@ -2220,7 +2238,7 @@
% \changes{v1.7m}{1992/10/11}{Use sltt as default.}
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different
-% math setup /pr1622}
+% math setup /pr1622)}
% Although most of the macro code is set in |\MacroFont| we want to be
% able to switch to indicate module code set in |\AltMacroFont|.
% |\macro@font| keeps track of which one we're using. We can't do the
@@ -2681,7 +2699,7 @@
% \end{macrocode}
%
% \changes{v2.1j}{2019/11/03}{Kernel now sets up \cs{verbvisiblespace} (gh/205)}
-% \changes{v2.1k}{2019/11/10}{Put the definition into the right command :-( (gh/205)}
+% \changes{v2.1k}{2019/11/10}{Put the definition into the right command (gh/205)}
% \begin{macrocode}
\@setupverbvisiblespace
\MacroFont \@vobeyspaces \@sxverbatim}
@@ -2895,32 +2913,32 @@
% following tasks:
% \begin{itemize}
% \parindent4em
-% \item[1)]
+% \item[(1)]
% |\catcode| all characters used in macro names to
-% 11 (i.e.\ `letter').
-% \item[2)]
+% 11 (i.e., `letter').
+% \item[(2)]
% |\catcode| the `|\|' character to 13
-% (i.e.\ `active').
-% \item[3a)]
+% (i.e., `active').
+% \item[(3a)]
% |\let| the `|\|' equal |\scan@macro|
-% (i.e.\ start the macro scanning mechanism) if there is
-% no special escape character (i.e.\ the
+% (i.e., start the macro scanning mechanism) if there is
+% no special escape character (i.e., the
% |\special@escape@char| is `|\|').
-% \item[3b)]
+% \item[(3b)]
% Otherwise |\let| it equal |\bslash|, i.e.\
% produce a printable |\|.
-% \item[4)]
+% \item[(4)]
% Make the \meta{special escape character} active.
-% \item[5)]
+% \item[(5)]
% |\let| the active version of the special escape
% character
-% (i.e.\ the expansion of |\active@escape@char|) equal
+% (i.e., the expansion of |\active@escape@char|) equal
% |\scan@macro|.
% \end{itemize}
% The reader might ask why we bother to |\catcode| the
% `|\|' first to 12 (at the end of |\macro@code|) then
% re-|\catcode| it to 13 in order to produce a $|\|_{12}$
-% in case 3b) above. This is done because we have to ensure that
+% in case (3b) above. This is done because we have to ensure that
% `|\|' has |\catcode| 13 within the \env{macrocode}
% environment. Otherwise the delimiter for the argument of
% |\xmacro@code| would not be found (parameter matching
@@ -2930,14 +2948,14 @@
% \begin{macrocode}
\begingroup \catcode`\|=\z@ \catcode`\\=\active
% \end{macrocode}
-% We carry out tasks 2) and 3b) first.
+% We carry out tasks (2) and (3b) first.
% \SpecialEscapechar\|
% \begin{macrocode}
|gdef|init@crossref{|catcode`|\|active |let\|bslash
% \end{macrocode}
% Because of the popularity of the `|@|' character as a
% `letter' in macros, we normally have to change its
-% |\catcode| here, and thus fulfill task 1). But the macro
+% |\catcode| here, and thus fulfill task (1). But the macro
% designer might use other characters as private letters as well,
% so we use a macro to do the |\catcode| switching.
% \SpecialEscapechar\|
@@ -2945,8 +2963,8 @@
|MakePrivateLetters
% \end{macrocode}
% Now we |\catcode| the special escape character to 13 and
-% |\let| it equal |\scan@macro|, i.e.\ fulfill tasks 4)
-% and 5). Note the use of |\expandafter| to insert the chosen
+% |\let| it equal |\scan@macro|, i.e., fulfill tasks (4)
+% and (5). Note the use of |\expandafter| to insert the chosen
% escape character saved in |\special@escape@char| and
% |\active@escape@char|.
% \SpecialEscapechar\|
@@ -2955,7 +2973,7 @@
|expandafter|let|active@escape@char|scan@macro}
|endgroup
% \end{macrocode}
-% If there is no special escape character, i.e.\ if
+% If there is no special escape character, i.e., if
% |\SpecialEscapechar| is |\\|, the second last line will
% overwrite the previous definition of $|\|_{13}$. In this
% way all tasks are fulfilled.
@@ -3109,9 +3127,9 @@
% done by the |\ifnot@excluded| macro which assumes that the
% macro name is saved in |\macro@namepart|. The character
% mustn't be stored with a special category code or exclusion from
-% the index won't work, so we we use \cs{string} to normalize it
-% the same way it is done in \cs{DoNotIndex}, i.e. everything ends up catcode 12
-% except for the space character.
+% the index won't work, so we use \cs{string} to normalize it
+% the same way it is done in \cs{DoNotIndex}, i.e. everything ends up
+% catcode 12 except for the space character.
% \changes{v2.0e}{1998/12/28}{Correctly use the case-changing trick.}
% \changes{v3.0l}{2022/11/03}{No longer using the case-changing trick.}
% \begin{macrocode}
@@ -3254,7 +3272,7 @@
% unnecessarily index within that part of the code. As the sequence
% is local it will revert this setting at the end of the
% environment so that the command is indexed elsewhere (unless it
-% is generally disabled from indexing.
+% is generally disabled from indexing).
%
% \DescribeMacro\g__doc_idxtype_prop
% Global property list that holds for all commands that are special
@@ -3282,7 +3300,7 @@
% \DescribeInterfaceMacro\RecordIndexType
% This command takes two arguments: a command (with escape char)
% and its type (i.e., first mandatory
-% argument of a |\NewDocElement| declaration. If |#1| should not be
+% argument of a |\NewDocElement| declaration). If |#1| should not be
% included from the index, then the data is used to record that
% this command is of this type. The information is then used to
% generate appropriate index entries. Obviously, index entries
@@ -3481,7 +3499,7 @@
% \begin{macro}{\__doc_idxtype_put:nn}
% This internal command takes two arguments: a command name as
% string (no backslash) and its type (i.e., first mandatory
-% argument of a |\NewDocElement| declaration. If |#1| is not in
+% argument of a |\NewDocElement| declaration). If |#1| is not in
% |\l__doc_donotindex_seq| it will add this data to the property
% list |\g__doc_idxtype_prop| using |#1| as key and |#2| as its
% value. If the key already exist its value will be overwritten. If
@@ -3884,7 +3902,8 @@
% \begin{imacro}{\RightBraceIndex}
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} These
% two macros fix the problems with \prg{makeindex}. Note the
-% `hack' with |\iffalse}\fi| to satisfy both \TeX{} and the
+% `hack' with \iffalse{-to get matching braces\fi |\iffalse}\fi|
+% to satisfy both \TeX{} and the
% \prg{makeindex} program. When this is written to the
% \texttt{.idx} file \TeX{} will see both braces (so we get a
% balanced text). \prg{makeindex} will also see balanced braces
@@ -5539,7 +5558,7 @@
% \begin{macrocode}
\long\def\@doc@env#1#2#3{
% \end{macrocode}
-% The |\endgroup| here closes the scanning of names (using special catcodes.
+% The |\endgroup| here closes the scanning of names (using special catcodes).
% \begin{macrocode}
\endgroup
\clist_map_inline:nn {#3} { \@doc@env@{#1}{#2}{##1} }
@@ -5565,8 +5584,8 @@
% they are technically part of the generated API, only not meant for public
% use.
%
-% \fmi{above docu is no longer right (but code needs further changes
-% anyway}
+% \fmi{above docu is no longer right (but code probably needs further changes
+% anyway)}
%
% |#1| is either \texttt{TT} (for true = macrolike) or \texttt{TF}.
% If true then we drop the first char from |\saved@macroname| and
@@ -5580,7 +5599,7 @@
% If the \DOC element described is macrolike but not a normal
% ``macro'' then its type should be recorded and this is the places
% where this happens. For macros (which should make up the bulk of
-% these items we don't do this and for anything else that looks
+% these items) we don't do this and for anything else that looks
% from an indexing perspective like a macro we don't do that either
% to keep the list of exceptions small. That would be the case if
% the indexing command |\Code|\meta{doc-element}|Index| is
@@ -5635,7 +5654,7 @@
\fi
% \end{macrocode}
% Suppress further |\index| entries when we are within a
-% \texttt{macrolike} environment. (There is no point doing that for
+% \texttt{macrolike} environment. There is no point doing that for
% non-\texttt{macrolike} environments are index entries are only
% generated for items starting with a backslash anyway.
% \fmi{fix}
@@ -5940,6 +5959,16 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\doc@ignoredinfo}
+%
+% \begin{macrocode}
+\def\doc@ignoredinfo#1#2{%
+ \PackageInfo{doc}{Doc element '#1/#2' declaration
+ ignored}%
+}
+% \end{macrocode}
+% \end{macro}
+%
%
% \begin{imacro}{\NewDocElement}
% \oarg{options}\marg{name}\marg{envname}
@@ -5963,6 +5992,30 @@
% \end{macrocode}
% \end{imacro}
%
+% \begin{imacro}{\ProvideDocElement}
+% \oarg{options}\marg{name}\marg{envname}
+% This does nothing unless the doc element could be declared with
+% \cs{NewDocElement}.
+% \begin{macrocode}
+\newcommand\ProvideDocElement[3][]{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@ifundefined{Print#2Name}%
+ {\@ifundefined{PrintDescribe#2}%
+ {\@ifundefined{#3}%
+ {\@ifundefined{end#3}%
+ {\@NewDocElement{#1}}%
+ \doc@ignoredinfo
+ }\doc@ignoredinfo
+ }\doc@ignoredinfo
+ }\doc@ignoredinfo
+ {#2}{#3}%
+}
+% \end{macrocode}
+% \end{imacro}
+%
+%
% \begin{imacro}{\RenewDocElement}
% \oarg{options}\marg{name}\marg{envname}
%
@@ -6098,7 +6151,7 @@
% \end{macrocode}
-% \begin{macro}{SpecialMainIndex}
+% \begin{macro}{\SpecialMainIndex}
%
% In \DOC v2 we had \cs{SpecialMainIndex} and
% \cs{SpecialMainEnvIndex} but now with additional \DOC elements we
@@ -6110,7 +6163,7 @@
% \end{macrocode}
% \end{macro}
-% \begin{macro}{SpecialUsageIndex}
+% \begin{macro}{\SpecialUsageIndex}
% \DOC v2 also had \cs{SpecialUsageIndex} which is now called
% \cs{SpecialMacroIndex} generating the ``usage'' index entry for
% a macro. Again we provide that as an alias via |\def|.
@@ -6206,86 +6259,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \section{Code no longer used}
-%
-% \begin{imacro}{\verb}
-% \changes{v1.7a}{1992/02/27}{Now warns about newlines (from
-% newdoc with `@noligs added).}
-% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX \cs{verb}}
-% We re-define |\verb| to check for newlines in its argument since a
-% missing delimiter is difficult to detect in \DOC{} source.
-% The code is the same as in \texttt{latex.tex} of September 19, 1993.
-% Perhaps there should be a font-changing
-% hook rather than just using |\ttfamily|, but if so it probably should be
-% different from |\MacroFont| since that normally includes |\small|
-% and would look wrong inline.
-% \changes{v1.7a}{1992/02/28}{Added math mode check (from verbatim.sty)}
-% \begin{macrocode}
-%\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi
-% \bgroup \let\do\do@noligs \verbatim@nolig@list
-% \ttfamily \verb@eol@error \let\do\@makeother \dospecials
-% \@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}}
-% \end{macrocode}
-% \end{imacro}
-%
-% \begin{macro}{\verb@balance@group}
-% \begin{macro}{\verb@egroup}
-% \begin{macro}{\verb@eol@error}
-% \changes{v1.8b}{1993/09/21}{Renamed \cs{verb@err} to
-% \cs{verb@eol@error}, as in new LaTeX verbatim.}
-% \begin{macrocode}
-%\let\verb@balance@group\@empty
-% \end{macrocode}
-%
-% \begin{macrocode}
-%\def\verb@egroup{\global\let\verb@balance@group\@empty\egroup}
-% \end{macrocode}
-%
-% \begin{macrocode}
-%\begingroup
-% \obeylines%
-% \gdef\verb@eol@error{\obeylines%
-% \def^^M{\verb@egroup\@latex@error{%
-% \noexpand\verb command ended by end of line}\@ehc}}%
-%\endgroup
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@sverb}
-% \changes{v1.7a}{1992/02/27}{Added for \cs{verb} change.}
-% \changes{v1.7a}{1992/02/28}{Now same as in verbatim.sty.}
-% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim,
-% which has better error trapping.}
-% See \cite{art:verbatim} for commentary.
-% \changes{v2.1j}{2019/11/03}{Use the kernel definition, no change needed (gh/205)}
-% \begin{macrocode}
-%\def\@sverb#1{%
-% \catcode`#1\active \lccode`\~`#1%
-% \gdef\verb@balance@group{\verb@egroup
-% \@latex@error{Illegal use of \noexpand\verb command}\@ehc}%
-% \aftergroup\verb@balance@group
-% \lowercase{\let~\verb@egroup}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\verbatim@nolig@list}
-% \begin{macro}{\do@noligs}
-% These macros replace the old |\@noligs| mechanism by an
-% extensible version to allow more ligatures to be added.
-% \begin{macrocode}
-%\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-}
-%\def\do@noligs#1{%
-% \catcode`#1\active
-% \begingroup
-% \lccode`\~`#1\relax
-% \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-
^^A Needed for emacs
^^A
diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf
index e8a184011e..1783af35f6 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 776d0e68d7..d5366b3fdd 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -31,7 +31,7 @@
\def\filename{docstrip.dtx}
\def\fileversion{v2.6b}
\def\filedate{2022-09-03}
-\def\docdate {2023-10-10}
+\def\docdate {2024-02-08}
%%
%
%\iffalse
@@ -450,7 +450,7 @@
% \DescribeMacro{\endbatchfile}
% All batch files should end with this command. Any lines after this
% in the file are ignored. In old files that start
-% |\def\batchfile{|\ldots\ this command is optional, but is a good
+% |\def\batchfile{|\ldots\ \iffalse}\fi this command is optional, but is a good
% idea anyway. If this command is omitted from a batchfile then
% normally \TeX\ will go to its interactive |*| prompt, so you may
% stop \ds{} by typing |\endbatchfile| to this prompt.
@@ -757,7 +757,7 @@
% \meta{Primary}]*\\
% \meta{Primary} & $::=$ &
% \meta{Terminal} $|$ \texttt{!}\meta{Primary}
-% $|$ \texttt{(}\meta{Expression}\texttt{)}\\
+% $|$ \texttt(\meta{Expression}\texttt)\\
% \end{tabular}
%
% The \texttt{|} stands for disjunction, the \texttt{\&} stands for
@@ -1712,7 +1712,7 @@ Z
% \end{macrocode}
%
% \begin{macro}{\quote@name}
-% \changes{v2.5h}{2020/04/18}{Macro added gfh/221)}
+% \changes{v2.5h}{2020/04/18}{Macro added (gh/221)}
% A macro copied from \texttt{ltfiles.dtx} in order to be able to
% allow spaces in filenames.
% \begin{macrocode}
@@ -1994,7 +1994,7 @@ Z
% \meta{Primary} & $::=$ &
% \meta{Terminal} $|$ \texttt{!}\meta{Primary}
% $|$
-% \texttt{(}\meta{Expression}\texttt{)}\\
+% \texttt(\meta{Expression}\texttt)\\
% \end{tabular}
%
% The \texttt{|} stands for disjunction, the \texttt{\&} stands for
@@ -2023,7 +2023,7 @@ Z
% \begin{eqnarray*}
% \tau(\meta{Terminal})&=&"\t@<Terminal>,#1,<Terminal>,\qStop"\\
% \tau(!\meta{Primary})&=&"\if1"\,\tau(\meta{Primary})\,"0\else1\fi"\\
-% \tau(\mbox{\texttt{(}\meta{Expression}\texttt{)}})
+% \tau(\mbox{\texttt(\meta{Expression}\texttt)})
% &=&\tau(\meta{Expression})\\
% \tau(\mbox{\meta{Primary}\texttt{\&}\meta{Secondary}})
% &=&"\if0"\,\tau(\meta{Primary})\,"0\else"
@@ -4473,7 +4473,7 @@ for copying and modification in the file \inFileName.
% {Macro added (DPC)}
% Process the batch file, and then terminate cleanly.
% This may be set to |\relax| for `new style' batch files that
-% do not start with |\def\batchfile{|\ldots
+% do not start with |\def\batchfile{|\ldots \iffalse}\fi
% \begin{macrocode}
\def\process@first@batchfile{%
\processbatchFile
diff --git a/macros/latex-dev/base/docstrip.ins b/macros/latex-dev/base/docstrip.ins
index 79d4c429dd..6ed99c9223 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 b87f05e2e8..55e029485c 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 15a7c3848c..53ea22f957 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 53e032c97b..3653bc1dbf 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 1a0978267e..11d968d2ea 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-2023
+% Copyright (C) 1993-2024
% 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 89890a4198..1712d18a26 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-2023
+% Copyright (C) 1993-2024
% 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 ae75460ee5..38c6aea61e 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 0c9dd72583..9fe9e195db 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 9e39cd192b..09af95dad3 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-2023
+% Copyright (C) 1993-2024
% 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 68c6792412..2023ea229c 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 eb2306a8fe..d1eaa48bd0 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 a3c42f9cc3..d6dda9e8e2 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 143956ecc4..7cf5d23981 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-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/base/fontdef.dtx b/macros/latex-dev/base/fontdef.dtx
index 5e88e55079..281add29ef 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -27,7 +27,8 @@
%
% \fi
% \iffalse
-%%% From File: fontdef.dtx
+%%% From File: fontdef.dtx
+%<*!latexrelease>
%<*dtx>
\ProvidesFile{fontdef.dtx}
%</dtx>
@@ -38,17 +39,24 @@
%<+cfgprel>\ProvidesFile{preload.cfg}
%<driver, >\ProvidesFile{fontdef.drv}
% \fi
-% \ProvidesFile{fontdef.dtx}
-%<-latexrelease> [2021/01/15 v3.0i LaTeX Kernel
-% \iftrue (\else
-%<text, >(Text
-%<math, >(Math
-%<+cfgtext>(Uncustomized text
-%<+cfgmath>(Uncustomized math
-%<+cfgprel>(Uncustomized preload
+% \ProvidesFile{fontdef.dtx}
+ [2024/02/09 v3.0i LaTeX Kernel
+% \iffalse
+%<text, > (Text font setup)
+%<math, > (Math font setup)
+%<+cfgtext> (Uncustomized text font setup)
+%<+cfgmath> (Uncustomized math font setup)
+%<+cfgprel> (Uncustomized preload font setup)
+%<*dtx>
% \fi
-%<-latexrelease> font setup)]
-%
+(font setup)
+%\iffalse
+%</dtx>
+%\fi
+]
+% \iffalse
+%</!latexrelease>
+%\fi
%
%\iffalse This is a META comment
%
diff --git a/macros/latex-dev/base/format.ins b/macros/latex-dev/base/format.ins
index ba0965004d..e20ff09438 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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-2023
+Copyright (C) 2015-2024
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-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -170,6 +170,7 @@ the system are in the document `cfgguide.tex'.
\from{lthooks.dtx}{2ekernel} % L3 layer module
\from{ltcmdhooks.dtx}{2ekernel} % L3 layer module
\from{ltsockets.dtx}{2ekernel} % L3 layer module
+ \from{lttemplates.dtx}{2ekernel} % L3 layer module
\from{ltalloc.dtx}{2ekernel}
\from{ltcntrl.dtx}{2ekernel}
\from{lterror.dtx}{2ekernel}
@@ -206,11 +207,12 @@ the system are in the document `cfgguide.tex'.
\from{ltbibl.dtx}{2ekernel}
\from{ltmarks.dtx}{trace,2ekernel} % L3 layer module
\from{ltpage.dtx}{2ekernel}
- \from{ltclass.dtx}{2ekernel,tracerollback}
+ \from{ltclass.dtx}{2ekernel,tracerollback}
\from{ltkeys.dtx}{2ekernel} % L3 layer module
\from{ltfilehook.dtx}{2ekernel} % L3 layer module
\from{ltshipout.dtx}{2ekernel} % L3 layer module
\from{ltoutput.dtx}{2ekernel}
+ \from{lttagging.dtx}{2ekernel}
\from{ltfinal.dtx}{2ekernel}}
\file{tracefnt.sty}{%
\from{ltfsstrc.dtx}{package,trace}}
@@ -228,6 +230,8 @@ the system are in the document `cfgguide.tex'.
\from{lttextcomp.dtx}{TS1sty}}
\file{textcomp-2018-08-11.sty}{%
\from{lttextcomp.dtx}{TS1oldsty}}
+ \file{checkencodingsubset.tex}{%
+ \from{lttextcomp.dtx}{TS1check}}
}
\generateFile{oldlfont.sty}{t}{%
diff --git a/macros/latex-dev/base/graphpap.dtx b/macros/latex-dev/base/graphpap.dtx
index 6b7bc8b822..7d93512b26 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-2023
+% Copyright (C) 1993-2024
% 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 43ba83aae3..7898dd2f92 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 d68b5190cc..2f422e2a84 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 04c8ef6959..001595bb7d 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-2023
+% Copyright (C) 1993-2024
% 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 aefc4a7666..ef7d8ab398 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-2023
+% Copyright (C) 1993-2024
% 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 697a4a38b3..0382d2255e 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 b7638603ef..d5d09c8f6a 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 02956a8c07..7ab9713d8e 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-2023
+% Copyright (C) 1993-2024
% LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -142,7 +142,7 @@
% Originally this command was only to be used in vertical mode (with
% the idea that it should be only within a document when
% using text from several documents to build up a composite work such
-% as a volume of journal articles. However, usages in certain
+% as a volume of journal articles). However, usages in certain
% languages suggested that it might be preferable to allow changing
% the input encoding at any time, which is what is possible now
% (though that is quite computing resource intensive).
@@ -410,7 +410,7 @@
%<cp1252&!ansinew> \ProvidesFile{cp1252.def}
%<cp1250> \ProvidesFile{cp1250.def}
%<cp1257> \ProvidesFile{cp1257.def}
- [2021/02/14 v1.3d Input encoding file]
+ [2024/02/08 v1.3d Input encoding file]
%<cp850>%%
%<cp850>%% If you need a Euro symbol, try cp858 instead.
%<cp850>%%
@@ -2204,7 +2204,7 @@
% \section{The Next encoding}
%
% This input encoding is based on work by Stefan Ried
-% (\texttt{stef@\linebreak[0]theo-phys.uni-essen.de} and Holger Uhr
+% (\texttt{stef@\linebreak[0]theo-phys.uni-essen.de}) and Holger Uhr
% (\texttt{huhr@\linebreak[0]uni-paderborn.de}).
%
% Further extended by
diff --git a/macros/latex-dev/base/inputenc.ins b/macros/latex-dev/base/inputenc.ins
index 3857827070..2cfe820673 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 6e453b6080..bfa0203fdc 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 b0a3ac1ab6..961928d5ad 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-2023
+% Copyright (C) 1993-2024
% 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 704346408a..ae4146963f 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 b84564bb55..7e4132665f 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-2023
+% Copyright (C) 1993-2024
% 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 0c90fa36ea..9226268c28 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 4abde253e1..eeda0f8d55 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-2023
+% Copyright (C) 1993-2024
% 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 93739630e3..89c3b0fc3a 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -97,6 +97,7 @@ extension .ins) which are part of the distribution.
\from{lthooks.dtx} {latexrelease}% L3 layer module
\from{ltcmdhooks.dtx} {latexrelease}% L3 layer module
\from{ltsockets.dtx} {latexrelease}% L3 layer module
+ \from{lttemplates.dtx} {latexrelease}% L3 layer module
\from{ltalloc.dtx} {latexrelease}% empty
\from{ltcntrl.dtx} {latexrelease}% empty
\from{lterror.dtx} {latexrelease}% empty
diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf
index a33f14a625..34a4481bc3 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 e4e1559e27..4ad1731589 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-2023
+% Copyright (C) 1993-2024
% 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 12d658bca9..874f12cbf7 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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-2023
+Copyright (C) 1993-2024
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 76b8b57254..444ae58d37 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 74c0e222b6..7d22f49814 100644
--- a/macros/latex-dev/base/lb2.err
+++ b/macros/latex-dev/base/lb2.err
@@ -1,4 +1,4 @@
-\newcommand\erratafiledate{2014/09/30}
+\newcommand\erratafiledate{2024/01/03}
\def\comando#1{\texttt{\string#1}}
@@ -1203,6 +1203,14 @@ Streiche den letzten Buchstaben von ausf"uhrliche\u{n}.
\erroronpage{647}{Abs.4, Z.1}{JMa}{2006/03/23}{2}
Streiche den letzten Buchstaben von vertikale\u{r}.
+\erroronpage{649}{Beispiel 10-3-9}{WOs}{2024/01/03}{}
+Das Beispiel verwendet \verb=\frame=, was seinen Inhalt immer auf der
+Zeile positioniert und nicht \verb=\fbox=, was je nach Drehung auch
+unter die Zeile dreht (siehe Beispiel 10.3.10).
+Die Ausgabe ist korrekt aber eher überraschend,
+da der nachfolgende Absatz dann \verb=\fbox= diskutiert und die
+Besonderheit von \verb=\frame= hier nicht erwähnt wird.
+
\erroronpage{649}{Abs.2, Z.8}{FMi/HjG}{2006/10/22}{2}
Ersetze: "`\u{Dieser Punkt} ist in \ldots"' \>
"`\u{Dies} ist in \ldots"'
@@ -1605,6 +1613,7 @@ Die Abkürzung NFSS sollte \textsf{NFSS} geschrieben werden.
\contributor{SZi}{Stefan Ziesemer}
\contributor{TNdz}{Timo Niedenzu}
\contributor{VVo}{Vladimir Volovich}
+\contributor{WOs}{Wolfgang Ostmann}
\contributor{YiL}{Yiannis Lazarides}
\end{multicols}
diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf
index 1635d1217d..91a6b37f7d 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 3e3c36d3d0..4df9e5ead6 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-2023
+% Copyright (C) 1993-2024
% 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 c522f39e59..72bb25531c 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 bd800591fc..8eeb8e9c2e 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.pdf b/macros/latex-dev/base/lgc2.pdf
index c4cbbd166e..9abfbe67df 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 1a7b50860d..880331d70f 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 c3498fb9c7..d9d5ebd3be 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-2023
+% Copyright (C) 1993-2024
% 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 8e34ca685a..37d11a97aa 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-2023
+% Copyright (C) 1993-2024
% 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 d84158c161..a041312cc5 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltboxes.dtx}
- [2023/10/26 v1.4e LaTeX Kernel (Box Commands)]
+ [2024/02/08 v1.4e LaTeX Kernel (Box Commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltboxes.dtx}
@@ -87,7 +87,7 @@
% Note that in this picture mode version of |\makebox| a [b] aligns on
% the \emph{bottom} of the text as documented. If you want to align on
% the \emph{baseline} use
-% |\makebox( , )[b]{\raisebox{0pt}[\height][0pt]{xyz}}}|
+% |\makebox( , )[b]{\raisebox{0pt}[\height][0pt]{xyz}}|
% or |\makebox( , )[b]{\smash{xyz}}|
%
% \DescribeMacro\mbox
@@ -235,7 +235,8 @@
% \begin{macro}{\makebox}
% \changes{v0.1a}{1993/12/03}
% {modified}
-% |\makebox| User level command just looks for optional |[| or |(|.
+% |\makebox| User level command just looks for optional
+% |[| or |(|. \iffalse)]\fi
% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)}
% \begin{macrocode}
%</2ekernel>
diff --git a/macros/latex-dev/base/ltclass.dtx b/macros/latex-dev/base/ltclass.dtx
index bb52148508..c6c0495fca 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltclass.dtx}
- [2023/04/14 v1.5h LaTeX Kernel (Class & Package Interface)]
+ [2024/02/14 v1.5i LaTeX Kernel (Class & Package Interface)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltclass.dtx}
@@ -390,7 +390,7 @@
% package files.)
%
% |\DeclareOption*{\PassOptionsToPackage{\CurrentOption}|^^A
-% |{|\meta{pkg-name}|}|\\
+% |{|\meta{pkg-name}|}}|\\
% Handle the current option by passing it on to the package
% \meta{pkg-name}, which will presumably be loaded via
% |\RequirePackage| later in the file. This is useful for building
@@ -1950,12 +1950,34 @@
% \end{macro}
%
% \begin{macro}{\@fileswithoptions}
+% \changes{v1.5i}{2024/01/30}{Test group level}
% The common part of |\documentclass| and |\usepackage|.
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2024/06/01}%
+%<latexrelease> {\@fileswithoptions}{Check Group}%
+%<*2ekernel|latexrelease>
\def\@fileswithoptions#1{%
+ \ifnum\currentgrouplevel>\z@
+ \@latex@error
+ {Loading a class or package in a group}%
+ {Classes and packages should only be loaded at the top level}%
+ \fi
\@ifnextchar[%]
{\@fileswith@ptions#1}%
{\@fileswith@ptions#1[]}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@fileswithoptions}{Check Group}%
+%<latexrelease>\def\@fileswithoptions#1{%
+%<latexrelease> \@ifnextchar[%]
+%<latexrelease> {\@fileswith@ptions#1}%
+%<latexrelease> {\@fileswith@ptions#1[]}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \begin{macrocode}
\@onlypreamble\@fileswithoptions
% \end{macrocode}
%
@@ -2624,8 +2646,8 @@
%
% Allow code to be saved to be executed at specific later times.
%
-% Save things in macros, I considered using toks registers, (and
-% |\addto@hook| from the NFSS code, that would require stacking the
+% Here we save things in macros. I considered using toks registers (and
+% |\addto@hook| from the NFSS code), but that would require stacking the
% contents in the case of required packages, so just generate a new
% macro for each package.
% \begin{macro}{\@begindocumenthook}
@@ -2997,7 +3019,7 @@
\let\do\@makeother\dospecials%
% \end{macrocode}
% If there are active characters in the upper half (e.g., from
-% \texttt{inputenc} there would be confusion so we render everything
+% \texttt{inputenc}) there would be confusion so we render everything
% harmless.
% \changes{v1.2f}{2018/03/27}
% {Use full file name for old release}
@@ -3585,7 +3607,7 @@
% and therefore we can now test its value. If the value is zero we
% assume that the remaining argument string represents a version
% and change |\pkgcls@targetdate| and set |\pkgcls@targetlabel| to
-% the version name (after stripping off the trailing \texttt{=}.
+% the version name (after stripping off the trailing \texttt{=}).
% \begin{macrocode}
\ifnum \pkgcls@targetdate=\z@
\pkgcls@targetdate\@ne
@@ -3695,7 +3717,7 @@
% late, but if there wasn't one (i.e., if current release is the
% oldest that exists) we use it as the best choice. However in
% that case something is wrong (as there shouldn't be a rollback to
-% a date where a package used doesn't yet exists. So we make a
+% a date when a package used didn't yet exists). So we make a
% complained to the user.
% \begin{macrocode}
\ifx\pkgcls@candidate\@empty
diff --git a/macros/latex-dev/base/ltcmd.dtx b/macros/latex-dev/base/ltcmd.dtx
index dcb85a1ae8..1733af5416 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 LaTeX Project
-% Copyright (C) 2009-2023
+% Copyright (C) 2009-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -34,8 +34,8 @@
%%% From File: ltcmd.dtx
%
% \begin{macrocode}
-\def\ltcmdversion{v1.2a}
-\def\ltcmddate{2023-08-19}
+\def\ltcmdversion{v1.2c}
+\def\ltcmddate{2024-02-08}
% \end{macrocode}
%
%<*driver>
@@ -415,8 +415,6 @@
\cs_new_protected:Npn \@@_declare_cmd_internal:Nnnn #1#2#3#4
{
\tl_set:Nx \l_@@_function_tl { \cs_to_str:N #1 }
- \tl_set:Nx \l_@@_fn_tl
- { \exp_not:c { \l_@@_function_tl \c_space_tl } }
\@@_normalize_arg_spec:n {#2}
\exp_args:No \@@_prepare_signature:n \l_@@_arg_spec_tl
\@@_declare_cmd_code:Nnn #1 {#2} {#3}
@@ -435,17 +433,93 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_all_m_check:n, \@@_all_m_check_aux:n}
+% A quick loop to check for all |(+)m|-type arguments.
+% \begin{macrocode}
+\cs_new:Npn \@@_all_m_check:n #1
+ { \tl_map_function:nN {#1} \@@_all_m_check_aux:n }
+\cs_new:Npn \@@_all_m_check_aux:n #1
+ {
+ \str_if_eq:nnF {#1} { m }
+ {
+ \str_if_eq:nnF {#1} { + }
+ { X }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_declare_cmd_code:Nnn}
% \begin{macro}
-% {\@@_declare_cmd_code_aux:Nnn, \@@_declare_cmd_code_expandable:Nnn}
-% The appropriate auxiliary is called.
+% {
+% \@@_declare_cmd_optimized:Nnn,
+% \@@_declare_cmd_code_aux:Nnn,
+% \@@_declare_cmd_code_expandable:Nnn
+% }
+% \begin{macro}{\@@_start_optimized:}
+% \changes{v1.2b}{2023/12/01}
+% {Optimize cmd creation for all-\texttt{m} arguments}
+% At this stage we can check for a short-cut possibility: if the argument
+% specification is made up of just |(+)m| tokens, and if all arguments are
+% either short or long, then we can produce an optimized document command.
+% This only applies to document commands, not creation of environments (which
+% are more complex).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_declare_cmd_code:Nnn #1#2
+ {
+ \bool_lazy_any:nTF
+ {
+ { \l_@@_environment_bool }
+ {
+ \bool_lazy_and_p:nn
+ { \l_@@_some_short_bool }
+ { \l_@@_some_long_bool }
+ }
+ { ! \tl_if_blank_p:e { \@@_all_m_check:n {#2} } }
+ }
+ {
+ \tl_set:Nx \l_@@_fn_tl
+ { \exp_not:c { \l_@@_function_tl \c_space_tl } }
+ \bool_if:NTF \l_@@_grab_expandably_bool
+ { \@@_declare_cmd_code_expandable:Nnn }
+ { \@@_declare_cmd_code_aux:Nnn }
+ }
+ { \@@_declare_cmd_optimized:Nnn }
+ #1 {#2}
+ }
+% \end{macrocode}
+% The optimized version of commands just has to worry about whether to make
+% them protected or long. The commands start with an expandable marker so
+% that other parts of the kernel know these are set up by \pkg{ltcmd}.
+% We need the two layers of redirection so that the \texttt{code} internal
+% function has the same form as it would for any other document command.
+% Optimization means that there is no \cs{group_align_safe_begin:} before
+% grabbing the arguments, so anything involving |&| tokens will not work.
+% However, this is really only intended for making optional argument
+% processing safe anyway, so in practice should not be an issue.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_cmd_code:Nnn
+\cs_new_protected:Npn \@@_declare_cmd_optimized:Nnn #1#2#3
{
- \bool_if:NTF \l_@@_grab_expandably_bool
- { \@@_declare_cmd_code_expandable:Nnn }
- { \@@_declare_cmd_code_aux:Nnn }
- }
+ \bool_if:NTF \l_@@_expandable_bool
+ { \cs_set_nopar:Npe }
+ { \cs_set_protected_nopar:Npe }
+ #1
+ {
+ \exp_not:N \@@_start_optimized:
+ \exp_not:c { \l_@@_function_tl \c_space_tl code }
+ }
+ \exp_args:Ncc \cs_generate_from_arg_count:NNnn
+ { \l_@@_function_tl \c_space_tl code }
+ {
+ cs_set
+ \bool_if:NF \l_@@_expandable_bool { _protected }
+ \bool_if:NF \l_@@_some_long_bool { _nopar }
+ :Npn
+ }
+ \l_@@_current_arg_int
+ {#3}
+ }
+\cs_new:Npn \@@_start_optimized: { }
% \end{macrocode}
% Standard functions call \cs{@@_start:nNNnnn}, which receives the
% argument specification, an auxiliary used for
@@ -544,6 +618,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_declare_env:nnnn}
% \begin{macro}{\@@_declare_env_internal:nnnn}
@@ -1286,7 +1361,7 @@
% that is not possible without the risk of mistakenly grabbing the
% entire brace group (potentially leading to a~\texttt{!~Runaway argument}
% error) or trying to grab a |}|$_2$, leading to
-% an~\verb|! Argument of \dots has an extra }| error.
+% \iffalse{\fi an~\verb|! Argument of \dots has an extra }| error.
% \begin{macrocode}
\cs_new_protected:Npn \@@_allowed_token_check:N #1
{
@@ -1373,6 +1448,9 @@
% \end{macro}
%
% \begin{macro}{\@@_add_arg_spec:n, \@@_add_arg_spec_mandatory:n}
+% \changes{v1.2c}{2023/12/22}
+% {Clarify error message when \texttt{!} prefix is applied to
+% non-trailing opt-arg (gh/1198)}
% When adding an argument to the argument specification, set the
% \texttt{some_long} or \texttt{some_short} booleans as appropriate
% and clear the booleans keeping track of |+|, |!| and |=| markers.
@@ -1414,7 +1492,12 @@
\bool_if:NT \l_@@_some_obey_spaces_bool
{
\msg_error:nnxx { cmd } { invalid-bang }
- { \@@_environment_or_command: } { \tl_to_str:n {#1} }
+ { \@@_environment_or_command: }
+ {
+ \bool_if:NTF \l_@@_obey_spaces_bool
+ { \tl_to_str:n {'#1'} }
+ { an~optional~argument~before~mandatory~ \tl_to_str:n {'#1'} }
+ }
\@@_bad_def:wn
}
\tl_clear:N \l_@@_last_delimiters_tl
@@ -1626,8 +1709,10 @@
% argument, so we need to break out of one layer of braces in
% \cs{l_@@_process_one_tl}, add copies of the processor as necessary,
% and then return the removed brace. The function below does just
-% that: it defines \cs{l_@@_process_one_tl} starting with a |}|$_2$
-% and ending with a |{|$_1$, so that it adds as many processors as
+% that: it defines \cs{l_@@_process_one_tl} starting with a
+% \iffalse{\fi |}|$_2$
+% and ending with a |{|$_1$, \iffalse}\fi
+% so that it adds as many processors as
% needed when |x|-expanded.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replicate_processor:nn #1 #2
@@ -2033,7 +2118,7 @@
% \begin{macro}{\@@_copy:NN}
% \begin{macro}{\@@_set_eq_if_exist:NN,\@@_set_eq_if_exist:cc}
% This macro just branches to the proper copying command by using
-% \cs{@@_cmd_type_cases:NnnnnF}. The copying command takes the names
+% \cs{@@_cmd_type_cases:NnnnnnF}. The copying command takes the names
% of the commands to be copied to and from, and the actual commands
% as its four arguments.
% \begin{macrocode}
@@ -2042,9 +2127,10 @@
\use:x
{
\int_set:Nn \tex_escapechar:D { 92 }
- \exp_not:N \@@_cmd_type_cases:NnnnnF \exp_not:N #2
+ \exp_not:N \@@_cmd_type_cases:NnnnnnF \exp_not:N #2
{ \@@_copy_command:nnNN }
{ \@@_copy_expandable:nnNN }
+ { \@@_copy_optimized:nnNN }
{ \@@_copy_environment:nnNN }
{ \@@_copy_environment_end:nnNN }
{ \@@_cant_copy:nwn { non-ltcmd } }
@@ -2186,6 +2272,24 @@
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
+% \begin{macro}{\@@_copy_optimized:nnNN}
+% Copy the code, simply define the wrapper.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_copy_optimized:nnNN #1#2#3#4
+ {
+ \cs_set_eq:cc { #1 ~ code } { #2 ~ code }
+ \token_if_protected_macro:NTF #4
+ { \cs_set_protected_nopar:Npe }
+ { \cs_set_nopar:Npe }
+ #3
+ {
+ \exp_not:N \@@_start_optimized:
+ \exp_not:c { #1 ~ code }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_copy:NN (part 2)}%
%<latexrelease> {Support~\NewCommandCopy~in~ltcmd}
@@ -2423,7 +2527,7 @@
%
% \begin{macro}{\@@_show:N}
% This macro just branches to the proper showing command by using
-% \cs{@@_cmd_type_cases:NnnnnF}. The showing command takes the command
+% \cs{@@_cmd_type_cases:NnnnnnF}. The showing command takes the command
% to be shown as argument.
% \begin{macrocode}
\cs_new_protected:Npn \@@_show:N #1
@@ -2431,9 +2535,10 @@
\use:x
{
\int_set:Nn \tex_escapechar:D { 92 }
- \exp_not:N \@@_cmd_type_cases:NnnnnF \exp_not:N #1
+ \exp_not:N \@@_cmd_type_cases:NnnnnnF \exp_not:N #1
{ \@@_show_command:N }
{ \@@_show_expandable:N }
+ { \@@_show_optimized:N }
{ \@@_show_environment:N }
{ \@@_show_environment_end:N }
{ \@@_cant_copy:nwn { non-ltcmd } }
@@ -2450,6 +2555,7 @@
% \@@_show_command:NnNNwN,
% \@@_show_expandable:N,
% \@@_show_expandable:NnNNNNnN,
+% \@@_show_optimized:N,
% \@@_show_command_aux:NnNNn,
% \@@_show_environment:N,
% \@@_show:x,
@@ -2530,6 +2636,48 @@
}
% \end{macrocode}
%
+% Optimized functions need things done a bit differently as we need to
+% reconstruct the argument spec.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_optimized:N #1
+ {
+ \exp_args:Nc \@@_show_optimized:NN
+ { \cs_to_str:N #1 \c_space_tl code }
+ #1
+ }
+\cs_new_protected:Npn \@@_show_optimized:NN #1#2
+ {
+ \cs_set:Npe \@@_show_optimized_aux:N ##1
+ {
+ \c_space_tl \c_space_tl \c_hash_str ##1 :
+ \bool_lazy_or:nnT
+ { \token_if_long_macro_p:N #1 }
+ { \token_if_protected_long_macro_p:N #1 }
+ { + } m
+ \iow_newline:
+ }
+ \tl_show:e
+ {
+ \token_to_str:N #2 =
+ \bool_lazy_or:nnF
+ { \token_if_protected_macro_p:N #1 }
+ { \token_if_protected_long_macro_p:N #1 }
+ { expandable ~ } document~command:
+ \iow_newline:
+ \int_step_function:nN
+ {
+ \int_div_truncate:nn
+ { \tl_count:e { \cs_parameter_spec:N #1 } }
+ { 2 }
+ }
+ \@@_show_optimized_aux:N
+ ->
+ \cs_replacement_spec:N #1
+ }
+ }
+\cs_generate_variant:Nn \tl_count:n { e }
+% \end{macrocode}
+%
% We can reuse most of the above to show an environment, except that
% we need to ensure that the proper \cs[no-index]{environment~\ldots}
% are passed to \cs{@@_show_command_aux:NnNNn}. Additionally, when
@@ -4376,13 +4524,14 @@
% \end{macro}
%
% \begin{macro}{\__kernel_cmd_if_xparse:NTF}
-% \begin{macro}{\@@_cmd_type_cases:Nnnnn}
+% \begin{macro}{\@@_cmd_type_cases:NnnnnnF}
% \changes{v1.0d}{2021/04/19}{Renamed \cs{__cmd_cmd_if_xparse:NTF} to
% \cs{__kernel_cmd_if_xparse:NTF} for cross-module usage}
% \changes{v1.0d}{2021/07/30}{Added \cs{@@_cmd_type_cases:NnnnnF} for
% \cs{NewCommandCopy} and \cs{ShowCommand} support}
% \changes{v1.0l}{2022/03/18}{Fix \cs{@@_cmd_type_cases:NnnnnF}
-%" prematurely expanding macros (gh/795)}
+% prematurely expanding macros (gh/795)}
+% \changes{v1.2b}{2023/12/01}{Extend for optimized commands}
% \begin{macro}{\@@_cmd_if_xparse_aux:N}
%
% To determine whether the command is an \pkg{xparse} command check
@@ -4390,13 +4539,14 @@
% that its |replacement_spec| starts with either
% \cs{@@_start:nNNnnn} (non-expandable command) or
% \cs{@@_start_expandable:nNNNNn} (expandable command) or
+% \cs{@@_start_optimized:} (optimized command) or
% \cs{@@_start_env:nnnnn} (environment) or
% \cs[no-index]{environment~\#1~end~aux} (environment end).
%
% This conditional is needed in several kernel modules and is
% therefore has a kernel-internal name.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_cmd_type_cases:NnnnnF #1 #2 #3 #4 #5 #6
+\cs_new_protected:Npn \@@_cmd_type_cases:NnnnnnF #1 #2 #3 #4 #5 #6 #7
{
\exp_args:Ne \str_case_e:nnF
{
@@ -4406,20 +4556,21 @@
{
{ \exp_not:N \@@_start:nNNnnn } {#2}
{ \exp_not:N \@@_start_expandable:nNNNNn } {#3}
- { \exp_not:N \@@_start_env:nnnnn } {#4}
+ { \exp_not:N \@@_start_optimized: } {#4}
+ { \exp_not:N \@@_start_env:nnnnn } {#5}
{
\exp_after:wN \exp_not:N
\cs:w environment~
\exp_last_unbraced:Ne \use_none:nnn
{ \cs_to_str:N #1 } ~end~aux \cs_end:
- } {#5}
+ } {#6}
}
- {#6}
+ {#7}
}
\cs_new_protected:Npn \__kernel_cmd_if_xparse:NTF #1
{
- \@@_cmd_type_cases:NnnnnF #1
- { } { } { } { } { \use_iii:nnn }
+ \@@_cmd_type_cases:NnnnnnF #1
+ { } { } { } { } { } { \use_iii:nnn }
\use_i:nn
}
% \end{macrocode}
@@ -4511,10 +4662,8 @@
\bool_if:NTF \l_@@_environment_bool
{ environment ~ ' \l_@@_environment_str ' }
{
- command ~ '
- \exp_args:Nf \tl_trim_spaces:n
- { \exp_after:wN \token_to_str:N \l_@@_fn_tl }
- '
+ command ~
+ ' \c_backslash_str \tl_to_str:N \l_@@_function_tl '
}
}
% \end{macrocode}
@@ -4522,6 +4671,8 @@
%
% Some messages intended as errors when defining commands/environments.
% \changes{v1.0f}{2021/06/04}{Normalize various error messages}
+% \changes{v1.2c}{2023/12/22}
+% {Generalize message \texttt{invalid-bang} (gh/1198)}
% \begin{macrocode}
\msg_new:nnnn { cmd } { arg-after-body }
{ Argument~type~'b'~must~be~last~in~#1. }
@@ -4612,7 +4763,7 @@
{ Invalid~argument~prefix~'!'~in~#1. }
{
The~prefix~'!'~is~only~allowed~for~trailing~optional~arguments.~
- You~tried~to~apply~it~to~'#2'.
+ You~tried~to~apply~it~to~#2.
\c_@@_ignore_def_tl
}
\msg_new:nnnn { cmd } { not-definable }
diff --git a/macros/latex-dev/base/ltcmdhooks-code.pdf b/macros/latex-dev/base/ltcmdhooks-code.pdf
index a48cf808d2..8abe240bae 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 cdff7b57d7..6424ad0033 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/ltcmdhooks.dtx b/macros/latex-dev/base/ltcmdhooks.dtx
index 6f885a2c6c..bb071e629c 100644
--- a/macros/latex-dev/base/ltcmdhooks.dtx
+++ b/macros/latex-dev/base/ltcmdhooks.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
-%% File: ltcmdhooks.dtx
-%% Copyright (C) 2020-2023
+%%% From File: ltcmdhooks.dtx
+%% Copyright (C) 2020-2024
%% Frank Mittelbach, Phelype Oleinik, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
@@ -12,16 +12,20 @@
% https://www.latex-project.org/lppl.txt
%
%
-%%% From File: ltcmdhooks.dtx
-%
-\def\ltcmdhooksversion{v1.0i}
-\def\ltcmdhooksdate{2023/06/16}
-%
+% \fi
%
+% \iffalse
+%%% From File: lthooks.dtx
%
%<*driver>
+% \fi
+\ProvidesFile{ltcmdhooks.dtx}
+ [2024/02/11 v1.0i LaTeX Kernel (Command hooks)]
+% \iffalse
+%
\documentclass{l3doc}
-%\usepackage{ltcmdhooks}
+\GetFileInfo{ltcmdhooks.dtx}
+% \usepackage{ltcmdhooks}
\EnableCrossrefs
\CodelineIndex
\begin{document}
@@ -38,7 +42,7 @@
% \providecommand\phoinline[1]{\begin{quote}\itshape\footnotesize PhO: #1\end{quote}}
%
% \title{The \texttt{ltcmdhooks} module\thanks{This file has version
-% \ltcmdhooksversion\ dated \ltcmdhooksdate, \copyright\ \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
% Project.}}
% \author{Frank Mittelbach \and Phelype Oleinik}
%
@@ -643,7 +647,7 @@
}
}
% \end{macrocode}
-% and a conditional \cs{@@_if_public_command:N} to check if a command
+% and a conditional \cs{@@_if_public_command:NTF} to check if a command
% has |__| in its name (no other checking is performed). Primitives
% with |:D| in their name could be included here, but they are already
% discarded in the \cs{token_if_macro:NTF} test above.
diff --git a/macros/latex-dev/base/ltcntrl.dtx b/macros/latex-dev/base/ltcntrl.dtx
index 52dcdbf983..fad5bf479e 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-2023
+% Copyright (C) 1993-2024
% 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 69025fa479..006486d23b 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltcounts.dtx}
- [2021/07/08 v1.1m LaTeX Kernel (Counters)]
+ [2021/11/08 v1.1n LaTeX Kernel (Counters)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltcounts.dtx}
@@ -305,6 +305,7 @@
% \begin{macro}{\@definecounter}
% \changes{v1.1b}{1995/05/20}{Streamlined code}
% \changes{v1.1c}{1995/05/20}{And do it right}
+% \changes{v1.1n}{2023/11/07}{Do not change \cs{the...} if already defined (gh/823)}
%
% \begin{macrocode}
\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname
@@ -312,9 +313,21 @@
\global\expandafter\let\csname cl@#1\endcsname\@empty
\@addtoreset{#1}{@ckpt}%
\global\expandafter\let\csname p@#1\endcsname\@empty
+% \end{macrocode}
+% If \cs{the\#1} is undefined or \cs{relax} we define it with the
+% standard definition for counters, otherwise we warn. This will
+% catch, for example, that somebody defines a counter named
+% ``index'' conflicting with the \env{theindex} environment.
+% \begin{macrocode}
\expandafter
- \gdef\csname the#1\expandafter\endcsname\expandafter
- {\expandafter\@arabic\csname c@#1\endcsname}}
+ \ifx\csname the#1\endcsname\relax
+ \expandafter
+ \gdef\csname the#1\expandafter\endcsname\expandafter
+ {\expandafter\@arabic\csname c@#1\endcsname}%
+ \else
+ \@latex@warning{Command `\string\the#1' already
+ defined -- not changed}%
+ \fi}
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltdefns.dtx b/macros/latex-dev/base/ltdefns.dtx
index 209c4e0fba..4d8368e2c0 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
- [2022/11/24 v1.5s LaTeX Kernel (definition commands)]
+ [2024/02/08 v1.5s LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
@@ -530,9 +530,11 @@
% This macro encapsulates the most common call to |\@ifnextchar|, saving
% several tokens each time it is used in the definition of a command
% with an optional argument.
-% |#1| The code to execute in the case that there is a |[| need not be
+% |#1| The code to execute in the case that there is a |[| \iffalse]\fi
+% need not be
% a single token but can be any sequence of commands that `expects' to
-% be followed by |[|. If this command were only used in |\newcommand|
+% be followed by |[|. \iffalse]\fi
+% If this command were only used in |\newcommand|
% definitions then |#1| would be a single token and the braces could
% be omitted from |{#1}| in the definition below, saving a bit of
% memory.
@@ -595,7 +597,7 @@
% required argument spec by using a delimited argument (delimited
% by the digit). This is faster and uses less tokens. The coding
% is slightly odd to preserve the old interface (using |#2| =
-% |\tw@| as the flag to surround the first argument with |[]|. But
+% |\tw@| as the flag to surround the first argument with |[]|). But
% the new method did not allow for the number of arguments |#3| not
% being given as an explicit digit; hence (further expansion of
% this argument and use of) |\number| was added later in 1999.
@@ -706,13 +708,14 @@
% \begin{macro}{\newenvironment}
% Define a new user environment.
% |#1| is the environment name. |#2#| Grabs all the tokens up to
-% the first |{|. These will be any optional arguments. They are not
+% the first |{|. \iffalse}\fi
+% These will be any optional arguments. They are not
% parsed at this point, but are just passed to |\@newenv| which
% will eventually call |\newcommand|. Any optional arguments will
% then be parsed by |\newcommand| as it defines the command that
% executes the `begin code' of the environment.
%
-% This |#2#| trick removed with version 1.2i as it fails if a |{|
+% This |#2#| trick removed with version 1.2i as it fails if a |{| \iffalse}\fi
% occurs in the optional argument. Now use |\@ifnextchar| directly.
% \begin{macrocode}
\def\newenvironment{\@star@or@long\new@environment}
@@ -888,7 +891,8 @@
% \begin{macro}{\@check@c}
% \changes{v1.2i}{1995/04/25}{Make \cs{long} for latex/1346}
% |\CheckCommand| itself just grabs all the arguments we need,
-% without actually looking for |[| optional argument forms. Now
+% without actually looking for |[| \iffalse]\fi
+% optional argument forms. Now
% define |\reserved@a|. If |\\reserved@a| is then defined, compare it
% with the ``|\#1|' otherwise compare |\reserved@a| with |#1|.
% \begin{macrocode}
@@ -2296,7 +2300,7 @@
% \changes{v1.3g}{2004/01/23}{Added macro (pr/3501)}
% This macro is the kernel version of |\@ifnextchar| which is used
% in a couple of places to prevent the AMS variant from being used
-% since in some places this produced chaos (for example
+% since in some places this produced chaos. For example,
% if an \texttt{fd} file
% is loaded in a random place then the optional argument to
% |\ProvidesFile| could get printed there instead of being written
diff --git a/macros/latex-dev/base/ltdirchk.dtx b/macros/latex-dev/base/ltdirchk.dtx
index 6e02929754..d06f68a706 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -36,8 +36,10 @@
%</unstripped>
%<*driver>
% \fi
+% \fi
\ProvidesFile{ltdirchk.dtx}
- [2021/12/11 v1.3a LaTeX Kernel (System Dependent Parts)]
+ [2024/02/11 v1.3a LaTeX Kernel (System Dependent Parts)]
+% \iffalse
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdirchk.dtx}
@@ -1000,8 +1002,8 @@
% \begin{macro}{\@TeXversion}
% \TeX\ versions older than 3.141 require |\@TeXversion| to be
% set. This can be determined automatically due to a trick suggested
-% by Bernd Raichle. (Actually this will not always get the correct
-% version number, eg \TeX3.14 would be detected as \TeX3, but \LaTeX\
+% by Bernd Raichle. Actually this will not always get the correct
+% version number, e.g., \TeX3.14 would be detected as \TeX3, but \LaTeX\
% only needs to take account of \TeX's older than 3, or between 3 and
% 3.14.
% \changes{v1.0h}{1994/10/11}
diff --git a/macros/latex-dev/base/lterror.dtx b/macros/latex-dev/base/lterror.dtx
index 77672168ce..99bdc79e4f 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-2023
+% Copyright (C) 1993-2024
% 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 4e5eba550b..4aaf799e32 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-2023
+% Copyright (C) 2019-2024
% 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 1e3965df67..7bfb51e947 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 f104a35011..3e561cdf3a 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 ae183bfeb4..831d633eef 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-2023
+% Copyright (C) 2020-2024
% Frank Mittelbach, Phelype Oleinik and The LaTeX Project
%
% This file is part of the LaTeX base system.
@@ -30,16 +30,22 @@
%
%%% From File: ltfilehook.dtx
%
-% \begin{macrocode}
-\providecommand\ltfilehookversion{v1.0o}
-\providecommand\ltfilehookdate{2023/07/10}
-% \end{macrocode}
-%
+% \fi
+%\iffalse
+%<*driver,structuredlog>
+%\fi
+\def\ltfilehookdate{2024/02/11}
+\def\ltfilehookversion{v1.0o}
+%\iffalse
+%</driver,structuredlog>
%<*driver>
-
+%\fi
+\expanded{\noexpand\ProvidesFile{ltfilehook.dtx}
+[\ltfilehookdate\space \ltfilehookversion\space LaTeX Kernel (hooks)]}
+% \iffalse
+%
\documentclass{l3doc}
-
\providecommand\InternalDetectionOff{}
\providecommand\InternalDetectionOn{}
@@ -407,7 +413,7 @@
%
% \begin{function}{\disable@package@load,\reenable@package@load}
% \begin{syntax}
-% \cs{disable@package@load} \Arg{package} \Arg{alternate-code}
+% \cs{disable@package@load} \Arg{package} \Arg{alternate-code}
% \cs{reenable@package@load} \Arg{package}
% \end{syntax}
% If \meta{package} is requested do not load it but instead run
@@ -1328,7 +1334,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{flag @@_file_replaced}
+% \begin{macro}{@@_file_replaced}
% \begin{macro}{\@@_if_file_replaced:TF}
% \begin{macro}{\@@_clear_replacement_flag:}
% Since the file replacement is done expandably in a \cs{csname}, use
diff --git a/macros/latex-dev/base/ltfiles.dtx b/macros/latex-dev/base/ltfiles.dtx
index f079c2cf5b..2e2a8884a0 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfiles.dtx}
- [2023/06/17 v1.2u LaTeX Kernel (File Handling)]
+ [2024/02/08 v1.2v LaTeX Kernel (File Handling)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfiles.dtx}
@@ -1087,7 +1087,7 @@
% \texttt{-1} we ensure that we don't get a backslash in front. As a
% result we end up with all characters as catcode 12 (plus
% spaces). We then sometimes add quotes around the construct
-% (removing any existing inner quotes. Sometimes we only remove the
+% (removing any existing inner quotes). Sometimes we only remove the
% quotes if they have been supplied by the user. There is clearly
% some room for improvement.
%
@@ -1682,6 +1682,22 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\if@listfiles@hashes}
+% \changes{v1.2v}{2023/11/15}{Extend file list information}
+% \begin{macro}{\if@listfiles@sizes}
+% \changes{v1.2v}{2023/11/15}{Extend file list information}
+% \begin{macrocode}
+\ExplSyntaxOn
+\keys_define:nn { __kernel / listfiles }
+ {
+ hashes .legacy_if_set:n = @listfiles@hashes ,
+ sizes .legacy_if_set:n = @listfiles@sizes
+ }
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\listfiles}
% A preamble command to cause |\end{document}| to list files input
% from the main file.
@@ -1693,8 +1709,10 @@
% {Stop \cs{listfiles} being run twice}
% \changes{v1.0i}{1994/10/18}
% {code moved here from ltclass}
+% \changes{v1.2v}{2023/11/15}{Extend file list information}
% \begin{macrocode}
-\def\listfiles{%
+\NewDocumentCommand\listfiles{O{}}{%
+ \SetKeys[__kernel/listfiles]{#1}%
\let\listfiles\relax
\def\@listfiles##1##2##3##4##5##6##7##8##9\@@{%
\def\reserved@d{\\}%
@@ -1730,9 +1748,40 @@
\filename@area\filename@base\\\\\\\\\\\\\\\\\\\@@
\typeout{%
\filename@area\reserved@a
- \ifx\reserved@b\relax\else\@spaces\reserved@b\fi}}%
+ \ifx\reserved@b\relax\else\@spaces\reserved@b\fi
+% \end{macrocode}
+% Now we add the additional information if requested.
+% \begin{macrocode}
+ \ifnum0%
+ \if@listfiles@hashes1\fi
+ \if@listfiles@sizes1\fi
+ >0 %
+ ^^J\@spaces
+ (%
+ \if@listfiles@sizes
+ size \@dofilelist@size\@currname
+ \if@listfiles@hashes
+ , %
+ \fi
+ \fi
+ \if@listfiles@hashes
+ hash \@dofilelist@hash\@currname
+ \fi
+ )%
+ \fi
+ }}%
\typeout{ ***********^^J}}}
% \end{macrocode}
+% \begin{macro}{\@dofilelist@hash}
+% \begin{macro}{\@dofilelist@size}
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_new_eq:NN \@dofilelist@hash \file_mdfive_hash:n
+\cs_new_eq:NN \@dofilelist@size \file_size:n
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
% \changes{LaTeX2e}{1994/03/13}
% {Reset \cs{@addtofilelist} at begin document}
diff --git a/macros/latex-dev/base/ltfinal.dtx b/macros/latex-dev/base/ltfinal.dtx
index 2652f6ce44..648e3e1b8b 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfinal.dtx}
- [2023/05/30 v2.3c LaTeX Kernel (Final Settings)]
+ [2024/02/08 v2.3c LaTeX Kernel (Final Settings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfinal.dtx}
@@ -273,7 +273,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{trace\string_stack\string_levels}
+% \begin{macro}{trace_stack_levels}
% Now define the Lua function to emulate \cs{tracingstacklevels} and
% install it in the |input_level_string| callback.
% \begin{macrocode}
@@ -1384,7 +1384,7 @@
% \end{macro}
%
% \begin{macro}{\@filelist}
-% \changes{v1.0w}{1995/10/19}{Move after \cs{reserved@a} setting:-)}
+% \changes{v1.0w}{1995/10/19}{Move after \cs{reserved@a} setting}
% \begin{macro}{\@addtofilelist}
% Reset |\@filelist| so files input while making the format are not
% listed. The list built up so far may take up a lot of memory and so
diff --git a/macros/latex-dev/base/ltfloat.dtx b/macros/latex-dev/base/ltfloat.dtx
index 7247824548..a07e5e81da 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-2023
+% Copyright (C) 1993-2024
% 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 bb6dbfe75c..097b8f692e 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfntcmd.dtx}
- [2021/09/12 v3.5a LaTeX Kernel (Font commands)]
+ [2023/12/26 v3.5a LaTeX Kernel (Font commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfntcmd.dtx}
@@ -393,9 +393,9 @@
% \end{macro}
-% \begin{macro}{textulc}
-% \begin{macro}{textsw}
-% \begin{macro}{textssc}
+% \begin{macro}{\textulc}
+% \begin{macro}{\textsw}
+% \begin{macro}{\textssc}
%
% \changes{v3.4c}{2019/12/17}{Macro added}
% \begin{macrocode}
diff --git a/macros/latex-dev/base/ltfssaxes.dtx b/macros/latex-dev/base/ltfssaxes.dtx
index a0746bd08c..8b5014a4cc 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-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -28,14 +28,14 @@
% \fi
% \iffalse
%%% From File: ltfssaxes.dtx
-%% Copyright (C) 1999-2020 Frank Mittelbach
+%% Copyright (C) 2019-2020 Frank Mittelbach
%
%<*driver>
% \fi
%
%
\ProvidesFile{ltfssaxes.dtx}
- [2023/10/30 v1.0i LaTeX Kernel (NFSS Axes handing)]
+ [2024/02/08 v1.0i LaTeX Kernel (NFSS Axes handing)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -1087,7 +1087,7 @@
%
% Shapes are also split in two axes (though it could be more if
% that is desirable), essentially building in an ``sc''
-% axis).
+% axis.
%
% \begin{macrocode}
%<*2ekernel|latexrelease>
@@ -1118,7 +1118,7 @@
% resets everything and \texttt{up} changes italic or slanted to
% upright and \texttt{ulc} undoes small caps.
%
-% So we now offer \cs{normalshape} (using \cs{shapedefault} which
+% So we now offer \cs{normalshape} (using \cs{shapedefault}) which
% is normally the same as calling both \cs{ulcshape} and
% \cs{upshape}, only more efficient.
%
@@ -1494,7 +1494,7 @@
% provide. So its redefinitions for the various shape commands,
% such as \cs{itshape} should no longer happen. We therefore force
% the standard definitions at \cs{AtBeginDocument} (later when this
-% is defined. Once
+% is defined). Once
% \texttt{fontaxes} is no longer doing such redefinitions that could
% be taken out again.
%
diff --git a/macros/latex-dev/base/ltfssbas.dtx b/macros/latex-dev/base/ltfssbas.dtx
index fa82bd73bb..df02a5749a 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -35,7 +35,7 @@
%
%
\ProvidesFile{ltfssbas.dtx}
- [2023/10/21 v3.2l LaTeX Kernel (NFSS Basic Macros)]
+ [2024/02/08 v3.2l LaTeX Kernel (NFSS Basic Macros)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -962,7 +962,7 @@
% case, however, we also need the value of |\baselineskip|. As the
% first argument to |\set@fontsize| we pass the current value of
% |\baselinestretch|. This will either match the internal value (in
-% which case nothing changes, or it will be an updated value due to
+% which case nothing changes) or it will be an updated value due to
% a user change of that macro using |\renewcommand|. If we would
% pass the internal |\f@linespread| such a change would be
% effectively overwritten by a size change.
diff --git a/macros/latex-dev/base/ltfsscmp.dtx b/macros/latex-dev/base/ltfsscmp.dtx
index 7bdfe2fd3e..57c94ea688 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-2023
+% Copyright (C) 1993-2024
% 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 c3a743d249..32f9eedf19 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-2023
+% Copyright (C) 1993-2024
% 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 7b43f0228b..255abe03f3 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -36,7 +36,7 @@
%
%
\ProvidesFile{ltfssini.dtx}
- [2021/09/10 v3.2i LaTeX Kernel (NFSS Initialisation)]
+ [2024/02/08 v3.2i LaTeX Kernel (NFSS Initialisation)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -864,7 +864,7 @@
%
% If \cs{bfdefault} and \cs{bfdefault@previous} are different then
% the default got changed directly through the legacy interface
-% (i.e., via \cs{def} or \cs{renewcommand}. In that case we reset
+% (i.e., via \cs{def} or \cs{renewcommand}). In that case we reset
% all meta family defaults so that the document behaves like it was
% the case before the new mechanism was introduced.
% \changes{v3.1k}{2020/03/19}{Support legacy use of \cs{bfdefault}
@@ -885,7 +885,7 @@
\let\bfdefault@previous\bfdefault
% \end{macrocode}
% And we reset the meta family defaults (\cs{bfdef@ult} is an
-% expanded version of \cs{bfdefault}.
+% expanded version of \cs{bfdefault}).
% \begin{macrocode}
\let\bfseries@rm\bfdef@ult
\let\bfseries@sf\bfdef@ult
@@ -1661,8 +1661,8 @@
% \begin{macrocode}
\def\emfontdeclare@clist{#2,#1}%
% \end{macrocode}
-% Then we execute current declaration. Appending |\selectfont| means one
-% can write just |\fontshape{it}}| and that works then too.
+% Then we execute the current declaration. Appending |\selectfont| means one
+% can write just |\fontshape{it}| and that works then too.
% \begin{macrocode}
% \typeout{Use: \detokenize{#1}}%
#1\selectfont
diff --git a/macros/latex-dev/base/ltfsstrc.dtx b/macros/latex-dev/base/ltfsstrc.dtx
index be0e6c68cf..4f0e43021a 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -37,7 +37,7 @@
%<package> [2020/12/22 v3.0n Standard LaTeX package (font tracing)]
% \fi
% \ProvidesFile{ltfsstrc.dtx}
-% [2021/04/26 v3.0o LaTeX Kernel (NFSS tracing)]
+% [2024/02/08 v3.0o LaTeX Kernel (NFSS tracing)]
%
% \iffalse
%<+checkmem>\CHECKMEM
@@ -125,7 +125,7 @@
%
% \item[debugshow] In addition to \texttt{infoshow} show also
% changing of math fonts as far as possible (this option can produce a
-% large amount of output.
+% large amount of output).
%
% \item[loading] Show the name of external fonts when they are
% loaded. This option shows only ``newly'' loaded fonts not those
@@ -489,8 +489,8 @@
\let\f@shape@saved\f@shape
\let\f@series@saved\f@series
% \end{macrocode}
-% The we run the delayed adjustments (which is using the
-% \cs{..@without@substitution} commands
+% Then we run the delayed adjustments (which use the
+% \cs{..@without@substitution} commands):
% \begin{macrocode}
\delayed@f@adjustment
% \end{macrocode}
@@ -863,14 +863,15 @@
%
% \TeX{} uses the math fonts that are current when the end of a
% formula is reached. If we don't want to keep font setups local to
-% every formula (which would result in an enormous overhead, we have
+% every formula (which would result in an enormous overhead), we have
% to be careful not to end up with the wrong setup in case formulas
% are nested, e.g., we need to be able to handle
% \begin{verbatim}
% $ a=b+c \mbox{ \small for all $b$ and $c\in Z$}$
%\end{verbatim}
% Here the inner formulae |b| and |c\in Z| are typeset in |\small| but
-% we have to return to |\normalsize| before we reach the closing |$|
+% we have to return to |\normalsize| before we reach the
+% closing |$| \iffalse$\fi
% of the outer formula.
%
% This is handled in the following way:
@@ -1042,8 +1043,8 @@
% If so we first call the `=' macro (i.e.\ argument three) to set
% up special things for the selected math group. Then we call
% |\mathgroup| to select the group given by argument two and
-% finally we place |#1| (i.e.\ the argument of the \meta{math
-% alphabet identifier} at the end. This part of the code is
+% finally we place |#1| (i.e., the argument of the \meta{math
+% alphabet identifier}) at the end. This part of the code is
% surrounded by two commands which behave like |\begingroup|
% and |\endgroup| if we want \meta{math alphabet identifier}s
% but will expand into |\@empty| if we want simply switches to
@@ -1081,7 +1082,7 @@
% \begin{macro}{\math@egroup}
% \changes{v1.0q}{1990/07/07}{Tracing code added.} If the
% \texttt{margid} option is in force (which can be tested by
-% looking at the definition of |\math@bgroup| we change the
+% looking at the definition of |\math@bgroup|) we change the
% |\math@egroup| command a bit to display the current \meta{math
% group number} after it closes the scope of \meta{math alphabet}
% with |\endgroup|.
@@ -1385,7 +1386,7 @@
% It looks for font ranges with font size functions. It's operation
% is rather simple: it discards everything up to the next size
% specification and passes this on to |\is@range| for inspection.
-% The specification (parameter |#2| is inserted again, in case
+% The specification (parameter |#2|) is inserted again, in case
% it is needed later.
% \begin{macrocode}
\def\extract@rangefontinfo#1<#2>{%
@@ -1402,7 +1403,7 @@
%
% From the way |\is@range| is called inside |\extract@rangefontinfo|
% we see that |#2| is the character |>| if the size specification
-% found is a simple one (as it does not contain a |-| character.
+% found is a simple one (that does not contain a |-| character).
% This is checked easily enough and |\extract@rangefontinfo|
% called again. Note that the extra tokens inserted after the
% |\@nil| in the call to |\is@range| appear at the beginning of
diff --git a/macros/latex-dev/base/lthooks-code.pdf b/macros/latex-dev/base/lthooks-code.pdf
index 61e9f4a92a..1ebe678058 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 4cd9279439..8dc6df576d 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 20d48730c4..ea337d306d 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-2023
+% Copyright (C) 2020-2024
% Frank Mittelbach, Phelype Oleinik, The LaTeX Project
%
% This file is part of the LaTeX base system.
@@ -27,17 +27,16 @@
% \fi
%
% \iffalse
-%
%%% From File: lthooks.dtx
%
-% \begin{macrocode}
-\def\lthooksversion{v1.1f}
-\def\lthooksdate{2023/10/02}
-% \end{macrocode}
-%
%<*driver>
+% \fi
+\ProvidesFile{lthooks.dtx}
+ [2024/02/11 v1.1h LaTeX Kernel (hooks)]
+% \iffalse
+%
\documentclass{l3doc}
-
+\GetFileInfo{lthooks.dtx}
\providecommand\InternalDetectionOff{}
\providecommand\InternalDetectionOn{}
@@ -62,7 +61,7 @@
%
%
% \title{\LaTeX{}'s hook management\thanks{This module has version
-% \lthooksversion\ dated \lthooksdate, \copyright\ \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
% Project.}}
%
% \author{Frank Mittelbach\thanks{Code improvements for speed and other goodies by Phelype Oleinik}}
@@ -160,7 +159,7 @@
% \end{function}
%
%
-% \begin{function}{\NewHookWithArguments}
+% \begin{function}[added=2023-06-01]{\NewHookWithArguments}
% \begin{syntax}
% \cs{NewHookWithArguments} \Arg{hook} \Arg{number}
% \end{syntax}
@@ -172,7 +171,7 @@
% the current package name. See section~\ref{sec:default-label}.
% \end{function}
%
-% \begin{function}{\NewReversedHookWithArguments}
+% \begin{function}[added=2023-06-01]{\NewReversedHookWithArguments}
% \begin{syntax}
% \cs{NewReversedHookWithArguments} \Arg{hook} \Arg{number}
% \end{syntax}
@@ -184,7 +183,7 @@
% the current package name. See section~\ref{sec:default-label}.
% \end{function}
%
-% \begin{function}{\NewMirroredHookPairWithArguments}
+% \begin{function}[added=2023-06-01]{\NewMirroredHookPairWithArguments}
% \begin{syntax}
% \cs{NewMirroredHookPairWithArguments} \Arg{hook-1} \Arg{hook-2} \Arg{number}
% \end{syntax}
@@ -264,7 +263,7 @@
% A leading |.| is treated literally.
% \end{function}
%
-% \begin{function}{\UseHookWithArguments}
+% \begin{function}[added=2023-06-01]{\UseHookWithArguments}
% \begin{syntax}
% \cs{UseHookWithArguments} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n}
% \end{syntax}
@@ -314,7 +313,7 @@
%
% \end{function}
%
-% \begin{function}{\UseOneTimeHookWithArguments}
+% \begin{function}[added=2023-06-01]{\UseOneTimeHookWithArguments}
% \begin{syntax}
% \cs{UseOneTimeHookWithArguments} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n}
% \end{syntax}
@@ -340,7 +339,7 @@
%
% \begin{function}{\AddToHook}
% \begin{syntax}
-% \cs{AddToHook} \Arg{hook}\oarg{label}\Arg{code}
+% \cs{AddToHook} \Arg{hook} \oarg{label} \Arg{code}
% \end{syntax}
% Adds \meta{code} to the \meta{hook} labeled by \meta{label}.
% When the optional argument \meta{label} is not provided, the
@@ -368,9 +367,9 @@
% See section~\ref{sec:default-label}.
% \end{function}
%
-% \begin{function}{\AddToHookWithArguments}
+% \begin{function}[added=2023-06-01]{\AddToHookWithArguments}
% \begin{syntax}
-% \cs{AddToHookWithArguments} \Arg{hook}\oarg{label}\Arg{code}
+% \cs{AddToHookWithArguments} \Arg{hook} \oarg{label} \Arg{code}
% \end{syntax}
% Works exactly like \cs{AddToHook}, except that the \meta{code} can
% access the arguments passed to the hook using \verb|#1|, \verb|#2|,
@@ -398,7 +397,7 @@
%
% \begin{function}{\RemoveFromHook}
% \begin{syntax}
-% \cs{RemoveFromHook} \Arg{hook}\oarg{label}
+% \cs{RemoveFromHook} \Arg{hook} \oarg{label}
% \end{syntax}
% Removes any code labeled by \meta{label} from the \meta{hook}.
% When the optional argument \meta{label} is not provided, the
@@ -459,7 +458,7 @@
%
% \begin{function}{\AddToHookNext}
% \begin{syntax}
-% \cs{AddToHookNext} \Arg{hook}\Arg{code}
+% \cs{AddToHookNext} \Arg{hook} \Arg{code}
% \end{syntax}
% Adds \meta{code} to the next invocation of the \meta{hook}.
% The code is executed after the normal hook code has finished and
@@ -505,9 +504,9 @@
% \end{function}\footnotetext{There is
% no mechanism to reorder such code chunks (or delete them).}
%
-% \begin{function}{\AddToHookNextWithArguments}
+% \begin{function}[added=2023-06-01]{\AddToHookNextWithArguments}
% \begin{syntax}
-% \cs{AddToHookNextWithArguments} \Arg{hook}\Arg{code}
+% \cs{AddToHookNextWithArguments} \Arg{hook} \Arg{code}
% \end{syntax}
% Works exactly like \cs{AddToHookNext}, but the \meta{code} can
% contain references to the arguments of the \meta{hook} as described
@@ -522,7 +521,7 @@
%
% \begin{function}{\ClearHookNext}
% \begin{syntax}
-% \cs{ClearHookNext}\Arg{hook}
+% \cs{ClearHookNext} \Arg{hook}
% \end{syntax}
% Normally \cs{AddToHookNext} is only used when you know precisely
% where it will apply and why you want some extra code at that
@@ -746,7 +745,7 @@
%
% \begin{function}{\DeclareHookRule}
% \begin{syntax}
-% \cs{DeclareHookRule} \Arg{hook}\Arg{label1}\Arg{relation}\Arg{label2}
+% \cs{DeclareHookRule} \Arg{hook} \Arg{label1} \Arg{relation} \Arg{label2}
% \end{syntax}
% Defines a relation between \meta{label1} and \meta{label2} for a
% given \meta{hook}. If \meta{hook} is \texttt{??} this defines a default
@@ -807,7 +806,7 @@
%
% \begin{function}{\ClearHookRule}
% \begin{syntax}
-% \cs{ClearHookRule}\Arg{hook}\Arg{label1}\Arg{label2}
+% \cs{ClearHookRule} \Arg{hook} \Arg{label1} \Arg{label2}
% \end{syntax}
% Syntactic sugar for saying that \meta{label1} and \meta{label2}
% are unrelated for the given \meta{hook}.
@@ -817,7 +816,7 @@
%
% \begin{function}{\DeclareDefaultHookRule}
% \begin{syntax}
-% \cs{DeclareDefaultHookRule}\Arg{label1}\Arg{relation}\Arg{label2}
+% \cs{DeclareDefaultHookRule} \Arg{label1} \Arg{relation} \Arg{label2}
% \end{syntax}
% This sets up a relation between \meta{label1} and \meta{label2}
% for all hooks unless overwritten by a specific rule for a hook.
@@ -1004,7 +1003,7 @@
%
% \begin{function}{\DebugHooksOn,\DebugHooksOff}
% \begin{syntax}
-% \cs{DebugHooksOn}
+% \cs{DebugHooksOn} \ldots\ \cs{DebugHooksOff}
% \end{syntax}
% Turn the debugging of hook code on or off. This displays most changes
% made to the hook data structures. The output is rather coarse and
@@ -1044,7 +1043,7 @@
% the current package name. See section~\ref{sec:default-label}.
% \end{function}
%
-% \begin{function}{
+% \begin{function}[added=2023-06-01]{
% \hook_new_with_args:nn,
% \hook_new_reversed_with_args:nn,
% \hook_new_pair_with_args:nnn
@@ -1100,9 +1099,14 @@
%
%
%
-% \begin{function}{\hook_use:n,\hook_use:nnw}
+% \begin{function}{\hook_use:n}
+% \begin{syntax}
+% ~~\cs{hook_use:n} \Arg{hook}
+% \end{syntax}
+% \end{function}
+% \vskip-1.2\baselineskip
+% \begin{function}[added=2023-06-01]{\hook_use:nnw}
% \begin{syntax}
-% \cs{hook_use:n} \Arg{hook}
% \cs{hook_use:nnw} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n}
% \end{syntax}
% Executes the \Arg{hook} code followed (if set up) by the code for next
@@ -1118,9 +1122,14 @@
% A leading |.| is treated literally.
% \end{function}
%
-% \begin{function}{\hook_use_once:n,\hook_use_once:nnw}
+% \begin{function}{\hook_use_once:n}
% \begin{syntax}
% \cs{hook_use_once:n} \Arg{hook}
+% \end{syntax}
+% \end{function}
+% \vskip-1.2\baselineskip
+% \begin{function}[added=2023-06-01]{\hook_use_once:nnw}
+% \begin{syntax}
% \cs{hook_use_once:nnw} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n}
% \end{syntax}
% Changes the \Arg{hook} status so that from now on any addition to
@@ -1139,10 +1148,16 @@
%
% \begin{function}{
% \hook_gput_code:nnn,
+% }
+% \begin{syntax}
+% ~~~~~~~~~\cs{hook_gput_code:nnn} \Arg{hook} \Arg{label} \Arg{code}
+% \end{syntax}
+% \end{function}
+% \vskip -1.2\baselineskip
+% \begin{function}[added=2023-06-01]{
% \hook_gput_code_with_args:nnn
% }
% \begin{syntax}
-% \cs{hook_gput_code:nnn} \Arg{hook} \Arg{label} \Arg{code}
% \cs{hook_gput_code_with_args:nnn} \Arg{hook} \Arg{label} \Arg{code}
% \end{syntax}
% Adds a chunk of \meta{code} to the \meta{hook} labeled
@@ -1168,10 +1183,17 @@
%
% \begin{function}{
% \hook_gput_next_code:nn,
+% }
+% \begin{syntax}
+% ~~~~~~~~~~~~~\cs{hook_gput_next_code:nn} \Arg{hook} \Arg{code}
+% \end{syntax}
+% \end{function}
+% \vskip-1.2\baselineskip
+% \begin{function}[added=2023-06-01]{
% \hook_gput_next_code_with_args:nn,
% }
% \begin{syntax}
-% \cs{hook_gput_next_code:nn} \Arg{hook} \Arg{code}
+% \cs{hook_gput_next_code_with_args:nn} \Arg{hook} \Arg{code}
% \end{syntax}
% Adds a chunk of \meta{code} for use only in the next invocation of the
% \meta{hook}. Once used it is gone.
@@ -1183,6 +1205,7 @@
% In that case, if an actual parameter token should be added to the
% code, it should be doubled.
%
+% \end{function}
% This is simpler than \cs{hook_gput_code:nnn}, the code is simply
% appended to the hook in the order of declaration at the very end,
% i.e., after all standard code for the hook got executed.
@@ -1191,7 +1214,6 @@
%
% The \meta{hook} can be specified using the dot-syntax to denote
% the current package name. See section~\ref{sec:default-label}.
-% \end{function}
%
%
% \begin{function}{\hook_gclear_next_code:n}
@@ -1862,15 +1884,17 @@
% \item[\hook{env/\meta{env}/begin}]
%
% This hook is executed as part of \cs{begin} directly in front
-% of the code specific to the environment start (e.g., the
-% second argument of \cs{newenvironment}). Its scope is the
-% environment body.
+% of the code specific to the environment start (e.g.,
+% the third argument of \cs{NewDocumentEnvironment} and
+% the second argument of \cs{newenvironment}).
+% Its scope is the environment body.
%
% \item[\hook{env/\meta{env}/end}]
%
% This hook is executed as part of \cs{end} directly in front of the
-% code specific to the end of the environment (e.g., the third
-% argument of \cs{newenvironment}).
+% code specific to the end of the environment (e.g.,
+% the forth argument of \cs{NewDocumentEnvironment} and
+% the third argument of \cs{newenvironment}).
%
% \item[\hook{env/\meta{env}/after}]
%
@@ -2701,7 +2725,7 @@
% \hook_new:n,
% \hook_new_with_args:nn
% }
-% \begin{macro}{@@_new:nn}
+% \begin{macro}{\@@_new:nn}
% The \cs{hook_new:n} declaration declares a new hook and expects
% the hook \meta{name} as its argument, e.g.,
% \hook{begindocument}.
@@ -3509,7 +3533,8 @@
\msg_error:nnnnn { hooks } { set-top-level }
{ for } { SetDefaultHookLabel } {#1}
}
- { \exp_args:Nx \@@_set_default_label:n { \@@_make_name:n {#1} } }
+ { \exp_args:Nx
+ \@@_set_default_label:n { \@@_make_name:n {#1} } }
}
\cs_new_protected:Npn \@@_set_default_label:n #1
{
@@ -3722,7 +3747,8 @@
%<latexrelease>\IncludeInRelease{2020/10/01}{\hook_gput_code:nnn}
%<latexrelease> {Providing~hooks}
%<latexrelease>\cs_gset_protected:Npn \hook_gput_code:nnn #1 #2
-%<latexrelease> { \@@_normalize_hook_args:Nnn \@@_gput_code:nnn {#1} {#2} }
+%<latexrelease> { \@@_normalize_hook_args:Nnn
+%<latexrelease> \@@_gput_code:nnn {#1} {#2} }
%<latexrelease>\cs_gset_protected:Npn \@@_gput_code:nnn #1 #2 #3
%<latexrelease> {
%<latexrelease> \@@_if_execute_immediately:nTF {#1}
@@ -3736,7 +3762,8 @@
%<latexrelease> {
%<latexrelease> \@@_if_disabled:nTF {#1}
%<latexrelease> { \msg_error:nnn { hooks } { hook-disabled } {#1} }
-%<latexrelease> { \@@_try_declaring_generic_hook:nnn {#1} {#2} {#3} }
+%<latexrelease> { \@@_try_declaring_generic_hook:nnn
+%<latexrelease> {#1} {#2} {#3} }
%<latexrelease> }
%<latexrelease> }
%<latexrelease> }
@@ -3748,7 +3775,8 @@
%<latexrelease> \on@line\space <-~ \tl_to_str:n{#3}} }
%<latexrelease> \str_if_eq:nnTF {#2} { top-level }
%<latexrelease> {
-%<latexrelease> \str_if_eq:eeTF { top-level } { \@@_currname_or_default: }
+%<latexrelease> \str_if_eq:eeTF { top-level }
+%<latexrelease> { \@@_currname_or_default: }
%<latexrelease> {
%<latexrelease> \@@_init_structure:n {#1}
%<latexrelease> \@@_tl_gput_right:cn { @@_toplevel~#1 } {#3}
@@ -3756,7 +3784,8 @@
%<latexrelease> { \msg_error:nnn { hooks } { misused-top-level } {#1} }
%<latexrelease> }
%<latexrelease> {
-%<latexrelease> \prop_get:cnNTF { g_@@_#1_code_prop } {#2} \l_@@_return_tl
+%<latexrelease> \prop_get:cnNTF
+%<latexrelease> { g_@@_#1_code_prop } {#2} \l_@@_return_tl
%<latexrelease> {
%<latexrelease> \prop_gput:cno { g_@@_#1_code_prop } {#2}
%<latexrelease> { \l_@@_return_tl #3 }
@@ -3840,7 +3869,8 @@
% \changes{v1.1d}{2023/05/21}
% {Changes to allow support arguments in cmd hooks (cmd-args).}
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_try_declaring_generic_hook:nnn}
+%<latexrelease>\IncludeInRelease{2023/06/01}
+%<latexrelease> {\@@_try_declaring_generic_hook:nnn}
%<latexrelease> {Hooks~with~args}
\cs_new_protected:Npn \@@_try_declaring_generic_hook:nnn #1
{
@@ -3857,31 +3887,38 @@
{#1}
}
%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_try_declaring_generic_hook:nnn}
+%<latexrelease>\IncludeInRelease{2021/11/15}
+%<latexrelease> {\@@_try_declaring_generic_hook:nnn}
%<latexrelease> {Standardise~generic~hook~names}
%<latexrelease>\cs_gset_protected:Npn \@@_try_declaring_generic_hook:nnn #1
%<latexrelease> {
-%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1}
+%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop:
+%<latexrelease> {#1}
%<latexrelease> \hook_gput_code:nnn
%<latexrelease> \@@_gput_undeclared_hook:nnn
%<latexrelease> {#1}
%<latexrelease> }
-%<latexrelease>\cs_gset_protected:Npn \@@_try_declaring_generic_next_hook:nn #1
+%<latexrelease>\cs_gset_protected:Npn
+%<latexrelease> \@@_try_declaring_generic_next_hook:nn #1
%<latexrelease> {
-%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1}
+%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop:
+%<latexrelease> {#1}
%<latexrelease> \hook_gput_next_code:nn
%<latexrelease> \@@_gput_next_do:nn
%<latexrelease> {#1}
%<latexrelease> }
%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_try_declaring_generic_hook:nnn}
+%<latexrelease>\IncludeInRelease{2020/10/01}
+%<latexrelease> {\@@_try_declaring_generic_hook:nnn}
%<latexrelease> {Standardise~generic~hook~names}
-%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_hook:nnn #1
+%<latexrelease>\cs_new_protected:Npn
+%<latexrelease> \@@_try_declaring_generic_hook:nnn #1
%<latexrelease> {
%<latexrelease> \@@_try_declaring_generic_hook:nNNnn {#1}
%<latexrelease> \hook_gput_code:nnn \@@_gput_undeclared_hook:nnn
%<latexrelease> }
-%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_next_hook:nn #1
+%<latexrelease>\cs_new_protected:Npn
+%<latexrelease> \@@_try_declaring_generic_next_hook:nn #1
%<latexrelease> {
%<latexrelease> \@@_try_declaring_generic_hook:nNNnn {#1}
%<latexrelease> \hook_gput_next_code:nn \@@_gput_next_do:nn
@@ -3904,12 +3941,15 @@
%
% \changes{v1.0s}{2021/09/28}
% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/675)}
+% \changes{v1.1h}{2024/01/24}
+% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/1243)}
% \begin{macrocode}
%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_hook:nNNnn #1
%<latexrelease> {
-%<latexrelease> \@@_if_file_hook:wTF #1 / \s_@@_mark
+%<latexrelease> \@@_if_file_hook:wTF #1 / / \s_@@_mark
%<latexrelease> {
-%<latexrelease> \exp_args:Ne \@@_try_declaring_generic_hook_split:nNNnn
+%<latexrelease> \exp_args:Ne
+%<latexrelease> \@@_try_declaring_generic_hook_split:nNNnn
%<latexrelease> { \exp_args:Ne \@@_file_hook_normalize:n {#1} }
%<latexrelease> }
%<latexrelease> { \@@_try_declaring_generic_hook_split:nNNnn {#1} }
@@ -3917,9 +3957,11 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_hook_split:nNNnn #1 #2 #3
+%<latexrelease>\cs_new_protected:Npn
+%<latexrelease> \@@_try_declaring_generic_hook_split:nNNnn #1 #2 #3
%<latexrelease> {
-%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1}
+%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop:
+%<latexrelease> {#1}
%<latexrelease> { #2 }
%<latexrelease> { #3 } {#1}
%<latexrelease> }
@@ -3931,9 +3973,11 @@
% \changes{v1.1a}{2023/04/06}
% {Changes to add hook arguments (hook-args).}
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_try_declaring_generic_hook:wn}
+%<latexrelease>\IncludeInRelease{2023/06/01}
+%<latexrelease> {\@@_try_declaring_generic_hook:wn}
%<latexrelease> {Hooks~with~args}
-\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn
+\prg_new_protected_conditional:Npnn
+ \@@_try_declaring_generic_hook:wn
#1 / #2 / #3 / #4 \scan_stop: #5 { TF }
{
\@@_if_generic:nTF {#5}
@@ -4052,9 +4096,11 @@
% \end{macro}
%
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_try_declaring_generic_hook:wn}
+%<latexrelease>\IncludeInRelease{2021/11/15}
+%<latexrelease> {\@@_try_declaring_generic_hook:wn}
%<latexrelease> {Standardise~generic~hook~names}
-%<latexrelease>\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn
+%<latexrelease>\prg_new_protected_conditional:Npnn
+%<latexrelease> \@@_try_declaring_generic_hook:wn
%<latexrelease> #1 / #2 / #3 / #4 \scan_stop: #5 { TF }
%<latexrelease> {
%<latexrelease> \@@_if_generic:nTF {#5}
@@ -4083,9 +4129,11 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2021/06/01}{\@@_try_declaring_generic_hook:wn}
+%<latexrelease>\IncludeInRelease{2021/06/01}
+%<latexrelease> {\@@_try_declaring_generic_hook:wn}
%<latexrelease> {Support~cmd~hooks}
-%<latexrelease>\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn
+%<latexrelease>\prg_new_protected_conditional:Npnn
+%<latexrelease> \@@_try_declaring_generic_hook:wn
%<latexrelease> #1 / #2 / #3 / #4 \scan_stop: #5 { TF }
%<latexrelease> {
%<latexrelease> \tl_if_empty:nTF {#2}
@@ -4099,10 +4147,12 @@
%<latexrelease> { \@@_try_put_cmd_hook:n {#5} }
%<latexrelease> \@@_make_usable:n {#5}
%<latexrelease> }
-%<latexrelease> \prop_if_in:NnTF \c_@@_generics_reversed_ii_prop {#2}
+%<latexrelease> \prop_if_in:NnTF
+%<latexrelease> \c_@@_generics_reversed_ii_prop {#2}
%<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
%<latexrelease> {
-%<latexrelease> \prop_if_in:NnT \c_@@_generics_reversed_iii_prop {#3}
+%<latexrelease> \prop_if_in:NnT
+%<latexrelease> \c_@@_generics_reversed_iii_prop {#3}
%<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
%<latexrelease> }
%<latexrelease> \prg_return_true:
@@ -4114,9 +4164,11 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_try_declaring_generic_hook:wn}
+%<latexrelease>\IncludeInRelease{2020/10/01}
+%<latexrelease> {\@@_try_declaring_generic_hook:wn}
%<latexrelease> {Support~cmd~hooks}
-%<latexrelease>\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn
+%<latexrelease>\prg_new_protected_conditional:Npnn
+%<latexrelease> \@@_try_declaring_generic_hook:wn
%<latexrelease> #1 / #2 / #3 / #4 \scan_stop: #5 { TF }
%<latexrelease> {
%<latexrelease> \tl_if_empty:nTF {#2}
@@ -4125,10 +4177,12 @@
%<latexrelease> \prop_if_in:NnTF \c_@@_generics_prop {#1}
%<latexrelease> {
%<latexrelease> \@@_if_declared:nF {#5} { \hook_new:n {#5} }
-%<latexrelease> \prop_if_in:NnTF \c_@@_generics_reversed_ii_prop {#2}
+%<latexrelease> \prop_if_in:NnTF
+%<latexrelease> \c_@@_generics_reversed_ii_prop {#2}
%<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
%<latexrelease> {
-%<latexrelease> \prop_if_in:NnT \c_@@_generics_reversed_iii_prop {#3}
+%<latexrelease> \prop_if_in:NnT
+%<latexrelease> \c_@@_generics_reversed_iii_prop {#3}
%<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
%<latexrelease> }
%<latexrelease> \prg_return_true:
@@ -4204,11 +4258,11 @@
% \changes{v1.0h}{2021/01/07}{Assume hook name has at least three
% nonempty parts (gh/464)}
% \begin{macrocode}
-%<latexrelease>\cs_new:Npn \@@_strip_double_slash:w #1/#2/#3 // #4 \s_@@_mark
+%<latexrelease>\cs_new:Npn \@@_strip_double_slash:w #1/#2/#3//#4\s_@@_mark
%<latexrelease> {
%<latexrelease> \tl_if_empty:nTF {#4}
%<latexrelease> { #1/#2/#3 }
-%<latexrelease> { \@@_strip_double_slash:w #1/#2/#3 / #4 \s_@@_mark }
+%<latexrelease> { \@@_strip_double_slash:w #1/#2/#3 /#4\s_@@_mark }
%<latexrelease> }
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
@@ -4287,9 +4341,12 @@
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2020/10/01}{\c_@@_generics_reversed_ii_prop}
%<latexrelease> {Standardise~generic~hook~names}
-%<latexrelease>\prop_const_from_keyval:Nn \c_@@_generics_reversed_ii_prop {after=,end=}
-%<latexrelease>\prop_const_from_keyval:Nn \c_@@_generics_reversed_iii_prop {after=}
-%<latexrelease>\prop_const_from_keyval:Nn \c_@@_generics_file_prop {before=,after=}
+%<latexrelease>\prop_const_from_keyval:Nn
+%<latexrelease> \c_@@_generics_reversed_ii_prop {after=,end=}
+%<latexrelease>\prop_const_from_keyval:Nn
+%<latexrelease> \c_@@_generics_reversed_iii_prop {after=}
+%<latexrelease>\prop_const_from_keyval:Nn
+%<latexrelease> \c_@@_generics_file_prop {before=,after=}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
% \end{macro}
@@ -4369,7 +4426,8 @@
\str_if_eq:nnTF {#2} { top-level }
{ \@@_toplevel_gset:nn {#1} { } }
{
- \prop_gpop:cnNF { g_@@_#1_code_prop } {#2} \l_@@_return_tl
+ \prop_gpop:cnNF { g_@@_#1_code_prop }
+ {#2} \l_@@_return_tl
{ \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} }
}
}
@@ -4387,7 +4445,8 @@
\@@_if_deprecated_generic:nTF {#1}
{
\@@_deprecated_generic_warn:n {#1}
- \@@_do_deprecated_generic:Nn \@@_gremove_code:nn {#1} {#2}
+ \@@_do_deprecated_generic:Nn
+ \@@_gremove_code:nn {#1} {#2}
}
{ \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} }
}
@@ -4412,8 +4471,10 @@
%<latexrelease> \str_if_eq:nnTF {#2} { top-level }
%<latexrelease> { \@@_tl_gclear:c { @@_toplevel~#1 } }
%<latexrelease> {
-%<latexrelease> \prop_gpop:cnNF { g_@@_#1_code_prop } {#2} \l_@@_return_tl
-%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} }
+%<latexrelease> \prop_gpop:cnNF { g_@@_#1_code_prop }
+%<latexrelease> {#2} \l_@@_return_tl
+%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove }
+%<latexrelease> {#1} {#2} }
%<latexrelease> }
%<latexrelease> }
%<latexrelease> \@@_if_usable:nT {#1}
@@ -4423,9 +4484,11 @@
%<latexrelease> \@@_if_deprecated_generic:nTF {#1}
%<latexrelease> {
%<latexrelease> \@@_deprecated_generic_warn:n {#1}
-%<latexrelease> \@@_do_deprecated_generic:Nn \@@_gremove_code:nn {#1} {#2}
+%<latexrelease> \@@_do_deprecated_generic:Nn
+%<latexrelease> \@@_gremove_code:nn {#1} {#2}
%<latexrelease> }
-%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} }
+%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove }
+%<latexrelease> {#1} {#2} }
%<latexrelease> }
%<latexrelease> }
%<latexrelease>\EndIncludeInRelease
@@ -4467,7 +4530,8 @@
{#1} {#2}
}
\cs_new_protected:Npn \@@_cs_gput_right_fast:nnn #1 #2 #3
- { \cs_gset:cpx { @@#1~#2 } { \exp_not:v { @@#1~#2 } \exp_not:n {#3} } }
+ { \cs_gset:cpx { @@#1~#2 }
+ { \exp_not:v { @@#1~#2 } \exp_not:n {#3} } }
\cs_new_protected:Npn \@@_cs_gput_right_slow:nnn #1 #2 #3
{
% \end{macrocode}
@@ -4693,7 +4757,8 @@
% \begin{macrocode}
\exp_last_unbraced:NNf
\cs_set:Npn \@@_tmp:w { \@@_parameter:n {#1} } { }
- \tl_set:Ne \l_@@_tmpa_tl { \@@_braced_cs_parameter:n { @@_tmp:w } }
+ \tl_set:Ne \l_@@_tmpa_tl
+ { \@@_braced_cs_parameter:n { @@_tmp:w } }
% \end{macrocode}
% Now this function does the fun part. It is meant to be used with
% \cs{prop_map_function:NN}, taking a label name in \verb|##1| and the
@@ -5069,8 +5134,8 @@
%<latexrelease> \@@_if_deprecated_generic:nT {#1}
%<latexrelease> {
%<latexrelease> \@@_deprecated_generic_warn:n {#1}
-%<latexrelease> \@@_do_deprecated_generic:Nn \@@_gset_rule:nnnn {#1}
-%<latexrelease> {#2} {#3} {#4}
+%<latexrelease> \@@_do_deprecated_generic:Nn \@@_gset_rule:nnnn
+%<latexrelease> {#1} {#2} {#3} {#4}
%<latexrelease> \exp_after:wN \use_none:nnnnnnnnn \use_none:n
%<latexrelease> }
%<latexrelease> \@@_init_structure:n {#1}
@@ -5110,7 +5175,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_rule_before_gset:nnn #1#2#3
{
- \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ \@@_tl_gset:cx
+ { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
{ \@@_label_ordered:nnTF {#2} {#3} { < } { > } }
}
\cs_new_eq:cN { @@_rule_<_gset:nnn } \@@_rule_before_gset:nnn
@@ -5119,7 +5185,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_rule_after_gset:nnn #1#2#3
{
- \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#3} {#2} _tl }
+ \@@_tl_gset:cx
+ { g_@@_#1_rule_ \@@_label_pair:nn {#3} {#2} _tl }
{ \@@_label_ordered:nnTF {#3} {#2} { < } { > } }
}
\cs_new_eq:cN { @@_rule_>_gset:nnn } \@@_rule_after_gset:nnn
@@ -5132,7 +5199,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_rule_voids_gset:nnn #1#2#3
{
- \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ \@@_tl_gset:cx
+ { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
{ \@@_label_ordered:nnTF {#2} {#3} { -> } { <- } }
}
% \end{macrocode}
@@ -5146,11 +5214,15 @@
% together in hook |#1|.
% \begin{macrocode}
\cs_new_protected:cpn { @@_rule_incompatible-error_gset:nnn } #1#2#3
- { \@@_tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
- { xE } }
+ { \@@_tl_gset:cn
+ { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ { xE }
+ }
\cs_new_protected:cpn { @@_rule_incompatible-warning_gset:nnn } #1#2#3
- { \@@_tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
- { xW } }
+ { \@@_tl_gset:cn
+ { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ { xW }
+ }
% \end{macrocode}
% \end{macro}
%
@@ -5268,7 +5340,7 @@
}
% \end{macrocode}
% After all hooks are initialized we change the ``use'' to just
-% call the hook code and not initialize it (as it was done in the
+% call the hook code and not initialize it (as this was already done in the
% preamble.
% \begin{macrocode}
\@@_post_initialization_defs:
@@ -5281,7 +5353,8 @@
%<latexrelease> {Hooks~with~args}
%<latexrelease>\cs_gset_protected:Npn \@@_initialize_all:
%<latexrelease> {
-%<latexrelease> \cs_gset_eq:NN \@@_update_hook_code:n \@@_initialize_hook_code:n
+%<latexrelease> \cs_gset_eq:NN \@@_update_hook_code:n
+%<latexrelease> \@@_initialize_hook_code:n
%<latexrelease> \@@_debug:n { \prop_gclear:N \g_@@_used_prop }
%<latexrelease> \seq_map_inline:Nn \g_@@_all_seq
%<latexrelease> { \@@_update_hook_code:n {##1} }
@@ -5291,7 +5364,8 @@
%<latexrelease> \prop_map_inline:Nn \g_@@_used_prop
%<latexrelease> {
%<latexrelease> \iow_term:x
-%<latexrelease> { ^^J ~ ##1 ~ -> ~ \cs_replacement_spec:c { @@~##1 } ~ }
+%<latexrelease> { ^^J ~ ##1 ~ -> ~
+%<latexrelease> \cs_replacement_spec:c { @@~##1 } ~ }
%<latexrelease> }
%<latexrelease> }
%<latexrelease> \cs_gset_eq:NN \hook_use:n \@@_use_initialized:n
@@ -5350,8 +5424,10 @@
% after the \verb|_next| and \verb|_toplevel| macros, so that the
% arguments passed to the hook are forwarded to them.
% \begin{macrocode}
- \exp_not:c { @@_toplevel~#1 } \@@_braced_parameter:n {#1}
- \exp_not:c { @@_next~#1 } \@@_braced_parameter:n {#1}
+ \exp_not:c { @@_toplevel~#1 }
+ \@@_braced_parameter:n {#1}
+ \exp_not:c { @@_next~#1 }
+ \@@_braced_parameter:n {#1}
}
}
{
@@ -5400,7 +5476,8 @@
%<latexrelease>\cs_gset_protected:Npn \@@_initialize_hook_code:n #1
%<latexrelease> {
%<latexrelease> \@@_debug:n
-%<latexrelease> { \iow_term:x { ^^J Update~code~for~hook~'#1' \on@line :^^J } }
+%<latexrelease> { \iow_term:x { ^^J Update~code~for~hook~'#1'
+%<latexrelease> \on@line :^^J } }
%<latexrelease> \@@_include_legacy_code_chunk:n {#1}
%<latexrelease> \@@_if_usable:nT {#1}
%<latexrelease> {
@@ -5414,15 +5491,21 @@
%<latexrelease> }
%<latexrelease> {
%<latexrelease> \@@_if_reversed:nTF {#1}
-%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn \@@_tl_gput_left:Nn
-%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_left:NV }
-%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn \@@_tl_gput_right:Nn
-%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_right:NV }
-%<latexrelease> \prop_set_eq:Nc \l_@@_work_prop { g_@@_#1_code_prop }
+%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn
+%<latexrelease> \@@_tl_gput_left:Nn
+%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV
+%<latexrelease> \clist_gput_left:NV }
+%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn
+%<latexrelease> \@@_tl_gput_right:Nn
+%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV
+%<latexrelease> \clist_gput_right:NV }
+%<latexrelease> \prop_set_eq:Nc \l_@@_work_prop
+%<latexrelease> { g_@@_#1_code_prop }
%<latexrelease> \@@_initialize_single:ccn
%<latexrelease> { @@~#1 } { g_@@_#1_labels_clist } {#1}
%<latexrelease> \@@_debug:n
-%<latexrelease> { \exp_args:NNx \prop_gput:Nnn \g_@@_used_prop {#1} { } }
+%<latexrelease> { \exp_args:NNx \prop_gput:Nnn \g_@@_used_prop
+%<latexrelease> {#1} { } }
%<latexrelease> }
%<latexrelease> }
%<latexrelease> }
@@ -5621,7 +5704,8 @@
\int_compare:nNnT
{ \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
{
- \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } } {##1}
+ \tl_set:cn
+ { \@@_tl_csname:n { \l_@@_rear_tl } } {##1}
\tl_set:Nn \l_@@_rear_tl {##1}
}
}
@@ -5703,42 +5787,50 @@
%<latexrelease> {#3}
%<latexrelease> }
%<latexrelease> }
-%<latexrelease> \@@_debug:n { \@@_debug_label_data:N \l_@@_work_prop }
+%<latexrelease> \@@_debug:n
+%<latexrelease> { \@@_debug_label_data:N \l_@@_work_prop }
%<latexrelease> \tl_set:Nn \l_@@_rear_tl { 0 }
%<latexrelease> \tl_set:cn { \@@_tl_csname:n { 0 } } { 0 }
%<latexrelease> \seq_map_inline:Nn \l_@@_labels_seq
%<latexrelease> {
-%<latexrelease> \int_compare:nNnT { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
-%<latexrelease> {
-%<latexrelease> \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } }{##1}
-%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1}
-%<latexrelease> }
+%<latexrelease> \int_compare:nNnT
+%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
+%<latexrelease> {
+%<latexrelease> \tl_set:cn { \@@_tl_csname:n
+%<latexrelease> { \l_@@_rear_tl } } {##1}
+%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1}
+%<latexrelease> }
%<latexrelease> }
%<latexrelease> \tl_set_eq:Nc \l_@@_front_tl { \@@_tl_csname:n { 0 } }
%<latexrelease> \@@_tl_gclear:N #1
%<latexrelease> \clist_gclear:N #2
-%<latexrelease> \bool_while_do:nn { ! \str_if_eq_p:Vn \l_@@_front_tl { 0 } }
+%<latexrelease> \bool_while_do:nn
+%<latexrelease> { ! \str_if_eq_p:Vn \l_@@_front_tl { 0 } }
%<latexrelease> {
%<latexrelease> \int_decr:N \l_@@_labels_int
-%<latexrelease> \prop_get:NVN \l_@@_work_prop \l_@@_front_tl \l_@@_return_tl
+%<latexrelease> \prop_get:NVN \l_@@_work_prop
+%<latexrelease> \l_@@_front_tl \l_@@_return_tl
%<latexrelease> \exp_args:NNV \@@_tl_gput:Nn #1 \l_@@_return_tl
%<latexrelease> \@@_clist_gput:NV #2 \l_@@_front_tl
-%<latexrelease> \@@_debug:n{ \iow_term:x{Handled~ code~ for~ \l_@@_front_tl} }
-%<latexrelease> \seq_map_inline:cn { \@@_seq_csname:n { \l_@@_front_tl } }
+%<latexrelease> \@@_debug:n{ \iow_term:x
+%<latexrelease> {Handled~ code~ for~ \l_@@_front_tl} }
+%<latexrelease> \seq_map_inline:cn
+%<latexrelease> { \@@_seq_csname:n { \l_@@_front_tl } }
%<latexrelease> {
%<latexrelease> \tl_set:cx { \@@_tl_csname:n {##1} }
-%<latexrelease> { \int_eval:n
-%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: - 1 }
-%<latexrelease> }
+%<latexrelease> { \int_eval:n
+%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: - 1 }
+%<latexrelease> }
%<latexrelease> \int_compare:nNnT
-%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
-%<latexrelease> {
-%<latexrelease> \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } } {##1}
-%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1}
-%<latexrelease> }
+%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
+%<latexrelease> {
+%<latexrelease> \tl_set:cn { \@@_tl_csname:n
+%<latexrelease> { \l_@@_rear_tl } } {##1}
+%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1}
+%<latexrelease> }
%<latexrelease> }
%<latexrelease> \tl_set_eq:Nc \l_@@_front_tl
-%<latexrelease> { \@@_tl_csname:n { \l_@@_front_tl } }
+%<latexrelease> { \@@_tl_csname:n { \l_@@_front_tl } }
%<latexrelease> }
%<latexrelease> \int_compare:nNnF \l_@@_labels_int = 0
%<latexrelease> {
@@ -5747,7 +5839,8 @@
%<latexrelease> \@@_debug_label_data:N \l_@@_work_prop
%<latexrelease> \iow_term:x{====================}
%<latexrelease> }
-%<latexrelease> \exp_args:NNo \@@_tl_gput:Nn #1 { \cs:w @@_toplevel~#3 \cs_end: }
+%<latexrelease> \exp_args:NNo \@@_tl_gput:Nn #1
+%<latexrelease> { \cs:w @@_toplevel~#3 \cs_end: }
%<latexrelease> \@@_tl_gput_right:No #1 { \cs:w @@_next~#3 \cs_end: }
%<latexrelease> }
%<latexrelease>\cs_generate_variant:Nn \@@_tl_gput_right:Nn { No }
@@ -6008,6 +6101,8 @@
%
% \changes{v1.1a}{2023/04/06}
% {Changes to add hook arguments (hook-args).}
+% \changes{v1.1g}{2024/01/03}
+% {Fix expansion of \cs{@@_print_args:nn} argument (gh/1221).}
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_log:nN}
%<latexrelease> {Hooks~with~args}
@@ -6027,7 +6122,7 @@
hook~'#1'
\@@_if_disabled:nF {#1}
{
- \exp_args:Nf \@@_print_args:nn {#1}
+ \exp_args:Nne \@@_print_args:nn {#1}
{
\int_eval:n
{ \str_count:e { \@@_parameter:n {#1} } / 3 }
@@ -6164,7 +6259,8 @@
%<latexrelease> }
%<latexrelease> \@@_preamble_hook:n {#1}
%<latexrelease> \@@_log_cmd:x
-%<latexrelease> { ^^J ->~The~ \@@_if_generic:nT {#1} { generic~ } hook~'#1': }
+%<latexrelease> { ^^J ->~The~ \@@_if_generic:nT
+%<latexrelease> {#1} { generic~ } hook~'#1': }
%<latexrelease> \@@_if_usable:nF {#1}
%<latexrelease> { \@@_log_line:x { The~hook~is~not~declared. } }
%<latexrelease> \@@_if_disabled:nT {#1}
@@ -6177,26 +6273,30 @@
%<latexrelease> { \@@_log_line_indent:x { --- } }
%<latexrelease> {
%<latexrelease> \prop_map_inline:cn { g_@@_#1_code_prop }
-%<latexrelease> { \@@_log_line_indent:x { ##1~->~\tl_to_str:n {##2} } }
+%<latexrelease> { \@@_log_line_indent:x
+%<latexrelease> { ##1~->~\tl_to_str:n {##2} } }
%<latexrelease> }
%<latexrelease> \@@_log_line:x
%<latexrelease> {
%<latexrelease> Document-level~(top-level)~code
%<latexrelease> \@@_if_usable:nT {#1}
-%<latexrelease> { ~(executed~\@@_if_reversed:nTF {#1} {first} {last} ) } :
+%<latexrelease> { ~(executed~
+%<latexrelease> \@@_if_reversed:nTF {#1} {first} {last} ) } :
%<latexrelease> }
%<latexrelease> \@@_log_line_indent:x
%<latexrelease> {
%<latexrelease> \tl_if_empty:cTF { @@_toplevel~#1 }
%<latexrelease> { --- }
-%<latexrelease> { -> ~ \exp_args:Nv \tl_to_str:n { @@_toplevel~#1 } }
+%<latexrelease> { -> ~ \exp_args:Nv \tl_to_str:n
+%<latexrelease> { @@_toplevel~#1 } }
%<latexrelease> }
%<latexrelease> \@@_log_line:x { Extra~code~for~next~invocation: }
%<latexrelease> \@@_log_line_indent:x
%<latexrelease> {
%<latexrelease> \tl_if_empty:cTF { @@_next~#1 }
%<latexrelease> { --- }
-%<latexrelease> { ->~ \exp_args:Nv \@@_log_next_code:n { @@_next~#1 } }
+%<latexrelease> { ->~ \exp_args:Nv \@@_log_next_code:n
+%<latexrelease> { @@_next~#1 } }
%<latexrelease> }
%<latexrelease> \@@_log_line:x { Rules: }
%<latexrelease> \bool_set_true:N \l_@@_tmpa_bool
@@ -6220,7 +6320,8 @@
%<latexrelease> {
%<latexrelease> Execution~order
%<latexrelease> \bool_if:NTF \l_@@_tmpa_bool
-%<latexrelease> { \@@_if_reversed:nT {#1} { ~(after~reversal) } }
+%<latexrelease> { \@@_if_reversed:nT
+%<latexrelease> {#1}{ ~(after~reversal) } }
%<latexrelease> { ~(after~
%<latexrelease> \@@_if_reversed:nT {#1} { reversal~and~ }
%<latexrelease> applying~rules)
@@ -6231,16 +6332,19 @@
%<latexrelease> \@spaces
%<latexrelease> \clist_if_empty:cTF { g_@@_#1_labels_clist }
%<latexrelease> { --- }
-%<latexrelease> { \clist_use:cn { g_@@_#1_labels_clist } { ,~ } }
+%<latexrelease> { \clist_use:cn
+%<latexrelease> { g_@@_#1_labels_clist } { ,~ } }
%<latexrelease> }
%<latexrelease> }
%<latexrelease> {
%<latexrelease> \@@_log_line:x { Execution~order: }
%<latexrelease> #2
%<latexrelease> {
-%<latexrelease> \@spaces Not~set~because~the~hook~ \@@_if_usable:nTF {#1}
+%<latexrelease> \@spaces Not~set~because~the~hook~
+%<latexrelease> \@@_if_usable:nTF {#1}
%<latexrelease> { code~pool~is~empty }
-%<latexrelease> { is~\@@_if_disabled:nTF {#1} {disabled} {undeclared} }
+%<latexrelease> { is~\@@_if_disabled:nTF
+%<latexrelease> {#1} {disabled} {undeclared} }
%<latexrelease> }
%<latexrelease> }
%<latexrelease> }
@@ -6388,7 +6492,8 @@
%<latexrelease>\IncludeInRelease{2020/10/01}{\hook_gput_next_code:nn}
%<latexrelease> {Hooks~with~args}
%<latexrelease>\cs_gset_protected:Npn \hook_gput_next_code:nn #1
-%<latexrelease> { \@@_normalize_hook_args:Nn \@@_gput_next_code:nn {#1} }
+%<latexrelease> { \@@_normalize_hook_args:Nn
+%<latexrelease> \@@_gput_next_code:nn {#1} }
%<latexrelease>\cs_gset_protected:Npn \hook_gput_next_code_with_args:nn #1 #2 { }
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
@@ -6580,7 +6685,8 @@
%<latexrelease> \fi:
%<latexrelease> \cs:w @@~#1 \@@_use_end:
%<latexrelease> }
-%<latexrelease>\cs_new:Npn \@@_use_undefined:w #1 #2 @@~#3 \@@_use_end:
+%<latexrelease>\cs_new:Npn \@@_use_undefined:w
+%<latexrelease> #1 #2 @@~#3 \@@_use_end:
%<latexrelease> {
%<latexrelease> #1 % fi
%<latexrelease> \@@_use:wn #3 / \s_@@_mark {#3}
@@ -6680,15 +6786,18 @@
%
% \changes{v1.0s}{2021/09/28}
% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/675)}
+% \changes{v1.1h}{2024/01/24}
+% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/1243)}
% \begin{macrocode}
%<latexrelease>\cs_new_protected:Npn \@@_try_file_hook:n #1
%<latexrelease> {
-%<latexrelease> \@@_if_file_hook:wTF #1 / \s_@@_mark
+%<latexrelease> \@@_if_file_hook:wTF #1 / / \s_@@_mark
%<latexrelease> {
%<latexrelease> \exp_args:Ne \@@_if_usable_use:n
%<latexrelease> { \exp_args:Ne \@@_file_hook_normalize:n {#1} }
%<latexrelease> }
-%<latexrelease> { \@@_if_usable_use:n {#1} } % file/ generic hook (e.g. file/before)
+%<latexrelease> { \@@_if_usable_use:n {#1} }
+%<latexrelease> % file/ generic hook (e.g. file/before)
%<latexrelease> }
% \end{macrocode}
%
@@ -6726,12 +6835,14 @@
\cs_new_protected:Npn \hook_use_once:n #1
{
\@@_if_execute_immediately:nF {#1}
- { \@@_normalize_hook_args:Nn \@@_use_once:nn { \use:n {#1} } { 0 } }
+ { \@@_normalize_hook_args:Nn \@@_use_once:nn
+ { \use:n {#1} } { 0 } }
}
\cs_new_protected:Npn \hook_use_once:nnw #1 #2
{
\@@_if_execute_immediately:nF {#1}
- { \@@_normalize_hook_args:Nn \@@_use_once:nn { \use:n {#1} } {#2} }
+ { \@@_normalize_hook_args:Nn \@@_use_once:nn
+ { \use:n {#1} } {#2} }
}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
@@ -6743,7 +6854,8 @@
%<latexrelease>\cs_gset_protected:Npn \hook_use_once:n #1
%<latexrelease> {
%<latexrelease> \@@_if_execute_immediately:nF {#1}
-%<latexrelease> { \@@_normalize_hook_args:Nn \@@_use_once:n { \use:n {#1} } }
+%<latexrelease> { \@@_normalize_hook_args:Nn \@@_use_once:n
+%<latexrelease> { \use:n {#1} } }
%<latexrelease> }
%<latexrelease>\cs_gset:Npn \hook_use_once:nnw #1 #2
%<latexrelease> { \use:c { use_none: \prg_replicate:nn {#2} { n } } }
@@ -6768,7 +6880,8 @@
% along with the next execution code.
% \begin{macrocode}
\@@_replacing_args_false:
- \@@_cs_gput_right:nnn { _next } {#1} { \@@_use_once_clear:n {#1} }
+ \@@_cs_gput_right:nnn { _next } {#1}
+ { \@@_use_once_clear:n {#1} }
\@@_replacing_args_reset:
\@@_if_usable:nTF {#1}
{ \@@_use_initialized:n {#1} }
@@ -7215,7 +7328,8 @@
{ Cannot~add~code~to~disabled~hook~'#1'. }
{
The~hook~'#1'~you~tried~to~add~code~to~was~previously~disabled~
- with~\iow_char:N\\hook_disable_generic:n~or~\iow_char:N\\DisableGenericHook,~so~
+ with~\iow_char:N\\hook_disable_generic:n~or~
+ \iow_char:N\\DisableGenericHook,~so~
it~cannot~have~code~added~to~it.
}
% \end{macrocode}
@@ -7383,7 +7497,7 @@
%<latexrelease> {Hooks~with~args}
%<latexrelease>\cs_new_protected:Npn \NewHookWithArguments #1 #2 { }
%<latexrelease>\cs_new_protected:Npn \NewReversedHookWithArguments #1 #2 { }
-%<latexrelease>\cs_new_protected:Npn \NewMirroredHookPairWithArguments #1 #2 #3 { }
+%<latexrelease>\cs_new_protected:Npn \NewMirroredHookPairWithArguments #1 #2 #3{}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
% \end{macro}
@@ -7835,7 +7949,8 @@
%<latexrelease> \exp_args:No \exp_not:o
%<latexrelease> {
%<latexrelease> \cs:w @@#1~#2 \exp_last_unbraced:Ne \cs_end:
-%<latexrelease> { \@@_braced_cs_parameter:n { @@#1~#2 } }
+%<latexrelease> { \@@_braced_cs_parameter:n
+%<latexrelease> { @@#1~#2 } }
%<latexrelease> }
%<latexrelease> }
%<latexrelease> }
diff --git a/macros/latex-dev/base/lthyphen.dtx b/macros/latex-dev/base/lthyphen.dtx
index 88d30c9cca..ae1e2182aa 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-2023
+% Copyright (C) 1993-2024
% 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 a2dc6b873e..25b8dd12e9 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-2023
+% Copyright (C) 1993-2024
% 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 80c36d5cd9..da8340ea9d 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-2023
+% Copyright (C) 2021-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltkeys.dtx}
- [2022/10/22 v1.0l LaTeX Kernel (Keyval options)]
+ [2024/01/13 v1.0m LaTeX Kernel (Keyval options)]
% \iffalse
\documentclass{l3doc}
\GetFileInfo{ltkeys.dtx}
@@ -294,6 +294,7 @@
% \changes{v1.0g}{2022/06/16}{Better handling of option removal}
% \changes{v1.0h}{2022/06/19}{Further work on handling of option removal}
% \changes{v1.0h}{2022/06/20}{Use raw options data}
+% \changes{v1.0m}{2024/01/13}{Trim spaces off key names}
% \begin{macro}{\@@_options_class:nnn}
% \changes{v1.0h}{2022/06/20}{New function}
% \changes{v1.0i}{2022/07/05}{Correct naming of raw class options storage}
@@ -318,7 +319,7 @@
\clist_map_inline:cn { @raw@opt@ \@currname . \@currext }
{
\exp_args:Ne \@@_options_class:nnn
- { \@@_remove_equals:n {##1} }
+ { \tl_trim_spaces:e { \@@_remove_equals:n {##1} } }
{##1} {#1}
}
}
@@ -344,6 +345,7 @@
% \changes{v1.0g}{2022/06/16}{Better handling of option removal}
% \changes{v1.0h}{2022/06/19}{Further work on handling of option removal}
% \changes{v1.0h}{2022/06/20}{Use raw options data}
+% \changes{v1.0m}{2024/01/13}{Trim spaces off key names}
% \begin{macro}{\@@_options_package:nnn}
% \changes{v1.0h}{2022/06/19}{New function}
% For global options when processing a package, the tasks are slightly
@@ -356,7 +358,7 @@
\clist_map_inline:Nn \@raw@classoptionslist
{
\exp_args:Ne \@@_options_package:nnn
- { \@@_remove_equals:n {##1} }
+ { \tl_trim_spaces:e { \@@_remove_equals:n {##1} } }
{##1} {#1}
}
}
diff --git a/macros/latex-dev/base/ltlength.dtx b/macros/latex-dev/base/ltlength.dtx
index 10e4b671c8..c81e6edfb7 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-2023
+% Copyright (C) 1993-2024
% 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 d43df93a54..8d4c25d916 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-2023
+% Copyright (C) 1993-2024
% 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 7589cf36e1..4fc710ba40 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-2023
+% Copyright (C) 1993-2024
% 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 6d274ed5c3..a15019dcd5 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-2023
+% Copyright (C) 2015-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -23,16 +23,22 @@
%<tex> \ProvidesFile\undefined\begingroup\def\ProvidesFile
%<tex> #1#2[#3]{\endgroup\immediate\write-1{File: #1 #3}}
%<tex>\fi
-%<plain>\ProvidesFile{ltluatex.tex}%
-%<*driver>
+%<*dtx>
\ProvidesFile{ltluatex.dtx}
-%</driver>
-%<*tex>
-[2023/08/03 v1.2c
-%</tex>
-%<plain> LuaTeX support for plain TeX (core)
-%<*tex>
+%</dtx>
+%<plain>\ProvidesFile{ltluatex.tex}
+%<*plain>
+% \fi
+% \ProvidesFile{ltluatex.dtx}
+[2024/02/11 v1.2c
+% LaTeX Kernel (LuaTeX support)^^A
+%\iffalse
+%<plain> LuaTeX support for plain TeX (core)%
+%\fi
]
+% \iffalse
+%</plain>
+%<*tex>
\edef\etatcatcode{\the\catcode`\@}
\catcode`\@=11
%</tex>
@@ -541,9 +547,9 @@
\csname globbox\endcsname
% \end{macrocode}
%
-% Define|\e@alloc| as in latex (the existing macros in |etex.src|
+% Define|\e@alloc| as in \LaTeX{} (the existing macros in |etex.src| are
% hard to extend to further register types as they assume specific
-% 26x and 27x count range. For compatibility the existing register
+% 26x and 27x count range). For compatibility the existing register
% allocation is not changed.
%
% \begin{macrocode}
diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf
index ca793006b1..230cb6527a 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 655e71aa4c..2bbd5ea3a0 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 c5ccd21606..e580cd3319 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/ltmarks.dtx b/macros/latex-dev/base/ltmarks.dtx
index 677534dd27..dcfa2fcb27 100644
--- a/macros/latex-dev/base/ltmarks.dtx
+++ b/macros/latex-dev/base/ltmarks.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: ltmarks.dtx
-%% Copyright (C) 2022-2023
+%% Copyright (C) 2022-2024
%% Frank Mittelbach, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
@@ -14,12 +14,14 @@
%
%%% From File: ltmarks.dtx
%
-% \begin{macrocode}
-\def\ltmarksversion{v1.0d}
-\def\ltmarksdate{2022/06/01}
-% \end{macrocode}
%<*driver>
+% \fi
+\ProvidesFile{ltmarks.dtx}
+ [2024/02/11 v1.0e LaTeX Kernel (Marks)]
+% \iffalse
+%
\documentclass{l3doc}
+\GetFileInfo{ltmarks.dtx}
%\usepackage{ltmarks}
@@ -45,7 +47,7 @@
%
%
% \title{The \texttt{ltmarks.dtx} code\thanks{This file has version
-% \ltmarksversion\ dated \ltmarksdate, \copyright\ \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
% Project.}}
% \author{^^A
% Frank Mittelbach, \LaTeX{} Project\thanks
@@ -156,7 +158,7 @@
% \begin{function}{\InsertMark,\mark_insert:nn}
% \begin{syntax}
% \cs{InsertMark} \Arg{class} \Arg{text}
-% \cs{mark_insert:nn} \Arg{class} \Arg{text}
+% \cs{mark_insert:nn} \Arg{class} \Arg{text}
% \end{syntax}
% Adds a mark to the current galley for the \meta{class}, containing the
% \meta{text}.
@@ -299,6 +301,8 @@
% \emph{true}; if a declared and an undeclared mark class is used
% it is always \emph{false}.}
%
+% \subsection{Use cases for conditionals}
+%
% However, the basic version is enough for the following typical use cases:
% \begin{description}
% \item[Test for at most one mark of class \texttt{myclass} on current
@@ -353,7 +357,7 @@
% \begin{function}{\DebugMarksOn,\DebugMarksOff,
% \mark_debug_on:,\mark_debug_off:}
% \begin{syntax}
-% \cs{DebugMarksOn} ... \cs{DebugMarksOff}
+% \cs{DebugMarksOn} \ldots\ \cs{DebugMarksOff}
% \end{syntax}
%
% Commands to turn the debugging of mark code on or off. The
@@ -397,8 +401,8 @@
%
% \begin{function}{\markboth, \markright}
% \begin{syntax}
-% \cs{markboth} \Arg{left} \Arg{right}
-% \cs{markright} \Arg{right}
+% \cs{markboth} \Arg{left} \Arg{right}
+% \cs{markright} \Arg{right}
% \end{syntax}
% \LaTeXe{} uses two marks which aren't fully independent. A
% \enquote{left} mark generated by the first argument of \cs{markboth}
@@ -610,9 +614,9 @@
% marks. It too is called as part of \cs{@opcol}.
% \end{function}
%
-% \begin{function}{\@@_update_structure:nn}
+% \begin{function}{\@@_update_structure_from_material:nn}
% \begin{syntax}
-% \cs{@@_update_structure:nn} \Arg{region} \Arg{material with marks}
+% \cs{@@_update_structure_from_material:nn} \Arg{region} \Arg{material with marks}
% \end{syntax}
% Helper function that inspects the marks
% inside the second argument and assigns new mark values based on
@@ -627,8 +631,8 @@
% \texttt{page} and \texttt{column} because only they have
% \texttt{previous-...} counterparts.
%
-% Another important part to keep in mind is that marks are only
-% recognized if they appear on top-level, e.g., if we want to
+% Another important aspect to keep in mind is that marks are recognized
+% only if they appear on the top level, e.g., if we want to
% process material stored in boxes we need to put it unboxed (using
% \cs{unvcopy} etc.)\ into the second argument.
% \end{function}
@@ -642,7 +646,7 @@
% Helper function that copies all mark values in the \meta{source}
% region to \meta{alias}, i.e., make the structures identical. Used
% to update the \texttt{previous-...} structures inside
-% \cs{@@_update_structure:nn} and \texttt{first-column} and
+% \cs{@@_update_structure_from_material:nn} and \texttt{first-column} and
% \texttt{last-column} structures inside
% \cs{@@_update_singlecol_structures:} or
% \cs{@@_update_dblcol_structures:}.
@@ -650,7 +654,6 @@
%
%
%
-%
% \begin{function}{\@@_update_structure_to_err:n}
% \begin{syntax}
% \cs{@@_update_structure_to_err:n} \Arg{region}
@@ -662,6 +665,37 @@
% \end{function}
%
%
+% \begin{function}{\@@_get_marks_for_reinsertion:nNN}
+% \begin{syntax}
+% \cs{@@_get_marks_for_reinsertion:nNN} \Arg{source}
+% \qquad \meta{token-list-var for collecting first marks}
+% \qquad \meta{token-list-var for collecting last marks}
+% \end{syntax}
+% Helper function for extracting marks that would otherwise get
+% lost, for example when they are hidden inside a box. This helper
+% does not update mark structures and can therefore be used outside
+% the output routine as well.
+%
+% It collect all the top-level marks from inside the \meta{source}
+% and adds suitable \cs{mark_insert:nn} in the two token
+% lists. These token lists can then be executed at the right place
+% to reinsert the marks, e.g., directly after the box. This is, for
+% example, used by \pkg{multicol} when a short balanced
+% \env{multicols} is returned to the galley for typesetting.
+%
+% If the \meta{source} consists of a single vertical box (plus
+% possibly followed by some glue but nothing else) then the box is
+% unpacked and the top-level marks are collected from its
+% content. However, if it is not a vertical box or there are are
+% other data then nothing is unpacked and you have to do the
+% unpacking yourself to get at the marks inside.
+%
+% It is quite likely that one only needs a single token list for
+% returning the \cs{mark_insert:nn} statements. If that is the case
+% this command may change to take only two arguments.
+% \end{function}
+%
+%
%
% ^^A \end{documentation}
%
@@ -703,12 +737,13 @@
%
%
% \begin{macro}{\mark_new_class:n,\@@_new_class:nn}
+%
% A mark class is created by initializing a number of data
-% structures. First, we get a register number to refer to the mark class.
-% The new mark class is then added to the \cs{g_@@_classes_seq}
-% sequence to be able to easily loop over all classes. Finally a
-% number of top-level global token lists are declared that hold
-% various versions of the mark for access.
+% structures. First, we get a register number to refer to the mark
+% class. The new mark class is then added to the
+% \cs{g_@@_classes_seq} sequence to be able to easily loop over all
+% classes. Finally a number of top-level global token lists are
+% declared that hold various versions of the mark for access.
% \begin{macrocode}
\cs_new_protected:Npn \mark_new_class:n #1
{
@@ -784,57 +819,74 @@
% \subsection{Updating mark structures}
%
%
-% \begin{macro}{\l_@@_box,\g_@@_tmp_tl,\g_@@_new_top_tl}
-% For some operations we need a temporary private box and two
+% \begin{macro}{\l_@@_box,\l_@@_ii_box,\g_@@_tmp_tl,\g_@@_new_top_tl}
+% For some operations we need two temporary private boxes and two
% private global token lists.
% \begin{macrocode}
\box_new:N \l_@@_box
+\box_new:N \l_@@_ii_box
\tl_new:N \g_@@_tmp_tl
\tl_new:N \g_@@_new_top_tl
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\@@_update_structure:nn}
-%
-% This function updates the mark structures. The first argument is
-% the region to update and second argument receives the material
-% that holds the marks. Out of this material we extract the first
-% and last marks for all classes (if there are any) to do the
-% assignments.
%
+% \begin{macro}{\@@_extract_and_handle_marks:nn}
+% \changes{v1.0e}{2024/01/29}{Macro added}
+%
+% This is the main macro to extract and handle marks inside some
+% vertical material. It is used by
+% \cs{@@_update_structure_from_material:nn} (for updating the mark
+% structure for a region based on the marks found) and by
+% \cs{@@_get_marks_for_reinsertion:nNN} (for extracting marks from
+% some material and prepare for reinserting them later (e.g., out
+% of a box that is placed as a box into the main galley).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_update_structure:nn #1#2
- {
+\cs_new_protected:Npn \@@_extract_and_handle_marks:nn #1#2 {
% \end{macrocode}
-% First thing we do is copying the current structure to
-% \texttt{previous-...}; this leaves the current structure
-% untouched so we can update it class by class (which is necessary).
+% This macro expects code to handle extracted marks in its first argument and
+% vertical material (not boxed or just consisting of a single
+% vertical box) as its second. It
+% extracts top-level mark information from \verb/#2/, stores them
+% as split marks and then calls
+% \verb/#1/ to make use of this information.
+%
+% If it finds a forced break in the material it removes it and then
+% restarts the attempt without it.
+%
+% We start with a group to keep most changes local.
% \begin{macrocode}
- \@@_update_structure_alias:nn { previous-#1 } {#1}
+ \group_begin:
% \end{macrocode}
+%
% Getting the first and last marks out of the material in \verb=#2=
-% is done by putting the material in a box and then doing a
-% split operation to the maximum size possible (which hopefully
-% means all of the content).\footnote{We could verify this, maybe we
-% should.} Because this is an action only for the sake of getting
-% at the mark values we don't want any underfull
-% box warnings so we turn those (locally) off.
+% is done by putting the material in a box and then doing a split
+% operation to the maximum size possible (which hopefully gets us
+% all of the content).\footnote{With normal column material cut
+% from the main galley we should always get all material in one go,
+% but in certain situations, for example, in a \pkg{multicols}
+% environment that contains some \cs{columnbreak}s a single split
+% operation will not be enough. Thus, this is something we need to
+% handle.} Because this action is used only to get the mark
+% values, we don't want any underfull box warnings so we (locally)
+% turn those off.
+%
% \begin{macrocode}
- \group_begin:
\dim_set_eq:NN \tex_splitmaxdepth:D \c_max_dim
\int_set_eq:NN \tex_vbadness:D \c_max_int
\dim_set_eq:NN \tex_vfuzz:D \c_max_dim
% \end{macrocode}
-% There is a further complication: if the region contains infinite
+%
+% There is a further complication: if the material contains infinite
% shrinking glue then a \tn{vsplit} operation will balk with a
-% low-level error. Now pages or columns, which are our main concern here, can't
-% have such infinite shrinkage if they are cut straight from the
-% galley, however the use of \tn{enlargethispage} actually does add
-% some at the very bottom (and also wraps the whole page into a box
-% by itself, so if we leave it this way then a) we get this error
-% and b) we don't see any marks because they are hidden one level
-% down).
+% low-level error. Now pages or columns, which are our main concern
+% here, can't have such infinite shrinkage if they are cut straight
+% from the galley, however the use of \tn{enlargethispage} actually
+% does add some at the very bottom (and also wraps the whole page
+% into a box by itself, so if we leave it this way then a) we get
+% this error and b) we don't see any marks because they are hidden
+% one level down).
%
% Another possible issue are packages or user code that place stray
% \tn{vbox}es directly into the main galley (an example is
@@ -842,93 +894,236 @@
% boxes end up as the last item on the page we should not unpack
% them.
%
-% We therefore do an \tn{unskip} to get rid of that glue if present and
-% also check if we have then a \tn{vbox} as the last item and if so
-% unpack that too, but only under certain conditions, see
-% below. All this is temporary, just for getting the
-% marks out, so it doesn't affect the final page production.
-%
-% In fact, we go one step further and set the box to a large
-% negative height possible and afterwards take a look at the
-% reported badness: if it is zero we know that there has still been
-% infinite shrinkage in the box so that we can't do a
-% \tn{vsplit}. If that is the case we generate an error message and
-% bypass extracting the marks. We use only half of \cs{c_max_dim}
-% because otherwise \TeX{} will report an overfull vbox despite our
-% setting of \cs{tex_vfuzz:D}. This test will not find existing
-% infinite shrinkage in all cases, e.g., if there are several glues
-% that cancel each other, but it is the best we can do.
-% \begin{macrocode}
- \vbox_set_to_ht:Nnn \l_@@_box { -.5\c_max_dim }
- {
- #2
- \tex_unskip:D
- \box_set_to_last:N \l_@@_box
+% All these issues need to be handled, which is done in
+% \cs{@@_prepare_and_extract:nn}.
+%
+% \begin{macrocode}
+ \@@_prepare_and_extract:nn {#1} {#2}
+% \end{macrocode}
+% Once all mark classes have been processed, the data structures are
+% updated and we can close the group, which undoes our local
+% changes and retains only the global ones.
+% \begin{macrocode}
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_prepare_and_extract:nn}
+%
+% This macro does the dirty work. It is not directly integrated in
+% \cs{@@_extract_and_handle_marks:nn} because we may have to call
+% it recursively if we find forced breaks.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_prepare_and_extract:nn #1#2 {
+% \end{macrocode}
+%
+% To handle the \cs{enlargethispage} case we do an \tn{unskip} to
+% get rid of any glue that is present at the very end of the material
+% and also check if we have then a \tn{vbox} as the last item and
+% if so unpack that too, but only under certain conditions, see
+% below. All this is temporary done in a group, just for getting
+% the marks out, so it doesn't affect the final page production.
+%
+% \begin{macrocode}
+ \vbox_set:Nn \l_@@_box
+ {
+ #2
+ \tex_unskip:D
+ \box_set_to_last:N \l_@@_box
% \end{macrocode}
% After having removed the last box from the current list (if there
-% was one)
-% we check if the list is now empty. If not, the the last box is
-% definitely not the one from \tn{enlargethispage} and so we can
-% and should leave it alone. Otherwise we check if this last box is
-% a \tn{vbox}.
+% was one) we check whether the vertical list is now empty. If not,
+% then the last box is definitely not the one from
+% \tn{enlargethispage} and so we can, and should, leave it
+% alone. Otherwise we check if this last box is a \tn{vbox}.
% \changes{v1.0d}{2022/06/01}{Extend the logic for detecting the marks
% in the box (gh/836)}
% \begin{macrocode}
- \int_compare:nNnT \tex_lastnodetype:D < 0
- {
- \box_if_vertical:NT \l_@@_box
- {
-% \end{macrocode}
-% If it is we do a further test and reset the \cs{l_@@_box}
-% to check if it contains infinitely shrinkable glue.
-% \begin{macrocode}
- \vbox_set_to_ht:Nnn \l_@@_box { -.5\c_max_dim }
- {
- \vbox_unpack:N \l_@@_box
- \tex_kern:D \c_zero_dim % ensure that box
- % is not empty
- }
+ \int_compare:nNnT \tex_lastnodetype:D < 0
+ {
+ \box_if_vertical:NT \l_@@_box
% \end{macrocode}
-% If not, then we unpack it, if yes we still ignore it for the process of
-% mark extraction. We do not generate an error though, because in all
-% likelihood this is an ordinary box like a marginal that does
-% contain something like \tn{vss}.
+% If it is, we unpack the box.
% \begin{macrocode}
- \int_compare:nNnT \tex_badness:D > 0
- { \vbox_unpack:N \l_@@_box }
- }
- }
+ { \vbox_unpack:N \l_@@_box }
+ }
% \end{macrocode}
% If it wasn't a vbox, it was either an hbox or there was no box.
% Given that we are only interested in the marks we don't need put
-% it back in that case. However, we have to make sure that the
-% outer box under construction
-% is not totally empty (which it might have been from the start, or
-% now), because \TeX{} does not report a badness for empty boxes
-% and that means our test would incorrectly conclude that we have
-% infinite shrinking glue. A simple \tn{kern} is enough to avoid
-% this (the same was already done above).
-% \begin{macrocode}
- \tex_kern:D \c_zero_dim
- }
- \int_compare:nNnTF \tex_badness:D > 0
+% it back in that case.
+% \begin{macrocode}
+ }
% \end{macrocode}
-% If the box had no infinite shrinkage (or rather if our test
-% didn't show any) we vsplit it. Note that it
-% doesn't matter that we set it to this strange size first. If there
-% was infinite shrinkage after all, we end up with a low-level
-% \TeX{} error, but if there is, it is a coding error and needs
-% correcting.
+% We are now ready to \cs{vsplit} the box to get at the marks. If
+% the box contains some infinite negative glue the \TeX{} will
+% produce an error complaining about it but it will correctly find
+% the the split marks. Given that we can't prevent that error, we
+% hide it from the user and ensure that \TeX{} doesn't stop. The
+% error message still shows in the log, but even that is mitigated
+% as best as possible---see the definition of
+% \cs{@@_vbox_set_split_to_maxdimen:NN} for the tricks employed.
% \begin{macrocode}
- {
- \vbox_set_split_to_ht:NNn \l_@@_box \l_@@_box \c_max_dim
+ \@@_vbox_set_split_to_maxdimen:NN \l_@@_ii_box \l_@@_box
+% \end{macrocode}
+% After splitting we check if there is anything left in
+% \cs{l_@@_box}. If not then the above split has set some split marks
+% that we can then use to finish the extraction:
+% \begin{macrocode}
+ \box_if_empty:NTF \l_@@_box
+ { #1 }
+% \end{macrocode}
+% If we have a remainder after the split then this means that there
+% was some forced break in the material. We get rid of that by
+% combining the content of the two boxes and restart.
+% \begin{macrocode}
+ {
+%<*trace>
+ \@@_debug:n { \iow_term:x
+ { Marks:~ mark~ extraction~needs~ recursion~
+ \msg_line_context: } }
+%</trace>
+ \@@_prepare_and_extract:nn {#1}
+ { \vbox_unpack:N \l_@@_ii_box
+ \vbox_unpack:N \l_@@_box }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_vbox_set_split_to_maxdimen:NN}
+%
+% Split a box to get at its marks without pausing even if \TeX{} is
+% producing an error message because of infinite negative glue in
+% the box. If there is such an error we ensure that it only shows
+% up in the log but not on the terminal.
+%
+% The nice low-level hack by DPC records in the \texttt{.log} that a glue
+% shrinkage error is harmless.
+%
+% We disguise \cs{c_max_dim} in an odd looking csname, which then
+% shows up as part of the display of an error message if that error
+% happens. This csname forms part of the error diplay so what
+% you get is something like
+%\begin{verbatim}
+% ! Infinite glue shrinkage found in box being split.
+% <argument> Infinite shrink error above ignored !
+% l. ... }
+%\end{verbatim}
+% which hopefully makes it clear that the error is harmless and
+% and should be ignored by the reader of the \texttt{.log}.
+% \begin{macrocode}
+\cs_set_eq:cN {Infinite~shrink~error~above~ignored~!}\c_max_dim
+% \end{macrocode}
+%
+% The whole definition of \cs{@@_vbox_set_split_to_maxdimen:NN}
+% below is fully expanded, so we have to use a lot of
+% \cs{exp_not:N} commands to prevent expansion where necessary.
+% \begin{macrocode}
+\cs_new_protected:Npx \@@_vbox_set_split_to_maxdimen:NN #1#2 {
+% \end{macrocode}
+% We start by saving the current interaction and escape char settings.
+% \begin{macrocode}
+ \tl_set:Ne \exp_not:N \l_@@_saved_parameters_tl
+ {
+ \tex_interactionmode:D
+ \exp_not:N \int_use:N \tex_interactionmode:D \scan_stop:
+ \tex_escapechar:D
+ \exp_not:N \int_use:N \tex_escapechar:D \scan_stop:
+ }
+% \end{macrocode}
+% Then we change them so that no escape char is printed in the
+% error message (accounts for the missing backslash in front of
+% \verb/Infinite shrink .../) and we set the interaction to
+% \cs{nonstopmode} so that the the error (if any) just goes into
+% the \texttt{.log} file and \TeX{} doesn't stop at that point.
+% \begin{macrocode}
+ \tex_escapechar:D -1 \scan_stop:
+ \tex_interactionmode:D 0 \scan_stop:
+% \end{macrocode}
+% Then we do the splitting of the box to \cs{c_max_dim} to get at
+% the marks. This may generate the error we are worried about,
+% i.e., if the box contains infinite negative glue. However, \TeX{}
+% makes this glue finite and continues, which means we get our split
+% marks which is really all we care about.
+% \begin{macrocode}
+ \tex_setbox:D #1 \tex_vsplit:D #2 to
+% \end{macrocode}
+% The \cs{use:n} may seem pointless, and it is to some extent, but
+% we need it to get our disguised \cs{c_max_dim} displayed
+% properly as part of the error message if there is one. Without
+% it, the display would show only part of what we want it to show
+% (try it).
+% \begin{macrocode}
+ \exp_not:N \use:n {
+ \use:c{Infinite~shrink~error~above~ignored~!}
+ }
+% \end{macrocode}
+% Finally, we change the escape char and the interaction mode back
+% to what it was before:
+% \begin{macrocode}
+ \exp_not:N \l_@@_saved_parameters_tl
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\l_@@_saved_parameters_tl}
+% The temporary variable used for resetting escape char and
+% interaction mode.
+% \begin{macrocode}
+\tl_new:N \l_@@_saved_parameters_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_update_structure_from_material:nn}
+%
+% \changes{v1.0e}{2024/01/29}{Macro renamed}
+%
+% This function updates the mark structures of a region. The first
+% argument is the region to update and second argument receives the
+% material that holds the marks. Out of this material we extract
+% the first and last marks for all classes (if there are any) to do
+% the assignments.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_update_structure_from_material:nn #1#2 {
+ \@@_extract_and_handle_marks:nn
+% \end{macrocode}
+%
+% Once the marks can be extracted we update the structure from the
+% split marks (code in \cs{@@_update_structure_from_splitmarks:n}).
+% \begin{macrocode}
+ { \@@_update_structure_from_splitmarks:n {#1} }
+ { #2 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_update_structure_from_splitmarks:n}
+% This macro is called after we have done a \cs{tex_vsplit:D}
+% operation and the mark data is in the split marks.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_update_structure_from_splitmarks:n #1 {
+% \end{macrocode}
+%
+% The first thing we do is to copy the current region structure to
+% \texttt{previous-...}; this leaves the current structure
+% untouched so we can update it class by class (which is necessary).
+% \begin{macrocode}
+ \@@_update_structure_alias:nn { previous-#1 } {#1}
% \end{macrocode}
% After this action we can get first and last marks of the various
% classes through \cs{tex_splitfirstmarks:D} and
% \cs{tex_splitbotmarks:D}. So now we loop over all classes stored in
% \cs{g_@@_classes_seq}.
% \begin{macrocode}
- \seq_map_inline:Nn \g_@@_classes_seq
+ \seq_map_inline:Nn \g_@@_classes_seq
{
% \end{macrocode}
% First action: get the last mark from the previous region, i.e.,
@@ -950,14 +1145,14 @@
\tl_gset:No \g_@@_tmp_tl
{ \tex_splitbotmarks:D \use:c { c_@@_class_##1_mark } }
% \end{macrocode}
-% If this mark doesn't exist then obviously first mark does
-% neither, so both become the last mark from the previous region. We
+% If this mark doesn't exist then obviously neither does the first mark,
+% so both become the last mark from the previous region. We
% have to be a little careful here: something like
% \verb=\mark_insert:nn{foo}{}= adds an \enquote{empty} mark that should
% not be confused with no mark at all. But no mark in our material
% will result in \cs{g_@@_tmp_tl} being fully empty. This is why we
% have to make sure that \enquote{empty} from \cs{mark_insert:nn} only
-% appears to be empty but fails the next test (see below how this
+% appears to be empty when typeset but fails the next test (see below how this
% is done).
% \begin{macrocode}
\tl_if_empty:NTF \g_@@_tmp_tl
@@ -987,29 +1182,144 @@
}
}
}
- }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_get_marks_for_reinsertion:nNN}
+%
+% This function extracts the marks from the material in the first
+% argument but it does not update any the mark structures. Instead,
+% it collects the marks in the token lists given as the second and
+% third argument, in such a way that they can be reinserted by just
+% executing the token lists.\footnote{It is probably enough to
+% collect everything in a single token list as long as we put the
+% first marks first and the last marks last). But for extra
+% flexibility, I currently use 2 token lists. This might change when it is
+% really clear that this is never needed.}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_get_marks_for_reinsertion:nNN #1#2#3 {
% \end{macrocode}
-% If the badness was zero (we actually tested for${}>0$ but it
-% can't get negative) then we had infinite shrinkage, so we report
-% that and set all marks to the value the last mark had before.
+% First we clear the temporary token lists as we haven't seen any marks yet.
% \begin{macrocode}
- {
- \msg_error:nnn { mark } { infinite-shrinkage } {#1}
- \seq_map_inline:Nn \g_@@_classes_seq
+ \tl_clear:N \g_@@_first_marks_tl
+ \tl_clear:N \g_@@_last_marks_tl
+% \end{macrocode}
+% Then we extract all top-level marks, thereby filling the token lists
+% with suitable \cs{mark_insert:nn} calls.
+% \begin{macrocode}
+ \@@_extract_and_handle_marks:nn
+% \end{macrocode}
+% The first argument holds the code for fill the token lists and
+% the second is the material we extract from.
+% \begin{macrocode}
+ \@@_get_from_splitmarks:
+ { #1 }
+% \end{macrocode}
+%
+% Finally, we copy the updated (or not updated) temporary token
+% lists to the two that have been supplied when the function was
+% called. By convention \enquote{get} operations return their
+% values in local variables and \cs{@@_extract_and_handle_marks:nn}
+% runs in a group, which is why we have to use global temporary
+% variables for collecting.
+% \begin{macrocode}
+ \tl_set_eq:NN #2 \g_@@_first_marks_tl
+ \tl_set_eq:NN #3 \g_@@_last_marks_tl
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_get_from_splitmarks:}
+% This function is called after we have done a \cs{vsplit} to
+% update the split marks. It loops through all mark classes to find
+% out if there are marks for this class and if so updates the
+% global tls used for collecting.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_get_from_splitmarks: {
+ \seq_map_inline:Nn \g_@@_classes_seq
{
- \tl_gset_eq:cc { g_@@_#1_top_ ##1_tl }
- { g_@@_#1_last_ ##1_tl }
- \tl_gset_eq:cc { g_@@_#1_first_##1_tl }
- { g_@@_#1_last_ ##1_tl }
+% \end{macrocode}
+% First we to get the last mark for the current class from the
+% material supplied.
+% \begin{macrocode}
+ \tl_gset:No \g_@@_tmp_tl
+ { \tex_splitbotmarks:D \use:c { c_@@_class_##1_mark } }
+% \end{macrocode}
+%
+% If this mark doesn't exist then obviously first mark doesn't
+% either, so we do nothing (other than issuing some debugging
+% info).
+
+% We have to be a little careful here: something like
+% \verb=\mark_insert:nn{foo}{}= adds an \enquote{empty} mark that
+% we should not confuse with the case where there is no mark at
+% all.
+%
+% When there is no mark at all we get a truly empty
+% \cs{g_@@_tmp_tl} as a result. This is why we have to make sure
+% that an \enquote{empty} mark generated with \cs{mark_insert:nn}
+% only appears to be empty when it is typeset, but fails the next
+% test (see below how this is done).
+% \begin{macrocode}
+ \tl_if_empty:NTF \g_@@_tmp_tl
+ {
+%<*trace>
+ \@@_debug:n { \iow_term:x { Marks:~no~ marks~
+ for~ class~ '##1'~\msg_line_context: } }
+%</trace>
+ }
+% \end{macrocode}
+%
+% If it wasn't empty, i.e., if it had a real value then we use this
+% value for our new last mark instead. This means we put an
+% appropriate \cs{mark_insert:nn} statement into
+% \cs{g_@@_last_marks_tl}.
+% \begin{macrocode}
+ {
+%<*trace>
+ \@@_debug:n { \iow_term:x { Marks:~ extract~ last~
+ mark~ for~ class~ '##1'~ =~ \g_@@_tmp_tl } }
+%</trace>
+ \tl_gput_right:Ne \g_@@_last_marks_tl
+ { \mark_insert:nn {##1} { \g_@@_tmp_tl } }
+% \end{macrocode}
+% Because we had a last mark we also have a first mark (which might
+% be the same, but might not be), so we pick that up and add it to
+% the \cs{g_@@_first_marks_tl} token list. This explains why we
+% first checked for the last mark because that makes the processing
+% faster in case there is none.
+% \begin{macrocode}
+%<*trace>
+ \@@_debug:n { \iow_term:x { Marks:~ extract~ first~
+ mark~ for~ class~ '##1'~ =~
+ \tex_splitfirstmarks:D
+ \use:c { c_@@_class_##1_mark }
+ } }
+%</trace>
+ \tl_gput_right:Ne \g_@@_first_marks_tl
+ { \mark_insert:nn {##1}
+ {
+ \tex_splitfirstmarks:D
+ \use:c { c_@@_class_##1_mark }
+ }
+ }
+ }
}
- }
+}
% \end{macrocode}
-% Once all mark classes have been processed the data structures are
-% updated and we can close the group which undoes our local
-% changes and retains only the global ones.
+% \end{macro}
+%
+%
+% \begin{macro}{\g_@@_first_marks_tl,\g_@@_last_marks_tl}
+% These are two global temporary variables used in the code above.
% \begin{macrocode}
- \group_end:
- }
+\tl_new:N \g_@@_first_marks_tl
+\tl_new:N \g_@@_last_marks_tl
% \end{macrocode}
% \end{macro}
%
@@ -1158,7 +1468,7 @@
% To retrieve the first, last or top region mark, we grab the
% appropriate value stored in the corresponding token list variable
% and pass its contents back. These functions should be used only
-% in output routines after \cs{@@_update_structure:nn} has acted,
+% in output routines and only after \cs{@@_update_structure_from_material:nn} has acted,
% otherwise their value will be wrong.
%
% If used with an unknown class or region they generate an error
@@ -1207,7 +1517,7 @@
%
% \subsection{Messages}
%
-% Mark errors are LaTeX kernel errors:
+% Mark errors are \LaTeX{} kernel errors:
% \changes{v1.0d}{2022/06/01}{Marks are kernel errors}
% \begin{macrocode}
\prop_gput:Nnn \g_msg_module_type_prop { mark } { LaTeX }
@@ -1247,17 +1557,7 @@
}
% \end{macrocode}
%
-% \begin{macrocode}
-\msg_new:nnnn { mark } { infinite-shrinkage }
- { Infinite~shrinkage~found~in~'#1'. }
- {
- \c__msg_coding_error_text_tl
- The~mark~region~'#1'~contains~some~infinite~negative~glue~
- allowing~it~to~shrink~to~an~arbitrary~size.~
- This~makes~it~impossible~to~split~the~region~apart~to~
- get~at~its~marks.~They~are~lost.
- }
-% \end{macrocode}
+%
%
%
%
@@ -1358,7 +1658,7 @@
%
%
% \begin{macro}{\@@_status:n}
-% Show all mark class values across all regions.
+% Show a snapshot of all mark class values across all regions.
% \begin{macrocode}
\cs_new_protected:Npn \@@_status:n #1
{
@@ -1370,6 +1670,22 @@
% \end{macro}
%
%
+% \begin{macro}{\ShowMarksAt}
+% \changes{v1.0e}{2024/01/29}{Macro added}
+% Debugging helper that displays a snapshot of all known mark
+% structures. The argument is a text string that is
+% displayed to help identifying when the snapshot was made.
+%
+% This may not stay like this (or at all), which is why it isn't
+% yet documented as an official command.
+% \begin{macrocode}
+\cs_new_protected:Npn \ShowMarksAt #1 {
+%<*trace>
+ \@@_debug:n { \@@_status:n {#1} }
+%</trace>
+}
+% \end{macrocode}
+% \end{macro}
%
%
% \subsection{Designer-level interfaces}
@@ -1425,9 +1741,9 @@
%
%
%
-% \section{\LaTeXe{} integration}
+% \section{\LaTeXe{} integration}
%
-% \subsection{Core \LaTeXe{} integration}
+% \subsection{Core \LaTeXe{} integration}
%
% \begin{macro}{\@@_update_singlecol_structures:}
% This command updates the mark structures if we are producing a
@@ -1445,11 +1761,11 @@
% \begin{macrocode}
\box_if_vertical:NTF \@outputbox
{
- \@@_update_structure:nn {page}
+ \@@_update_structure_from_material:nn {page}
{ \vbox_unpack:N \@outputbox }
}
{
- \@@_update_structure:nn {page}
+ \@@_update_structure_from_material:nn {page}
{ \hbox_unpack:N \@outputbox }
}
% \end{macrocode}
@@ -1489,11 +1805,11 @@
% \begin{macrocode}
\box_if_vertical:NTF \@outputbox
{
- \@@_update_structure:nn {column}
+ \@@_update_structure_from_material:nn {column}
{ \vbox_unpack:N \@outputbox }
}
{
- \@@_update_structure:nn {column}
+ \@@_update_structure_from_material:nn {column}
{ \hbox_unpack:N \@outputbox }
}
% \end{macrocode}
@@ -1583,17 +1899,26 @@
%<@@=>
% \end{macrocode}
%
-% \begin{macro}[int]{\@expl@@@mark@update@singlecol@structures@@,
-% \@expl@@@mark@update@dblcol@structures@@}
+% \begin{macro}[int]{\@expl@@@mark@update@singlecol@structures@@}
% \begin{macrocode}
\cs_new_eq:NN \@expl@@@mark@update@singlecol@structures@@
\__mark_update_singlecol_structures:
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}[int]{\@expl@@@mark@update@dblcol@structures@@}
+% \begin{macrocode}
\cs_new_eq:NN \@expl@@@mark@update@dblcol@structures@@
\__mark_update_dblcol_structures:
% \end{macrocode}
% \end{macro}
%
-% \subsection{Other \LaTeXe{} output routines}
+%
+%
+%
+% \subsection{Other \LaTeXe{} output routines}
%
% This section will cover \pkg{multicol} and other packages altering
% or providing their own output routine. Not done yet.
@@ -1601,6 +1926,9 @@
%
%
%
+% \subsection{Rollback information}
+%
+%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{0000/00/00}{ltmarks}%
%<latexrelease> {Undo~Marks~handling}
@@ -1609,7 +1937,7 @@
% We keep the interface commands around even if we roll back in
% case they are used in packages that don't roll back. Not likely
% to do a lot of good, but then there is not much we can do, but
-% this at least then doesn't give errors.
+% this at least they won't give unknown csname errors.
% \begin{macrocode}
%<latexrelease>\DeclareRobustCommand \NewMarkClass[1]{}
%<latexrelease>\DeclareRobustCommand \InsertMark[2]{}
diff --git a/macros/latex-dev/base/ltmath.dtx b/macros/latex-dev/base/ltmath.dtx
index 3b1518dd2e..b40faa8a80 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltmeta.dtx b/macros/latex-dev/base/ltmeta.dtx
index daaa71626b..1e4bdaed2c 100644
--- a/macros/latex-dev/base/ltmeta.dtx
+++ b/macros/latex-dev/base/ltmeta.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: ltmeta.dtx
-%% Copyright (C) 2021-2023
+%% Copyright (C) 2021-2024
%% Frank Mittelbach, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
@@ -13,13 +13,14 @@
%
%
%%% From File: ltmeta.dtx
-%
-% \begin{macrocode}
-\def\ltmetaversion{v1.0b}
-\def\ltmetadate{2022/05/18}
-% \end{macrocode}
%<*driver>
+% \fi
+\ProvidesFile{ltmeta.dtx}
+ [2024/02/11 v1.0b LaTeX Kernel (Document Metadata)]
+% \iffalse
+%
\documentclass{l3doc}
+\GetFileInfo{ltmeta.dtx}
% Fixing footnotes in functions and variables: this should be in l3doc!
@@ -43,7 +44,7 @@
%
%
% \title{The \texttt{ltmeta.dtx} code\thanks{This file has version
-% \ltmetaversion\ dated \ltmetadate, \copyright\ \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
% Project.}}
% \author{Frank Mittelbach}
%
diff --git a/macros/latex-dev/base/ltmiscen.dtx b/macros/latex-dev/base/ltmiscen.dtx
index 74a9685f1f..accdac24b2 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmiscen.dtx}
- [2023/09/13 v1.2c LaTeX Kernel (Misc. Environments)]
+ [2024/02/08 v1.2c LaTeX Kernel (Misc. Environments)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltmiscen.dtx}
@@ -509,8 +509,8 @@
% endings are converted to spaces by \TeX{} during that process.
%
% However, especially the \texttt{.toc} file might be read in L-R mode
-% (in cases the \cs{tableofcontents} attempts to put, say a list of
-% sub-sections as a paragraph. In that case the newlines after a line
+% (in cases the \cs{tableofcontents} attempts to put, say, a list of
+% sub-sections as a paragraph). In that case the newlines after a line
% like
% \begin{verbatim}
% \contentsline {subsubsection}{\numberline {1.1.1}A C-head}{2}
@@ -520,9 +520,9 @@
%
% That could be fixed by reading in the file using
% \cs{endlinechar}\texttt{=-1} but that has the danger that it drops
-% some valid endlines that should be converted to spaces (for example
+% some valid endlines that should be converted to spaces (for example,
% when the user edited the TOC and then used \cs{nofiles} to preserve
-% it.
+% it).
%
% So the approach taken instead is this:
% \begin{itemize}
@@ -1604,7 +1604,7 @@
% ``\verb=!~!foo='' in the output.
% To avoid this scenario we check if \verb=#1= has the character
% code of a space, if so we recurse otherwise we call \cs{@@sverb}
-% (which is the original definition of \cs{@sverb}.
+% (which is the original definition of \cs{@sverb}).
% \changes{v1.1u}{2020/04/22}{Drop spaces before \cs{verb} delimiter (gh/327)}
% \begin{macrocode}
\def\@sverb#1{\if\noexpand#1 \expandafter\@sverb\else\@@sverb{#1}\fi}
diff --git a/macros/latex-dev/base/ltnews.cls b/macros/latex-dev/base/ltnews.cls
index 45ee3664d1..fa86ce17b7 100644
--- a/macros/latex-dev/base/ltnews.cls
+++ b/macros/latex-dev/base/ltnews.cls
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf
index b6fc97ce53..d35b824b96 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 0cb6ad55cc..d4a6d274ae 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-2023
+% Copyright (C) 2014-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -40,7 +40,7 @@
\ProvidesFile{ltnews.tex}%
[2022/06/10 v1.4e Master file for ltnews*.tex (LaTeX Project)]
-\providecommand*{\lastissue}{38}
+\providecommand*{\lastissue}{39}
\InputIfFileExists{ltnews-lastissue.cfg}{}{}
diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf
index a7eb8b72ac..119150dcf2 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 55c6b20dd6..5c46b0450e 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-2023
+% Copyright (C) 1993-2024
% 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 1560d5cfae..c549274162 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 58856fe97b..d91af6f8b1 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-2023
+% Copyright (C) 1993-2024
% 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 a33ab0d699..525e896caa 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 96a5bec428..22533b9fae 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-2023
+% Copyright (C) 1993-2024
% 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 0fe86c8d1c..759e78dec7 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 ab49d7ade3..c1b474bca6 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-2023
+% Copyright (C) 1993-2024
% 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 16be61db08..63b9af2498 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 cdfe8bc072..3254b428e3 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-2023
+% Copyright (C) 1993-2024
% 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 62f27b9c09..c3a5d736c7 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 3d5cadb745..9830e55055 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-2023
+% Copyright (C) 1993-2024
% 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 41696cd5b2..5906a1d278 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 43cf204fed..75bbaba715 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-2023
+% Copyright (C) 1993-2024
% 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 d3824fd033..093798a6eb 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 f1386a5332..540e14c33f 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-2023
+% Copyright (C) 1993-2024
% 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 ee50c517ad..18344161cc 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 26eccedd1e..6b932f8f3e 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-2023
+% Copyright (C) 1993-2024
% 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 8aa002886a..d993b06982 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 b011eacf7e..e4925794d5 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-2023
+% Copyright (C) 1993-2024
% 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 799f3e69a8..4bd344ad0c 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 07dbd64240..70810e7b09 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-2023
+% Copyright (C) 1993-2024
% 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 3017fe26b4..8b19a4a371 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 38ea9122a0..92d484333c 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-2023
+% Copyright (C) 1993-2024
% 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 a471304672..15fd4203d8 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 e489b4ff27..278bec28b0 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-2023
+% Copyright (C) 1993-2024
% 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 58c7faeed3..8d615e493d 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 44cc44647e..2d767890e0 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-2023
+% Copyright (C) 1993-2024
% 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 a4ccdfcf6a..7c3c35bdc7 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 b95801dd6e..9e281e8e0e 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-2023
+% Copyright (C) 1993-2024
% 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 6fbbe159aa..01c228be83 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 7edf8a7f53..8606cffe99 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-2023
+% Copyright (C) 1993-2024
% 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 fe38f79c39..3dcf8679dc 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 e18e4660eb..8af30edac8 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-2023
+% Copyright (C) 1993-2024
% 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 404206d928..f2533985c9 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 8c70621534..5bca87ddd1 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-2023
+% Copyright (C) 1993-2024
% 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 3f107c4567..0d73b8b4dd 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 7e9492a8f2..5a18300cc2 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews20.pdf b/macros/latex-dev/base/ltnews20.pdf
index 8eeacf2590..dd9fe8fb37 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 b233f92dc4..6d31e1f56c 100644
--- a/macros/latex-dev/base/ltnews20.tex
+++ b/macros/latex-dev/base/ltnews20.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews21.pdf b/macros/latex-dev/base/ltnews21.pdf
index 0b70907056..4e58f50dd4 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/ltnews21.tex b/macros/latex-dev/base/ltnews21.tex
index a48cd0b199..16319e56d7 100644
--- a/macros/latex-dev/base/ltnews21.tex
+++ b/macros/latex-dev/base/ltnews21.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf
index 60862afc61..013d7190fa 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 dfc2e2326a..4a5f70bdb6 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-2023
+% Copyright (C) 2015-2024
% 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 abf6218395..5a149714d3 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 ee75a6463e..6eaaa08fd6 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-2023
+% Copyright (C) 2015-2024
% 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 2a8294b46a..8a065321dc 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 6a50ef902c..d34669098a 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-2023
+% Copyright (C) 2015-2024
% 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 3b2fcf4928..818b9b84c8 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 0676220a2e..4a168fee7b 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-2023
+% Copyright (C) 2016-2024
% 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 55d618bb30..1f5e0d6eee 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 9fbb6716b1..7ce1b7bd14 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-2023
+% Copyright (C) 2017-2024
% 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 244be0a0bd..5e5115fab5 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 917bf1cc10..44407da76f 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-2023
+% Copyright (C) 2017-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews28.pdf b/macros/latex-dev/base/ltnews28.pdf
index 9536e57f5a..173d27b6f6 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 3c3b92da97..fec5c5c6c9 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-2023
+% Copyright (C) 2017-2024
% 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 6ac0eb8b97..306556f994 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 999836b01d..b201c49180 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-2023
+% Copyright (C) 2018-2024
% 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 ad5fb53b4c..815eaf3072 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/ltnews30.tex b/macros/latex-dev/base/ltnews30.tex
index 8183f7eabb..97d2e9d890 100644
--- a/macros/latex-dev/base/ltnews30.tex
+++ b/macros/latex-dev/base/ltnews30.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews31.pdf b/macros/latex-dev/base/ltnews31.pdf
index 4a6484d05b..dff2439d12 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 44bf494142..194791cff5 100644
--- a/macros/latex-dev/base/ltnews31.tex
+++ b/macros/latex-dev/base/ltnews31.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews32.pdf b/macros/latex-dev/base/ltnews32.pdf
index 1964d6203a..f2e80722ec 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/ltnews32.tex b/macros/latex-dev/base/ltnews32.tex
index c64cd97958..ccc5feff77 100644
--- a/macros/latex-dev/base/ltnews32.tex
+++ b/macros/latex-dev/base/ltnews32.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews33.pdf b/macros/latex-dev/base/ltnews33.pdf
index 6d8f5775e9..0bc0b4a0fc 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/ltnews33.tex b/macros/latex-dev/base/ltnews33.tex
index 0b98a707ba..83e8a90c44 100644
--- a/macros/latex-dev/base/ltnews33.tex
+++ b/macros/latex-dev/base/ltnews33.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews34.pdf b/macros/latex-dev/base/ltnews34.pdf
index 3985ff0d5e..fa2a374667 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 d3a9202b56..889531fe78 100644
--- a/macros/latex-dev/base/ltnews34.tex
+++ b/macros/latex-dev/base/ltnews34.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews35.pdf b/macros/latex-dev/base/ltnews35.pdf
index 820f6a341b..83e8307de1 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/ltnews35.tex b/macros/latex-dev/base/ltnews35.tex
index 8d49bf1984..8f0c9d6ae3 100644
--- a/macros/latex-dev/base/ltnews35.tex
+++ b/macros/latex-dev/base/ltnews35.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2021-2023
+% Copyright (C) 2021-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews36.pdf b/macros/latex-dev/base/ltnews36.pdf
index 4c2d70661f..35e707fe85 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/ltnews36.tex b/macros/latex-dev/base/ltnews36.tex
index 5dee958747..fdd830d870 100644
--- a/macros/latex-dev/base/ltnews36.tex
+++ b/macros/latex-dev/base/ltnews36.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2021-2023
+% Copyright (C) 2021-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews37.pdf b/macros/latex-dev/base/ltnews37.pdf
index 3ff2725b4d..c63805f098 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 3adda3ea90..1efb0a5127 100644
--- a/macros/latex-dev/base/ltnews37.tex
+++ b/macros/latex-dev/base/ltnews37.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2021-2023
+% Copyright (C) 2021-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltnews38.pdf b/macros/latex-dev/base/ltnews38.pdf
index 80ff1a2127..9693e62fef 100644
--- a/macros/latex-dev/base/ltnews38.pdf
+++ b/macros/latex-dev/base/ltnews38.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews38.tex b/macros/latex-dev/base/ltnews38.tex
index 04ffe1a0ed..bf485de239 100644
--- a/macros/latex-dev/base/ltnews38.tex
+++ b/macros/latex-dev/base/ltnews38.tex
@@ -177,7 +177,7 @@ and \pkg{biblatex}.
For now activation is done through the line
\begin{verbatim}
\DocumentMetadata
- {testphase={phase-III,math,tabular}}
+ {testphase={phase-III,math,table}}
\end{verbatim}
The math and the tabular support are not yet incorporated into
\texttt{phase-III} but need their own activation, so that we can
diff --git a/macros/latex-dev/base/ltnews39.pdf b/macros/latex-dev/base/ltnews39.pdf
new file mode 100644
index 0000000000..f43f43a067
--- /dev/null
+++ b/macros/latex-dev/base/ltnews39.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews39.tex b/macros/latex-dev/base/ltnews39.tex
new file mode 100644
index 0000000000..b4b93d3504
--- /dev/null
+++ b/macros/latex-dev/base/ltnews39.tex
@@ -0,0 +1,640 @@
+% \iffalse meta-comment
+%
+% Copyright 2023
+% The LaTeX Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -——————————————
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews39.tex
+%
+% This is issue 39 of LaTeX News.
+
+\NeedsTeXFormat{LaTeX2e}[2020-02-02]
+
+\documentclass{ltnews}
+
+%% Maybe needed only for Chris' inadequate system:
+\providecommand\Dash {\unskip \textemdash}
+
+%% NOTE: Chris' preferred hyphens!
+%%\showhyphens{parameters}
+%% \hyphenation{because parameters parameter}
+
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\usepackage{csquotes}
+\usepackage{multicol}
+\usepackage{color}
+
+\providecommand\hook[1]{\texttt{#1}}
+
+\providecommand\meta[1]{$\langle$\textrm{\itshape#1}$\rangle$}
+\providecommand\option[1]{\texttt{#1}}
+\providecommand\env[1]{\texttt{#1}}
+\providecommand\Arg[1]{\texttt\{\meta{#1}\texttt\}}
+
+
+\providecommand\eTeX{\hologo{eTeX}}
+\providecommand\XeTeX{\hologo{XeTeX}}
+\providecommand\LuaTeX{\hologo{LuaTeX}}
+\providecommand\pdfTeX{\hologo{pdfTeX}}
+\providecommand\MiKTeX{\hologo{MiKTeX}}
+\providecommand\CTAN{\textsc{ctan}}
+\providecommand\TL{\TeX\,Live}
+\providecommand\githubissue[2][]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(%
+ \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}%
+ {github issue#1 #2}%
+ )}%
+ \par\smallskip}
+%% But Chris has to mostly disable \href for his TEXPAD app:
+%% \def\href #1{} % Only For Chris' deficient TeX engine
+
+% simple solution right now (just link to the first issue if there are more)
+\def\getfirstgithubissue#1 #2\relax{#1}
+
+\providecommand\sxissue[1]{\ifhmode\unskip
+ \else
+ % githubissue preceding
+ \vskip-\smallskipamount
+ \vskip-\parskip
+ \fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par}
+
+\providecommand\gnatsissue[2]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(%
+ \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=#1\%2F\getfirstgithubissue#2 \relax}%
+ {gnats issue #1/#2}%
+ )}%
+ \par}
+
+\let\cls\pkg
+\providecommand\env[1]{\texttt{#1}}
+\providecommand\acro[1]{\textsc{#1}}
+
+\vbadness=1400 % accept slightly empty columns
+
+
+\let\finalpagebreak\pagebreak % for TUB (if they use it)
+
+\makeatletter
+% maybe not the greatest design but normally we wouldn't have subsubsections
+\renewcommand{\subsubsection}{%
+ \@startsection {subsubsection}{2}{0pt}{1.5ex \@plus 1ex \@minus .2ex}%
+ {-1em}{\@subheadingfont\colonize}%
+}
+\providecommand\colonize[1]{#1:}
+\makeatother
+
+\let\finalvspace\vspace % for document layout fixes
+
+% Undo ltnews's \verbatim@font with active < and >
+\makeatletter
+\def\verbatim@font{%
+ \normalsize\ttfamily}
+\makeatletter
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecommand\tubcommand[1]{}
+\tubcommand{\input{tubltmac}}
+
+\publicationmonth{June}
+\publicationyear{2024 --- DRAFT version for upcoming release}
+%\publicationyear{2024}
+
+\publicationissue{39}
+
+\begin{document}
+
+\tubcommand{\addtolength\textheight{4.2pc}} % only for TUB
+
+\maketitle
+{\hyphenpenalty=10000 \exhyphenpenalty=10000 \spaceskip=3.33pt \hbadness=10000
+\tableofcontents}
+
+\setlength\rightskip{0pt plus 3em}
+
+\medskip
+
+\section{Introduction}
+
+\emph{to write}
+
+
+\section{News from the \enquote{\LaTeX{} Tagged PDF} project}
+
+In the previous \LaTeX{} News~\cite{39:ltnews38} we announced a first prototype
+support for tagged tabulars. Some of the necessary support code has
+now been moved from \texttt{latex-lab} to the corresponding packages
+(using sockets and plugs) and to the \LaTeX{} kernel (for those parts
+that are also necessary for other aspects of tagging).
+
+The kernel code specific to tagging is implemented in the file
+\texttt{lttagging.dtx}. For now it contains \cs{UseTaggingSocket}, a
+special invocation command for sockets that are specific to
+tagging. This enables us to also provide \cs{SuspendTagging} and
+\cs{ResumeTagging}, i.e., a very efficient way to temporarily disable
+the whole tagging process. This is, for example, necessary, if some
+code is doing trial typesetting. In that case the trials should not
+generate tagging structures\Dash only the finally chosen version
+should. Thus, \pkg{tabularx}, for example, stops the tagging while
+doing its trials to figure out the correct column widths to use, and
+then renables tagging when the table is finally typeset.
+
+Over time, \texttt{lttagging.dtx} will hold more general tagging code
+as appropriate. For now it is only documented as part of
+\texttt{source2e.pdf} but long term we will provide a separate guide
+for tagging, which will then also include the information currently
+found in various other places, e.g., \texttt{tagpdf.pdf}.
+
+We also added support for a few missing commands
+described in Leslie Lamport's \emph{\LaTeX{}
+Manual}~\cite{38:Lamport}: If \texttt{phase-III} is used
+the \cs{marginpar} command will be properly tagged (depending on
+the PDF version) as an \texttt{Aside} or a \texttt{Note} structure.
+In the standard classes \cs{maketitle} will be tagged if the additional
+testphase module \texttt{title} is used.
+
+The \texttt{math} module has been extended and now includes
+options to attach MathML files to the structures.
+First tests with a PDF reader and screen reader that support
+associated files looks very promising. Examples of PDF files tagged with the
+new method can be found at
+\url{https://github.com/latex3/tagging-project/discussions/56}.
+
+At last various small bugs and problems reported at
+\url{https://github.com/latex3/tagging-project}
+has been fixed. Such a feedback is very valuable,
+so we hope to see you there and thank you for
+any contribution, whether it is an issue or a post on a discussion
+thread.
+
+
+
+\section{Enhancements to the new mark mechanism}
+
+In June 2022 we introduced a new mark mechanism in
+\LaTeX{}~\cite[p.~76]{39:ltnews} that allows keeping track of multiple
+independent marks. It also properly supports top marks, something that wasn't
+reliably possible with \LaTeX{} before.
+
+There was, however, one limitation: to retrieve the marks from the
+page data it was necessary to \cs{vsplit} that data artificially so
+that \TeX{} would produce split marks that the mechanism could then
+use. Unfortunately, \TeX{} gets very upset if it finds infinite
+negative glue (e.g., from \cs{vss}) within this data. This is not
+totally surprising because such glue would allow splitting off any
+amount of material as such glue would hide the size of it. \TeX{}
+therefore responds with an error message if it find such glue while
+doing a \cs{vsplit} operation (and it does so even if a later glue
+item cancels the infinite glue).
+
+To account for this, the code in 2022 attempted to detect this
+situation beforehand and if so did not do any splitting but, of
+course, it would then also not extract any mark information.
+
+In this release the approach has been changed and we always do a
+\cs{vsplit} operation and thus always get the right mark data
+extracted. While it is not possible to avoid upsetting \TeX{} in case
+we have infinite negative glue present, it is possible to hide this
+(more or less) from the user.\footnote{A note to \pkg{l3build} users
+that make use of its testing capabilities: the new mechanism
+temporarily changes \cs{interactionmode} and, for implementation
+reasons in \TeX{}, that results in extra newlines in the \texttt{.log}
+file, so instead of seeing \texttt{[1] [2]} you will see each on
+separate lines. This means that test files might show difference of
+that nature, once the code is active, and must therefore be
+regenerated as necessary.} With the new code \TeX{} will neither stop
+nor show anything on the terminal. What we can't do, though, is to
+avoid that an error is written to the log file, but to make it clear
+that this error is harmless and should be ignored we have arranged the
+code so that the error message, if it is issued, takes the following
+format:
+\begin{verbatim}
+! Infinite glue shrinkage found in box being split.
+<argument> Infinite shrink error above ignored !
+l. ... }
+\end{verbatim}
+Not perfect (especially the somewhat unmotivated \texttt{<argument>}),
+but you can only do so much if error messages and their texts are
+hard-wired in the engine.
+
+So why all this? There are two reasons: we do not lose marks in edge
+cases any longer and perhaps more importantly we are now also reliably
+able to extract marks from arbitrarily boxed data, something that
+wasn't possible at all before. This is, for example, necessary to
+support extended marks in \env{multicols} environments or extract them
+from floats, marginpars, etc.
+
+Details about the implementation can be found in \texttt{texdoc
+ ltmarks-code} or in the shorter \texttt{texdoc ltmarks-doc} (which
+only describes the general concepts and the command interfaces).
+
+\section{New or improved commands}
+
+\subsection{\pkg{doc}: provide \cs{ProvideDocElement}}
+
+Beside \cs{NewDocElement} and \cs{RenewDocElement} we now also offer a
+\cs{ProvideDocElement} declaration that does nothing unless the doc
+element could be declared with \cs{NewDocElement}. This can be useful
+if documentation files are processed both individually as well as
+combined.
+
+
+\subsection{\pkg{doc}: better support for \pkg{upquote}}
+
+In \LaTeX{} News~37~\cite{39:ltnews37} we wrote that support for the
+\pkg{upquote} package was added to the \pkg{doc} package, but back
+then this was only done for \cs{verb}, and the \env{verbatim}
+environments. However, the bulk of code in a typical \texttt{.dtx} file is
+within \env{macrocode} or \env{macrocode*} environments which were not
+affected by adding \pkg{upquote}. We have now updated those, such that
+\pkg{upquote} alters the quote characters in these environments as
+well.
+%
+\githubissue{1230}
+
+\section{Providing \pkg{xtemplate} in the format}
+
+In \LaTeX{} News~32, we described the move of one long-term experimental idea
+into the kernel: the package \pkg{xparse}, which was integrated as \pkg{ltcmd}.
+With this edition, we move another long-term development idea to stable status:
+\emph{templates}.
+
+In this context, templates are a mechanism to abstract out various elements of a
+document (such as \enquote{sectioning}) in such a way that different
+implementations can be interchanged, and design decisions are set up efficiently
+and controllably.
+
+In contrast to \pkg{ltcmd}, which provides a mechanism that many document
+authors will exploit routinely, templates are a more specialised tool. We
+anticipate that they will be used by a small number of programmers, providing
+generic ideas that will then be used within document classes. Most document
+authors will therefore likely encounter templates directly only rarely.
+We anticipate though that they will be \emph{using} templates provided
+by the team or others.
+
+The template system requires three separate ideas
+\begin{itemize}
+ \item Template \emph{type}: the \enquote{thing} we are using templates
+ for, such as \enquote{sectioning} or \enquote{enumerated-list}
+ \item A template: a combination of code and keys that can be used
+ to implement a type. Here for example we might have
+ \enquote{standard-\LaTeX{}-sectioning} as a template for
+ \enquote{sectioning}
+ \item One or more \emph{instances}: a specific use case of a template
+ where (some) keys are set to known values. We might for example see
+ \enquote{\LaTeX{}-section}, \enquote{\LaTeX{}-subsection}, etc.
+\end{itemize}
+
+As part of the move from the experimental \pkg{xtemplate} to kernel integration,
+the team have revisited the commands provided. The stable set now comprises
+\begin{itemize}
+ \item \cs{NewTemplateType}
+ \item \cs{DeclareTemplateInterface}
+ \item \cs{DeclareTemplateCode}
+ \item \cs{DeclareTemplateCopy}
+ \item \cs{EditTemplateDefault}
+ \item \cs{UseTemplate}
+ \item \cs{DeclareInstance}
+ \item \cs{DeclareInstanceCopy}
+ \item \cs{EditInstance}
+ \item \cs{UseInstance}
+\end{itemize}
+
+To support existing package authors, we have released an updated version of
+\pkg{xtemplate} which will work smoothly with the new kernel-level code. The
+existing commands provided in \pkg{xtemplate} will continue to work, but
+we encourage programmers to move to the set above.
+
+\section{Code improvements}
+
+\subsection{Loading packages at the top level}
+Classes and packages should only be loaded with \cs{documentclass}, \cs{usepackage},
+or class interface commands such as \cs{LoadClass} or \cs{RequirePackageWithOptions}
+at the top level, not inside a group. Previously \LaTeX\ did not check this,
+which would often lead to low level errors later on if package declarations
+were reverted as a group ended.
+\LaTeX\ now checks the group level and an error is thrown
+if the class or package is loaded in a group.
+%
+\githubissue{1185}
+
+\subsection{Keep track of lost glyphs}
+
+A while ago we changed the \LaTeX{} default value for
+\cs{tracinglostchars} from \texttt{1} to \texttt{2} so that missing
+glyphs generate at least a warning, but we forgot to make the same
+change to \cs{tracingnone}. Thus, when issuing that command \LaTeX{}
+stopped generating warnings about missing glyphs. This has now been
+corrected.
+%
+\githubissue{549}
+
+\subsection{Improve \pkg{fontenc} error message}
+
+If the \pkg{fontenc} is asked to load a font encoding for which it
+doesn't find a suitable \texttt{.def} file it generates an error
+message indicating that the encoding name might be misspelled. That
+is, of course, one of the possible causes, but another one is that the
+installation is missing a necessary support package, e.g., that no
+support for Cyrillic fonts has been installed. The error message text
+has therefore been extended to explain the issue more generally.
+%
+\githubissue{1102}
+
+
+\subsection{Warn if counter names are problematic}
+
+In the past it was possible to declare, for example,
+\verb/\newcounter{index}/ with the side-effect that this defines
+\cs{theindex}, even though \LaTeX{} has a \env{theindex} environment
+that then got clobbered by the declaration.
+%
+This has now been changed: if \cs{the}\meta{counter} is already
+defined it is not altered, but instead a warning message is displayed.
+%
+\githubissue{823}
+
+\subsection{Extended information in \cs{listfiles}}
+
+The \cs{listfiles} command provides useful information when finding issues
+related to variation in package versions. However, this has to date relied on
+the information in the \cs{ProvidesPackage} line, or similar: that can be
+misleading if for example a file has been edited locally. We have now extended
+\cs{listfiles} to take an optional argument which will then include the MD5
+hash of each file (and the size of each file) in the \texttt{.log}. Thus for
+example you can use
+\begin{verbatim}
+\listfiles[hashes,sizes]
+\end{verbatim}
+to get both the file sizes and file hashes in the \texttt{.log} as well as
+the standard release information.
+%
+\githubissue{945}
+
+\subsection{Optimize creation of simple document commands}
+
+Creating document commands using \cs{NewDocumentCommand}, etc., provides a very
+flexible way of grabbing arguments. When the document command only takes simple
+mandatory arguments, this has to-date added an overhead that could be avoided.
+We have now refined the internal code path such that \enquote{simple} document
+commands avoid almost any overhead at point-of-use, making the results
+essentially as efficient as using \cs{newcommand} for low-level \TeX{}
+constructs. Note that as \cs{NewDocumentCommand} makes engine-robust commands,
+the direct equivalent to \cs{newcommand} is \cs{NewExpandableDocumentCommand}.
+%
+\githubissue{1189}
+
+\subsection{Declaring appropriate sub-encodings for \texttt{TS1} symbol fonts}
+
+In 2020 we incorporated support for the \texttt{TS1} symbol encoding
+directly into the kernel and in this way removed the need to load the
+\pkg{textcomp} package~\cite{39:ltnews31} to make commands such as
+\cs{texteuro} available.
+
+There is, however, a big problem with this \texttt{TS1} symbol
+encoding: only very few fonts can provide every glyph that is supposed
+to be part of \texttt{TS1}. This means that changing font families
+might result in certain symbols becoming unavailable. This can be a
+major disaster if, for example, the \cs{texteuro} (\texteuro) or the
+\cs{textohm} (\textohm) are no longer printed in your document, just
+because you altered your text font family.
+
+To mitigate this problem, we also introduced in 2020 the declaration
+\cs{DeclareEncodingSubset}. This declaration is supposed to be used in
+font definition files for the \texttt{TS1} encoding to specify which
+subset (we have defined 10 common ones) a specific font implements. If
+such a declaration is used then missing symbols are automatically
+taking from a fallback font. While this is not perfect, it is the best
+you can do other than painstrickenly checking that your document only
+uses glyphs that the font supports and if necessary switch to a
+different font or avoid the missing symbols. See also the discussion
+in \cite{39:ltnews33}.
+
+To jumpstart the process we also added declarations to the \LaTeX{}
+kernel for most of the fonts found in \TeX{}Live at the time\Dash with
+the assumption that such declarations would over time be superseded by
+declarations in the \texttt{.fd} files. Unfortunately, this hasn't
+happened yet (or not often) and so many of the initial declarations
+went stale: several fonts got new glyphs added to them (so their
+sub-encoding should have been changed but didn't); others (mainly due
+to license issues) changed the family name and thus our declarations
+became useless and the renamed fonts (now without a declaration) ended
+up in the default sub-encoding which offers only few glyphs; yet
+others such as CharisSIL (which triggered the GitHub issue) were
+simply not around at the time.
+
+We have therefore, again attempted to provide the (currently) correct
+declarations, but it is obvious that this is not a workable
+process. As we do not maintain the fonts we do not have the
+information that something has changed, and to regularly check the
+ever growing font support bundles is simply not possible. It is
+therefore very important that maintainers of font packages do not only
+provide \texttt{.fd} files but also add such a declaration to every
+\texttt{TS1...fd} font definition file that they distribute.
+
+To simplify this process, we now provide a simple \LaTeX{} file
+(\texttt{checkencodingsubset.tex}) for determining the correct (safe)
+sub-encoding. If run, it asks for a font family and then outputs its
+findings, for example, for \texttt{AlgolRevived-TLF} you will get:
+\begin{verbatim}
+-----------------------------------------
+Testing font family AlgolRevived-TLF
+(currently TS1-sub-encoding 9)
+-----------------------------------------
+Some glyphs are missing from sub-encoding 8:
+ ==> \textcelsius (137) is missing
+ ==> \texttwosuperior (178) is missing
+ ==> \textthreesuperior (179) is missing
+ ==> \textonesuperior (185) is missing
+Some glyphs are missing from sub-encoding 7:
+ ==> \texteuro (191) is missing
+All glyphs between sub-encoding 6 and 7 exist
+All glyphs between sub-encoding 5 and 6 exist
+All glyphs between sub-encoding 4 and 5 exist
+Some glyphs are missing from sub-encoding 3:
+ ==> \textwon (142) is missing
+All glyphs between sub-encoding 2 and 3 exist
+Some glyphs are missing from sub-encoding 1:
+ ==> \textmho (77) is missing
+ ==> \textpertenthousand (152) is missing
+All glyphs between sub-encoding 0 and 1 exist
+All glyphs in core exist
+-----------------------------------------
+TS1 encoding subset for AlgolRevived-TLF (ok)
+Use sub-encoding 9
+-----------------------------------------
+\end{verbatim}
+This output is meant for human consumption, e.g., you see which glyphs
+are missing and why a certain sub-encoding is suggested, but it is not
+that hard to use it in a script and extract the suggested sub-encoding
+by grepping for the line starting with \texttt{Use sub-encoding}.
+
+Of course, this check will only work if the missing glyphs are really
+missing: some fonts placed \enquote{tofu}\footnote{Little squares to
+indicate a missing symbol.} into such slots and in this case it looks
+to \TeX{} as if the glyph is provided. For example, for the old
+Palatino fonts (family \texttt{ppl}) it would report
+\begin{verbatim}
+-----------------------------------------
+TS1 encoding subset for ppl (bad)
+Use sub-encoding 0 (not 5)
+-----------------------------------------
+\end{verbatim}
+i.e., all glyphs are provided, while in reality more than twenty are
+missing and sub-encoding 5 as declared in the kernel is correct.
+%
+\githubissue{1257}
+
+
+
+%\section{Bug fixes}
+
+%\section{Changes to packages in the \pkg{amsmath} category}
+
+%\section{Changes to packages in the \pkg{graphics} category}
+
+
+
+\section{Changes to packages in the \pkg{tools} category}
+
+
+\subsection{\pkg{array}, \pkg{longtable}, \pkg{tabularx}: support tagging}
+
+The three packages are now extended to enable producing tagged tabulars upon
+request. This is done by adding a number of sockets (see
+\cite{39:ltnews38}) that, by default, do nothing, but are equipped
+with appropriate plugs if tagged PDF is requested.
+
+In the previous \LaTeX{} release this was handled in
+\texttt{latex-lab} patching the packages when tagging was requested.
+
+
+
+
+\subsection{\pkg{verbatim}: \cs{verb} showed visible spaces}
+
+A recent change in the kernel was not reflected in the \pkg{verbatim}
+package with the result that \cs{verb} showed visible spaces
+(\verb*/ /) after the package was loaded. This has already been corrected
+in a hotfix for release 2023-11.
+%
+\githubissue{1160}
+
+\subsection{\pkg{verbatim}: Support tabs in \cs{verbatiminput*}}
+
+Mimicking the kernel update (November, 2023) that allowed \cs{verb*}
+to mark tabs as spaces, the \pkg{verbatim} package has been updated
+such that \cs{verbatiminput*} marks tabs as spaces as well.
+%
+\githubissue{1245}
+
+
+\subsection{\pkg{multicol}: \cs{columnbreak} interferes with mark mechanism}
+
+The \pkg{multicol} package has to keep track of marks (from
+\cs{markright} or \cs{markboth}) as part of its output routine code
+and can't rely on \LaTeX{} handling that automatically. It does so by
+artificially splitting page data with \cs{vsplit} to extract the mark
+data. With the introduction of \cs{columnbreak} that code failed
+sometimes, because it was not seeing any mark that followed such a
+forced column break.
+
+This has now been corrected, but there is further work to do, because
+as of now \pkg{multicol} does not yet handle marks using the new mark
+mechanism\Dash see the discussion at the beginning of the newsletter.
+%
+\githubissue{1130}
+
+\subsection{\pkg{showkeys}: Allow \cs{newline} in \pkg{amsthm} to work}
+%
+Previously \pkg{showkeys} added an extra box layer which disabled the \cs{newline}
+of \pkg{amsthm} theorem styles. This extra box has now been avoided.
+%
+\githubissue{1123}
+
+
+
+\section{Changes to files in the \pkg{cyrillic} category}
+
+\subsection{Correct definition of \cs{k}}
+
+Ages ago, the encoding specific definitions for various accent
+commands were changed to guard against altering some parameter values
+non-locally by mistake. For some reason the definition for \cs{k} in
+the Cyrillic encodings \texttt{T2A}, \texttt{T2B}, and \texttt{T2C}
+didn't get this treatment. This oversight has now been corrected.
+%
+\githubissue{1148}
+
+
+
+\begin{thebibliography}{9}
+
+%\fontsize{9.3}{11.3}\selectfont
+
+
+%\bibitem{39:Lamport}
+%Leslie Lamport.
+%\newblock \emph{{\LaTeX}: {A} Document Preparation System: User's Guide and Reference
+% Manual}.
+%\newblock \mbox{Addison}-Wesley, Reading, MA, USA, 2nd edition, 1994.
+%\newblock ISBN 0-201-52983-1.
+%\newblock Reprinted with corrections in 1996.
+%
+
+\bibitem{39:ltnews} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 1--39}. June, 2024.
+ \url{https://latex-project.org/news/latex2e-news/ltnews.pdf}
+%
+%
+\bibitem{39:ltnews31} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 31}. February, 2020.
+ \url{https://latex-project.org/news/latex2e-news/ltnews31.pdf}
+
+\bibitem{39:ltnews33} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 33}. June 2021.\\
+ \url{https://latex-project.org/news/latex2e-news/ltnews33.pdf}
+
+\bibitem{39:ltnews37} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 37}. June 2023.\\
+ \url{https://latex-project.org/news/latex2e-news/ltnews37.pdf}
+
+\bibitem{39:ltnews38} \LaTeX{} Project Team.
+ \emph{\LaTeXe{} news 38}. November 2023.\\
+ \url{https://latex-project.org/news/latex2e-news/ltnews38.pdf}
+
+%\bibitem{39:blueprint} Frank Mittelbach and Chris Rowley.
+% \emph{\LaTeX{} Tagged PDF \Dash A blueprint for a large project}.\\
+% \url{https://latex-project.org/publications/indexbyyear/2020/}
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex-dev/base/ltoutenc.dtx b/macros/latex-dev/base/ltoutenc.dtx
index 1d257805a4..c18ff01446 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -44,7 +44,7 @@
%<*driver>
% \fi
\ProvidesFile{ltoutenc.dtx}
- [2022/05/27 v2.0z LaTeX Kernel (font encodings)]
+ [2024/02/08 v2.1a LaTeX Kernel (font encodings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutenc.dtx}
@@ -383,10 +383,10 @@
% other encodings, so there are some optimizations provided:
% \begin{quote}
% |\DeclareTextSymbolDefault{|^^A
-% \meta{command}|}|^^A
+% \meta{command}|}{|^^A
% \meta{encoding}|}|\\
% |\DeclareTextAccentDefault{|^^A
-% \meta{command}|}|^^A
+% \meta{command}|}{|^^A
% \meta{encoding}|}|
% \end{quote}
% are short for:
@@ -840,7 +840,7 @@
% interfere between accent and base character. Therefore we need to
% avoid that (they are some hidden inside \cs{maybe@load@fontshape}).
% As we don't have to load the fontshape in this case
-% (as that happened in the box above if necessary, we simply
+% (as that already happened in the box above, if necessary), we simply
% disable that part of the code temporarily.
% We also ignore \cs{ignorespaces} which has the same issue and may
% show up as part of \cs{normalfont} if that is used.
@@ -3659,10 +3659,10 @@
\let\encodingdefault\CurrentOption
% \end{macrocode}
% From 2020/02/02 release onward we only load the encoding files if
-% they haven't be loaded already. To check this we look if
-% \verb=\T@=\textit{encoding} is already defined. If not we load
+% they haven't be loaded already. To check this we look at whether
+% \verb=\T@=\textit{encoding} is already defined. If not, we load it later
% (indicated by setting the switch
-% \texttt{@tempswa} to true and we always load if we run in an older
+% \texttt{@tempswa} to true) and we always load if we are using an older
% format (or rather in a rollback situation).
% \changes{v2.0m}{2020/01/25}{Load each encoding file only once (gh/255)}
% \begin{macrocode}
@@ -3677,6 +3677,7 @@
\if@tempswa
% \end{macrocode}
%
+% \changes{v2.1a}{2023/11/07}{Add more explanation to error message (gh/1102)}
% \begin{macrocode}
\edef\reserved@f{%
\lowercase{\def\noexpand\reserved@f{\CurrentOption enc.def}}}%
@@ -3685,7 +3686,11 @@
{}{\PackageError{fontenc}%
{Encoding file `\reserved@f' not found.%
\MessageBreak
- You might have misspelt the name of the encoding}%
+ You might have misspelled the name of the encoding
+ \MessageBreak
+ or a required support package (e.g., cyrillic) is
+ \MessageBreak
+ missing in your installation}%
{Necessary code for this encoding was not
loaded.\MessageBreak
Thus calling the encoding later on will
@@ -3723,8 +3728,8 @@
% \end{macrocode}
%
% We select the new font encoding default (i.e., the last encoding
-% specified in the option list. But this encoding may not work with
-% the current |\f@shape|, e.g., \texttt{LY1} is not defined for
+% specified in the option list). But this encoding may not work with
+% the current |\f@shape|: e.g., \texttt{LY1} is not defined for
% \texttt{cmr} and therefore packages switching to \texttt{LY1}
% usually also change \cs{rmdefault}. But that only applies at
% |\begin{document}| so we get a spurious warning if we use what
diff --git a/macros/latex-dev/base/ltoutenc.ins b/macros/latex-dev/base/ltoutenc.ins
index 2f0c39517f..c5316f9aab 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 18388b1cc6..b067ef5ecb 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-2023
+% Copyright (C) 1993-2024
% 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 1a6586d067..f4efe0fd58 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-2023
+% Copyright (C) 1993-2024
% 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 6c02d0fa7f..da80dbaab7 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-2023
+% Copyright (C) 1993-2024
% 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 31d863610b..200d3b4238 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-2023
+% Copyright (C) 1993-2024
% 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 aa77b62b7c..37c0dd52df 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 008e6a5f33..7d23332d28 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 9c1a95ee61..e9741ff935 100644
--- a/macros/latex-dev/base/ltpara.dtx
+++ b/macros/latex-dev/base/ltpara.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: ltpara.dtx
-%% Copyright (C) 2020-2023
+%% Copyright (C) 2020-2024
%% Frank Mittelbach, The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
@@ -14,12 +14,14 @@
%
%%% From File: ltpara.dtx
%
-% \begin{macrocode}
-\def\ltparaversion{v1.0l}
-\def\ltparadate{2023/01/30}
-% \end{macrocode}
%<*driver>
+% \fi
+\ProvidesFile{ltpara.dtx}
+ [2024/02/11 v1.0m LaTeX Kernel (paragraph hooks)]
+% \iffalse
+%
\documentclass{l3doc}
+\GetFileInfo{ltpara.dtx}
%\usepackage{ltpara}
@@ -45,7 +47,7 @@
%
%
% \title{The \texttt{ltpara.dtx} code\thanks{This file has version
-% \ltparaversion\ dated \ltparadate, \copyright\ \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
% Project.}}
% \author{Frank Mittelbach}
%
@@ -811,9 +813,11 @@
\hook_use:n {para/begin}
% \end{macrocode}
% If we aren't in horizontal mode any longer the hooks above misbehaved.
+% \changes{v1.0m}{2023/11/16}{Correct error message: hook
+% left horizontal not vertical mode (gh/1182)}
% \begin{macrocode}
\if_mode_horizontal: \else:
- \msg_error:nnnn { hooks }{ para-mode }{begin}{vertical} \fi:
+ \msg_error:nnnn { hooks }{ para-mode }{begin}{horizontal} \fi:
% \end{macrocode}
% Finally we reinsert the indentation box (unless suppressed) and
% then call \cs{everypar} the way legacy \LaTeX\ code expects it.
@@ -845,7 +849,7 @@
%<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> \msg_error:nnnn { hooks }{ para-mode }{begin}{horizontal} \fi:
%<latexrelease> \@@_handle_indent:
%<latexrelease>}
% \end{macrocode}
diff --git a/macros/latex-dev/base/ltpictur.dtx b/macros/latex-dev/base/ltpictur.dtx
index 926fd5c692..ea5ac4205b 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-2023
+% Copyright (C) 1993-2024
% 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 b41810373d..a628b954d9 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltplain.dtx}
- [2023/10/21 v2.3i LaTeX Kernel (Plain TeX)]
+ [2024/02/08 v2.3j LaTeX Kernel (Plain TeX)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltplain.dtx}
@@ -1241,11 +1241,11 @@
%<latexrelease>\IncludeInRelease{2022/06/01}{\obeylines}%
%<latexrelease> {Add a redirection to obeylines and obeyspaces}%
% \end{macrocode}
-% If the active |^^M| escapes, e.g. into a \cs{write} (which is
-% effectively in a different context) we don't want the definition
+% If the active |^^M| escapes, e.g., into a \cs{write} (which is
+% effectively in a different context) then we don't want the definition
% from \cs{obeylines} but rather a simple \cs{par} (in fact even
% the primitive one, not the \LaTeX{} version \cs{para\_end:} which
-% is only defined later.
+% is only defined later).
%
% \begin{macrocode}
\begingroup
@@ -1263,7 +1263,7 @@
% line ending characters and in that mode \TeX{} discards
% everything from that point onwards to the real end of the line so
% it works like a comment --- pretty strange really (and I think
-% due to the fact the the original pascal compiler could have some
+% due to the fact that the original pascal compiler could have some
% garbage showing up after the normal line ending character. Thus
% we really have to make sure that any closing braces is not one
% the same line as an |^^M|, because otherwise it would get dropped
@@ -1293,7 +1293,7 @@
% one that is current when \cs{obeylines} act.
%
% There is a small subtlety here: in an \cs{edef} the active |^^M| stayed
-% put (because it was equal to to the primitive \cs{par}), now
+% put (because it was equal to the primitive \cs{par}), now
% \cs{obeyedline} expands and you get what it contains, i.e., in that
% case \cs{par}, into the \cs{edef} or \cs{mark} unless we use
% \cs{protected} on it.
@@ -1813,7 +1813,13 @@
\tracinggroups\z@
\tracingparagraphs\z@
\tracingmacros\z@
- \tracinglostchars\@ne
+% \end{macrocode}
+% None really means go back to the \LaTeX{} ``default'' and for
+% \cs{tracinglostchars} this should therefore be 2 these days.
+% \changes{v2.3j}{2023/11/07}{Set \cs{tracinglostchars} to 2 in
+% \cs{tracingnone} (gh/549)}
+% \begin{macrocode}
+ \tracinglostchars\tw@
\tracingpages\z@
\tracingstats\z@
}%
diff --git a/macros/latex-dev/base/ltproperties-code.pdf b/macros/latex-dev/base/ltproperties-code.pdf
index a0757a3b61..85f4ba4e45 100644
--- a/macros/latex-dev/base/ltproperties-code.pdf
+++ b/macros/latex-dev/base/ltproperties-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltproperties-doc.pdf b/macros/latex-dev/base/ltproperties-doc.pdf
index 8dccf572dc..1dc54d6ea6 100644
--- a/macros/latex-dev/base/ltproperties-doc.pdf
+++ b/macros/latex-dev/base/ltproperties-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltproperties.dtx b/macros/latex-dev/base/ltproperties.dtx
index 40c50cd20a..4a5fa78b5f 100644
--- a/macros/latex-dev/base/ltproperties.dtx
+++ b/macros/latex-dev/base/ltproperties.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: ltproperties.dtx
+% File: ltproperties.dtx
%
% Copyright (C) 2021-2023 The LaTeX Project
%
@@ -21,13 +21,21 @@
% https://github.com/latex3/latex2e
%
% for those people who are interested.
-% \begin{macrocode}
-\def\ltpropertiesversion{1.0c}
-\def\ltpropertiesdate{2023-10-15}
-% \end{macrocode}
-
-%<*driver>
+%
+% \fi
+%
+% \iffalse
+%%% From File: ltproperties.dtx
+%
+%<*driver>
+% \fi
+\ProvidesFile{ltproperties.dtx}
+ [2024/02/11 v1.0d LaTeX Kernel (Properties)]
+% \iffalse
+%
\documentclass[full]{l3doc}
+\GetFileInfo{ltproperties.dtx}
+
\EnableCrossrefs
\CodelineIndex
\begin{document}
@@ -39,7 +47,7 @@
% \title{^^A
% Recording and cross-referencing document properties^^A
% \thanks{This module has version
-% \ltpropertiesversion\ dated \ltpropertiesdate, \copyright\ The \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ The \LaTeX\
% Project.}
% }
%
@@ -157,8 +165,8 @@
%
% \begin{function}{\property_new:nnnn,\property_gset:nnnn}
% \begin{syntax}
-% \cs{property_new:nnnn} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
-% \cs{property_gset:nnnn} \Arg{property}\Arg{setpoint} \Arg{default} \Arg{code}
+% \cs{property_new:nnnn} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
+% \cs{property_gset:nnnn} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
% \end{syntax}
% \LaTeXe-interface: see \cs{NewProperty}, \cs{SetProperty}.\\
% Sets the \meta{property} to have the \meta{default} specified, and at the
@@ -180,7 +188,7 @@
% \property_record:nn, \property_record:nV, \property_record:ee
% }
% \begin{syntax}
-% \cs{property_record:nN} \Arg{label} \Arg{clist var}
+% \cs{property_record:nN} \Arg{label} \meta{clist var}
% \cs{property_record:nn} \Arg{label} \Arg{clist}
% \end{syntax}
% \LaTeXe{}-interface: see \cs{RecordProperties}.\\
@@ -307,8 +315,8 @@
%
% \begin{function}{\NewProperty,\SetProperty}
% \begin{syntax}
-% \cs{NewProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
-% \cs{SetProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
+% \cs{NewProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
+% \cs{SetProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code}
% \end{syntax}
% Sets the \meta{property} to have the \meta{default} specified, and at the
% \meta{setpoint} (either |now| or |shipout|) to write the result of the
@@ -329,7 +337,7 @@
% of properties. Also similar to the standard \cs{label} command, the command is surrounded
% by an \cs{@bsphack}/\cs{@esphack} pair to preserve spacing.
% \end{function}
-
+%
% \begin{function}[EXP]{\RefProperty}
% \begin{syntax}
% \cs{RefProperty} \oarg{local default} \Arg{label} \Arg{property}
@@ -342,7 +350,7 @@
%
% \begin{function}{\IfPropertyExistTF}
% \begin{syntax}
-% \cs{IfPropertyExistTF} \Arg{property} \Arg{true code} \Arg{false code}
+% \cs{IfPropertyExistTF} \Arg{property} \Arg{true code} \Arg{false code}
% \end{syntax}
% Tests if the \meta{property} has been declared.
% \end{function}
@@ -361,7 +369,7 @@
% \end{syntax}
% Tests if the label and a value of the \meta{property} for the \meta{label} are both known.
% \end{function}
-
+%
% \begin{function}{\RefUndefinedWarn}
% \begin{syntax}
% \cs{RefUndefinedWarn} \Arg{label} \Arg{property}
@@ -551,6 +559,7 @@
% later too. That is all pretty easy using \pkg{expl3}: we accept a stray
% comma at the end of the list as that is easier to deal with than trying
% to tidy up, and there is no real downside.
+% \changes{v1.0d}{2024-01-17}{Use \cs{protected@write}}%
% \begin{macrocode}
\cs_new_protected:Npn \property_record:nN #1#2
{ \property_record:nV {#1} #2 }
@@ -561,7 +570,7 @@
{
\legacy_if:nT { @filesw }
{
- \iow_shipout_x:Nx \@auxout
+ \protected@write \@auxout {}
{
\token_to_str:N \new@label@record
{#1}
@@ -737,7 +746,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{IfPropertyExistTF}
+% \begin{macro}{\IfPropertyExistTF}
% \begin{macrocode}
\cs_new_eq:NN \IfPropertyExistTF \property_if_exist:eTF
% \end{macrocode}
diff --git a/macros/latex-dev/base/ltsect.dtx b/macros/latex-dev/base/ltsect.dtx
index 5a03fd4977..4560704463 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-2023
+% Copyright (C) 1993-2024
% 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 b688db8cc5..0fee02853e 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 9265263918..3051341818 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 b19814a6fd..0c9113ce93 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-2023
+%% Copyright (C) 2020-2024
%% Frank Mittelbach, The LaTeX Project
%%
%
@@ -31,30 +31,14 @@
%
%%% From File: ltshipout.dtx
%
-% \begin{macrocode}
-\providecommand\ltshipoutversion{v1.0n}
-\providecommand\ltshipoutdate{2022/11/08}
-% \end{macrocode}
-%
%<*driver>
-
+% \fi
+\ProvidesFile{ltshipout.dtx}
+ [2024/02/11 v1.0n LaTeX Kernel (Shipout)]
+% \iffalse
+%
\documentclass{l3doc}
-
-% bug fix fo l3doc.cls
-\ExplSyntaxOn
-\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
- {
- \vbox_set:Nn \l__codedoc_macro_box
- {
- \vbox_unpack_drop:N \l__codedoc_macro_box
- \hbox { \llap { \__codedoc_print_macroname:nN {#1} #2
- \MacroFont % <----- without it the \ is in lmr10 if a link is made
- \
- } }
- }
- \int_incr:N \l__codedoc_macro_int
- }
-\ExplSyntaxOff
+\GetFileInfo{ltshipout.dtx}
\providecommand\InternalDetectionOff{}
\providecommand\InternalDetectionOn{}
@@ -76,7 +60,7 @@
%
%
% \title{The \texttt{ltshipout} documentation\thanks{This file has version
-% \ltshipoutversion\ dated \ltshipoutdate, \copyright\ \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
% Project.}}
%
% \author{Frank Mittelbach, \LaTeX{} Project Team}
@@ -859,7 +843,7 @@
%
% \changes{v1.0d}{2020/11/23}{Check for both kernel and user hook (gh/431)}
% \changes{v1.0f}{2021/01/08}{Added another kernel hook for more
-% flexibility (cf \texttt{https://github.com/pgf-tikz/pgf/issues/960}}
+% flexibility (cf.\ \texttt{https://github.com/pgf-tikz/pgf/issues/960}}
% \begin{macrocode}
\bool_lazy_and:nnF
{ \hook_if_empty_p:n {shipout/background} }
diff --git a/macros/latex-dev/base/ltsockets-code.pdf b/macros/latex-dev/base/ltsockets-code.pdf
index 7fa60a7f54..6301f60a3c 100644
--- a/macros/latex-dev/base/ltsockets-code.pdf
+++ b/macros/latex-dev/base/ltsockets-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltsockets-doc.pdf b/macros/latex-dev/base/ltsockets-doc.pdf
index e708f04a3a..a50aad4998 100644
--- a/macros/latex-dev/base/ltsockets-doc.pdf
+++ b/macros/latex-dev/base/ltsockets-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltsockets.dtx b/macros/latex-dev/base/ltsockets.dtx
index 7d2940f454..243963f7bc 100644
--- a/macros/latex-dev/base/ltsockets.dtx
+++ b/macros/latex-dev/base/ltsockets.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2023
+% Copyright (C) 2023-2024
% Frank Mittelbach, The LaTeX Project
%
% This file is part of the LaTeX base system.
@@ -30,14 +30,14 @@
%
%%% From File: ltsockets.dtx
%
-% \begin{macrocode}
-\def\ltsocketsversion{0.9a}
-\def\ltsocketsdate{2023-08-21}
-% \end{macrocode}
+%<*driver>
+% \fi
+\ProvidesFile{ltsockets.dtx}
+ [2024/02/11 v0.9a LaTeX Kernel (Sockets)]
+% \iffalse
%
-%<*driver>
\documentclass{l3doc}
-
+\GetFileInfo{ltsockets.dtx}
\providecommand\InternalDetectionOff{}
\providecommand\InternalDetectionOn{}
@@ -55,7 +55,7 @@
%
%
% \title{\LaTeX{}'s socket management\thanks{This module has version
-% \ltsocketsversion\ dated \ltsocketsdate, \copyright\ \LaTeX\
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
% Project.}}
%
% \author{Frank Mittelbach}
@@ -530,8 +530,8 @@
%
% \begin{function}{\NewSocket,\socket_new:nn}
% \begin{syntax}
-% \cs{NewSocket} \Arg{socket-name}\Arg{number-of-inputs}
-% \cs{socket_new:nn}\Arg{socket-name}\Arg{number-of-inputs}
+% \cs{NewSocket} \Arg{socket-name} \Arg{number-of-inputs}
+% \cs{socket_new:nn} \Arg{socket-name} \Arg{number-of-inputs}
% \end{syntax}
% Declares a new socket with name \meta{socket-name} having
% \meta{number-of-inputs} inputs. There is automatically a
@@ -563,9 +563,9 @@
%
% \begin{function}{\NewSocketPlug,\socket_new_plug:nnn,\socket_set_plug:nnn}
% \begin{syntax}
-% \cs{NewSocketPlug} \Arg{socket-name}\Arg{socket-plug-name}\Arg{code}
-% \cs{socket_new_plug:nnn}\Arg{socket-name}\Arg{socket-plug-name}\Arg{code}
-% \cs{socket_set_plug:nnn}\Arg{socket-name}\Arg{socket-plug-name}\Arg{code}
+% \cs{NewSocketPlug} \Arg{socket-name} \Arg{socket-plug-name} \Arg{code}
+% \cs{socket_new_plug:nnn} \Arg{socket-name} \Arg{socket-plug-name} \Arg{code}
+% \cs{socket_set_plug:nnn} \Arg{socket-name} \Arg{socket-plug-name} \Arg{code}
% \end{syntax}
% Declares a new plug for socket \meta{socket-name} that runs
% \meta{code} when executing. It complains if the plug was already
@@ -582,8 +582,8 @@
%
% \begin{function}{\AssignSocketPlug,\socket_assign_plug:nn}
% \begin{syntax}
-% \cs{AssignSocketPlug} \Arg{socket-name}\Arg{socket-plug-name}
-% \cs{socket_assign_plug:nn}\Arg{socket-name}\Arg{socket-plug-name}
+% \cs{AssignSocketPlug} \Arg{socket-name} \Arg{socket-plug-name}
+% \cs{socket_assign_plug:nn} \Arg{socket-name} \Arg{socket-plug-name}
% \end{syntax}
% Assigns the plug \meta{socket-plug-name} to the socket
% \meta{socket-name}. It errors if either socket or plug is not
@@ -595,8 +595,8 @@
%
% \begin{function}{\UseSocket,\socket_use:nw,\socket_use:n,\socket_use:nn,\socket_use:nnn,\socket_use:nnnn}
% \begin{syntax}
-% \cs{UseSocket} \Arg{socket-name}
-% \cs{socket_use:nnn}\Arg{socket-name} \Arg{socket-arg\textsubscript{1}} \Arg{socket-arg\textsubscript{2}}
+% \cs{UseSocket} \Arg{socket-name}
+% \cs{socket_use:nnn} \Arg{socket-name} \Arg{socket-arg\textsubscript{1}} \Arg{socket-arg\textsubscript{2}}
% \end{syntax}
% Executes the socket \meta{socket-name} by retrieving the
% \meta{code} of the current plug assigned to the socket. This is
@@ -619,8 +619,8 @@
%
% \begin{function}{\ShowSocket,\LogSocket,\socket_show:n,\socket_log:n}
% \begin{syntax}
-% \cs{ShowSocket} \Arg{socket-name}
-% \cs{socket_show:n}\Arg{socket-name}
+% \cs{ShowSocket} \Arg{socket-name}
+% \cs{socket_show:n} \Arg{socket-name}
% \end{syntax}
% Displays information about the socket \meta{socket-name} and its
% state then stops and waits for further instructions --- at the
diff --git a/macros/latex-dev/base/ltspace.dtx b/macros/latex-dev/base/ltspace.dtx
index 03b3445047..206e4f3885 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltspace.dtx}
- [2023/10/26 v1.3r LaTeX Kernel (spacing)]
+ [2024/02/08 v1.3r LaTeX Kernel (spacing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltspace.dtx}
@@ -568,7 +568,7 @@
% \changes{LaTeX2e}{1993/12/08}
% {Command reimplemented; late birthday present for Chris}
% \changes{LaTeX2e}{1993/12/08}{Command reimplemented}
-% \changes{LaTeX2e}{1993/12/16}{Corrected optimisation :-)}
+% \changes{LaTeX2e}{1993/12/16}{Corrected optimisation}
% |\@bsphack| and |\@esphack|
% used by macros such as |\index| and
% |\begin{@float}| \ldots |\end{@float}|
@@ -1156,8 +1156,8 @@
% \subsection{Horizontal space (and breaks)}
%
% \begin{macro}{\nobreakdashes}
-% \changes{v1.3}{2004/02/04}{(Macro added}
-% \changes{v1.3a}{2004/02/15}{(Added spacefactor setting}
+% \changes{v1.3}{2004/02/04}{Macro added}
+% \changes{v1.3a}{2004/02/15}{Added spacefactor setting}
% This idea is borrowed from the \textsf{amsmath} package but
% here we define a robust command.
%
@@ -1194,7 +1194,7 @@
% \end{macro}
%
% \begin{macro}{\nobreakspace}
-% \changes{v1.2k}{1995/12/04}{(Macro added}
+% \changes{v1.2k}{1995/12/04}{Macro added}
% \changes{v1.3r}{2023/10/26}{Protected definition for tilde}
% \begin{macro}{\@xobeysp}
% \changes{v1.2t}{1996/09/28}{Moved from ltmiscen.dtx and redefined to
@@ -1209,7 +1209,7 @@
%
% The braces in the definition of |~| are needed to ensure that a
% following space is preserved when reading to/from internal files.
-% \changes{v1.2l}{1995/12/04}{(braces added to definition of tilde}
+% \changes{v1.2l}{1995/12/04}{braces added to definition of tilde}
%
% We need to keep \cs{@xobeysp} as it is widely used; so here it is
% let to the non-robust command \cs{nobreakspace }.
diff --git a/macros/latex-dev/base/lttab.dtx b/macros/latex-dev/base/lttab.dtx
index e76325d82b..a85b4f8cf7 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/lttagging.dtx b/macros/latex-dev/base/lttagging.dtx
new file mode 100644
index 0000000000..585479df21
--- /dev/null
+++ b/macros/latex-dev/base/lttagging.dtx
@@ -0,0 +1,775 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2023-2024
+% The LaTeX Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+%
+% \iffalse
+%%% From File: lttagging.dtx
+%
+%<*driver>
+% \fi
+\ProvidesFile{lttagging.dtx}
+ [2023/12/19 v1.0a LaTeX Kernel (tagging support)]
+% \iffalse
+\documentclass{l3doc}
+\GetFileInfo{lttagging.dtx}
+\title{\filename}
+\date{\filedate}
+\author{\LaTeX{} project}
+
+\begin{document}
+% \MaintainedByLaTeXTeam{latex} % should be added again the moment
+ % it is supported by l3doc
+ \maketitle
+ \DocInput{\filename}
+\end{document}
+%</driver>
+% \fi
+%
+% \providecommand\env[1]{\texttt{#1}}
+%
+% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \let\ProvideDocElement\NewDocElement
+%
+% \ProvideDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \ProvideDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+% \ProvideDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
+%
+%
+% \section{}
+%
+%
+%
+% \MaybeStop{}
+%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \section{General support for tagged output}
+%
+% \DescribeMacro\SuspendTagging
+% \DescribeMacro\ResumeTagging
+%
+% The are places in code where it is import top stop any tagging
+% activities, e.g., when we are doing trial typesetting that it is
+% done several times. In such a case one must tag only the final
+% version that is actually used, otherwise tagging structures are
+% allowed which then do not end up in the PDF and confuse the
+% mechanism. For this we have two commands that can be used in
+% packages: \cs{SuspendTagging} and \cs{ResumeTagging}. They are
+% available as part of the \LaTeX{} kernel, so that they can be
+% safely used in packages whether or not tagging is requested .They
+% both take string argument that is used for debugging to easily
+% identify why tagging was suspended or restarted, for example, in
+% \pkg{tabularx} you find \verb=\SuspendTagging{tabularx}=. By default
+% they two commands do nothing.
+%
+% TODO: the corresponding L3 layer commands should also have a dummy
+% definition in the kernel!
+%
+% \DescribeMacro\UseTaggingSocket
+% \DescribeMacro\tag_socket_use:n
+% \DescribeMacro\tag_socket_use:nn
+% To support tagging in packages we use sockets with names starting
+% with \texttt{tagsupport/}. Usually, these sockets have exactly two
+% plugs defined:
+% \plug{noop} (when no tagging is requested or tagging is not wanted
+% for some reason) and a second plug that enables the tagging. There
+% may be more, e.g., tagging with special debugging, etc., but right
+% now it is usually just on or off.
+%
+% Given that we sometimes have to suspend tagging, it would be fairly
+% inefficient to put different plugs into these sockets whenever that
+% happens. We therefore offer \cs{UseTaggingSocket} which is like
+% \cs{UseSocket} except that the socket name is specified without
+% \texttt{tagsupport/}, i.e.,
+% \begin{quote}
+% \verb=\UseTaggingSocket{foo}= $\to$
+% \verb=\UseSocket{tagsupport/foo}=
+% \end{quote}
+% Beside being slightly shorter, the big advantage is that this way
+% we can change \cs{UseTaggingSocket} to do nothing when tagging is
+% suspended with \cs{SuspendTagging} instead of changing the plugs of
+% the tagging support sockets back and forth.
+%
+% It is possible to use the tagging support sockets with
+% \cs{UseSocket} directly, but in this case the socket remains active
+% if \cs{SuspendTagging} is in force. There my be reasons for doing
+% that but in general we expect to always use \cs{UseTaggingSocket}.
+%
+% The L3 programming layer versions \cs{tag_socket_use:n} and
+% \cs{tag_socket_use:nn} are slightly more efficient than
+% \cs{UseTaggingSocket} because they do not have to determine how
+% many arguments the socket takes when disabling it, so in code that
+% is using the L3 programming layer we recommend to use them instead
+% of the CamelCase command.
+%
+%
+%
+% \begin{macro}{\SuspendTagging,\ResumeTagging}
+%
+% In the kernel, these two commands get dummy definitions so that
+% they can be used without harm in packages. The real definition is
+% used when tagging gets enabled.
+% \begin{macrocode}
+\cs_new_eq:NN \SuspendTagging \use_none:n
+\cs_new_eq:NN \ResumeTagging \use_none:n
+% \end{macrocode}
+%
+% A simplified version of this defnition should move to
+% \pkg{tagpdf} and dropped here, eventually.
+% \begin{macrocode}
+\AddToHook{begindocument/before}{
+ \cs_if_exist:NT \tag_stop:n
+ {
+ \cs_set:Npn \SuspendTagging #1 {
+% \end{macrocode}%
+% This stops tagging and also disables all tagging sockets so we are done.
+% \begin{macrocode}
+ \tag_stop:n {#1}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \cs_set:Npn \ResumeTagging #1 { \tag_start:n {#1} }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tag_socket_use:n,
+% \tag_socket_use:nn,
+% \UseTaggingSocket,
+% }
+% Again this is not the final definition for the kernel; it is just
+% a version to get going while some parts of the kernel support are
+% still missing.
+% \begin{macrocode}
+\AddToHook{begindocument}[kernel]{
+ \cs_if_exist:NF \tag_if_active:T
+ {
+ \prg_new_conditional:Npnn \tag_if_active: { p , T , TF, F }
+ { \prg_return_false: }
+ }
+}
+% \end{macrocode}
+%
+% Dummy definitions in the kernel.
+% These definitions will get updated in \pkg{tagpdf}.
+% \begin{macrocode}
+\cs_new_protected:Npn \tag_socket_use:n #1 { }
+\cs_new_protected:Npn \tag_socket_use:nn #1#2 { }
+% \end{macrocode}
+% The default in the kernel is just to get rid of the argument:
+% \begin{macrocode}
+\cs_new_protected:Npn \UseTaggingSocket #1 {
+ \int_case:nnF
+ { \int_use:c { c__socket_tagsupport/#1_args_int } }
+ {
+ 0 \prg_do_nothing:
+ 1 \use_none:n
+ 2 \use_none:nn
+% \end{macrocode}
+% We do not expect tagging sockets with more than one or two
+% arguments, so for now we only provide those.
+% \begin{macrocode}
+ }
+ \ERRORusetaggingsocket % that should get a proper error message
+}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \subsection{Tagging support for table/tabular packages}
+%
+% The code uses a number of sockets to inject the tagging
+% commands. These can be easily set to a noop-plug in case the
+% automated tagging is not wanted.
+%
+% \begin{socketdecl}{tagsupport/tbl/cell/begin,
+% tagsupport/tbl/cell/end,
+% tagsupport/tbl/pcell/end,
+% tagsupport/tbl/pcell/end,
+% tagsupport/tbl/row/begin,
+% tagsupport/tbl/row/end,
+% }
+% At first sockets for the begin and end of cells and table rows:
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/cell/begin}{0}
+\NewSocket{tagsupport/tbl/cell/end}{0}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/row/begin}{0}
+\NewSocket{tagsupport/tbl/row/end}{0}
+% \end{macrocode}
+% Multi-line cells have their own sockets (as they start out in
+% vertical mode and need different treatment).
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/pcell/begin}{0}
+\NewSocket{tagsupport/tbl/pcell/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/tbl/init}
+% This socket should be at the begin of the table, inside a group.
+% It is used for settings such as disabling para-tagging inside the
+% table. This socket
+% can perhaps be merged later into the begin-sockets.
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/init}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+% \begin{socketdecl}{tagsupport/tbl/finalize}
+% To fine tune the structure (change cells to header cells, remove
+% unwanted structures, move a foot to the end, etc.). We also need a
+% socket that is executed at the end of the table but \emph{before}
+% all the variables are restored to the outer or default values.
+% The code in the socket can make assignments, but probably
+% shouldn't do typesetting and not write whatsits.
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/finalize}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+
+
+% \begin{socketdecl}{tagsupport/tbl/colspan}
+% This socket is used to manage spanning cells, e.g., a
+% \cs{multicolumn}. It expects one argument (the number of cells
+% spanned) and if tagging is enabled set appropriate tag attributes
+% in the background. We probably need a similar socket for row
+% spans eventually.
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/colspan}{1}
+% \end{macrocode}
+% \end{socketdecl}
+%
+
+
+% \begin{socketdecl}{tagsupport/tbl/hmode/begin,
+% tagsupport/tbl/hmode/end,
+% tagsupport/tbl/vmode/begin,
+% tagsupport/tbl/vmode/end
+% }
+%
+% These sockets are used in the begin and end code of environments,
+% to allow a fast enabling and disabling of the tagging. We
+% distinguish between tables that can be used inside paragraphs and
+% standalone tables such as \env{longtable} that are always in
+% vertical mode.
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/hmode/begin}{0}
+\NewSocket{tagsupport/tbl/hmode/end}{0}
+\NewSocket{tagsupport/tbl/vmode/begin}{0}
+\NewSocket{tagsupport/tbl/vmode/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+%
+% \begin{socketdecl}{tagsupport/tbl/longtable/init,
+% tagsupport/tbl/longtable/finalize}
+% \env{longtable} needs its own sockets to fine tune the structure.
+% Simply switching the plug in the previous socket interferes with
+% enabling/disabling the tagging.
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/longtable/init}{0}
+\NewSocket{tagsupport/tbl/longtable/finalize}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{socketdecl}{tagsupport/tbl/longtable/head,
+% tagsupport/tbl/longtable/foot}
+% Header and footer boxes need special handling because they are repeatedly
+% used.
+% \begin{macrocode}
+\NewSocket{tagsupport/tbl/longtable/head}{0}
+\NewSocket{tagsupport/tbl/longtable/foot}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+%
+%
+%
+%
+% \section{For lttab.dtx parked here for now}
+%
+%
+% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \subsection{Variables for row, column and span counting}
+%
+% This part needs a decision on names for various integer registers
+% as well as a decision if those should be also made available for
+% \LaTeXe{}-style packages in form of 2e names and or as
+% non-internals for the L3 programming layer.
+%
+% At the moment they are all internal but this probably has to change.
+%
+% \begin{macro}{
+% \g_@@_col_int,
+% \g_@@_row_int,
+% \g_@@_span_tl,
+% \g_@@_table_cols_tl}
+%
+% \cs{g_@@_row_int} holds the current row number in the table. The
+% value \texttt{0} means we haven't yet processed the table
+% preamble (or in case of longtable are just in front of the next
+% chunk to be processed). It is incremented by every \cs{cr}
+% including the one ending the table preamble.
+%
+% TODO: due to the gymnastics needed inside the longtable code the
+% row counter is directly exposed there rather than hidden by
+% interfaces. This needs changing when it is decided how to manage
+% these counters.
+%
+% \cs{g_@@_col_int} holds the current column number. The value
+% \texttt{0} means we have not yet started the table or just finished a table row
+% (with \verb=\\= typically); any other positive value means we
+% are currently typesetting a cell in that column in some row
+% (denoted by the \cs{g_@@_row_int}).
+%
+% In a \cs{multicolumn} it holds the column number of the first
+% spanned column and \cs{g_@@_span_tl} the info how many cells are
+% spanned.
+%
+% \cs{g_@@_span_tl} is normally \texttt{1} except in a
+% \cs{multicolumn} cell.
+% \begin{macrocode}
+\int_new:N \g_@@_col_int
+\int_new:N \g_@@_row_int
+\tl_new:N \g_@@_span_tl
+\tl_new:N \g_@@_table_cols_tl
+
+\tl_gset:Nn \g_@@_span_tl {1}
+\tl_gset:Nn \g_@@_table_cols_tl {0} % indicates outer level
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\l_@@_saved_col_tl,\l_@@_saved_row_tl,
+% \l_@@_saved_span_tl,\l_@@_saved_table_cols_tl}
+%
+% Saving the outer values if we are nesting tables is necessary (as
+% the above variables are globally altered). For this we always use
+% token lists because they don't change and we do not need to blow
+% additional integer registers.
+% \begin{macrocode}
+\tl_new:N \l_@@_saved_col_tl
+\tl_new:N \l_@@_saved_row_tl
+\tl_new:N \l_@@_saved_span_tl
+\tl_new:N \l_@@_saved_table_cols_tl
+
+\tl_set:Nn \l_@@_saved_col_tl{0}
+\tl_set:Nn \l_@@_saved_row_tl{0}
+\tl_set:Nn \l_@@_saved_span_tl{1}
+\tl_set:Nn \l_@@_saved_table_cols_tl{0} % indicates outer level
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_missingcells_int}
+% This will contain the number of missing cells in a row:
+% \begin{macrocode}
+\int_new:N \g_@@_missing_cells_int
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \subsection{Tracing/debugging}
+%
+% \begin{macro}{\DebugTablesOn,\DebugTablesOff}
+%
+% \begin{macrocode}
+\def\DebugTablesOn{
+ \cs_set_eq:NN \@@_trace:n \typeout
+}
+\def\DebugTablesOff{
+ \cs_set_eq:NN \@@_trace:n \use_none:n
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@@_trace:n \use_none:n
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Interface commands}
+%
+% All interface commands for the cell number determination have to be
+% public on some level because they are needed in other packages as
+% well, e.g., longtable. We may or may not also want to provide 2e
+% style names for them.
+%
+% \begin{macro}{\tbl_update_cell_data:}
+% Updating cell data in columns after the first means we have to
+% increment the \cs{g_@@_col_int} by the span count of the previous
+% cell (in case it was a \cs{multicolumn}) and then reset the
+% \cs{g_@@_span_tl} to one (as the default).
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_update_cell_data: {
+ \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl }
+ \tl_gset:Nn \g_@@_span_tl {1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\tbl_count_table_cols:}
+% Current implementation of \cs{@mkpream} uses the scratch counter
+% \cs{count@} to keep track of the number of toks registers it needs
+% (2 per column), but this can't be used as it counts also
+% insertions made with \verb+!{}+ and \verb+@{}+.
+% So similar as does longtable for \cs{LT@cols} we count the
+% numbers of ampersands instead.
+% \begin{macrocode}
+\cs_new:Npn \tbl_count_table_cols: {
+ \seq_set_split:NnV\l_@@_tmpa_seq {&}\@preamble
+ \tl_gset:Ne \g_@@_table_cols_tl { \seq_count:N \l_@@_tmpa_seq }
+ \@@_trace:n { ==>~ Table~ has~ \g_@@_table_cols_tl \space columns }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\l_@@_tmpa_seq}
+%
+% \begin{macrocode}
+\seq_new:N \l_@@_tmpa_seq
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\tbl_count_missing_cells:n}
+%
+% We might have the situation that some table package has not
+% implemented the \cs{tbl_count_table_cols:} in which case
+% \cs{g_@@_table_cols_tl} would always be zero and we would get an
+% error below when we try to determine the missing cells, so bypass
+% that calculation if we aren't doing tagging (there the packages
+% should have the proper code added). Recall that this is code,
+% that is called by \verb=\\= and an old table packagee might rely
+% on whatever the \LaTeX{} kernel offers here.
+% \begin{macrocode}
+\cs_new:Npn \tbl_count_missing_cells:n #1 {
+ \tag_if_active:T {
+ \int_compare:nNnT \g_@@_col_int > 0
+ {
+ \int_gset:Nn \g_@@_missing_cells_int
+ {
+ \g_@@_table_cols_tl
+ - \g_@@_col_int
+ - \g_@@_span_tl
+ + 1
+ }
+ \int_compare:nNnT \g_@@_missing_cells_int < 0 \ERRORmissingcells % should not happen
+ \@@_trace:n{==>~
+ (#1)~
+ This~ row~ needs~
+ \int_use:N \g_@@_missing_cells_int \space
+ additional~ cell(s)
+ }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tbl_save_outer_table_cols:}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_save_outer_table_cols: {
+ \tl_set_eq:NN \l_@@_saved_table_cols_tl \g_@@_table_cols_tl
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tbl_init_cell_data_for_table:}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_init_cell_data_for_table: {
+ \tl_set:No \l_@@_saved_col_tl {\int_use:N \g_@@_col_int }
+ \tl_set:No \l_@@_saved_row_tl {\int_use:N \g_@@_row_int }
+ \tl_set_eq:NN \l_@@_saved_span_tl \g_@@_span_tl
+%
+ \@@_trace:n { ==>~ saved~cell~data:~
+ \l_@@_saved_row_tl,
+ \l_@@_saved_col_tl,
+ \l_@@_saved_span_tl \space
+ (
+ \int_compare:nNnTF \l_@@_saved_table_cols_tl = 0
+ { outer~ level }
+ { max:~ \l_@@_saved_table_cols_tl }
+ )
+ }
+% \end{macrocode}
+% These are the initial values when starting a table:
+% \begin{macrocode}
+ \int_gzero:N \g_@@_row_int
+ \int_gzero:N \g_@@_col_int
+ \tl_gset:Nn \g_@@_span_tl {1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\tbl_update_cell_data_for_next_row:}
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_update_cell_data_for_next_row: {
+ \int_gincr:N \g_@@_row_int % this row about to start
+ \int_gzero:N \g_@@_col_int % we are before first col
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tbl_init_cell_data_for_row:}
+% If we start processing a cell in the first column we set
+% \cs{g_@@_col_int} to \texttt{1} as we are no longer "at" but "in"
+% the first column. We also set \cs{g_@@_span_tl} to its default
+% value (not spanning cells).
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_init_cell_data_for_row: {
+ \int_gset:Nn \g_@@_col_int {1}
+ \tl_gset:Nn \g_@@_span_tl {1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tbl_if_row_was_started:T,
+% \tbl_if_row_was_started:TF}
+% We use \cs{g_@@_col_int} equal zero to indicate that we are just
+% after a TR (i.e.n between rows or at the very beginning of the
+% table). Using the row
+% count is not so good as longtable may split the table in chunks.
+%
+% These conditionals have to be expandable (i.e., unprotected) as
+% they are sometimes executed when \TeX{} is scanning inside a table.
+% \begin{macrocode}
+\cs_new:Npn \tbl_if_row_was_started:T {
+ \int_compare:nNnT \g_@@_col_int > 0
+}
+\cs_new:Npn \tbl_if_row_was_started:TF {
+ \int_compare:nNnTF \g_@@_col_int > 0
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\tbl_gzero_row_count:,\tbl_gincr_row_count:,\tbl_gdecr_row_count:}
+% This here is basically a temporary interface. What it will be in
+% the end depends on what we decide concerning exposing row and
+% column counters, if they stay internal we need something like
+% this here (perhaps using \texttt{gincr} etc, or perhaps some
+% other names in the first place).
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_gzero_row_count: {
+ \int_gzero:N \g_@@_row_int
+}
+\cs_new_protected:Npn \tbl_gincr_row_count: {
+ \int_gincr:N \g_@@_row_int
+}
+\cs_new_protected:Npn \tbl_gdecr_row_count: {
+ \int_gdecr:N \g_@@_row_int
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tbl_inbetween_rows:}
+% Again name is not really brilliant so far.
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_inbetween_rows: {
+ \int_gzero:N \g_@@_col_int
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \begin{macro}{\tbl_restore_outer_cell_data:}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_restore_outer_cell_data: {
+ \int_gset:Nn \g_@@_col_int { \l_@@_saved_col_tl }
+ \int_gset:Nn \g_@@_row_int { \l_@@_saved_row_tl }
+ \tl_gset_eq:NN \g_@@_span_tl \l_@@_saved_span_tl
+ \tl_gset_eq:NN \g_@@_table_cols_tl \l_@@_saved_table_cols_tl
+ \@@_trace:n { ==>~ restored~cell~data:~
+ \int_use:N \g_@@_row_int,
+ \int_use:N \g_@@_col_int,
+ \l_@@_saved_span_tl \space
+ (
+ \int_compare:nNnTF \g_@@_table_cols_tl = 0
+ { outer~ level }
+ { max:~ \g_@@_table_cols_tl }
+ )
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\tbl_update_multicolumn_cell_data:n}
+% This macro updates \cs{g_@@_col_int} and \cs{g_@@_span_tl} inside
+% a \cs{multicolumn} and possibly calls the tagging socket
+% \texttt{tbl/row/begin}.
+% \begin{macrocode}
+\cs_new_protected:Npn \tbl_update_multicolumn_cell_data:n #1 {
+% \end{macrocode}
+% We execute socket for tagging only if this \cs{multicolumn}
+% replaces the preamble of the first column. In that case we also have
+% to set \cs{g_@@_col_int} to 1 because this is no longer done in the
+% preamble for the cell either.
+% \begin{macrocode}
+ \int_compare:nNnTF \g_@@_col_int = 0
+ {
+ \UseTaggingSocket{tbl/row/begin}
+ \int_gset:Nn \g_@@_col_int {1}
+ }
+% \end{macrocode}
+% If we are in a later column we use \cs{g_@@_span_tl} from the
+% previous column to update.
+% \begin{macrocode}
+ {
+ \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl }
+ }
+% \end{macrocode}
+% Then we set the span value so that it can be use in the next column.
+% \begin{macrocode}
+ \tl_gset:Nn \g_@@_span_tl {#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\tbl_crcr:n}
+% This macro is used instead of the usual \cs{crcr} at the end of a
+% table. It is deliberately defined without protection because it
+% may get expanded by the scanning mechanism of low-level \TeX{}
+% after a final \cs{cr} (aka \verb=\\=) in the table. In that case
+% it shouldn't stop the expansion and the conditional inside will
+% be false, thus it just vanishes without doing anything. If there
+% are missing cells (in which case we also haven't see \cs{cr} yet)
+% the macro \cs{tbl_count_missing_cells:n} is executed and
+% then the row is finished with a final \cs{cr}.
+% \begin{macrocode}
+\cs_new:Npn \tbl_crcr:n #1 {
+ \int_compare:nNnT \g_@@_col_int > 0
+ {
+ \tbl_count_missing_cells:n {#1}
+ \cr
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%<@@=>
+% \end{macrocode}
+%
+% This is needed for \pkg{longtable} because \cs{refstepcounter} is
+% setting up a target when \pkg{hyperref} is loaded and we don't
+% want that in \pkg{longtable}.
+%
+% TODO: move to right .dtx file
+% \begin{macrocode}
+\let\@kernel@refstepcounter\refstepcounter
+% \end{macrocode}
+% Prevent longtable patching by hyperref until hyperref does so automatically:
+% \begin{macrocode}
+\def\hyper@nopatch@longtable{}
+% \end{macrocode}
+%
+%
+% Should there be a module?
+%
+% \begin{macrocode}
+%<latexrelease>\NewModuleRelease{2024/06/01}{lttagging}
+%<latexrelease> {Tagging support}
+% \end{macrocode}
+%
+%
+%
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}{lttagging}%
+%<latexrelease> {Undo tagging support}
+%<latexrelease>
+%<latexrelease>
+%<latexrelease>
+%<latexrelease>\EndModuleRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/macros/latex-dev/base/lttemplates.dtx b/macros/latex-dev/base/lttemplates.dtx
new file mode 100644
index 0000000000..844fb6fd34
--- /dev/null
+++ b/macros/latex-dev/base/lttemplates.dtx
@@ -0,0 +1,2698 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
+% Copyright (C) 2004-2010 Frank Mittelbach, The LaTeX Project
+% Copyright (C) 2011-2024
+% The LaTeX Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+%
+% \iffalse
+%
+%%% From File: lttemplates.dtx
+%
+%<*driver>
+% \fi
+\ProvidesFile{lttemplates.dtx}
+ [2024-02-11 v1.0a LaTeX Kernel (Prototype document functions)]
+% \iffalse
+\documentclass{l3doc}
+\GetFileInfo{lttemplates.dtx}
+\begin{document}
+ \DocInput{lttemplates.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{The \texttt{lttemplates.dtx} code\thanks{This file has version
+% \fileversion\ dated \filedate, \copyright\ \LaTeX\
+% Project.}}
+% \author{^^A
+% Frank Mittelbach, Chris Rowley, David Carlisle, \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \maketitle
+%
+% \section{Introduction}
+%
+% There are three broad \enquote{layers} between putting down ideas into
+% a source file and ending up with a typeset document. These layers of
+% document writing are
+% \begin{enumerate}
+% \item authoring of the text with mark-up;
+% \item document layout design;
+% \item implementation (with \TeX{} programming) of the design.
+% \end{enumerate}
+% We write the text as an author, and we see the visual output of the design
+% after the document is generated; the \TeX{} implementation in the middle is
+% the glue between the two.
+%
+% \LaTeX{}'s greatest success has been to standardise a system of mark-up that
+% balances the trade-off between ease of reading and ease of writing to suit
+% almost all forms of technical writing. It's
+% other original strength was a good background in typographical design; while
+% the standard \LaTeXe{} classes look somewhat dated now in terms of their
+% visual design, their typography is generally sound (barring the occasional
+% minor faults).
+%
+% However, \LaTeXe{} has always lacked a standard approach to customising
+% the visual design of a document. Changing the looks of the standard classes
+% involved either:
+% \begin{itemize}
+% \item Creating a new version of the implementation code of the class and
+% editing it.
+% \item Loading one of the many packages to customise certain elements of
+% the standard classes.
+% \item Loading a completely different document class, such as
+% \textsf{KOMA-Script} or \textsf{memoir}, that allows easy customisation.
+% \end{itemize}
+% All three of these approaches have their drawbacks and learning curves.
+%
+% The idea behind \pkg{lttemplates} is to cleanly separate the three layers
+% introduced at the beginning of this section, so that document authors who
+% are not programmers can easily change the design of their documents.
+% \pkg{lttemplates} also makes it easier for \LaTeX{} programmers to provide
+% their own customisations on top of a pre-existing class.
+%
+% \section{What is a document?}
+%
+% Besides the textual content of the words themselves, the source file
+% of a document contains mark-up elements that add structure to the
+% document. These elements include sectional divisions, figure/table
+% captions, lists of various sorts, theorems/proofs, and so on.
+% The list will be different for every document that can be written.
+%
+% Each element can be represented logically without worrying about the
+% formatting, with mark-up such as \cs{section}, \cs{caption},
+% |\begin{enumerate}| and so on. The output of each one of these
+% document elements will be a typeset representation of the information
+% marked up, and the visual arrangement and design of these elements
+% can vary widely in producing a variety of desired outcomes.
+%
+% For each type of document element, there may be design variations that
+% contain the same sort of information but present it in slightly
+% different ways. For example, the difference between a numbered and an
+% unnumbered section, \cs{section} and |\section*|, or the difference
+% between an itemised list or an enumerated list.
+%
+% There are three distinct layers in the definition of
+% \enquote{a document} at this level
+% \begin{enumerate}
+% \item semantic elements such as the ideas of sections and lists;
+% \item a set of design solutions for representing these elements
+% visually;
+% \item specific variations for these designs that represent the
+% elements in the document.
+% \end{enumerate}
+% In the parlance of the template system, these are called types,
+% templates, and instances, and they are discussed below in sections
+% \ref{sec:types}, \ref{sec:templates}, and~\ref{sec:instances},
+% respectively.
+%
+% \section {Types, templates, and instances}
+%
+% By formally declaring documents to be composed of mark-up elements
+% grouped into types, which are interpreted and typeset with a set of
+% templates, each of which has one or more instances with which to
+% compose each and every semantic unit of the text, we can cleanly
+% separate the components of document construction.
+%
+% All of the structures provided by the template system are global,
+% and do not respect \TeX{} grouping.
+%
+% \section{Template types}
+% \label{sec:types}
+%
+% An \emph{template type} (sometimes just \enquote{type}) is an
+% abstract idea of a document element that takes a fixed number of
+% arguments corresponding to the information from the document author
+% that it is representing. A sectioning type, for example, might take
+% three inputs: \enquote{title}, \enquote{short title}, and
+% \enquote{label}.
+%
+% Any given document class will define which types are to be
+% used in the document, and any template of a given type can be
+% used to generate an instance for the type. (Of course, different
+% templates will produce different typeset representations, but the
+% underlying content will be the same.)
+%
+% \begin{function}{\NewTemplateType}
+% \begin{syntax}
+% \cs{NewTemplateType} \Arg{template type} \Arg{no. of args}
+% \end{syntax}
+% This function defines an \meta{template type} taking
+% \meta{number of arguments}, where the \meta{type} is an
+% abstraction as discussed above. For example,
+% \begin{verbatim}
+% \NewTemplateType{sectioning}{3}
+% \end{verbatim}
+% creates a type \enquote{sectioning}, where each use of that
+% type will need three arguments.
+% \end{function}
+%
+% \section{Templates}
+% \label{sec:templates}
+%
+% A \emph{template} is a generalised design solution for representing
+% the information of a specified type. Templates that do the same
+% thing, but in different ways, are grouped together by their type
+% and given separate names. There are two important parts to a template:
+% \begin{itemize}
+% \item the parameters it takes to vary the design it is producing;
+% \item the implementation of the design.
+% \end{itemize}
+% As a document author or designer does not care about the
+% implementation but rather only the interface to the template, these two
+% aspects of the template definition are split into two independent
+% declarations, \cs{DeclareTemplateInterface} and
+% \cs{DeclareTemplateCode}.
+%
+% \begin{function}{\DeclareTemplateInterface}
+% \begin{syntax}
+% \cs{DeclareTemplateInterface}
+% ~~\Arg{type} \Arg{template} \Arg{no.~of args}
+% ~~\Arg{key list}
+% \end{syntax}
+% A \meta{template} interface is declared for a particular
+% \meta{type}, where the \meta{number of arguments} must
+% agree with the type declaration. The interface itself is
+% defined by the \meta{key list}, which is itself a key--value list
+% taking a specialized format:
+% \begin{quotation}
+% \obeylines
+% \noindent
+% \meta{key1}~":"~\meta{key type1}~","
+% \meta{key2}~":"~\meta{key type2}~","
+% \meta{key3}~":"~\meta{key type3}~"="~\meta{default3}~","
+% \meta{key4}~":"~\meta{key type4}~"="~\meta{default4}~","
+% \ldots
+% \end{quotation}
+% Each \meta{key} name should consist of \textsc{ascii} characters,
+% with the exception of |,|, |=| and \verb*| |. The recommended form
+% for key names is to use lower case letters, with dashes to separate
+% out different parts. Spaces are ignored in key names, so they can be
+% included or missed out at will. Each \meta{key} must have a
+% \meta{key type}, which defined the type of input that the \meta{key}
+% requires. A full list of key types is given in
+% Table~\ref{tab:key-types}. Each key may have a \meta{default}
+% value, which will be used in by the template if the \meta{key} is
+% not set explicitly. The \meta{default} should be of the correct
+% form to be accepted by the \meta{key type} of the \meta{key}: this
+% is not checked by the code.
+% \end{function}
+%
+% \begin{table}
+% \centering
+% \begin{tabular}{>{\ttfamily}ll}
+% \toprule
+% \multicolumn{1}{l}{Key-type} & Description of input \\
+% \midrule
+% boolean & \texttt{true} or \texttt{false} \\
+% choice\Arg{choices}
+% & A list of pre-defined \meta{choices} \\
+% commalist & A comma-separated list \\
+% function\Arg{$N$}
+% & A function definition with $N$ arguments
+% ($N$ from $0$ to $9$) \\
+% instance\Arg{name}
+% & An instance of type \meta{name} \\
+% integer & An integer or integer expression \\
+% length & A fixed length \\
+% muskip & A math length with shrink and stretch components \\
+% real & A real (floating point) value \\
+% skip & A length with shrink and stretch components \\
+% tokenlist & A token list: any text or commands \\
+% \bottomrule
+% \end{tabular}
+% \caption{Key-types for defining template interfaces with
+% \cs{DeclareTemplateInterface}.}
+% \label{tab:key-types}
+% \end{table}
+%
+% \begin{function}{\KeyValue}
+% \begin{syntax}
+% \cs{KeyValue} \Arg{key name}
+% \end{syntax}
+% There are occasions where the default (or value) for one key
+% should be taken from another. The \cs{KeyValue} function can be
+% used to transfer this information without needing to know the
+% internal implementation of the key:
+% \begin{verbatim}
+% \DeclareTemplateInterface { type } { template } { no. of args }
+% {
+% key-name-1 : key-type = value ,
+% key-name-2 : key-type = \KeyValue { key-name-1 },
+% ...
+% }
+% \end{verbatim}
+% \end{function}
+%
+% \begin{function}{\DeclareTemplateCode}
+% \begin{syntax}
+% \cs{DeclareTemplateCode}
+% ~~\Arg{type} \Arg{template} \Arg{no.~of args}
+% ~~\Arg{key bindings} \Arg{code}
+% \end{syntax}
+% The relationship between a templates keys and the internal
+% implementation is created using the \cs{DeclareTemplateCode}
+% function. As with \cs{DeclareTemplateInterface}, the
+% \meta{template} name is given along with the \meta{type}
+% and \meta{number of arguments} required. The \meta{key bindings}
+% argument is a key--value list which specifies the relationship
+% between each \meta{key} of the template interface with an
+% underlying\meta{variable}.
+%
+% \begin{quotation}
+% \obeylines
+% \noindent
+% \meta{key1}~"="~\meta{variable1},
+% \meta{key2}~"="~\meta{variable2},
+% \meta{key3}~"="~global~\meta{variable3},
+% \meta{key4}~"="~global~\meta{variable4},
+% \ldots
+% \end{quotation}
+% With the exception of the choice, code and function key types,
+% the \meta{variable} here should be the name of an existing
+% \LaTeX3 register. As illustrated, the key word \enquote{global}
+% may be included in the listing to indicate that the \meta{variable}
+% should be assigned globally. A full list of variable bindings is
+% given in Table~\ref{tab:key-vars}.
+%
+% The \meta{code} argument of \cs{DeclareTemplateCode} is used
+% as the replacement text for the template when it is used, either
+% directly or as an instance. This may therefore accept arguments
+% |#1|, |#2|, \emph{etc}.~as detailed by the \meta{number of arguments}
+% taken by the type.
+% \end{function}
+%
+% \begin{table}
+% \centering
+% \begin{tabular}{>{\ttfamily}ll}
+% \toprule
+% \multicolumn{1}{l}{Key-type} & Description of binding \\
+% \midrule
+% boolean & Boolean variable, \emph{e.g}.~\cs{l_tmpa_bool} \\
+% choice
+% & List of choice implementations
+% (see Section~\ref{sec:choices-key}) \\
+% commalist & Comma list, \emph{e.g}.~\cs{l_tmpa_clist} \\
+% function
+% & Function taking $N$ arguments, \emph{e.g}.~\cs{use_i:nn} \\
+% instance \\
+% integer & Integer variable, \emph{e.g}.~\cs{l_tmpa_int} \\
+% length & Dimension variable, \emph{e.g}.~\cs{l_tmpa_dim} \\
+% muskip & Muskip variable, \emph{e.g}.~\cs{l_tmpa_muskip} \\
+% real & Floating-point variable, \emph{e.g}.~\cs{l_tmpa_fp} \\
+% skip & Skip variable, \emph{e.g}.~\cs{l_tmpa_skip} \\
+% tokenlist & Token list variable, \emph{e.g}.~\cs{l_tmpa_tl} \\
+% \bottomrule
+% \end{tabular}
+% \caption{Bindings required for different key types when defining
+% template implementations with \cs{DeclareTemplateCode}. Apart
+% from \texttt{code}, \texttt{choice} and \texttt{function}
+% all of these accept the key word \texttt{global} to carry
+% out a global assignment.}
+% \label{tab:key-vars}
+% \end{table}
+%
+% \begin{function}{\AssignTemplateKeys}
+% \begin{syntax}
+% \cs{AssignTemplateKeys}
+% \end{syntax}
+% In the final argument of \cs{DeclareTemplateCode} the assignment of
+% keys defined by the template may be delayed by including the command
+% \cs{AssignTemplateKeys}. If this is \emph{not} present, keys are assigned
+% immediately before the template code. If \cs{AssignTemplateKeys} is
+% present, assignment is delayed until this point. Note that the
+% command must be \emph{directly} present in the code, not placed
+% within a nested command/macro.
+% \end{function}
+%
+% \begin{function}{\DeclareTemplateCopy}
+% \begin{syntax}
+% \cs{DeclareTemplateCopy}
+% ~~\Arg{type} \Arg{template2} \Arg{template1}
+% \end{syntax}
+% Copies \meta{template1} of \meta{type} to a new name \meta{template2}:
+% the copy can then be edited independent of teh original.
+% \end{function}
+%
+% \section{Multiple choices}
+% \label{sec:choices-key}
+%
+% The \texttt{choice} key type implements multiple choice input. At the
+% interface level, only the list of valid choices is needed:
+% \begin{verbatim}
+% \DeclareTemplateInterface { foo } { bar } { 0 }
+% { key-name : choice { A, B, C } }
+% \end{verbatim}
+% where the choices are given as a comma-list (which must therefore
+% be wrapped in braces). A default value can also be given:
+% \begin{verbatim}
+% \DeclareTemplateInterface { foo } { bar } { 0 }
+% { key-name : choice { A, B, C } = A }
+% \end{verbatim}
+%
+% At the implementation level, each choice is associated with code,
+% using a nested key--value list.
+% \begin{verbatim}
+% \DeclareTemplateCode { foo } { bar } { 0 }
+% {
+% key-name =
+% {
+% A = Code-A ,
+% B = Code-B ,
+% C = Code-C
+% }
+% }
+% { ... }
+% \end{verbatim}
+% The two choice lists should match, but in the implementation a
+% special \texttt{unknown} choice is also available. This can be used
+% to ignore values and implement an \enquote{else} branch:
+% \begin{verbatim}
+% \DeclareTemplateCode { foo } { bar } { 0 }
+% {
+% key-name =
+% {
+% A = Code-A ,
+% B = Code-B ,
+% C = Code-C ,
+% unknown = Else-code
+% }
+% }
+% { ... }
+% \end{verbatim}
+% The \texttt{unknown} entry must be the last one given, and should
+% \emph{not} be listed in the interface part of the template.
+%
+% For keys which accept the values \texttt{true} and \texttt{false}
+% both the boolean and choice key types can be used. As template
+% interfaces are intended to prompt clarity at the design level, the
+% boolean key type should be favoured, with the choice type reserved
+% for keys which take arbitrary values.
+%
+% \section{Instances}
+% \label{sec:instances}
+%
+% After a template is defined it still needs to be put to use. The
+% parameters that it expects need to be defined before it can be used in
+% a document. Every time a template has parameters given to it, an
+% \emph{instance} is created, and this is the code that ends up in the
+% document to perform the typesetting of whatever pieces of information
+% are input into it.
+%
+% For example, a template might say \enquote{here is a section with or
+% without a number that might be centred or left aligned and print its
+% contents in a certain font of a certain size, with a bit of a gap
+% before and after it} whereas an instance declares \enquote{this is a
+% section with a number, which is centred and set in $12\,\text{pt}$
+% italic with a $10\,\text{pt}$ skip before and a
+% $12\,\text{pt}$ skip after it}. Therefore, an instance is just a
+% frozen version of a template with specific settings as chosen by the
+% designer.
+%
+% \begin{function}{\DeclareInstance}
+% \begin{syntax}
+% \cs{DeclareInstance}
+% ~~\Arg{type} \Arg{instance} \Arg{template} \Arg{parameters}
+% \end{syntax}
+% This function uses a \meta{template} for an \meta{type}
+% to create an \meta{instance}. The \meta{instance} will be set
+% up using the \meta{parameters}, which will set some of the
+% \meta{keys} in the \meta{template}.
+%
+% As a practical example, consider a type for document sections
+% (which might include chapters, parts, sections, \emph{etc}.), which
+% is called \texttt{sectioning}. One possible template for this
+% type might be called \texttt{basic}, and one instance of this
+% template would be a numbered section. The instance declaration might
+% read:
+% \begin{verbatim}
+% \DeclareInstance { sectioning } { section-num } { basic }
+% {
+% numbered = true ,
+% justification = center ,
+% font =\normalsize\itshape ,
+% before-skip = 10pt ,
+% after-skip = 12pt ,
+% }
+% \end{verbatim}
+% Of course, the key names here are entirely imaginary, but illustrate
+% the general idea of fixing some settings.
+% \end{function}
+%
+% \begin{function}{\IfInstanceExistT, \IfInstanceExistF, \IfInstanceExistTF}
+% \begin{syntax}
+% \cs{IfInstanceExistTF} \Arg{type} \Arg{instance} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the named \meta{instance} of a \meta{type} exists, and
+% then inserts the appropriate code into the input stream.
+% \end{function}
+%
+% \begin{function}{\DeclareInstanceCopy}
+% \begin{syntax}
+% \cs{DeclareInstanceCopy}
+% ~~\Arg{type} \Arg{instance2} \Arg{instance1}
+% \end{syntax}
+% Copies the \meta{values} for \meta{instance1} for an
+% \meta{type} to \meta{instance2}.
+% \end{function}
+%
+% \section{Document interface}
+%
+% After the instances have been chosen, document commands must be
+% declared to use those instances in the document. \cs{UseInstance}
+% calls instances directly, and this command should be used internally
+% in document-level mark-up.
+%
+% \begin{function}{\UseInstance}
+% \begin{syntax}
+% \cs{UseInstance}
+% ~~\Arg{type} \Arg{instance} \meta{arguments}
+% \end{syntax}
+% Uses an \meta{instance} of the \meta{type}, which will require
+% \meta{arguments} as determined by the number specified for the
+% \meta{type}. The \meta{instance} must have been declared
+% before it can be used, otherwise an error is raised.
+% \end{function}
+%
+% \begin{function}{\UseTemplate}
+% \begin{syntax}
+% \cs{UseTemplate} \Arg{type} \Arg{template}
+% ~~\Arg{settings} \meta{arguments}
+% \end{syntax}
+% Uses the \meta{template} of the specified \meta{type},
+% applying the \meta{settings} and absorbing \meta{arguments} as
+% detailed by the \meta{type} declaration. This in effect
+% is the same as creating an instance using \cs{DeclareInstance}
+% and immediately using it with \cs{UseInstance}, but without the
+% instance having any further existence. It is therefore useful where
+% a template needs to be used once.
+%
+% This function can also be used as the argument to \texttt{instance}
+% key types:
+% \begin{verbatim}
+% \DeclareInstance { type } { template } { instance }
+% {
+% instance-key =
+% \UseTemplate { type2 } { template2 } { <settings> }
+% }
+% \end{verbatim}
+% \end{function}
+%
+% \section{Changing existing definitions}
+%
+% Template parameters may be assigned specific defaults for instances
+% to use if the instance declaration doesn't explicit set those
+% parameters. In some cases, the document designer will wish to edit
+% these defaults to allow them to \enquote{cascade} to the instances.
+% The alternative would be to set each parameter identically for each
+% instance declaration, a tedious and error-prone process.
+%
+% \begin{function}{\EditTemplateDefaults}
+% \begin{syntax}
+% \cs{EditTemplateDefaults}
+% ~~\Arg{type} \Arg{template} \Arg{new defaults}
+% \end{syntax}
+% Edits the \meta{defaults} for a \meta{template} for an
+% \meta{type}. The \meta{new defaults}, given as a key--value
+% list, replace the existing defaults for the \meta{template}. This
+% means that the change will apply to instances declared after the
+% editing, but that instances which have already been created are
+% unaffected.
+% \end{function}
+%
+% \begin{function}{\EditInstance}
+% \begin{syntax}
+% \cs{EditInstance}
+% ~~\Arg{type} \Arg{instance} \Arg{new values}
+% \end{syntax}
+% Edits the \meta{values} for an \meta{instance} for an
+% \meta{type}. The \meta{new values}, given as a key--value
+% list, replace the existing values for the \meta{instance}. This
+% function is complementary to \cs{EditTemplateDefaults}:
+% \cs{EditInstance} changes a single instance while leaving the
+% template untouched.
+% \end{function}
+%
+% \section{\emph{Ad hoc} adjustment of templates}
+%
+% \begin{function}{\SetTemplateKeys}
+% \begin{syntax}
+% \cs{SetTemplateKeys} \Arg{type} \Arg{template} \Arg{keyvals}
+% \end{syntax}
+% At point of use it may be useful to apply changed to individual instances.
+% This is supported as each template key is made available for adjustment
+% using \cs{SetTemplateKeys}.
+% \end{function}
+%
+% For example, after
+% \begin{verbatim}
+% \NewTypeType{MyObj}{0}
+% \DeclareTemplateInterface{MyObj}{TemplateA}{0}
+% {
+% akey: tokenlist ,
+% bkey: function{2}
+% }
+% \DeclareTemplateCode{MyObj}{TemplateA}{0}
+% {
+% akey = SomeTokens ,
+% bkey = \func:nn ,
+% }
+% \end{verbatim}
+% the template keys could be adjusted in an \emph{ad hoc} fashion using
+% \begin{verbatim}
+% \SetTemplateKeys{MyObj}{TemplateA}
+% {
+% akey = OtherTokens ,
+% bkey = \AltFunc:nn
+% }
+% \end{verbatim}
+%
+% \section{Getting information about templates and instances}
+%
+% \begin{function}{\ShowInstanceValues}
+% \begin{syntax}
+% \cs{ShowInstanceValues} \Arg{type} \Arg{instance}
+% \end{syntax}
+% Shows the \meta{values} for an \meta{instance} of the given
+% \meta{type} at the terminal.
+% \end{function}
+%
+% \begin{function}{\ShowTemplateCode}
+% \begin{syntax}
+% \cs{ShowTemplateCode} \Arg{type} \Arg{template}
+% \end{syntax}
+% Shows the \meta{code} of a \meta{template} for an \meta{type}
+% in the terminal.
+% \end{function}
+%
+% \begin{function}{\ShowTemplateDefaults}
+% \begin{syntax}
+% \cs{ShowTemplateDefaults} \Arg{type} \Arg{template}
+% \end{syntax}
+% Shows the \meta{default} values of a \meta{template} for an
+% \meta{type} in the terminal.
+% \end{function}
+%
+% \begin{function}{\ShowTemplateInterface}
+% \begin{syntax}
+% \cs{ShowTemplateInterface} \Arg{type} \Arg{template}
+% \end{syntax}
+% Shows the \meta{keys} and associated \meta{key types} of a
+% \meta{template} for an \meta{type} in the terminal.
+% \end{function}
+%
+% \begin{function}{\ShowTemplateVariables}
+% \begin{syntax}
+% \cs{ShowTemplateVariables} \Arg{type} \Arg{template}
+% \end{syntax}
+% Shows the \meta{variables} and associated \meta{keys} of a
+% \meta{template} for an \meta{type} in the terminal. Note that
+% \texttt{code} and \texttt{choice} keys do not map directly to variables
+% but to arbitrary code. For \texttt{choice} keys, each valid choice
+% is shown as a separate entry in the list, with the key name and choice
+% separated by a space, for example
+% \begin{verbatim}
+% Template 'example' of type 'example' has variable mapping:
+% > demo unknown => \def \demo {?}
+% > demo c => \def \demo {c}
+% > demo b => \def \demo {b}
+% > demo a => \def \demo {a}.
+% \end{verbatim}
+% would be shown for a choice key \texttt{demo} with valid choices
+% \texttt{a}, \texttt{b} and \texttt{c}, plus code for an \texttt{unknown}
+% branch.
+% \end{function}
+%
+% \MaybeStop{\setlength\IndexMin{200pt}\PrintIndex}
+%
+% \section{The implementation}
+%
+% \begin{macrocode}
+%<@@=template>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*2ekernel>
+\message{templates,}
+%</2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\NewModuleRelease{2024/06/01}{lttemplates}
+%<latexrelease> {Prototype~document~commands}%
+% \end{macrocode}
+%
+% \subsection{Variables and constants}
+%
+% \begin{variable}
+% {
+% \c_@@_code_root_tl ,
+% \c_@@_defaults_root_tl ,
+% \c_@@_instances_root_tl ,
+% \c_@@_keytypes_root_tl ,
+% \c_@@_key_order_root_tl ,
+% \c_@@_restrict_root_tl ,
+% \c_@@_values_root_tl ,
+% \c_@@_vars_root_tl
+% }
+% So that literal values are kept to a minimum.
+% \begin{macrocode}
+\tl_const:Nn \c_@@_code_root_tl { template~code~>~ }
+\tl_const:Nn \c_@@_defaults_root_tl { template~defaults~>~ }
+\tl_const:Nn \c_@@_instances_root_tl { template~instance~>~ }
+\tl_const:Nn \c_@@_keytypes_root_tl { template~key~types~>~ }
+\tl_const:Nn \c_@@_key_order_root_tl { template~key~order~>~ }
+\tl_const:Nn \c_@@_values_root_tl { template~values~>~ }
+\tl_const:Nn \c_@@_vars_root_tl { template~vars~>~ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_keytypes_arg_seq}
+% A list of keytypes which also need additional data (an argument),
+% used to parse the keytype correctly.
+% \begin{macrocode}
+\seq_const_from_clist:Nn \c_@@_keytypes_arg_seq
+ { choice , function , instance }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_type_prop}
+% For storing types and the associated number of arguments.
+% \begin{macrocode}
+\prop_new:N \g_@@_type_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_assignments_tl}
+% When creating an instance, the assigned values are collected here.
+% \begin{macrocode}
+\tl_new:N \l_@@_assignments_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\l_@@_default_tl}
+% The default value for a key is recovered here from the property list
+% in which it is stored.
+% \begin{macrocode}
+\tl_new:N \l_@@_default_tl
+% \end{macrocode}
+%\ end{macro}
+%
+% \begin{variable}{\l_@@_error_bool}
+% A flag for errors to be carried forward.
+% \begin{macrocode}
+\bool_new:N \l_@@_error_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_global_bool}
+% Used to indicate that assignments should be global.
+% \begin{macrocode}
+\bool_new:N \l_@@_global_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {
+% \l_@@_key_name_tl ,
+% \l_@@_keytype_tl ,
+% \l_@@_keytype_arg_tl ,
+% \l_@@_value_tl ,
+% \l_@@_var_tl
+% }
+% When defining each key in a template, the name and type of the key
+% need to be separated and stored. Any argument needed by the
+% keytype is also stored separately.
+% \begin{macrocode}
+\tl_new:N \l_@@_key_name_tl
+\tl_new:N \l_@@_keytype_tl
+\tl_new:N \l_@@_keytype_arg_tl
+\tl_new:N \l_@@_value_tl
+\tl_new:N \l_@@_var_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {
+% \l_@@_keytypes_prop ,
+% \l_@@_key_order_seq ,
+% \l_@@_values_prop ,
+% \l_@@_vars_prop
+% }
+% To avoid needing too many difficult-to-follow csname assignments,
+% various scratch token registers are used to build up data, which is
+% then transferred
+% \begin{macrocode}
+\prop_new:N \l_@@_keytypes_prop
+\seq_new:N \l_@@_key_order_seq
+\prop_new:N \l_@@_values_prop
+\prop_new:N \l_@@_vars_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {
+% \l_@@_tmp_clist ,
+% \l_@@_tmp_dim ,
+% \l_@@_tmp_int ,
+% \l_@@_tmp_muskip ,
+% \l_@@_tmp_skip ,
+% \l_@@_tmp_tl
+% }
+% Scratch space.
+% \begin{macrocode}
+\clist_new:N \l_@@_tmp_clist
+\dim_new:N \l_@@_tmp_dim
+\int_new:N \l_@@_tmp_int
+\muskip_new:N \l_@@_tmp_muskip
+\skip_new:N \l_@@_tmp_skip
+\tl_new:N \l_@@_tmp_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\s_@@_mark, \s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Testing existence and validity}
+%
+% There are a number of checks needed for either the existence of
+% a type, template or instance. There are also some for the
+% validity of a particular call. All of these are collected up here.
+%
+% \begin{macro}{\@@_execute_if_arg_agree:nnT}
+% A test agreement between the number of arguments for the template
+% type and that specified when creating a template. This is not done as a
+% separate conditional for efficiency and better error message
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_execute_if_arg_agree:nnT #1#2#3
+ {
+ \prop_get:NnN \g_@@_type_prop {#1} \l_@@_tmp_tl
+ \int_compare:nNnTF {#2} = \l_@@_tmp_tl
+ {#3}
+ {
+ \msg_error:nneee { template } { argument-number-mismatch }
+ {#1} { \l_@@_tmp_tl } {#2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_execute_if_code_exist:nnT}
+% A template is only fully declared if the code has been set up,
+% which can be checked by looking for the template function itself.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_execute_if_code_exist:nnT #1#2#3
+ {
+ \cs_if_exist:cTF { \c_@@_code_root_tl #1 / #2 }
+ {#3}
+ { \msg_error:nnnn { template } { no-template-code } {#1} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {\@@_execute_if_keytype_exist:nT, \@@_execute_if_keytype_exist:VT}
+% The test for valid keytypes looks for a function to set up the key,
+% which is part of the \enquote{code} side of the template definition.
+% This avoids having different lists for the two parts of the process.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_execute_if_keytype_exist:nT #1#2
+ {
+ \cs_if_exist:cTF { @@_store_value_ #1 :n }
+ {#2}
+ { \msg_error:nnn { template } { unknown-keytype } {#1} }
+ }
+\cs_generate_variant:Nn \@@_execute_if_keytype_exist:nT { V }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_execute_if_type_exist:nT}
+% To check that a particular type is valid.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_execute_if_type_exist:nT #1#2
+ {
+ \prop_if_in:NnTF \g_@@_type_prop {#1}
+ {#2}
+ { \msg_error:nnn { template } { unknown-type } {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_execute_if_keys_exist:nnT}
+% To check that the keys for a template have been set up before trying
+% to create any code, a simple check for the correctly-named keytype
+% property list.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_if_keys_exist:nnT #1#2#3
+ {
+ \cs_if_exist:cTF { \c_@@_keytypes_root_tl #1 / #2 }
+ {#3}
+ { \msg_error:nnnn { template } { unknown-template } {#1} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_if_key_value:n, \@@_if_key_value:V}
+% Tests for the first token in a string being \cs{KeyValue}.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_key_value:n #1 { T , F , TF }
+ {
+ \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop }
+ \prg_return_true:
+ \prg_return_false:
+ }
+\prg_generate_conditional_variant:Nnn \@@_if_key_value:n { V } { T , F , TF }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_if_instance_exist:nn}
+% Testing for an instance
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_instance_exist:nn #1#2 { T, F, TF }
+ {
+ \cs_if_exist:cTF { \c_@@_instances_root_tl #1 / #2 }
+ \prg_return_true:
+ \prg_return_false:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_if_use_template:nTF}
+% Tests for the first token in a string being \cs{UseTemplate}.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_use_template:n #1 { TF }
+ {
+ \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop }
+ \prg_return_true:
+ \prg_return_false:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Saving and recovering property lists}
+%
+% The various property lists for templates have to be shuffled in
+% and out of storage.
+%
+% \begin{macro}
+% {
+% \@@_store_defaults:nn ,
+% \@@_store_keytypes:nn ,
+% \@@_store_values:nn ,
+% \@@_store_vars:nn
+% }
+% The defaults and keytypes are transferred from the scratch property
+% lists to the \enquote{proper} lists for the template being created.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_store_defaults:nn #1#2
+ {
+ \debug_suspend:
+ \prop_gclear_new:c { \c_@@_defaults_root_tl #1 / #2 }
+ \prop_gset_eq:cN { \c_@@_defaults_root_tl #1 / #2 }
+ \l_@@_values_prop
+ \debug_resume:
+ }
+\cs_new_protected:Npn \@@_store_keytypes:nn #1#2
+ {
+ \debug_suspend:
+ \prop_if_exist:cTF { \c_@@_keytypes_root_tl #1 / #2 }
+ {
+ \msg_info:nnnn { template } { declare-template-interface } {#1} {#2}
+ \prop_gclear:c { \c_@@_keytypes_root_tl #1 / #2 }
+ }
+ { \prop_new:c { \c_@@_keytypes_root_tl #1 / #2 } }
+ \prop_gset_eq:cN { \c_@@_keytypes_root_tl #1 / #2 }
+ \l_@@_keytypes_prop
+ \seq_gclear_new:c { \c_@@_key_order_root_tl #1 / #2 }
+ \seq_gset_eq:cN { \c_@@_key_order_root_tl #1 / #2 }
+ \l_@@_key_order_seq
+ \debug_resume:
+ }
+\cs_new_protected:Npn \@@_store_values:nn #1#2
+ {
+ \debug_suspend:
+ \prop_clear_new:c { \c_@@_values_root_tl #1 / #2 }
+ \prop_set_eq:cN { \c_@@_values_root_tl #1 / #2 }
+ \l_@@_values_prop
+ \debug_resume:
+ }
+\cs_new_protected:Npn \@@_store_vars:nn #1#2
+ {
+ \debug_suspend:
+ \prop_gclear_new:c { \c_@@_vars_root_tl #1 / #2 }
+ \prop_gset_eq:cN { \c_@@_vars_root_tl #1 / #2 }
+ \l_@@_vars_prop
+ \debug_resume:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_recover_defaults:nn ,
+% \@@_recover_keytypes:nn ,
+% \@@_recover_values:nn ,
+% \@@_recover_vars:nn
+% }
+% Recovering the stored data for a template is rather less complex
+% than storing it. All that happens is the data is transferred from
+% the permanent to the scratch storage. However, we need to check the
+% scratch storage does exist.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_recover_defaults:nn #1#2
+ {
+ \prop_if_exist:cTF
+ { \c_@@_defaults_root_tl #1 / #2 }
+ {
+ \prop_set_eq:Nc \l_@@_values_prop
+ { \c_@@_defaults_root_tl #1 / #2 }
+ }
+ { \prop_clear:N \l_@@_values_prop }
+ }
+\cs_new_protected:Npn \@@_recover_keytypes:nn #1#2
+ {
+ \prop_if_exist:cTF
+ { \c_@@_keytypes_root_tl #1 / #2 }
+ {
+ \prop_set_eq:Nc \l_@@_keytypes_prop
+ { \c_@@_keytypes_root_tl #1 / #2 }
+ }
+ { \prop_clear:N \l_@@_keytypes_prop }
+ \seq_if_exist:cTF { \c_@@_key_order_root_tl #1 / #2 }
+ {
+ \seq_set_eq:Nc \l_@@_key_order_seq
+ { \c_@@_key_order_root_tl #1 / #2 }
+ }
+ { \seq_clear:N \l_@@_key_order_seq }
+ }
+\cs_new_protected:Npn \@@_recover_values:nn #1#2
+ {
+ \prop_if_exist:cTF
+ { \c_@@_values_root_tl #1 / #2 }
+ {
+ \prop_set_eq:Nc \l_@@_values_prop
+ { \c_@@_values_root_tl #1 / #2 }
+ }
+ { \prop_clear:N \l_@@_values_prop }
+ }
+\cs_new_protected:Npn \@@_recover_vars:nn #1#2
+ {
+ \prop_if_exist:cTF
+ { \c_@@_vars_root_tl #1 / #2 }
+ {
+ \prop_set_eq:Nc \l_@@_vars_prop
+ { \c_@@_vars_root_tl #1 / #2 }
+ }
+ { \prop_clear:N \l_@@_vars_prop }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Creating new template types}
+%
+% \begin{macro}{\@@_define_type:nn, \@@_declare_type:nn}
+% Although the type is the \enquote{top level} of the template
+% system, it is actually very easy to implement. All that happens is that
+% the number of arguments required is recorded, indexed by the name of the
+% type.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_define_type:nn #1#2
+ {
+ \prop_if_in:NnTF \g_@@_type_prop {#1}
+ { \msg_error:nnn { template } { type-already-defined } {#1} }
+ { \@@_declare_type:nn {#1} {#2} }
+ }
+\cs_new_protected:Npn \@@_declare_type:nn #1#2
+ {
+ \int_set:Nn \l_@@_tmp_int {#2}
+ \int_compare:nTF { 0 <= \l_@@_tmp_int <= 9 }
+ {
+ \msg_info:nnnV { template } { declare-type }
+ {#1} \l_@@_tmp_int
+ \prop_gput:NnV \g_@@_type_prop {#1}
+ \l_@@_tmp_int
+ }
+ {
+ \msg_error:nnnV { template } { bad-number-of-arguments }
+ {#1} \l_@@_tmp_int
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Design part of template declaration}
+%
+% The \enquote{design} part of a template declaration defines the general
+% behaviour of each key, and possibly a default value. However, it does
+% not include the implementation. This means that what happens here is
+% the two properties are saved to appropriate lists, which can then
+% be used later to recover the information when implementing the keys.
+%
+% \begin{macro}{\@@_declare_template_keys:nnnn}
+% The main function for the \enquote{design} part of creating a template
+% starts by checking that the type exists and that the number of
+% arguments required agree. If that is all fine, then the two storage
+% areas for defaults and keytypes are initialised. The mechanism is then
+% set up for the \pkg{l3keys} module to actually parse the keys.
+% Finally, the code hands of to the storage routine to save the parsed
+% information properly.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_declare_template_keys:nnnn #1#2#3#4
+ {
+ \@@_execute_if_type_exist:nT {#1}
+ {
+ \@@_execute_if_arg_agree:nnT {#1} {#3}
+ {
+ \prop_clear:N \l_@@_values_prop
+ \prop_clear:N \l_@@_keytypes_prop
+ \seq_clear:N \l_@@_key_order_seq
+ \keyval_parse:NNn
+ \@@_parse_keys_elt:n \@@_parse_keys_elt:nn {#4}
+ \@@_store_defaults:nn {#1} {#2}
+ \@@_store_keytypes:nn {#1} {#2}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_keys_elt:n}
+% \begin{macro}{\@@_parse_keys_elt_aux:n}
+% \begin{macro}{\@@_parse_keys_elt_aux:}
+% Processing the key part of the key--value pair is always carried out
+% using this function, even if a value was found. First, the key name
+% is separated from the keytype, and if necessary the keytype is
+% separated into two parts. This information is then used to check that
+% the keytype is valid, before storing the keytype (plus argument if
+% necessary) as a property of the key name. The key name is also stored
+% (in braces) in the token list to record the order the keys are defined
+% in.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_keys_elt:n #1
+ {
+ \@@_split_keytype:n {#1}
+ \bool_if:NF \l_@@_error_bool
+ {
+ \@@_execute_if_keytype_exist:VT \l_@@_keytype_tl
+ {
+ \seq_map_function:NN \c_@@_keytypes_arg_seq
+ \@@_parse_keys_elt_aux:n
+ \bool_if:NF \l_@@_error_bool
+ {
+ \seq_if_in:NoTF \l_@@_key_order_seq
+ \l_@@_key_name_tl
+ {
+ \msg_error:nnV { template } { duplicate-key-interface }
+ \l_@@_key_name_tl
+ }
+ { \@@_parse_keys_elt_aux: }
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_parse_keys_elt_aux:n #1
+ {
+ \str_if_eq:VnT \l_@@_keytype_tl {#1}
+ {
+ \tl_if_empty:NT \l_@@_keytype_arg_tl
+ {
+ \msg_error:nnn { template } { keytype-requires-argument } {#1}
+ \bool_set_true:N \l_@@_error_bool
+ \seq_map_break:
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_parse_keys_elt_aux:
+ {
+ \tl_set:Ne \l_@@_tmp_tl
+ {
+ \l_@@_keytype_tl
+ \tl_if_empty:NF \l_@@_keytype_arg_tl
+ { { \l_@@_keytype_arg_tl } }
+ }
+ \prop_put:NVV \l_@@_keytypes_prop \l_@@_key_name_tl
+ \l_@@_tmp_tl
+ \seq_put_right:NV \l_@@_key_order_seq \l_@@_key_name_tl
+ \str_if_eq:VnT \l_@@_keytype_tl { choice }
+ {
+ \clist_if_in:NnT \l_@@_keytype_arg_tl { unknown }
+ { \msg_error:nn { template } { choice-unknown-reserved } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_keys_elt:nn}
+% For keys which have a default, the keytype and key name are first
+% separated out by the \cs{@@_parse_keys_elt:n}
+% routine, before storing the default value in the scratch property list.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_keys_elt:nn #1#2
+ {
+ \@@_parse_keys_elt:n {#1}
+ \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#2}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_split_keytype:n}
+% \begin{macro}{\@@_split_keytype_aux:w}
+% The keytype and key name should be separated by |:|. As the
+% definition might be given inside or outside of a code block,
+% the category code of colons is standardised. After
+% that, the standard delimited argument method is used to separate the
+% two parts.
+% \begin{macrocode}
+\cs_new_protected:Npe \@@_split_keytype:n #1
+ {
+ \exp_not:N \bool_set_false:N \exp_not:N \l_@@_error_bool
+ \tl_set:Nn \exp_not:N \l_@@_tmp_tl {#1}
+ \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl { : } { \token_to_str:N : }
+ \tl_if_in:VnTF \exp_not:N \l_@@_tmp_tl { \token_to_str:N : }
+ {
+ \exp_not:n
+ {
+ \tl_clear:N \l_@@_key_name_tl
+ \exp_after:wN \@@_split_keytype_aux:w
+ \l_@@_tmp_tl \s_@@_stop
+ }
+ }
+ {
+ \exp_not:N \bool_set_true:N \exp_not:N \l_@@_error_bool
+ \msg_error:nnn { template } { missing-keytype } {#1}
+ }
+ }
+\use:e
+ {
+ \cs_new_protected:Npn \exp_not:N \@@_split_keytype_aux:w
+ #1 \token_to_str:N : #2 \s_@@_stop
+ {
+ \tl_put_right:Ne \exp_not:N \l_@@_key_name_tl
+ {
+ \exp_not:N \tl_trim_spaces:e
+ { \exp_not:N \tl_to_str:n {#1} }
+ }
+ \tl_if_in:nnTF {#2} { \token_to_str:N : }
+ {
+ \tl_put_right:Nn \exp_not:N \l_@@_key_name_tl
+ { \token_to_str:N : }
+ \exp_not:N \@@_split_keytype_aux:w #2 \s_@@_stop
+ }
+ {
+ \exp_not:N \tl_if_empty:NTF \exp_not:N \l_@@_key_name_tl
+ {
+ \msg_error:nnn { template } { empty-key-name }
+ { \token_to_str:N : #2 }
+ }
+ { \exp_not:N \@@_split_keytype_arg:n {#2} }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_split_keytype_arg:n, \@@_split_keytype_arg:V}
+% \begin{macro}{\@@_split_keytype_arg_aux:n}
+% \begin{macro}{\@@_split_keytype_arg_aux:w}
+% The second stage of sorting out the keytype is to check for an
+% argument. As there is no convenient delimiting token to look for,
+% a check is made instead for each possible text value for the keytype.
+% To keep things faster, this only involves the keytypes that need an
+% argument. If a match is made, then a check is also needed to see that
+% it is at the start of the keytype information. All being well, the
+% split can then be applied. Any non-matching keytypes are assumed to
+% be \enquote{correct} as given, and are left alone (this is checked by
+% other code).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_split_keytype_arg:n #1
+ {
+ \tl_set:Ne \l_@@_keytype_tl { \tl_trim_spaces:n {#1} }
+ \tl_clear:N \l_@@_keytype_arg_tl
+ \cs_set_protected:Npn \@@_split_keytype_arg_aux:n ##1
+ {
+ \tl_if_in:nnT {#1} {##1}
+ {
+ \cs_set:Npn \@@_split_keytype_arg_aux:w
+ ####1 ##1 ####2 \s_@@_stop
+ {
+ \tl_if_blank:nT {####1}
+ {
+ \tl_set:Ne \l_@@_keytype_tl
+ { \tl_trim_spaces:n {##1} }
+ \tl_if_blank:nF {####2}
+ {
+ \tl_set:Ne \l_@@_keytype_arg_tl
+ { \use:n ####2 }
+ }
+ \seq_map_break:
+ }
+ }
+ \@@_split_keytype_arg_aux:w #1 \s_@@_stop
+ }
+ }
+ \seq_map_function:NN \c_@@_keytypes_arg_seq
+ \@@_split_keytype_arg_aux:n
+ }
+\cs_generate_variant:Nn \@@_split_keytype_arg:n { V }
+\cs_new:Npn \@@_split_keytype_arg_aux:n #1 { }
+\cs_new:Npn \@@_split_keytype_arg_aux:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Storing values}
+%
+% As \pkg{lttemplates} pre-processes key values for efficiency reasons,
+% there is a need to convert the values given as defaults into
+% \enquote{ready to use} data. The same general idea is true when an instance
+% is declared. However, assignments are not made until an instance is
+% used, and so there has to be some intermediate storage. Furthermore,
+% the ability to delay evaluation of results is needed. To achieve these
+% aims, a series of \enquote{process and store} functions are defined here.
+%
+% All of the information about the key (the key name and the keytype)
+% is already stored as variables. The same property list is always used
+% to store the data, meaning that the only argument required is the
+% value to be processed and potentially stored.
+%
+% \begin{macro}{\@@_store_value_boolean:n}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_store_value_boolean:n #1
+ { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_store_value:n, \@@_store_value_choice:n,
+% \@@_store_value_function:n, \@@_store_value_instance:n}
+% With no need to worry about delayed evaluation, these keytypes all
+% just store the input directly.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_store_value:n #1
+ { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} }
+\cs_new_eq:NN \@@_store_value_choice:n \@@_store_value:n
+\cs_new_eq:NN \@@_store_value_function:n \@@_store_value:n
+\cs_new_eq:NN \@@_store_value_instance:n \@@_store_value:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_store_value_aux:Nn, \@@_store_value_integer:n,
+% \@@_store_value_length:n, \@@_store_value_muskip:n,
+% \@@_store_value_real:n, \@@_store_value_skip:n,
+% \@@_store_value_tokenlist:n, \@@_store_value_commalist:n}
+% Storing values in \cs{l_@@_values_prop} is in most cases the same.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_store_value_aux:Nn #1#2
+ { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#2} }
+\cs_new_protected:Npn \@@_store_value_integer:n
+ { \@@_store_value_aux:Nn \int_eval:n }
+\cs_new_protected:Npn \@@_store_value_length:n
+ { \@@_store_value_aux:Nn \dim_eval:n }
+\cs_new_protected:Npn \@@_store_value_muskip:n
+ { \@@_store_value_aux:Nn \muskip_eval:n }
+\cs_new_protected:Npn \@@_store_value_real:n
+ { \@@_store_value_aux:Nn \fp_eval:n }
+\cs_new_protected:Npn \@@_store_value_skip:n
+ { \@@_store_value_aux:Nn \skip_eval:n }
+\cs_new_protected:Npn \@@_store_value_tokenlist:n
+ { \@@_store_value_aux:Nn \use:n }
+\cs_new_eq:NN \@@_store_value_commalist:n \@@_store_value_tokenlist:n
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Implementation part of template declaration}
+%
+% \begin{macro}{\@@_declare_template_code:nnnnn}
+% \begin{macro}{\@@_declare_template_code:nnnn}
+% The main function for implementing a template starts with a couple of
+% simple checks to make sure that there are no obvious mistakes: the
+% number of arguments must agree and the template keys must have been
+% declared.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_declare_template_code:nnnnn #1#2#3#4#5
+ {
+ \@@_execute_if_type_exist:nT {#1}
+ {
+ \@@_execute_if_arg_agree:nnT {#1} {#3}
+ {
+ \@@_if_keys_exist:nnT {#1} {#2}
+ {
+ \@@_store_key_implementation:nnn {#1} {#2} {#4}
+ \regex_match:nnTF { \c { AssignTemplateKeys } } {#5}
+ { \@@_declare_template_code:nnnn {#1} {#2} {#3} {#5} }
+ {
+ \@@_declare_template_code:nnnn
+ {#1} {#2} {#3} { \AssignTemplateKeys #5 }
+ }
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_declare_template_code:nnnn #1#2#3#4
+ {
+ \cs_if_exist:cT { \c_@@_code_root_tl #1 / #2 }
+ { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} }
+ \cs_generate_from_arg_count:cNnn
+ { \c_@@_code_root_tl #1 / #2 }
+ \cs_gset_protected:Npn {#3} {#4}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_store_key_implementation:nnn}
+% Actually storing the implementation part of a template is quite easy
+% as it only requires the list of keys given to be turned into a
+% property list. There is also some error-checking to do, hence the need
+% to have the list of defined keytypes available. In certain cases
+% (when choices are involved) parsing the key results in changes to the
+% default values. That is why they are loaded and then saved again.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_store_key_implementation:nnn #1#2#3
+ {
+ \@@_recover_defaults:nn {#1} {#2}
+ \@@_recover_keytypes:nn {#1} {#2}
+ \prop_clear:N \l_@@_vars_prop
+ \keyval_parse:nnn
+ { \@@_parse_vars_elt:n } { \@@_parse_vars_elt:nnn { #1 / #2 } } {#3}
+ \@@_store_vars:nn {#1} {#2}
+ \prop_map_inline:Nn \l_@@_keytypes_prop
+ { \msg_error:nnnnn { template } { key-not-implemented } {##1} {#2} {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_vars_elt:n}
+% At the implementation stage, every key must have a value given. So
+% this is an error function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_vars_elt:n #1
+ { \msg_error:nnn { template } { key-no-variable } {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_vars_elt:nnn}
+% \begin{macro}{\@@_parse_vars_elt_aux:nn}
+% \begin{macro}{\@@_parse_vars_elt_aux:nw}
+% \begin{macro}{\@@_parse_vars_elt_aux:nnn, \@@_parse_vars_elt_aux:nne}
+% \begin{macro}{\@@_parse_vars_elt_key:nn}
+% The actual storage part here is very simple: the storage bin name
+% is placed into the property list. At the same time, a comparison is
+% made with the keytypes defined earlier: if there is a mismatch then
+% an error is raised.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_vars_elt:nnn #1#2#3
+ {
+ \tl_set:Ne \l_@@_key_name_tl
+ { \tl_trim_spaces:e { \tl_to_str:n {#2} } }
+ \prop_get:NVNTF \l_@@_keytypes_prop
+ \l_@@_key_name_tl
+ \l_@@_keytype_tl
+ {
+ \@@_split_keytype_arg:V \l_@@_keytype_tl
+ \@@_parse_vars_elt_aux:nn {#1} {#3}
+ \prop_remove:NV \l_@@_keytypes_prop \l_@@_key_name_tl
+ }
+ { \msg_error:nnn { template } { unknown-key } {#2} }
+ }
+% \end{macrocode}
+% Split off any leading \texttt{global} and they look for the way to
+% implement.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_vars_elt_aux:nn #1#2
+ {
+ \@@_parse_vars_elt_aux:nw {#1} #2 global global \s_@@_stop
+ }
+\cs_new_protected:Npn \@@_parse_vars_elt_aux:nw
+ #1#2 global #3 global #4 \s_@@_stop
+ {
+ \tl_if_blank:nTF {#4}
+ { \@@_parse_vars_elt_aux:nnn {#1} { } {#2} }
+ {
+ \tl_if_blank:nTF {#2}
+ {
+ \@@_parse_vars_elt_aux:nne
+ {#1} { global } { \tl_trim_spaces:n {#3} }
+ }
+ { \msg_error:nnn { template } { bad-variable } { #2 global #3 } }
+ }
+ }
+\cs_new_protected:Npn \@@_parse_vars_elt_aux:nnn #1#2#3
+ {
+ \str_case:VnF \l_@@_keytype_tl
+ {
+ { choice } { \@@_implement_choices:nn {#1} {#3} }
+ { function }
+ {
+ \cs_if_exist:NF #3
+ { \cs_new:Npn #3 { } }
+ \@@_parse_vars_elt_key:nn {#1}
+ {
+ .code:n =
+ {
+ \cs_generate_from_arg_count:NNnn
+ \exp_not:N #3
+ \exp_not:c
+ { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn }
+ { \exp_not:V \l_@@_keytype_arg_tl }
+ {##1}
+ }
+ }
+ \prop_put:NVn \l_@@_vars_prop
+ \l_@@_key_name_tl {#2#3}
+ }
+ { instance }
+ {
+ \@@_parse_vars_elt_key:nn {#1}
+ {
+ .code:n =
+ {
+ \exp_not:c
+ { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn }
+ \exp_not:N #3 { \UseInstance {##1} }
+ }
+ }
+ \prop_put:NVn \l_@@_vars_prop
+ \l_@@_key_name_tl {#2#3}
+ }
+ }
+ {
+ \tl_if_single:nTF {#3}
+ {
+ \cs_if_exist:NF #3
+ { \use:c { \@@_map_var_type: _new:N } #3 }
+ \@@_parse_vars_elt_key:nn {#1}
+ {
+ . \@@_map_var_type:
+ _ \str_if_eq:nnT {#1} { global } { g } set:N
+ = \exp_not:N #3
+ }
+ \prop_put:NVn \l_@@_vars_prop
+ \l_@@_key_name_tl {#2#3}
+ }
+ { \msg_error:nnn { template } { bad-variable } {#2#3} }
+ }
+ }
+\cs_generate_variant:Nn \@@_parse_vars_elt_aux:nnn { nne }
+\cs_new_protected:Npn \@@_parse_vars_elt_key:nn #1#2
+ {
+ \keys_define:ne { template / #1 }
+ { \l_@@_key_name_tl #2 }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_map_var_type:}
+% Turn a \enquote{friendly} variable type into an \texttt{expl3} one.
+% \begin{macrocode}
+\cs_new:Npn \@@_map_var_type:
+ {
+ \str_case:Vn \l_@@_keytype_tl
+ {
+ { boolean } { bool }
+ { commalist } { clist }
+ { integer } { int }
+ { length } { dim }
+ { muskip } { muskip }
+ { real } { fp }
+ { skip } { skip }
+ { tokenlist } { tl }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_implement_choices:nn}
+% \begin{macro}{\@@_implement_choices_default:}
+% Implementing choices requires a second key--value loop. So after a
+% little set-up, the standard parser is called.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_implement_choices:nn #1#2
+ {
+ \clist_set:NV \l_@@_tmp_clist \l_@@_keytype_arg_tl
+ \prop_put:NVn \l_@@_vars_prop \l_@@_key_name_tl { }
+ \keys_define:ne { template / #1 } { \l_@@_key_name_tl .choice: }
+ \keyval_parse:nnn
+ { \@@_implement_choice_elt:n }
+ { \@@_implement_choice_elt:nnn {#1} }
+ {#2}
+ \prop_get:NVNT \l_@@_values_prop \l_@@_key_name_tl
+ \l_@@_tmp_tl
+ { \@@_implement_choices_default: }
+ \clist_if_empty:NF \l_@@_tmp_clist
+ {
+ \clist_map_inline:Nn \l_@@_tmp_clist
+ { \msg_error:nnn { template } { choice-not-implemented } {##1} }
+ }
+ }
+% \end{macrocode}
+% A sanity check for the default value, so that an error is raised
+% now and not when converting to assignments.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_implement_choices_default:
+ {
+ \tl_set:Ne \l_@@_tmp_tl
+ { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl }
+ \prop_if_in:NVF \l_@@_vars_prop \l_@@_tmp_tl
+ {
+ \tl_set:Ne \l_@@_tmp_tl
+ { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl }
+ \prop_if_in:NVF \l_@@_vars_prop \l_@@_tmp_tl
+ {
+ \prop_get:NVN \l_@@_keytypes_prop \l_@@_key_name_tl
+ \l_@@_tmp_tl
+ \@@_split_keytype_arg:V \l_@@_tmp_tl
+ \prop_get:NVN \l_@@_values_prop \l_@@_key_name_tl
+ \l_@@_tmp_tl
+ \msg_error:nnVV { template } { unknown-default-choice }
+ \l_@@_key_name_tl
+ \l_@@_key_name_tl
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_implement_choice_elt:nnn, \@@_implement_choice_elt_aux:nnn}
+% \begin{macro}{\@@_implement_choice_elt_aux:n}
+% \begin{macro}{\@@_implement_choice_elt:n}
+% The actual storage of the implementation of a choice is mainly about
+% error checking. The code here ensures that all choices have to have
+% been declared, apart from the special \texttt{unknown} choice, which
+% must come last. The code for each choice is stored along with the
+% key name in the variables property list.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_implement_choice_elt:nnn #1#2#3
+ {
+ \clist_if_empty:NTF \l_@@_tmp_clist
+ {
+ \str_if_eq:nnTF {#2} { unknown }
+ { \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3} }
+ { \@@_implement_choice_elt_aux:n {#2} }
+ }
+ {
+ \clist_if_in:NnTF \l_@@_tmp_clist {#2}
+ {
+ \clist_remove_all:Nn \l_@@_tmp_clist {#2}
+ \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3}
+ }
+ { \@@_implement_choice_elt_aux:n {#2} }
+ }
+ }
+\cs_new_protected:Npn \@@_implement_choice_elt_aux:n #1
+ {
+ \prop_get:NVN \l_@@_keytypes_prop \l_@@_key_name_tl
+ \l_@@_tmp_tl
+ \@@_split_keytype_arg:V \l_@@_tmp_tl
+ \msg_error:nnVn { template } { unknown-choice } \l_@@_key_name_tl {#1}
+ }
+\cs_new_protected:Npn \@@_implement_choice_elt_aux:nnn #1#2#3
+ {
+ \keys_define:ne { template / #1 }
+ { \l_@@_key_name_tl / #2 .code:n = { \exp_not:n {#3} } }
+ \tl_set:Ne \l_@@_tmp_tl
+ { \l_@@_key_name_tl \c_space_tl #2 }
+ \prop_put:NVn \l_@@_vars_prop \l_@@_tmp_tl {#3}
+ }
+\cs_new_protected:Npn \@@_implement_choice_elt:n #1
+ {
+ \msg_error:nnVn { template } { choice-requires-code }
+ \l_@@_key_name_tl {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Editing template defaults}
+%
+% \begin{macro}{\@@_edit_defaults:nnn}
+% Editing the template defaults means getting the values back out
+% of the store, then parsing the list of new values before putting
+% the updated list back into storage.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_edit_defaults:nnn #1#2#3
+ {
+ \@@_if_keys_exist:nnT {#1} {#2}
+ {
+ \@@_recover_defaults:nn {#1} {#2}
+ \@@_parse_values:nnn {#1} {#2} {#3}
+ \@@_store_defaults:nn {#1} {#2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_values:nnn}
+% The routine to parse values is the same for both editing a
+% template and setting up an instance. So the code here does only the
+% minimum necessary for reading the values.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_values:nnn #1#2#3
+ {
+ \@@_recover_keytypes:nn {#1} {#2}
+ \keyval_parse:NNn
+ \@@_parse_values_elt:n \@@_parse_values_elt:nn {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_values_elt:n}
+% Every key needs a value, so this is just an error routine.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_values_elt:n #1
+ {
+ \bool_set_true:N \l_@@_error_bool
+ \msg_error:nnn { template } { key-no-value } {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_parse_values_elt:nn}
+% \begin{macro}{\@@_parse_values_elt_aux:n}
+% To store the value, find the keytype then call the saving function.
+% These need the current key name saved as \cs{l_@@_key_name_tl}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_values_elt:nn #1#2
+ {
+ \tl_set:Ne \l_@@_key_name_tl
+ { \tl_trim_spaces:e { \tl_to_str:n {#1} } }
+ \prop_get:NVNTF \l_@@_keytypes_prop \l_@@_key_name_tl
+ \l_@@_tmp_tl
+ { \@@_parse_values_elt_aux:n {#2} }
+ { \msg_error:nnV { template } { unknown-key } \l_@@_key_name_tl }
+ }
+\cs_new_protected:Npn \@@_parse_values_elt_aux:n #1
+ {
+ \@@_split_keytype_arg:V \l_@@_tmp_tl
+ \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_template_set_eq:nnn}
+% To copy a template, each of the lists plus the code has to be copied
+% across. To keep this independent of the list storage system, it is
+% all done with two-part shuffles.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_template_set_eq:nnn #1#2#3
+ {
+ \@@_recover_defaults:nn {#1} {#3}
+ \@@_store_defaults:nn {#1} {#2}
+ \@@_recover_keytypes:nn {#1} {#3}
+ \@@_store_keytypes:nn {#1} {#2}
+ \@@_recover_vars:nn {#1} {#3}
+ \@@_store_vars:nn {#1} {#2}
+ \cs_if_exist:cT { \c_@@_code_root_tl #1 / #2 }
+ { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} }
+ \cs_gset_eq:cc { \c_@@_code_root_tl #1 / #2 }
+ { \c_@@_code_root_tl #1 / #3 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Creating instances of templates}
+%
+% \begin{macro}
+% {
+% \@@_declare_instance:nnnn,
+% \@@_declare_instance_aux:nnnn
+% }
+% Making an instance has two distinct parts. First, the keys given are
+% parsed to transfer the values into the structured data format used
+% internally. This allows the default and given values to be combined
+% with no repetition. In the second step, the structured data is
+% converted to pre-defined variable assignments, and these are stored
+% in the function for the instance.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_declare_instance:nnnn #1#2#3#4
+ {
+ \@@_execute_if_code_exist:nnT {#1} {#2}
+ {
+ \@@_recover_defaults:nn {#1} {#2}
+ \@@_recover_vars:nn {#1} {#2}
+ \@@_declare_instance_aux:nnnn {#1} {#2} {#3} {#4}
+ }
+ }
+\cs_new_protected:Npn \@@_declare_instance_aux:nnnn #1#2#3#4
+ {
+ \bool_set_false:N \l_@@_error_bool
+ \@@_parse_values:nnn {#1} {#2} {#4}
+ \bool_if:NF \l_@@_error_bool
+ {
+ \prop_put:Nnn \l_@@_values_prop { from~template } {#2}
+ \@@_store_values:nn {#1} {#3}
+ \@@_convert_to_assignments:
+ \cs_if_exist:cT { \c_@@_instances_root_tl #1 / #3 }
+ { \msg_info:nnnn { template } { declare-instance } {#3} {#1} }
+ \cs_set_protected:cpe { \c_@@_instances_root_tl #1 / #3 }
+ {
+ \exp_not:N \@@_assignments_push:n
+ { \exp_not:V \l_@@_assignments_tl }
+ \exp_not:c { \c_@@_code_root_tl #1 / #2 }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_instance_set_eq:nnn}
+% Copy--paste an instance.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_instance_set_eq:nnn #1#2#3
+ {
+ \@@_if_instance_exist:nnTF {#1} {#3}
+ {
+ \@@_recover_values:nn {#1} {#3}
+ \@@_store_values:nn {#1} {#2}
+ \cs_if_exist:cT { \c_@@_instances_root_tl #1 / #2 }
+ { \msg_info:nnnn { template } { declare-instance } {#2} {#1} }
+ \cs_set_eq:cc { \c_@@_instances_root_tl #1 / #2 }
+ { \c_@@_instances_root_tl #1 / #3 }
+ }
+ { \msg_error:nnnn { template } { unknown-instance } {#1} {#3} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_edit_instance:nnn}
+% \begin{macro}
+% {\@@_edit_instance_aux:nnnnn, \@@_edit_instance_aux:nVnnn}
+% Editing an instance is almost identical to declaring one. The only
+% variation is the source of the values to use. When editing, they are
+% recovered from the previous instance run.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_edit_instance:nnn #1#2#3
+ {
+ \@@_if_instance_exist:nnTF {#1} {#2}
+ {
+ \@@_recover_values:nn {#1} {#2}
+ \prop_get:NnN \l_@@_values_prop { from~template }
+ \l_@@_tmp_tl
+ \@@_edit_instance_aux:nVnn
+ {#1} \l_@@_tmp_tl {#2} {#3}
+ }
+ { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} }
+ }
+\cs_new_protected:Npn \@@_edit_instance_aux:nnnn #1#2#3#4
+ {
+ \@@_recover_vars:nn {#1} {#2}
+ \@@_declare_instance_aux:nnnn {#1} {#2} {#3} {#4}
+ }
+\cs_generate_variant:Nn \@@_edit_instance_aux:nnnn { nV }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_convert_to_assignments:}
+% \begin{macro}{\@@_convert_to_assignments_aux:n}
+% \begin{macro}
+% {\@@_convert_to_assignments_aux:nn, \@@_convert_to_assignments_aux:nV}
+% The idea on converting to a set of assignments is to loop over each
+% key, so that the loop order follows the declaration order of the keys.
+% This is done using a sequence as property lists are not
+% \enquote{ordered}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_convert_to_assignments:
+ {
+ \tl_clear:N \l_@@_assignments_tl
+ \seq_map_function:NN \l_@@_key_order_seq
+ \@@_convert_to_assignments_aux:n
+ }
+\cs_new_protected:Npn \@@_convert_to_assignments_aux:n #1
+ {
+ \prop_get:NnN \l_@@_keytypes_prop {#1} \l_@@_tmp_tl
+ \@@_convert_to_assignments_aux:nV {#1} \l_@@_tmp_tl
+ }
+% \end{macrocode}
+% The second auxiliary function actually does the work. The
+% arguments here are the key name (|#1|) and the keytype (|#2|).
+% From those, the value to assign and the name of the appropriate
+% variable are recovered. A bit of work is then needed to sort out
+% keytypes with arguments (for example instances), and to look for
+% global assignments. Once that is done, a hand-off can be made to the
+% handler for the relevant keytype.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_convert_to_assignments_aux:nn #1#2
+ {
+ \prop_get:NnNT \l_@@_values_prop {#1} \l_@@_value_tl
+ {
+ \prop_get:NnNTF \l_@@_vars_prop {#1} \l_@@_var_tl
+ {
+ \@@_split_keytype_arg:n {#2}
+ \str_if_eq:VnF \l_@@_keytype_tl { choice }
+ {
+ \str_if_eq:VnF \l_@@_keytype_tl { code }
+ { \@@_find_global: }
+ }
+ \tl_set:Nn \l_@@_key_name_tl {#1}
+ \use:c { @@_assign_ \l_@@_keytype_tl : }
+ }
+ { \msg_error:nnn { template } { unknown-attribute } {#1} }
+ }
+ }
+\cs_generate_variant:Nn \@@_convert_to_assignments_aux:nn { nV }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_find_global:}
+% \begin{macro}{\@@_find_global_aux:w}
+% Global assignments should have the phrase |global| at the front.
+% This is pretty easy to find: no other error checking, though.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_find_global:
+ {
+ \bool_set_false:N \l_@@_global_bool
+ \tl_if_in:onT \l_@@_var_tl { global }
+ {
+ \exp_after:wN \@@_find_global_aux:w \l_@@_var_tl \s_@@_stop
+ }
+ }
+\cs_new_protected:Npn \@@_find_global_aux:w #1 global #2 \s_@@_stop
+ {
+ \tl_set:Nn \l_@@_var_tl {#2}
+ \bool_set_true:N \l_@@_global_bool
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Using templates directly}
+%
+% \begin{macro}{\@@_use_template:nnn}
+% Directly use a template with a particular parameter setting.
+% This is also picked up if used in a nested fashion inside a parameter
+% list. The idea is essentially the same as creating an instance,
+% just with no saving of the result.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_template:nnn #1#2#3
+ {
+ \@@_execute_if_code_exist:nnT {#1} {#2}
+ {
+ \@@_recover_defaults:nn {#1} {#2}
+ \@@_recover_vars:nn {#1} {#2}
+ \@@_parse_values:nnn {#1} {#2} {#3}
+ \@@_convert_to_assignments:
+ \use:c { \c_@@_code_root_tl #1 / #2 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Assigning values to variables}
+%
+% \begin{macro}{\@@_assign_boolean:}
+% \begin{macro}{\@@_assign_boolean_aux:n}
+% Setting a Boolean value is slightly different to everything else
+% as the value can be used to work out which \texttt{set} function to
+% call. As long as there is no need to recover things from another
+% variable, everything is pretty easy. If there is, then we need to allow
+% for the fact that the recovered value here will \emph{not} be expandable,
+% so needs to be converted to something that is.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_boolean:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_boolean_aux:n { bool_gset } }
+ { \@@_assign_boolean_aux:n { bool_set } }
+ }
+\cs_new_protected:Npn \@@_assign_boolean_aux:n #1
+ {
+ \@@_if_key_value:VTF \l_@@_value_tl
+ {
+ \@@_key_to_value:
+ \tl_put_right:Ne \l_@@_assignments_tl
+ {
+ \exp_not:c { #1 _eq:NN }
+ \exp_not:V \l_@@_var_tl
+ \exp_not:V \l_@@_value_tl
+ }
+ }
+ {
+ \tl_put_right:Ne \l_@@_assignments_tl
+ {
+ \exp_not:c { #1 _ \l_@@_value_tl :N }
+ \exp_not:V \l_@@_var_tl
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_assign_choice:}
+% \begin{macro}
+% {\@@_assign_choice_aux:nF, \@@_assign_choice_aux:eF}
+% The idea here is to find either the choice as-given or else the
+% special |unknown| choice, and to copy the appropriate code across.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_choice:
+ {
+ \@@_assign_choice_aux:eF
+ { \l_@@_key_name_tl \c_space_tl \l_@@_value_tl }
+ {
+ \@@_assign_choice_aux:eF
+ { \l_@@_key_name_tl \c_space_tl unknown }
+ {
+ \prop_get:NVN \l_@@_keytypes_prop \l_@@_key_name_tl
+ \l_@@_tmp_tl
+ \@@_split_keytype_arg:V \l_@@_tmp_tl
+ \msg_error:nnVV { template } { unknown-choice }
+ \l_@@_key_name_tl
+ \l_@@_value_tl
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_assign_choice_aux:nF #1
+ {
+ \prop_get:NnNTF \l_@@_vars_prop {#1} \l_@@_tmp_tl
+ { \tl_put_right:NV \l_@@_assignments_tl \l_@@_tmp_tl }
+ }
+\cs_generate_variant:Nn \@@_assign_choice_aux:nF { e }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_assign_function:}
+% \begin{macro}{\@@_assign_function_aux:N}
+% This looks a bit messy but is only actually one function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_function:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_function_aux:N \cs_gset:Npn }
+ { \@@_assign_function_aux:N \cs_set:Npn }
+ }
+\cs_new_protected:Npn \@@_assign_function_aux:N #1
+ {
+ \tl_put_right:Ne \l_@@_assignments_tl
+ {
+ \cs_generate_from_arg_count:NNnn
+ \exp_not:V \l_@@_var_tl
+ \exp_not:N #1
+ { \exp_not:V \l_@@_keytype_arg_tl }
+ { \exp_not:V \l_@@_value_tl }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_assign_instance:}
+% \begin{macro}{\@@_assign_instance_aux:N}
+% Using an instance means adding the appropriate function creation to
+% the tl. No checks are made at this stage, so if the instance is
+% not valid then errors will arise later.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_instance:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_instance_aux:N \cs_gset_protected:Npn }
+ { \@@_assign_instance_aux:N \cs_set_protected:Npn }
+ }
+\cs_new_protected:Npn \@@_assign_instance_aux:N #1
+ {
+ \tl_put_right:Ne \l_@@_assignments_tl
+ {
+ \exp_not:N #1 \exp_not:V \l_@@_var_tl
+ {
+ \@@_use_instance:nn
+ { \exp_not:V \l_@@_keytype_arg_tl }
+ { \exp_not:V \l_@@_value_tl }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_assign_integer:}
+% \begin{macro}{\@@_assign_length:}
+% \begin{macro}{\@@_assign_muskip:}
+% \begin{macro}{\@@_assign_real:}
+% \begin{macro}{\@@_assign_skip:}
+% All of the calculated assignments use the same underlying code, with
+% only the low-level assignment function changing.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_integer:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_variable:N \int_gset:Nn }
+ { \@@_assign_variable:N \int_set:Nn }
+ }
+\cs_new_protected:Npn \@@_assign_length:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_variable:N \dim_gset:Nn }
+ { \@@_assign_variable:N \dim_set:Nn }
+}
+\cs_new_protected:Npn \@@_assign_muskip:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_variable:N \muskip_gset:Nn }
+ { \@@_assign_variable:N \muskip_set:Nn }
+ }
+\cs_new_protected:Npn \@@_assign_real:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_variable:N \fp_gset:Nn }
+ { \@@_assign_variable:N \fp_set:Nn }
+ }
+\cs_new_protected:Npn \@@_assign_skip:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_variable:N \skip_gset:Nn }
+ { \@@_assign_variable:N \skip_set:Nn }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_assign_tokenlist:}
+% \begin{macro}{\@@_assign_tokenlist_aux:NN}
+% Life would be easy here if it were not for \cs{KeyValue}. To deal
+% correctly with that, we need to allow for the recovery a stored value
+% at point of use.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_tokenlist:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_tokenlist_aux:NN \tl_gset:NV \tl_gset:Nn }
+ { \@@_assign_tokenlist_aux:NN \tl_set:NV \tl_set:Nn }
+ }
+\cs_new_protected:Npn \@@_assign_tokenlist_aux:NN #1#2
+ {
+ \@@_if_key_value:VTF \l_@@_value_tl
+ {
+ \@@_key_to_value:
+ \tl_put_right:Ne \l_@@_assignments_tl
+ {
+ #1 \exp_not:V \l_@@_var_tl
+ { \exp_not:V \l_@@_value_tl }
+ }
+ }
+ {
+ \tl_put_right:Ne \l_@@_assignments_tl
+ {
+ #2 \exp_not:V \l_@@_var_tl
+ { \exp_not:V \l_@@_value_tl }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_assign_commalist:}
+% Very similar for commas lists, so some code is shared.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_commalist:
+ {
+ \bool_if:NTF \l_@@_global_bool
+ { \@@_assign_tokenlist_aux:NN \clist_gset:NV \clist_gset:Nn }
+ { \@@_assign_tokenlist_aux:NN \clist_set:NV \clist_set:Nn }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_assign_variable:N}
+% A general-purpose function for all of the numerical assignments.
+% As long as the value is not coming from another variable, the stored
+% value is simply transferred for output.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assign_variable:N #1
+ {
+ \@@_if_key_value:VT \l_@@_value_tl
+ { \@@_key_to_value: }
+ \tl_put_right:Ne \l_@@_assignments_tl
+ {
+ #1 \exp_not:V \l_@@_var_tl
+ { \exp_not:V \l_@@_value_tl }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_key_to_value:}
+% \begin{macro}{\@@_key_to_value_auxi:w}
+% \begin{macro}{\@@_key_to_value_auxii:w}
+% The idea here is to recover the attribute value of another key. To
+% do that, the marker is removed and a look up takes place. If this
+% is successful, then the name of the variable of the attribute is
+% returned. This assumes that the value will be used in context where
+% it will be converted to a value, for example when setting a number.
+% There is also a need to check in case the copied value happens to be
+% \texttt{global}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_key_to_value:
+ { \exp_after:wN \@@_key_to_value_auxi:w \l_@@_value_tl }
+\cs_new_protected:Npn \@@_key_to_value_auxi:w \KeyValue #1
+ {
+ \tl_set:Ne \l_@@_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } }
+ \prop_get:NVNTF \l_@@_vars_prop \l_@@_tmp_tl
+ \l_@@_value_tl
+ {
+ \exp_after:wN \@@_key_to_value_auxii:w \l_@@_value_tl
+ \s_@@_mark global \q_@@_nil \s_@@_stop
+ }
+ { \msg_error:nnV { template } { unknown-attribute } \l_@@_tmp_tl }
+ }
+\cs_new_protected:Npn \@@_key_to_value_auxii:w #1 global #2#3 \s_@@_stop
+ {
+ \@@_quark_if_nil:NF #2
+ { \tl_set:Nn \l_@@_value_tl {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Using instances}
+%
+% \begin{macro}{\@@_use_instance:nn}
+% \begin{macro}{\@@_use_instance_aux:nNnnn}
+% \begin{macro}{\@@_use_instance_aux:nn}
+% Using an instance is just a question of finding the appropriate function.
+% If nothing is found, an error is raised. One complication is that
+% if the first token of argument |#2| is \cs{UseTemplate} then that
+% is also valid. There is an error-test to make sure that the
+% types agree, and if so the template is used directly.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_instance:nn #1#2
+ {
+ \@@_if_use_template:nTF {#2}
+ { \@@_use_instance_aux:nNnnn {#1} #2 }
+ { \@@_use_instance_aux:nn {#1} {#2} }
+ }
+\cs_new_protected:Npn \@@_use_instance_aux:nNnnn #1#2#3#4#5
+ {
+ \str_if_eq:nnTF {#1} {#3}
+ { \@@_use_template:nnn {#3} {#4} {#5} }
+ { \msg_error:nnnn { template } { type-mismatch } {#1} {#3} }
+}
+\cs_new_protected:Npn \@@_use_instance_aux:nn #1#2
+ {
+ \@@_if_instance_exist:nnTF {#1} {#2}
+ { \use:c { \c_@@_instances_root_tl #1 / #2 } }
+ { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%\subsection{Assignment manipulation}
+%
+% A few functions to transfer assignments about, as this is needed by
+% \cs{AssignTemplateKeys}.
+%
+% \begin{macro}{\@@_assignments_pop:}
+% To actually use the assignments.
+% \begin{macrocode}
+\cs_new:Npn \@@_assignments_pop: { \l_@@_assignments_tl }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_assignments_push:n}
+% Here, the assignments are stored for later use.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_assignments_push:n #1
+ { \tl_set:Nn \l_@@_assignments_tl {#1} }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Showing templates and instances}
+%
+% \begin{macro}{\@@_show_code:nn}
+% Showing the code for a template is just a translation of
+% \cs{cs_show:c}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_code:nn #1#2
+ { \cs_show:c { \c_@@_code_root_tl #1 / #2 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_show_defaults:nn,
+% \@@_show_keytypes:nn,
+% \@@_show_vars:nn
+% }
+% \begin{macro}{\@@_show:Nnnn}
+% A modified version of the property-list printing code, such that
+% the output refers to templates and instances rather than to the
+% underlying structures.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_defaults:nn #1#2
+ {
+ \@@_if_keys_exist:nnT {#1} {#2}
+ {
+ \@@_recover_defaults:nn {#1} {#2}
+ \@@_show:Nnnn \l_@@_values_prop
+ {#1} {#2} { default~values }
+ }
+ }
+\cs_new_protected:Npn \@@_show_keytypes:nn #1#2
+ {
+ \@@_if_keys_exist:nnT {#1} {#2}
+ {
+ \@@_recover_keytypes:nn {#1} {#2}
+ \@@_show:Nnnn \l_@@_keytypes_prop
+ {#1} {#2} { interface }
+ }
+ }
+\cs_new_protected:Npn \@@_show_vars:nn #1#2
+ {
+ \@@_execute_if_code_exist:nnT {#1} {#2}
+ {
+ \@@_recover_vars:nn {#1} {#2}
+ \@@_show:Nnnn \l_@@_vars_prop
+ {#1} {#2} { variable~mapping }
+ }
+ }
+\cs_new_protected:Npn \@@_show:Nnnn #1#2#3#4
+ {
+ \msg_show:nneeee { template } { show-attribute }
+ { \tl_to_str:n {#2} }
+ { \tl_to_str:n {#3} }
+ { \tl_to_str:n {#4} }
+ { \prop_map_function:NN #1 \msg_show_item_unbraced:nn }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_show_values:nn}
+% Instance values are a little more complex, as is the template to consider.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_values:nn #1#2
+ {
+ \@@_if_instance_exist:nnT {#1} {#2}
+ {
+ \@@_recover_values:nn {#1} {#2}
+ \msg_show:nneee { template } { show-values }
+ { \tl_to_str:n {#1} }
+ { \tl_to_str:n {#2} }
+ {
+ \prop_map_function:NN \l_@@_values_prop
+ \msg_show_item_unbraced:nn
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Messages}
+%
+% The text for error messages: short and long text for all of them.
+% \begin{macrocode}
+\msg_new:nnnn { template } { argument-number-mismatch }
+ { Template~type~'#1'~takes~#2~argument(s). }
+ {
+ Templates~of~type~'#1'~require~#2~argument(s).\\
+ You~have~tried~to~make~a~template~for~'#1'~
+ with~#3~argument(s),~which~is~not~possible:~
+ the~number~of~arguments~must~agree.
+ }
+\msg_new:nnnn { template } { bad-number-of-arguments }
+ { Bad~number~of~arguments~for~template~type~'#1'. }
+ {
+ A~template~may~accept~between~0~and~9~arguments.\\
+ You~asked~to~use~#2~arguments:~this~is~not~supported.
+ }
+\msg_new:nnnn { template } { bad-variable }
+ { Incorrect~variable~description~'#1'. }
+ {
+ The~argument~'#1'~is~not~of~the~form \\
+ ~~'<variable>'\\
+ ~or~\\
+ ~~'global~<variable>'.\\
+ It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template.
+ }
+\msg_new:nnnn { template } { choice-not-implemented }
+ { The~choice~'#1'~has~no~implementation. }
+ {
+ Each~choice~listed~in~the~interface~for~a~template~must~
+ have~an~implementation.
+ }
+\msg_new:nnnn { template } { choice-no-code }
+ { The~choice~'#1'~requires~implementation~details. }
+ {
+ When~creating~template~code~using~\DeclareTemplateCode,~
+ each~choice~name~must~have~an~associated~implementation.\\
+ This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
+ }
+\msg_new:nnnn { template } { choice-requires-code }
+ { The~choice~'#2'~for~key~'#1'~requires~an~implementation. }
+ {
+ You~should~have~put:\\
+ \ \ #1~:~choice~{~#2 = <code> ~} \\
+ but~LaTeX~did~not~find~any~<code>.
+ }
+\msg_new:nnnn { template } { duplicate-key-interface }
+ { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. }
+ {
+ Each~key~can~only~have~one~interface~declared~in~a~template.\\
+ LaTeX~found~two~interfaces~for~'#1'.
+ }
+\msg_new:nnnn { template } { keytype-requires-argument }
+ { The~key~type~'#1'~requires~an~argument~\msg_line_context:. }
+ {
+ You~should~have~put:\\
+ \ \ <key-name>~:~#1~{~<argument>~} \\
+ but~LaTeX~did~not~find~an~<argument>.
+ }
+\msg_new:nnnn { template } { invalid-keytype }
+ { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
+ {
+ Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\
+ \ \ <key>~:~<key-type>\\
+ LaTeX~could~not~find~a~<key-type>~in~your~input.
+ }
+\msg_new:nnnn { template } { key-no-value }
+ { The~key~'#1'~has~no~value~\msg_line_context:. }
+ {
+ When~creating~an~instance~of~a~template~
+ every~key~listed~must~include~a~value:\\
+ \ \ <key>~=~<value>
+ }
+\msg_new:nnnn { template } { key-no-variable }
+ { The~key~'#1'~requires~implementation~details~\msg_line_context:. }
+ {
+ When~creating~template~code~using~\DeclareTemplateCode,~
+ each~key~name~must~have~an~associated~implementation.\\
+ This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
+ }
+\msg_new:nnnn { template } { key-not-implemented }
+ { Key~'#1'~has~no~implementation~\msg_line_context:. }
+ {
+ The~definition~of~key~implementations~for~template~'#2'~
+ of~template~type~'#3'~does~not~include~any~details~for~key~'#1'.\\
+ The~key~was~declared~in~the~interface~definition,~
+ and~so~an~implementation~is~required.
+ }
+\msg_new:nnnn { template } { missing-keytype }
+ { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
+ {
+ Key~interface~definitions~should~be~of~the~form\\
+ \ \ #1~:~<key-type>\\
+ but~LaTeX~could~not~find~a~<key-type>.
+ }
+\msg_new:nnnn { template } { no-template-code }
+ {
+ The~template~'#2'~of~type~'#1'~is~unknown~
+ or~has~no~implementation.
+ }
+ {
+ There~is~no~code~available~for~the~template~name~given.\\
+ This~should~be~given~using~\DeclareTemplateCode.
+ }
+\msg_new:nnnn { template } { type-already-defined }
+ { Template~type~'#1'~already~defined. }
+ {
+ You~have~used~\NewTemplateType~
+ with~a~template~type~that~has~already~been~defined.
+ }
+\msg_new:nnnn { template } { type-mismatch }
+ { Template~types~'#1'~and~'#2'~do~not~agree. }
+ {
+ You~are~trying~to~use~a~template~directly~with~\UseInstance
+ (or~a~similar~function),~but~the~template~types~do~not~match.
+ }
+\msg_new:nnnn { template } { unknown-attribute }
+ { The~template~attribute~'#1'~is~unknown. }
+ {
+ There~is~a~definition~in~the~current~template~reading\\
+ \ \ \token_to_str:N \KeyValue {~#1~} \\
+ but~there~is~no~key~called~'#1'.
+ }
+\msg_new:nnnn { template } { unknown-choice }
+ { The~choice~'#2'~was~not~declared~for~key~'#1'. }
+ {
+ The~key~'#1'~takes~a~fixed~list~of~choices~
+ and~this~list~does~not~include~'#2'.
+ }
+\msg_new:nnnn { template } { unknown-default-choice }
+ { The~default~choice~'#2'~was~not~declared~for~key~'#1'. }
+ {
+ The~key~'#1'~takes~a~fixed~list~of~choices~
+ and~this~list~does~not~include~'#2'.
+ }
+\msg_new:nnnn { template } { unknown-instance }
+ { The~instance~'#2'~of~type~'#1'~is~unknown. }
+ {
+ You~have~asked~to~use~an~instance~'#2',~
+ but~this~has~not~been~created.
+ }
+\msg_new:nnnn { template } { unknown-key }
+ { Unknown~template~key~'#1'. }
+ {
+ The~key~'#1'~was~not~declared~in~the~interface~
+ for~the~current~template.
+ }
+\msg_new:nnnn { template } { unknown-keytype }
+ { The~key-type~'#1'~is~unknown. }
+ {
+ Valid~key-types~are:\\
+ -~boolean;\\
+ -~choice;\\
+ -~commalist;\\
+ -~function;\\
+ -~instance;\\
+ -~integer;\\
+ -~length;\\
+ -~muskip;\\
+ -~real;\\
+ -~skip;\\
+ -~tokenlist.
+ }
+\msg_new:nnnn { template } { unknown-type }
+ { The~template~type~'#1'~is~unknown. }
+ {
+ A~template~type~needs~to~be~defined~with~\NewTemplateType
+ prior~to~using~it.
+ }
+\msg_new:nnnn { template } { unknown-template }
+ { The~template~'#2'~of~type~'#1'~is~unknown. }
+ {
+ No~interface~has~been~declared~for~a~template~
+ '#2'~of~template~type~'#1'.
+ }
+% \end{macrocode}
+%
+% Information messages only have text: more text should not be needed.
+% \begin{macrocode}
+\msg_new:nnn { template } { declare-instance }
+ { Declaring~instance~~'#1'~of~type~#2~\msg_line_context:. }
+\msg_new:nnn { template } { declare-template-code }
+ { Declaring~code~for~template~'#2'~of~template~type~'#1'~\msg_line_context:. }
+\msg_new:nnn { template } { declare-template-interface }
+ {
+ Declaring~interface~for~template~'#2'~of~template~type~'#1'~
+ \msg_line_context:.
+ }
+\msg_new:nnn { template } { declare-type }
+ { Declaring~template~type~'#1'~taking~#2~argument(s)~\msg_line_context:. }
+\msg_new:nnn { template } { show-attribute }
+ {
+ The~template~'#2'~of~type~'#1'~has~
+ \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 }
+ }
+\msg_new:nnn { template } { show-values }
+ {
+ The~instance~'#2'~of~type~'#1'~has~
+ \tl_if_empty:nTF {#3} { no~values. } { values: #3 }
+ }
+% \end{macrocode}
+%
+% Also add \pkg{template} to the \pkg{LaTeX} messages.
+% \begin{macrocode}
+\prop_gput:Nnn \g_msg_module_type_prop { template } { LaTeX }
+% \end{macrocode}
+%
+% \subsection{User functions}
+%
+% \begin{macro}{\NewTemplateType}
+% \begin{macro}{\DeclareTemplateInterface}
+% \begin{macro}{\DeclareTemplateCode}
+% \begin{macro}{\DeclareTemplateCopy}
+% \begin{macro}{\EditTemplateDefaults}
+% \begin{macro}{\UseTemplate}
+% \begin{macro}{\DeclareInstance}
+% \begin{macro}{\DeclareInstanceCopy}
+% \begin{macro}{\EditInstance}
+% \begin{macro}{\UseInstance}
+% All simple translations.
+% \begin{macrocode}
+\cs_new_protected:Npn \NewTemplateType #1#2
+ { \@@_define_type:nn {#1} {#2} }
+\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4
+ { \@@_declare_template_keys:nnnn {#1} {#2} {#3} {#4} }
+\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5
+ { \@@_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} }
+\cs_new_protected:Npn \DeclareTemplateCopy #1#2#3
+ { \@@_template_set_eq:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \EditTemplateDefaults #1#2#3
+ { \@@_edit_defaults:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \UseTemplate #1#2#3
+ { \@@_use_template:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \DeclareInstance #1#2#3#4
+ { \@@_declare_instance:nnnn {#1} {#3} {#2} {#4} }
+\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3
+ { \@@_instance_set_eq:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \EditInstance #1#2#3
+ { \@@_edit_instance:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \UseInstance #1#2
+ { \@@_use_instance:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ShowTemplateCode}
+% \begin{macro}{\ShowTemplateDefaults}
+% \begin{macro}{\ShowTemplateInterface}
+% \begin{macro}{\ShowTemplateVariables}
+% \begin{macro}{\ShowInstanceValues}
+% The show functions are again just translation.
+% \begin{macrocode}
+\cs_new_protected:Npn \ShowTemplateCode #1#2
+ { \@@_show_code:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowTemplateDefaults #1#2
+ { \@@_show_defaults:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowTemplateInterface #1#2
+ { \@@_show_keytypes:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowTemplateVariables #1#2
+ { \@@_show_vars:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowInstanceValues #1#2
+ { \@@_show_values:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\KeyValue}
+% Simply dump the argument when executed: this should not happen.
+% \begin{macrocode}
+\cs_new_protected:Npn \KeyValue #1 {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AssignTemplateKeys}
+% A short call to use a token register by proxy.
+% \begin{macrocode}
+\cs_new_protected:Npn \AssignTemplateKeys { \@@_assignments_pop: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SetTemplateKeys}
+% A friendly wrapper
+% \begin{macrocode}
+\cs_new_protected:Npn \SetTemplateKeys #1#2#3
+ { \keys_set_known:nnN { template / #1 / #2 } {#3} \l_@@_tmp_clist }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}{lttemplates}%
+%<latexrelease> {Prototype~document~commands}%
+%<latexrelease>
+%<latexrelease>\EndModuleRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% We need to stop DocStrip treating |@@| in a special way at this point.
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \Finale \ No newline at end of file
diff --git a/macros/latex-dev/base/lttextcomp.dtx b/macros/latex-dev/base/lttextcomp.dtx
index 3602e0a6b0..c67bac00dd 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-2023
+% Copyright (C) 2019-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -37,7 +37,7 @@
%
%
\ProvidesFile{lttextcomp.dtx}
- [2022/08/07 v1.0g LaTeX Kernel (text companion symbols)]
+ [2024/02/08 v1.1a LaTeX Kernel (text companion symbols)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -163,11 +163,12 @@
%
% \begin{macro}{\DeclareEncodingSubset}
%
-% The declaration takes 3 mandatory arguments: an \emph{encoding}
+% The declaration takes 3 mandatory arguments: an \emph{encoding}
% for which a subsetting is wanted (currently always \texttt{TS1},
% and most likely forever), the \emph{font family} for which we
-% declare the subset and finally the \emph{subset} number (between \texttt{0} (all
-% of the encoding is supported) and \texttt{9} many glyphs are missing.
+% declare the subset and finally the \emph{subset} number, with a value between
+% \texttt{0} (all of the encoding is supported) and \texttt{9} (many
+% glyphs are missing).
%
% For \texttt{TS1} the numbers have been chosen in a way that most
% fonts can be fairly correctly categorized, but the default
@@ -439,7 +440,7 @@
% \end{macrocode}
%
% And here are the other \texttt{TS1} glyphs that are implemented
-% by every font (or nearly every---a few are commented out and
+% by every font (or nearly every)---a few are commented out and
% moved to sub-encoding 9,
% because they aren't around in some fonts.
% \begin{macrocode}
@@ -950,6 +951,8 @@
% This first block contains the fonts that have been already
% supported by the \texttt{textcomp} package way back, i.e., the
% font families that have \TeX{} support since the mid-nineties.
+% \changes{v1.1a}{2024/01/27}{Adjusted/corrected TS1 sub-encoding
+% declarations for various families (gh/1257)}
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{ccr} {0}
\DeclareEncodingSubset{TS1}{cmbr} {0}
@@ -981,16 +984,28 @@
\DeclareEncodingSubset{TS1}{lmss} {1}
\DeclareEncodingSubset{TS1}{lmssq} {1}
\DeclareEncodingSubset{TS1}{lmvtt} {1}
-\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and
- % pertenthousand for some reason
+% \end{macrocode}
+% The lmtt family is missing TM, SM, and perthousand for some
+% reason, so the first safe sub-encoding would be 2, but that is
+% then missing out a huge number of glyphs that are available, so
+% we claim it is sub-encoding 1 even if this can lead to missing glyphs.
+% \begin{macrocode}
+\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and pertenthousand
% \end{macrocode}
%
+% The next three families have been removed from TeX Live, but we
+% keep the definitions
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{ptmx} {2}
\DeclareEncodingSubset{TS1}{ptmj} {2}
\DeclareEncodingSubset{TS1}{ul8} {2}
% \end{macrocode}
%
+% The next set are the early PostScript font implementations, these
+% days there are better alternatives, but \ldots. Note that, their
+% virtual fonts contain a lot of ``tofu'' in form of black squares,
+% thus they don't even give a missing character warning if you
+% select such a glyph. This is why they are set as sub-encoding 5.
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{bch} {5} % tofu for blank, ohm
\DeclareEncodingSubset{TS1}{futj}{5} % tofu for blank, interrobang/down, ohm
@@ -1009,12 +1024,11 @@
\DeclareEncodingSubset{TS1}{ul9} {5} % tofu for blank, interrobang/down, ohm
% \end{macrocode}
%
+% The next set suffers from the same problem and they contain even
+% fewer real glyphs.
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{dayroms}{6} % tofu for blank, interrobang/down, ohm
\DeclareEncodingSubset{TS1}{dayrom} {6} % tofu for blank, interrobang/down, ohm
-% \end{macrocode}
-%
-% \begin{macrocode}
\DeclareEncodingSubset{TS1}{augie}{8} % really only missing euro
\DeclareEncodingSubset{TS1}{put} {8}
\DeclareEncodingSubset{TS1}{uag} {8} % probably (currently broken distrib)
@@ -1024,6 +1038,7 @@
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{zi4} {9}
% \end{macrocode}
+%
% LucidaBright (sold through TUG) probably not quite correct, I
% guess as I have the older fonts \ldots
% \begin{macrocode}
@@ -1041,44 +1056,72 @@
% Below are the newer fonts that have support files for
% \LaTeX{}. With very few exceptions the classifications are done
% so that all characters are correctly produced (either being
-% available in the font or substituted.
+% available in the font or substituted).
%
% There are a few fonts that contain ``tofu'' squares in places
% (instead of a real glyph) and in a few cases some really seldom
% needed chars are unavailable, i.e., produce missing glyphs (to
% avoid that a large number of available chars are unnecessarily
-% substituted.
+% substituted).
%
+% Encoding declarations for these font families shouldn't really be
+% in the kernel, but part of the \texttt{.fd} files for the
+% family. When we introduced the concept in 2021 we had some hope
+% that this would happen over time and that we could take the
+% declarations out---after all it is nearly impossible to maintain
+% it correctly in the kernel, given that fonts may get new glyphs
+% added (happened for several of them in the recent year) which is
+% something we wouldn't notice. However, so far this hasn't
+% happened, so in 2024, I went through the current set and adjusted
+% the declarations in several places.
+%
+% Next four are wrong and still need adjustment:
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{lato-*} {0} % with a bunch of tofu inside
\DeclareEncodingSubset{TS1}{opensans-*} {0} % with a bunch of tofu inside
\DeclareEncodingSubset{TS1}{cantarell-*} {0} % with a bunch of tofu inside
-\DeclareEncodingSubset{TS1}{fbb-*} {0} % missing centoldstyle
+\DeclareEncodingSubset{TS1}{tli} {1} % with lots of tofu inside
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareEncodingSubset{TS1}{tli} {1} % with lots of tofu inside
+\DeclareEncodingSubset{TS1}{fbb-*} {2} % missing centoldstyle
% \end{macrocode}
%
+%
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{Alegreya-*} {2}
\DeclareEncodingSubset{TS1}{AlegreyaSans-*} {2}
+\DeclareEncodingSubset{TS1}{BaskervilleF-*} {2}
\DeclareEncodingSubset{TS1}{DejaVuSans-TLF} {2}
\DeclareEncodingSubset{TS1}{DejaVuSansCondensed-TLF} {2}
+% \end{macrocode}
+% Next one is missing \cs{textfractionsolidus} but is otherwise
+% completely sub-encoding 2 so we use that sub-encoding.
+% \begin{macrocode}
\DeclareEncodingSubset{TS1}{DejaVuSansMono-TLF} {2}
+% \end{macrocode}
+%
+% \begin{macrocode}
\DeclareEncodingSubset{TS1}{EBGaramond-*} {2}
+\DeclareEncodingSubset{TS1}{Merriwthr-OsF} {2}
+\DeclareEncodingSubset{TS1}{MerriwthrSans-OsF} {2}
+\DeclareEncodingSubset{TS1}{Montserrat-*} {2}
+\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {2}
+\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {2}
+\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {2}
\DeclareEncodingSubset{TS1}{Tempora-TLF} {2}
\DeclareEncodingSubset{TS1}{Tempora-TOsF} {2}
+\DeclareEncodingSubset{TS1}{XCharter-TLF} {2}
+\DeclareEncodingSubset{TS1}{XCharter-TOsF} {2}
+\DeclareEncodingSubset{TS1}{erewhon-*} {2}
% \end{macrocode}
%
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{Arimo-TLF} {3}
-\DeclareEncodingSubset{TS1}{Carlito-*} {3}
-\DeclareEncodingSubset{TS1}{FiraSans-*} {3}
+\DeclareEncodingSubset{TS1}{Crlt-*} {3}
+\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {3}
\DeclareEncodingSubset{TS1}{IBMPlexSans-TLF} {3}
-\DeclareEncodingSubset{TS1}{Merriweather-OsF} {3}
-\DeclareEncodingSubset{TS1}{Montserrat-*} {3}
-\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {3}
+\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {3}
\DeclareEncodingSubset{TS1}{SourceCodePro-TLF} {3}
\DeclareEncodingSubset{TS1}{SourceCodePro-TOsF} {3}
\DeclareEncodingSubset{TS1}{SourceSansPro-*} {3}
@@ -1096,6 +1139,7 @@
\DeclareEncodingSubset{TS1}{CrimsonPro-*} {4}
\DeclareEncodingSubset{TS1}{FiraMono-TLF} {4}
\DeclareEncodingSubset{TS1}{FiraMono-TOsF} {4}
+\DeclareEncodingSubset{TS1}{FiraSans-*} {4}
\DeclareEncodingSubset{TS1}{Go-TLF} {4}
\DeclareEncodingSubset{TS1}{GoMono-TLF} {4}
\DeclareEncodingSubset{TS1}{InriaSans-*} {4}
@@ -1108,7 +1152,6 @@
\DeclareEncodingSubset{TS1}{LinguisticsPro-OsF} {4}
\DeclareEncodingSubset{TS1}{LinuxBiolinumT-*} {4}
\DeclareEncodingSubset{TS1}{LinuxLibertineT-*} {4}
-\DeclareEncodingSubset{TS1}{MerriweatherSans-OsF} {4}
\DeclareEncodingSubset{TS1}{MintSpirit-*} {4}
\DeclareEncodingSubset{TS1}{MintSpiritNoTwo-*} {4}
\DeclareEncodingSubset{TS1}{PTMono-TLF} {4}
@@ -1128,66 +1171,64 @@
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareEncodingSubset{TS1}{Almendra-OsF} {5}
+\DeclareEncodingSubset{TS1}{Almndr-OsF} {5}
\DeclareEncodingSubset{TS1}{Baskervaldx-*} {5}
-\DeclareEncodingSubset{TS1}{BaskervilleF-*} {5}
-\DeclareEncodingSubset{TS1}{Bitter-TLF} {5}
+\DeclareEncodingSubset{TS1}{Bttr-TLF} {5}
\DeclareEncodingSubset{TS1}{Cinzel-LF} {5}
\DeclareEncodingSubset{TS1}{CinzelDecorative-LF} {5}
+\DeclareEncodingSubset{TS1}{Cochineal-*} {5}
\DeclareEncodingSubset{TS1}{DejaVuSerif-TLF} {5}
\DeclareEncodingSubset{TS1}{DejaVuSerifCondensed-TLF} {5}
\DeclareEncodingSubset{TS1}{GilliusADF-LF} {5}
\DeclareEncodingSubset{TS1}{GilliusADFCond-LF} {5}
\DeclareEncodingSubset{TS1}{GilliusADFNoTwo-LF} {5}
\DeclareEncodingSubset{TS1}{GilliusADFNoTwoCond-LF} {5}
-\DeclareEncodingSubset{TS1}{LobsterTwo-LF} {5}
\DeclareEncodingSubset{TS1}{OldStandard-TLF} {5}
-\DeclareEncodingSubset{TS1}{PlayfairDisplay-TLF} {5}
-\DeclareEncodingSubset{TS1}{PlayfairDisplay-TOsF} {5}
+\DeclareEncodingSubset{TS1}{PlyfrDisplay-TLF} {5}
+\DeclareEncodingSubset{TS1}{PlyfrDisplay-TOsF} {5}
\DeclareEncodingSubset{TS1}{TheanoDidot-TLF} {5}
\DeclareEncodingSubset{TS1}{TheanoDidot-TOsF} {5}
\DeclareEncodingSubset{TS1}{TheanoModern-TLF} {5}
\DeclareEncodingSubset{TS1}{TheanoModern-TOsF} {5}
\DeclareEncodingSubset{TS1}{TheanoOldStyle-TLF} {5}
\DeclareEncodingSubset{TS1}{TheanoOldStyle-TOsF} {5}
+\DeclareEncodingSubset{TS1}{charssil-TLF} {5}
% \end{macrocode}
%
% \begin{macrocode}
\DeclareEncodingSubset{TS1}{Crimson-TLF} {6}
-\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {6}
-\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {6}
-\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {6}
\DeclareEncodingSubset{TS1}{LibertinusSerifDisplay-LF}{6}
\DeclareEncodingSubset{TS1}{LinuxLibertineDisplayT-*} {6}
\DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-LF} {6}
\DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-TLF} {6}
-\DeclareEncodingSubset{TS1}{Overlock-LF} {6}
+\DeclareEncodingSubset{TS1}{Ovrlck-LF} {6}
% \end{macrocode}
%
% \begin{macrocode}
+\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7}
+\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7}
\DeclareEncodingSubset{TS1}{CormorantGaramond-*} {7}
\DeclareEncodingSubset{TS1}{Heuristica-TLF} {7}
\DeclareEncodingSubset{TS1}{Heuristica-TOsF} {7}
\DeclareEncodingSubset{TS1}{IMFELLEnglish-TLF} {7}
-\DeclareEncodingSubset{TS1}{LibreBaskerville-TLF} {7}
-\DeclareEncodingSubset{TS1}{LibreCaslon-*} {7}
-\DeclareEncodingSubset{TS1}{Marcellus-LF} {7}
+\DeclareEncodingSubset{TS1}{LibreBskrvl-TLF} {7}
+\DeclareEncodingSubset{TS1}{LibreCsln-*} {7}
+\DeclareEncodingSubset{TS1}{Lbstr-LF} {7}
+\DeclareEncodingSubset{TS1}{Mrcls-LF} {7}
+% \end{macrocode}
+% Strangely enough NotoSerif and NotoSans are sub-encoding 7 as
+% they are missing \cs{textminus} and several other glyphs. In
+% contrast the NotoSansMono is far more complete.
+% \begin{macrocode}
\DeclareEncodingSubset{TS1}{NotoSans-*} {7}
-\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {7}
-\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {7}
\DeclareEncodingSubset{TS1}{NotoSerif-*} {7}
-\DeclareEncodingSubset{TS1}{Quattrocento-TLF} {7}
-\DeclareEncodingSubset{TS1}{QuattrocentoSans-TLF} {7}
-\DeclareEncodingSubset{TS1}{XCharter-TLF} {7}
-\DeclareEncodingSubset{TS1}{XCharter-TOsF} {7}
-\DeclareEncodingSubset{TS1}{erewhon-*} {7}
-\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7}
-\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7}
-\DeclareEncodingSubset{TS1}{Forum-LF} {7} % the superiors are missing
+\DeclareEncodingSubset{TS1}{Quattro-LF} {7}
+\DeclareEncodingSubset{TS1}{QuattroSans-LF} {7}
+\DeclareEncodingSubset{TS1}{Frm-LF} {7} % the superiors are missing
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareEncodingSubset{TS1}{Cochineal-*} {8}
+\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {8}
% \end{macrocode}
%
% \begin{macrocode}
@@ -1231,7 +1272,7 @@
%
% Here are new names for the legacy symbols that \LaTeX{} used to
% pick up from the \texttt{OMS} encoded fonts (and used for itemize
-% lists or footnote symbols.
+% lists or footnote symbols).
%
% We go the roundabout way via separate OMS declarations so that
%\begin{verbatim}
@@ -1481,7 +1522,6 @@
%
%
%
-%
% \section{The \texttt{textcomp} package}
%
%
@@ -1706,7 +1746,7 @@
% The default is ``almostfull'' which means that old documents will
% work except that |\textcircled| and |\t| will use the kernel
% defaults (with the advantage that this also works if the current
-% font (as often the case) doesn't implement these glyphs.
+% font, as often the case, doesn't implement these glyphs).
%
% The ``force'' option simply sets the switch to true.
% \begin{macrocode}
@@ -2301,8 +2341,547 @@
% \begin{macrocode}
%</TS1oldsty>
% \end{macrocode}
+%
+%
+%
+%
+% \section{The \texttt{checkencodingsubset.tex} file}
+%
+% This is a simple file that asks for a name of a font family and
+% then displays information about the TS1 encoding for this family
+% and recommends the right encoding subset (to be used with
+% \cs{DeclareEncodingsubset}) for this family.
+% \changes{v1.1a}{2024/01/27}{Added check file for encoding subset}
+% \begin{macrocode}
+%<*TS1check>
+\Providesfile{checkencodingsubset.tex}
+ [2024/01/27 v0.5a Figure out safe TS1 encoding subsets]
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\typeoutdetails\typeout
+%\def\typeoutdetails#1{} % alternative definition used below
+% \end{macrocode}
+%
+% For the purpose of this check a glyph exists if the font slot is
+% occupied---too bad if that contains the wrong glyph or some tofu.
+% If it ``exists'' we return 0 otherwise 1. This way we can call
+% this macro several times in a row and obtain a number that is 0
+% if all glyphs are existing or greater than 0 if any of them is
+% missing.
+%
+% The second argument (holding the command name for a symbol) is
+% not used during these tests.
+% \begin{macrocode}
+\def\doesglyphexist#1#2{\iffontchar\testFont #1 0\else 1\relax \fi}
+% \end{macrocode}
+%
+% This macro also tests and outputs some information about the
+% symbol if it is missing. This time we make use of the second
+% argument.
+% \begin{macrocode}
+\def\glyphmissingdetails#1#2{\iffontchar\testFont #1 \else
+ \typeoutdetails{\space\space\space ==> \string#2 (#1) is missing}\fi}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newif\ifsafesubencodingfound
+\newif\ifcoremisses
+% \end{macrocode}
+%
+% Testing a group of symbols that belong to one sub-encoding. More
+% precisely, the symbols that become unavailable if you change from
+% sub-encoding $x$ (\texttt{\#2}) to $x+1$ (\texttt{\#3}). As far
+% as the code is concerned, the
+% symbols that are supposed to be always available (the core)
+% become available if we test the group \texttt{-1} and \texttt{0}.
+%
+% The first argument contains the testing code and is supposed to
+% return a single number greater or equal to zero.
+% \begin{macrocode}
+\def\testgroup#1#2#3{%
+ \ifnum 0 = #1%
+ \ifnum #2<0
+ \typeoutdetails{All glyphs in core exist}%
+ \else
+ \typeoutdetails{All glyphs between sub-encoding #2 and #3 exist}%
+ \fi
+ \else
+ \ifnum #2<0
+ \typeoutdetails{**********************************}%
+ \typeoutdetails{Some glyphs are missing from core:}%
+ \coremissestrue
+ \ifsafesubencodingfound \else
+ \def\subencodingresult{#2}%
+ \fi
+ \else
+ \typeoutdetails{Some glyphs are missing from sub-encoding #2:}%
+ \ifsafesubencodingfound \else
+ \def\subencodingresult{#3}%
+ \fi
+ \fi
+% \end{macrocode}
+% If some glyphs are missing, we rerun the test code but this time
+% using \cs{glyphmissingdetails}.
+% \begin{macrocode}
+ {\let\doesglyphexist \glyphmissingdetails #1}%
+% \end{macrocode}
+% And because we had misses we have definitely found the subset.
+% \begin{macrocode}
+ \safesubencodingfoundtrue
+ \fi
+}
+% \end{macrocode}
+%
+% The currently defined subset for the family is either stored in
+% \cs{TS1:\meta{family}} if it was declared, or it is the default
+% subset which is stored in \cs{TS1:?}.
+% \begin{macrocode}
+\def\currsubencoding#1{\csname TS1:\ifcsname TS1:#1\endcsname #1\else ?\fi\endcsname}
+% \end{macrocode}
+%
+% If a font family is not found when declaring it with
+% \cs{DeclareFixedFont} we end up with the following font. This can
+% then be used as a simple test if we failed loading the TS1 font.
+% \begin{macrocode}
+\DeclareFixedFont\cmrFont{TS1}{cmr}{m}{n}{10pt}
+% \end{macrocode}
+%
+% Check for all glyphs in all encoding subsets \ldots
+% \begin{macrocode}
+\def\testallgroups#1{%
+ \DeclareFixedFont\testFont{TS1}{#1}{m}{n}{10pt}%
+ \ifx\testFont\cmrFont
+ \typeout{***** Font family #1 not found ****}%
+ \else
+% \end{macrocode}
+% We haven't checked anything yet.
+% \begin{macrocode}
+ \safesubencodingfoundfalse
+ \coremissesfalse
+ \typeoutdetails{^^J-----------------------------------------}%
+ \typeoutdetails{Testing font family #1^^J(currently TS1-sub-encoding
+ \currsubencoding{#1})}%
+ \typeout{-----------------------------------------}%
+% \end{macrocode}
+% Then we start testing the groups beginning with the glyphs
+% between sub-encoding 8 and 9. If any of them is missing (checked
+% with \cs{doesglyphexist}) then we already know that 9 is the
+% correct answer.
+% \begin{macrocode}
+ \testgroup{%
+ \doesglyphexist{21}{\texttwelveudash}%
+ \doesglyphexist{22}{\textthreequartersemdash}%
+ \doesglyphexist{134}{\textbardbl}%
+ \doesglyphexist{137}{\textcelsius}%
+ \doesglyphexist{178}{\texttwosuperior}%
+ \doesglyphexist{179}{\textthreesuperior}%
+ \doesglyphexist{185}{\textonesuperior}%
+ }{8}{9}%
+% \end{macrocode}
+% Nevertheless we go on with further groups so that the output
+% lists all missing glyphs.
+% \begin{macrocode}
+ \testgroup{%
+ \doesglyphexist{32}{\textblank}%
+ \doesglyphexist{148}{\textinterrobang}%
+ \doesglyphexist{149}{\textinterrobangdown}%
+ \doesglyphexist{191}{\texteuro}%
+ }{7}{8}%
+ \testgroup{%
+ \doesglyphexist{47}{\textfractionsolidus}%
+ \doesglyphexist{61}{\textminus}%
+ \doesglyphexist{87}{\textohm}%
+ \doesglyphexist{181}{\textmu}%
+ }{6}{7}%
+ \testgroup{%
+ \doesglyphexist{140}{\textflorin}%
+ \doesglyphexist{164}{\textcurrency}%
+ }{5}{6}%
+ \testgroup{%
+ \doesglyphexist{155}{\textnumero}%
+ \doesglyphexist{157}{\textestimated}%
+ }{4}{5}%
+ \testgroup{%
+ \doesglyphexist{24}{\textleftarrow}%
+ \doesglyphexist{25}{\textrightarrow}%
+ \doesglyphexist{94}{\textuparrow}%
+ \doesglyphexist{95}{\textdownarrow}%
+ \doesglyphexist{141}{\textcolonmonetary}%
+ \doesglyphexist{142}{\textwon}%
+ \doesglyphexist{146}{\textlira}%
+ \doesglyphexist{150}{\textdong}%
+ }{3}{4}%
+ \testgroup{%
+ \doesglyphexist{60}{\textlangle}%
+ \doesglyphexist{62}{\textrangle}%
+ }{2}{3}%
+ \testgroup{%
+ \doesglyphexist{0}{\capitalgrave}%
+ \doesglyphexist{1}{\capitalacute}%
+ \doesglyphexist{2}{\capitalcircumflex}%
+ \doesglyphexist{3}{\capitaltilde}%
+ \doesglyphexist{4}{\capitaldieresis}%
+ \doesglyphexist{5}{\capitalhungarumlaut}%
+ \doesglyphexist{6}{\capitalring}%
+ \doesglyphexist{7}{\capitalcaron}%
+ \doesglyphexist{8}{\capitalbreve}%
+ \doesglyphexist{9}{\capitalmacron}%
+ \doesglyphexist{10}{\capitaldotaccent}%
+ \doesglyphexist{11}{\capitalcedilla}%
+ \doesglyphexist{12}{\capitalogonek}%
+ \doesglyphexist{26}{\t}%
+ \doesglyphexist{27}{\capitaltie}%
+ \doesglyphexist{28}{\newtie}%
+ \doesglyphexist{29}{\capitalnewtie}%
+ \doesglyphexist{45}{\textdblhyphen}%
+ \doesglyphexist{48}{\textzerooldstyle}%
+ \doesglyphexist{49}{\textoneoldstyle}%
+ \doesglyphexist{50}{\texttwooldstyle}%
+ \doesglyphexist{51}{\textthreeoldstyle}%
+ \doesglyphexist{52}{\textfouroldstyle}%
+ \doesglyphexist{53}{\textfiveoldstyle}%
+ \doesglyphexist{54}{\textsixoldstyle}%
+ \doesglyphexist{55}{\textsevenoldstyle}%
+ \doesglyphexist{56}{\texteightoldstyle}%
+ \doesglyphexist{57}{\textnineoldstyle}%
+ \doesglyphexist{77}{\textmho}%
+ \doesglyphexist{79}{\textbigcircle}%
+ \doesglyphexist{91}{\textlbrackdbl}%
+ \doesglyphexist{93}{\textrbrackdbl}%
+ \doesglyphexist{96}{\textasciigrave}%
+ \doesglyphexist{98}{\textborn}%
+ \doesglyphexist{99}{\textdivorced}%
+ \doesglyphexist{100}{\textdied}%
+ \doesglyphexist{108}{\textleaf}%
+ \doesglyphexist{109}{\textmarried}%
+ \doesglyphexist{110}{\textmusicalnote}%
+ \doesglyphexist{126}{\texttildelow}%
+ \doesglyphexist{127}{\textdblhyphenchar}%
+ \doesglyphexist{128}{\textasciibreve}%
+ \doesglyphexist{129}{\textasciicaron}%
+ \doesglyphexist{175}{\textasciimacron}%
+ \doesglyphexist{130}{\textacutedbl}%
+ \doesglyphexist{131}{\textgravedbl}%
+ \doesglyphexist{138}{\textdollaroldstyle}%
+ \doesglyphexist{139}{\textcentoldstyle}%
+ \doesglyphexist{143}{\textnaira}%
+ \doesglyphexist{144}{\textguarani}%
+ \doesglyphexist{145}{\textpeso}%
+ \doesglyphexist{147}{\textrecipe}%
+ \doesglyphexist{152}{\textpertenthousand}%
+ \doesglyphexist{153}{\textpilcrow}%
+ \doesglyphexist{154}{\textbaht}%
+ \doesglyphexist{156}{\textdiscount}%
+ \doesglyphexist{158}{\textopenbullet}%
+ \doesglyphexist{159}{\textservicemark}%
+ \doesglyphexist{160}{\textlquill}%
+ \doesglyphexist{161}{\textrquill}%
+ \doesglyphexist{168}{\textasciidieresis}%
+ \doesglyphexist{171}{\textcopyleft}%
+ \doesglyphexist{173}{\textcircledP}%
+ \doesglyphexist{180}{\textasciiacute}%
+ \doesglyphexist{184}{\textreferencemark}%
+ \doesglyphexist{187}{\textsurd}%
+ }{1}{2}%
+% \end{macrocode}
+% All fonts (up to now) that belong to sub-encoding 1 do have the
+% \cs{textcircled} glyph, but it is too small to be usable. So this
+% test for this group currently doesn't do much good---but who
+% knows maybe one day a font shows up in which this glyph is
+% actually missing.
+% \begin{macrocode}
+ \testgroup{%
+ \doesglyphexist{79}{\textcircled}% this is not a proper test because the symbol is
+ % usually available but not usable
+ }{0}{1}%
+ \testgroup{%
+ \doesglyphexist{13}{\textquotestraightbase}%
+ \doesglyphexist{18}{\textquotestraightdblbase}%
+ \doesglyphexist{23}{\textcapitalcompwordmark}%
+ \doesglyphexist{31}{\textascendercompwordmark}%
+ \doesglyphexist{36}{\textdollar}%
+ \doesglyphexist{39}{\textquotesingle}%
+ \doesglyphexist{42}{\textasteriskcentered}%
+ \doesglyphexist{132}{\textdagger}%
+ \doesglyphexist{133}{\textdaggerdbl}%
+ \doesglyphexist{135}{\textperthousand}%
+ \doesglyphexist{136}{\textbullet}%
+ \doesglyphexist{151}{\texttrademark}%
+ \doesglyphexist{162}{\textcent}%
+ \doesglyphexist{163}{\textsterling}%
+ \doesglyphexist{165}{\textyen}%
+ \doesglyphexist{166}{\textbrokenbar}%
+ \doesglyphexist{167}{\textsection}%
+ \doesglyphexist{169}{\textcopyright}%
+ \doesglyphexist{170}{\textordfeminine}%
+ \doesglyphexist{172}{\textlnot}%
+ \doesglyphexist{174}{\textregistered}%
+ \doesglyphexist{176}{\textdegree}%
+ \doesglyphexist{177}{\textpm}%
+ \doesglyphexist{182}{\textparagraph}%
+ \doesglyphexist{183}{\textperiodcentered}%
+ \doesglyphexist{186}{\textordmasculine}%
+ \doesglyphexist{188}{\textonequarter}%
+ \doesglyphexist{189}{\textonehalf}%
+ \doesglyphexist{190}{\textthreequarters}%
+ \doesglyphexist{214}{\texttimes}%
+ \doesglyphexist{246}{\textdiv}%
+ }{-1}{0}%
+% \end{macrocode}
+% If all groups have all glyphs then we have the full encoding
+% (subset 0).
+% \begin{macrocode}
+ \ifsafesubencodingfound\else
+ \def\subencodingresult{0}%
+ \fi
+% \end{macrocode}
+% If the font is missing some of the core glyphs we make a remark
+% about this, because they will never display.
+% \begin{macrocode}
+ \typeoutdetails{-----------------------------------------}%
+ \typeout{TS1 encoding subset for #1\ifcoremisses \space(ignoring core misses)\fi
+ \space (\ifnum\subencodingresult =
+ \currsubencoding{#1} ok\else bad\fi)}%
+ \typeout{Use sub-encoding \subencodingresult
+ \ifnum\subencodingresult = \currsubencoding{#1}\else
+ \space (not \currsubencoding{#1})\fi}
+ \typeout{-----------------------------------------^^J}%
+ \fi
+}
+% \end{macrocode}
+%
+% This tests all declarations (or most of them) that have been
+% added to the kernel. It is called if no family is given interactively.
+% \begin{macrocode}
+\long\def\testallkerneldefinedfamilies{%
+\testallgroups{ccr}% {0}
+\testallgroups{cmbr}% {0}
+%%\testallgroups{cmr}% {0} % don't test this one as it is the fallback
+ % thus reports that the family is not found
+\testallgroups{cmss}% {0}
+\testallgroups{cmtl}% {0}
+\testallgroups{cmtt}% {0}
+\testallgroups{cmvtt}% {0}
+\testallgroups{pxr}% {0}
+\testallgroups{pxss}% {0}
+\testallgroups{pxtt}% {0}
+\testallgroups{qag}% {0}
+\testallgroups{qbk}% {0}
+\testallgroups{qcr}% {0}
+\testallgroups{qcs}% {0}
+\testallgroups{qhvc}% {0}
+\testallgroups{qhv}% {0}
+\testallgroups{qpl}% {0}
+\testallgroups{qtm}% {0}
+\testallgroups{qzc}% {0}
+\testallgroups{txr}% {0}
+\testallgroups{txss}% {0}
+\testallgroups{txtt}% {0}
+%
+% Next would claim to be 0 (or 2)
+%
+%\testallgroups{lmr}% {1}
+%\testallgroups{lmdh}% {1}
+%\testallgroups{lmss}% {1}
+%\testallgroups{lmssq}% {1}
+%\testallgroups{lmvtt}% {1}
+%\testallgroups{lmtt}% {1} % missing TM, SM and pertenthousand so really 2
+%
+% these are no longer in TeX Live
+%
+%\testallgroups{ptmx}% {2} % gone for a long time it seems
+%\testallgroups{ptmj}% {2} % ditto
+%\testallgroups{ul8}% {2} % ditto
+%
+% next block has tofu chars so results are wrong
+%
+%\testallgroups{bch}% {5} % tofu for blank, ohm
+%\testallgroups{futj}%{5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{futs}%{5} % tofu for blank, ohm
+%\testallgroups{futx}%{5} % probably (currently broken distrib)
+%\testallgroups{pag}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{pbk}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{pcr}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{phv}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{pnc}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{pplj}%{5} % tofu for blank
+%\testallgroups{pplx}%{5} % tofu for blank
+%\testallgroups{ppl}% {5} % tofu for blank interrobang/down
+%\testallgroups{ptm}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{pzc}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{ul9}% {5} % tofu for blank, interrobang/down, ohm
+%\testallgroups{dayroms}%{6} % tofu for blank, interrobang/down, ohm
+%\testallgroups{dayrom}% {6} % tofu for blank, interrobang/down, ohm
+%\testallgroups{augie}%{8} % really only missing euro and full of tofu
+%\testallgroups{put}% {8}
+%\testallgroups{uag}% {8} % probably (currently broken distrib)
+%\testallgroups{ugq}% {8}
+%
+\testallgroups{zi4}% {9}
+%
+%% not installed normally
+%
+%\testallgroups{hls}% {5}
+%\testallgroups{hlst}% {5}
+%\testallgroups{hlct}% {5}
+%\testallgroups{hlh}% {5}
+%\testallgroups{hlx}% {8}
+%\testallgroups{hlce}% {8}
+%\testallgroups{hlcn}% {8}
+%\testallgroups{hlcw}% {8}
+%\testallgroups{hlcf}% {8}
-
+\testallgroups{lato-LF}% {0} % with a bunch of tofu inside --- should probably be changed
+\testallgroups{opensans-TLF}%{0} % with a bunch of tofu inside --- should probably be changed
+\testallgroups{cantarell-TLF}% {0} % with a bunch of tofu inside --- should probably be changed
+\testallgroups{fbb-LF}% {0} % missing centoldstyle ---> 2
+\testallgroups{tli}% {1} % with lots of tofu inside --- should probably be changed
+\testallgroups{Alegreya-OsF}% {2}
+\testallgroups{AlegreyaSans-OsF}% {2}
+\testallgroups{DejaVuSans-TLF}% {2}
+\testallgroups{DejaVuSansCondensed-TLF}% {2}
+\testallgroups{DejaVuSansMono-TLF}% {2} this is missing \textfractionsolidus which makes it 7 really
+\testallgroups{EBGaramond-LF}% {2}
+\testallgroups{Tempora-TLF}% {2}
+\testallgroups{Tempora-TOsF}% {2}
+\testallgroups{Arimo-TLF}% {3}
+\testallgroups{Crlt-TLF}% {3} changed from Carlito-
+\testallgroups{FiraSans-LF}% {3} should be 4
+\testallgroups{IBMPlexSans-TLF}% {3}
+\testallgroups{Merriwthr-OsF}% {3} changed from Merriweather- and should be 2
+\testallgroups{Montserrat-LF}% {3} now 2
+\testallgroups{MontserratAlternates-LF}%{3} now 2
+\testallgroups{SourceCodePro-TLF}% {3}
+\testallgroups{SourceCodePro-TOsF}% {3}
+\testallgroups{SourceSansPro-OsF}% {3}
+\testallgroups{SourceSerifPro-LF}% {3}
+\testallgroups{Tinos-TLF}% {3}
+\testallgroups{AccanthisADFStdNoThree-LF}%{4}
+\testallgroups{Cabin-TLF}% {4}
+\testallgroups{Caladea-TLF}% {4}
+\testallgroups{Chivo-LF}% {4}
+\testallgroups{ClearSans-TLF}% {4}
+\testallgroups{Coelacanth-LF}% {4}
+\testallgroups{CrimsonPro-LF}% {4}
+\testallgroups{FiraMono-TLF}% {4}
+\testallgroups{FiraMono-TOsF}% {4}
+\testallgroups{Go-TLF}% {4}
+\testallgroups{GoMono-TLF}% {4}
+\testallgroups{InriaSans-LF}% {4}
+\testallgroups{InriaSerif-LF}% {4}
+\testallgroups{LibertinusSans-LF}% {4}
+\testallgroups{LibertinusSerif-LF}% {4}
+\testallgroups{LibreBodoni-TLF}% {4}
+\testallgroups{LibreFranklin-TLF}% {4}
+\testallgroups{LinguisticsPro-LF}% {4}
+\testallgroups{LinguisticsPro-OsF}% {4}
+\testallgroups{LinuxBiolinumT-LF}% {4}
+\testallgroups{LinuxLibertineT-LF}% {4}
+\testallgroups{MerriwthrSans-OsF}% {4} name change and now 2
+\testallgroups{MintSpirit-LF}% {4}
+\testallgroups{MintSpiritNoTwo-LF}% {4}
+\testallgroups{PTMono-TLF}% {4}
+\testallgroups{PTSans-TLF}% {4}
+\testallgroups{PTSansCaption-TLF}% {4}
+\testallgroups{PTSansNarrow-TLF}% {4}
+\testallgroups{PTSerif-TLF}% {4}
+\testallgroups{PTSerifCaption-TLF}% {4}
+\testallgroups{Raleway-TLF}% {4}
+\testallgroups{Raleway-TOsF}% {4}
+\testallgroups{Roboto-LF}% {4}
+\testallgroups{RobotoMono-TLF}% {4}
+\testallgroups{RobotoSlab-TLF}% {4}
+\testallgroups{Rosario-LF}% {4}
+\testallgroups{SticksTooText-LF}% {4}
+\testallgroups{UniversalisADFStd-LF}%{4}
+\testallgroups{Almndr-OsF}% {5} name change
+\testallgroups{Baskervaldx-LF}% {5}
+\testallgroups{BaskervilleF-LF}% {5} now 2
+\testallgroups{Bttr-TLF}% {5} name changed from Bitter-...
+\testallgroups{Cinzel-LF}% {5}
+\testallgroups{CinzelDecorative-LF}%{5}
+\testallgroups{DejaVuSerif-TLF}% {5}
+\testallgroups{DejaVuSerifCondensed-TLF}% {5}
+\testallgroups{GilliusADF-LF}% {5}
+\testallgroups{charssil-TLF} %% missing should be 5
+\testallgroups{GilliusADFCond-LF}%{5}
+\testallgroups{GilliusADFNoTwo-LF}%{5}
+\testallgroups{GilliusADFNoTwoCond-LF}%{5}
+\testallgroups{Lbstr-LF}% {5} name change and should be 7
+\testallgroups{OldStandard-TLF}% {5}
+\testallgroups{PlyfrDisplay-LF}%{5} name change
+\testallgroups{PlyfrDisplay-OsF}% {5} name change
+\testallgroups{TheanoDidot-TLF}% {5}
+\testallgroups{TheanoDidot-TOsF}% {5}
+\testallgroups{TheanoModern-TLF}% {5}
+\testallgroups{TheanoModern-TOsF}%{5}
+\testallgroups{TheanoOldStyle-TLF}%{5}
+\testallgroups{TheanoOldStyle-TOsF}%{5}
+\testallgroups{Crimson-TLF}% {6}
+\testallgroups{IBMPlexMono-TLF}% {6} now 3
+\testallgroups{IBMPlexSerif-TLF}% {6} now 3
+\testallgroups{LibertinusMono-TLF}%{6} should be 8
+\testallgroups{LibertinusSerifDisplay-LF}%{6}
+\testallgroups{LinuxLibertineDisplayT-LF}%{6}
+\testallgroups{LinuxLibertineMonoT-LF}%{6}
+\testallgroups{LinuxLibertineMonoT-TLF}%{6}
+\testallgroups{Ovrlck-LF}% {6} name changed
+\testallgroups{CormorantGaramond-LF}%{7}
+\testallgroups{Heuristica-TLF}% {7}
+\testallgroups{Heuristica-TOsF}% {7}
+\testallgroups{IMFELLEnglish-TLF}%{7}
+\testallgroups{LibreBskvl-LF}% {7} %% wrong name LibreBaskerville-TLF
+\testallgroups{LibreCsln-LF}% {7} changed from LibreCaslon-
+\testallgroups{Mrcls-LF}% {7} %% wrong name Marcellus-LF
+\testallgroups{NotoSans-LF}% {7}
+\testallgroups{NotoSansMono-TLF}%{7} now 2
+\testallgroups{NotoSansMono-TOsF}%{7} now 2
+\testallgroups{NotoSerif-LF}% {7}
+\testallgroups{Quattro-LF}% {7} changed from Quattrocento-
+\testallgroups{QuattroSans-LF}% {7} changed from QuattrocentoSans-
+\testallgroups{XCharter-TLF}% {7} now 2
+\testallgroups{XCharter-TOsF}% {7} now 2
+\testallgroups{erewhon-LF}% {7} now 2
+\testallgroups{ComicNeue-TLF}% {7}
+\testallgroups{ComicNeueAngular-TLF}%{7}
+\testallgroups{Frm-LF}%{7} % the superiors are missing; name changed from Forum-LF
+\testallgroups{Cochineal-TLF}% {8} now 5
+\testallgroups{AlgolRevived-TLF}%{9}
+}
+% \end{macrocode}
+%
+% There interaction with the user.
+% \begin{macrocode}
+\typeout{^^J=====================================================================}
+\typeout{| Enter font family to check (or <enter> for kernel defined families)}
+\typeout{=====================================================================}
+\typein[\FontFamilyToCheck]{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\if!\FontFamilyToCheck!
+ \typeout{=====================================================================}
+ \typeout{| Detailed output? (default no)}
+ \typeout{=====================================================================}
+ \typein[\Details]{}
+ \if!\Details!
+ \def\typeoutdetails#1{}
+ \else
+ \let\typeoutdetails\typeout
+ \fi
+ \testallkerneldefinedfamilies
+\else
+ \let\typeoutdetails\typeout
+ \testallgroups\FontFamilyToCheck
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\stop
+%</TS1check>
+% \end{macrocode}
+%
% \Finale
%
diff --git a/macros/latex-dev/base/ltthm.dtx b/macros/latex-dev/base/ltthm.dtx
index b321c7ac2b..180b8accfe 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-2023
+% Copyright (C) 1993-2024
% 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 e169dee020..3896935525 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -115,7 +115,7 @@
{2024-06-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{0}
+\def\patch@level{-1}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
diff --git a/macros/latex-dev/base/ltx3info.pdf b/macros/latex-dev/base/ltx3info.pdf
index 61f04c83ca..4abf1f8a46 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 096fa2db9a..bfa09b9b87 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-2023
+% Copyright (C) 1993-2024
% 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 d219d2ebc2..244bddffce 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-2023
+% Copyright (C) 1993-2024
% 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 e147c9d22f..5e8b494692 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -30,7 +30,7 @@
%
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesClass{ltxdoc}
-%<class> [2023/03/28 v2.1j Standard LaTeX documentation class]
+%<class> [2024/02/08 v2.1j Standard LaTeX documentation class]
%
%<*driver>
\documentclass{ltxdoc}
@@ -288,12 +288,13 @@
% \section{Useful abbreviations}
%
% |\cmd{\foo}| Prints |\foo| verbatim. It may be used inside moving
-% arguments. It can \emph{not} be use to record commands that are defined as
+% arguments. It can \emph{not} be used to record commands that are defined as
% ``|\outer|'' nor is it possible to use it on conditionals such as
% |\iftrue| or defined by |\newif|.
-% |\cs{foo}| already available with the \texttt{doc} package also prints |\foo|, for those who prefer that
+% |\cs{foo}| Already available with the \texttt{doc} package and also prints |\foo|,
+% for those who prefer that
% syntax. (This second form can be used to record all types of command so the
-% above restrictions do not apply.
+% above restrictions do not apply.)
% \begin{macro}{\cmd}
% \changes{v2.0k}{1994/05/21}{New definition, so \cmd\{ works.}
% \begin{macro}{\cs}
@@ -676,7 +677,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
%
% Copyright 2006, 2007, 2011
% Heiko Oberdiek
-% Copyright (C) 2014-2023
+% Copyright (C) 2014-2024
% The LaTeX Project
%
diff --git a/macros/latex-dev/base/ltxdoc.pdf b/macros/latex-dev/base/ltxdoc.pdf
index 334349f4bb..61a0b18e68 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/ltxguide.cls b/macros/latex-dev/base/ltxguide.cls
index 778f7e993e..c202b56acb 100644
--- a/macros/latex-dev/base/ltxguide.cls
+++ b/macros/latex-dev/base/ltxguide.cls
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/ltxref.dtx b/macros/latex-dev/base/ltxref.dtx
index 0f842e4312..79cf01be77 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-2023
+% Copyright (C) 1993-2024
% 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 b91d3a6c44..20da2f159d 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-2023
+% Copyright (C) 1993-2024
% 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 1c5f6edcb9..45e5c9aab0 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 d6c1e08074..a2ab245043 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/minimal.cls b/macros/latex-dev/base/minimal.cls
index 89c233c30f..64efdd5287 100644
--- a/macros/latex-dev/base/minimal.cls
+++ b/macros/latex-dev/base/minimal.cls
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf
index ff40b00fa9..5006d07168 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 332b609ab3..ff934ecc34 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/newdc.ins b/macros/latex-dev/base/newdc.ins
index 277e8ea21f..69d74d6167 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 0b35eddd80..2792395c58 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-2023
+% Copyright (C) 1993-2024
% 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 556ce5f76d..0464053c10 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -26,8 +26,8 @@
% extension .ins) which are part of the distribution.
%
% \fi
-\def\nfssfontfileversion{v2.2e}
-\def\nfssfontfiledate{2020/11/26}
+\def\nfssfontfileversion{v2.2f}
+\def\nfssfontfiledate{2023/11/07}
%
% \iffalse
@@ -197,7 +197,7 @@
{\PackageWarningNoLine{nfssfont}%
{Encoding file `\next' not found.%
\MessageBreak
- You might have misspelt the name of the encoding
+ You might have misspelled the name of the encoding
\MessageBreak
or perhaps this encoding is not a text encoding,
\MessageBreak
diff --git a/macros/latex-dev/base/nfssfont.ins b/macros/latex-dev/base/nfssfont.ins
index 21a13f70a8..00f5a0c8a3 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 c947cc02bf..44aba54c32 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 320b3a4b0e..1f5d12ece4 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 33ae5e6fd9..7a3534f517 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-2023
+% Copyright (C) 1993-2024
% 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 d26bdaa9ed..fb5f86824c 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-2023
+% Copyright (C) 1993-2024
% 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 bbbf71162f..ec69e47396 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-2023
+% Copyright (C) 1993-2024
% 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 056816e99e..83f50bda12 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 b143f929d5..84fbeb3470 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 a918c337dd..3674a6c05f 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-2023
+% Copyright (C) 1993-2024
% 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 3acb556b96..3124ed366f 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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-2023
+Copyright (C) 1993-2024
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-2023
+Copyright (C) 1993-2024
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 5bdcaaa9e6..072806917b 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.fdd b/macros/latex-dev/base/slifonts.fdd
index 5b66975095..b35cd07a8b 100644
--- a/macros/latex-dev/base/slifonts.fdd
+++ b/macros/latex-dev/base/slifonts.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -45,7 +45,7 @@
%<*driver, >
\ProvidesFile{sfonts.drv}
%</driver, >
- [2019/07/09 v2.2f Standard LaTeX slide font definitions]
+ [2023/12/02 v2.2f Standard LaTeX slide font definitions]
%
%<*driver>
\documentclass{ltxdoc}
@@ -95,7 +95,7 @@
% \section{Introduction}
%
% This file contains the external font information for special
-% variants of the the Computer Modern fonts to be used for overhead
+% variants of the Computer Modern fonts to be used for overhead
% slides. They allow to produce slides in a similar fashion as it was
% originally done by \SliTeX{}.
%
@@ -103,7 +103,7 @@
% format. Instead the standard format may be used and internally only
% different font definition files come into play.
%
-% Note, that that you therefore can easily produce slides in different
+% Note that you therefore can easily produce slides in different
% fonts just by calling an appropriate package (like |times|) in
% your |\usepackage| command. This works, for example, with all
% fonts that are defined to be scalable (eg PostScript fonts) since
diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf
index 8dc32739ff..140e317b47 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 f39b19d128..5fbc7e1c0c 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 c538593ddd..6ff2928a42 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -342,6 +342,8 @@ page_precedence "rnaA"
\DocInclude{ltoutput} % Output routine
+ \DocInclude{lttagging}% Tagging support
+
\DocInclude{lthyphen} % Hyphenation (hyphen.ltx).
\DocInclude{ltfinal} % Last minute initialisations and dump
@@ -378,7 +380,7 @@ page_precedence "rnaA"
\def\endash{--}
\catcode`\-\active
\def-{\futurelet\temp\indexdash}
-\def\indexdash{\ifx\temp-\endash\fi}
+\def\indexdash{\ifx\temp-\endash\else:\fi}
\PrintIndex
\endgroup
diff --git a/macros/latex-dev/base/source2edoc.cls b/macros/latex-dev/base/source2edoc.cls
index 5f731af7ae..48ae49b29a 100644
--- a/macros/latex-dev/base/source2edoc.cls
+++ b/macros/latex-dev/base/source2edoc.cls
@@ -2,12 +2,12 @@
% This class is buggy and needs fixing
\ProvidesClass{source2edoc}
- [2022/04/03 v0.2c Quick hack to typeset source2.tex
+ [2024/02/14 v0.2e Quick hack to typeset source2.tex
(not usable for anything else and buggy -- will vanish again)!]
-\LoadClass{l3doc}
+\LoadClass[kernel]{l3doc}
\RemoveFromHook{begindocument}[l3doc] % drop the standard setting making " a shortverb
\AddToHook{begindocument}{\MakeShortVerb \|} % but readd | as one
@@ -50,84 +50,6 @@
}
-
-% some l3doc's def are buggy (already fixed there but not distributed yet)
-
-\RenewDocumentCommand \DocInclude { m }
- {
- \relax\clearpage
- \docincludeaux
- \IfFileExists{#1.fdd}
- { \cs_set:Npn \currentfile{#1.fdd} }
- { \cs_set:Npn \currentfile{#1.dtx} }
- \int_compare:nNnTF \@auxout = \@partaux
- { \@latexerr{\string\include\space cannot~be~nested}\@eha }
- { \@docinclude {#1} } % <--- braces needed!
- \int_compare:nNnF { \tex_currentgrouplevel:D } = { 0 }
- {
- \int_compare:nNnT { \tex_interactionmode:D } = { 0 }
- { \int_set:Nn \tex_interactionmode:D { 1 } }
- \msg_fatal:nnn { source2edoc } { missing-endgroup } {#1}
- }
- }
-\msg_new:nnn { source2edoc } { missing-endgroup }
- {
- \str_if_eq:VnTF \@currenvir { document }
- {
- There~are~\int_use:N \tex_currentgrouplevel:D
- \c_space_tl unclosed~groups~in~#1.dtx.
- }
- {
- The~\@currenvir \c_space_tl environment~on~line~\@currenvline
- \c_space_tl doesn't~have~a~matching~\iow_char:N\\end{\@currenvir}.
- }
- }
-\cs_gset:Npn \@docinclude #1
- {
- \clearpage
- \immediate\write\@mainaux{\string\@input{#1.aux}}
- \@tempswatrue
- \if@partsw
- \@tempswafalse
- \cs_set:Npx \@tempb {#1}
- \clist_map_inline:Nn \@partlist
- {
- \if_meaning:w \@tempa \@tempb
- \@tempswatrue
- \fi:
- }
- \fi
- \if@tempswa
- \cs_set_eq:NN \@auxout \@partaux
- \immediate\openout\@partaux #1.aux
- \immediate\write\@partaux{\relax}
- \cs_set_eq:NN \@ltxdoc@PrintIndex \PrintIndex
- \cs_set_eq:NN \PrintIndex \relax
- \cs_set_eq:NN \@ltxdoc@PrintChanges \PrintChanges
- \cs_set_eq:NN \PrintChanges \relax
- \cs_set_eq:NN \@ltxdoc@theglossary \theglossary
- \cs_set_eq:NN \@ltxdoc@endtheglossary \endtheglossary
- \part{\currentfile}
- {
- \cs_set_eq:NN \ttfamily\relax
- \cs_gset:Npx \filekey
- { \filekey,~ \thepart = { \ttfamily \currentfile } } % <-- mising spaces considered harmful
- }
- \DocInput{\currentfile}
- \cs_set_eq:NN \PrintIndex \@ltxdoc@PrintIndex
- \cs_set_eq:NN \PrintChanges \@ltxdoc@PrintChanges
- \cs_set_eq:NN \theglossary \@ltxdoc@theglossary
- \cs_set_eq:NN \endtheglossary \@ltxdoc@endtheglossary
- \clearpage
- \@writeckpt{#1}
- \immediate \closeout \@partaux
- \else
- \@nameuse{cp@#1}
- \fi
- \cs_set_eq:NN \@auxout \@mainaux
- }
-
-
% change the setup here: we have a lot of long names so better run raggeded
\cs_set_protected:Npn \__codedoc_macro_end_style:n #1
@@ -176,7 +98,7 @@
dd%
\else\@ctrerr\fi}
\def\docincludeaux{%
- \def\thepart{\aalph{part}}\def\filesep{\thepart-}%
+ \def\thepart{\ifnum\value{part}<10 0\fi\arabic{part}}\def\filesep{\thepart-}%
\let\filekey\@gobble
\g@addto@macro\index@prologue{%
\gdef\@oddfoot{\parbox[t]{\textwidth}{\strut\footnotesize
@@ -303,6 +225,9 @@ Bug reports can be opened (category \texttt{#1}) at\\%
\AddToHook{cmd/tableofcontents/after}{\global\let\tableofcontents\relax}
+% pages > 1000
+\renewcommand\@pnumwidth{2em}
+
\InputIfFileExists{ltxdoc.cfg}
{\typeout{*************************************^^J%
* Local config file ltxdoc.cfg used^^J%
diff --git a/macros/latex-dev/base/syntonly.dtx b/macros/latex-dev/base/syntonly.dtx
index 2b0049b696..9844585fa5 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -71,7 +71,7 @@
\ProvidesFile{syntonly.dtx}
%</dtx>
%<*package|dtx>
- [2017/06/30 v2.1e Standard LaTeX2e package]
+ [2024/02/08 v2.1e Standard LaTeX2e package]
%</package|dtx>
% \end{macrocode}
%
@@ -150,7 +150,7 @@
\repeat
% \end{macrocode}
% Since all font changes occur either via |\selectfont| (in
-% text or |\mathversion| (for math mode) it is sufficient
+% text) or |\mathversion| (for math mode), it is sufficient
% to change these to no-ops. In addition we must prevent
% the loading of math fonts, this is done by making
% |\getanddefine@fonts| a no-op.
@@ -184,7 +184,7 @@
% The |\nopages@| macro disables the \LaTeX{} output routine.
% To this end we define a very simple output routine that empties
% the output \emph{and} footnote boxes (remember that the latter
-% are insertions.
+% are insertions).
% \begin{macrocode}
\def\nopages@{%
\output {\setbox\z@\box\@cclv
diff --git a/macros/latex-dev/base/syntonly.ins b/macros/latex-dev/base/syntonly.ins
index 8ccaf254d1..6435e0a6ee 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-2023
+%% Copyright (C) 1993-2024
%% 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-2023
+Copyright (C) 1993-2024
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 3390b696f3..6beca59509 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 7eae6c142c..e8f06313fb 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf
index 87fd9f964d..4945823cda 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/tlc3.err b/macros/latex-dev/base/tlc3.err
index d4f94705d7..cb33dd01e4 100644
--- a/macros/latex-dev/base/tlc3.err
+++ b/macros/latex-dev/base/tlc3.err
@@ -1,4 +1,4 @@
-\newcommand\erratafiledate{2023/10/30} % needs / and not -
+\newcommand\erratafiledate{2024/01/29} % needs / and not -
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% To produce a printed version of this errata file run this file through
@@ -640,14 +640,37 @@ Output of example misses the page numbers in acronym list \> Run example 3 times
\CHAPTER{Chapter 4 --- Basic Formatting Tools -- Larger \ldots}
+\erroronpage{I-253}{para 2, l.-3}{YEi}{2023/11/27}{s}
+Move comma:\\
+and \textsf{thmtools} packages and \textsf{typed-checklist}\u{,} helps you write \> \\
+and \textsf{thmtools} packages\u{,} and \textsf{typed-checklist} helps you write
+
+
\erroronpage{I-323}{Table 4.4, left column}{BeB}{2023/07/25}{s}
Typo: Assembler (\u{N}otorola68k, x86masm) \> \\ Assembler (\u{M}otorola68k, x86masm)
% Matlab \> Matlab \u{(empty, 5.1)}
% könnte auch aktualisiert werden, steht aber in Version 1.8d nicht drin
+\erroronpage{I-344}{exa 4-3-16}{CAR/FMi}{2024/01/29}{s}
+Use \cs{NewDocumentEnvironment} instead of
+\cs{DeclareDocumentEnvironment} because it is always better to check
+that the declaration is not accidentally overwriting an existing
+environment.
\CHAPTER{Chapter 5 --- The Layout of the Page}
+\erroronpage{I-365}{paras -3 to -2}{YEi}{2023/11/28}{s}
+
+Add/replace:\\
+\ldots package and others. \cs{par} The \u{fifth} section then \> \\
+\ldots package and others.
+\u{In the fifth section we cover ``static'' page} \\
+\u{decorations such as watermarks.} \cs{par} The \u{sixth} section then
+
+\erroronpage{I-368}{table 5.1}{YEi}{2023/11/29}{s}
+A better approximation for \texttt{b5paper} is \u{$6\frac{7}{8}$}${}\times 9 \frac{7}{8}$
+
+
\erroronpage{I-386}{exa 5-3-1, l.7}{EOl}{2023/09/09}{s}
Change:
paragraph over \u{two} pages. \> paragraph over \u{three} pages.
@@ -1302,6 +1325,10 @@ is created only if the entry \u{contains} a shorttitle \u{field} and the title a
is created only if the entry \u{has been referenced (prior to typesetting}\\
\u{the bibliography), contains} a shorttitle \u{field,} and the title and shorttitle fields differ.
+\erroronpage{II-535}{footnote}{FMi}{2024/01/07}{}
+Extend the explanation:\\
+\u{you can} use \cs{mancite} \u{in front of any citation command} to avoid this.
+
\erroronpage{II-560}{exa 16-7-31}{FMi}{2023/08/31}{s}
Jane Doe.\ \textit{A\u{n} second book.}\ 2020.\> Jane Doe.\ \textit{A second book.}\ 2020.
@@ -1367,11 +1394,13 @@ Appendix title not properly capitalized.
\contributor{MJo}{Maciej Jończyk}
\contributor{YFu}{FUJIMURA Yukitoshi}
\contributor{YvH}{Yvon Henel}
+\contributor{YEi}{Yaakov Eisenberg}
\contributor{bb}{Barbara Beeton}
\contributor{kb}{Karl Berry}
\end{multicols}
+
Other people have sent us corrections for errors already found.
Thanks to all of you!
diff --git a/macros/latex-dev/base/tlc3.pdf b/macros/latex-dev/base/tlc3.pdf
index 24ff91e85b..00936f6e57 100644
--- a/macros/latex-dev/base/tlc3.pdf
+++ b/macros/latex-dev/base/tlc3.pdf
Binary files differ
diff --git a/macros/latex-dev/base/tulm.fdd b/macros/latex-dev/base/tulm.fdd
index c8dd8b95fc..6f7a6873cd 100644
--- a/macros/latex-dev/base/tulm.fdd
+++ b/macros/latex-dev/base/tulm.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016-2023
+% Copyright (C) 2016-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex-dev/base/tulm.ins b/macros/latex-dev/base/tulm.ins
index 85970a5133..ea8fd7b22b 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-2023
+%% Copyright (C) 2016-2024
%% 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-2023
+Copyright (C) 2016-2024
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 8316f50ae8..29c84ca59b 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 5baa2b5447..e81c8dbfa8 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-2023
+%% Copyright (C) 1993-2024
%% 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 d41dee80ce..0001be0aae 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 40865a2be9..228a253abb 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -34,15 +34,15 @@
\title{\LaTeX\ for authors --- historic version}
-\author{\copyright~Copyright 1995--2022, \LaTeX\ Project Team.\\
+\author{\copyright~Copyright 1995--2023, \LaTeX\ Project Team.\\
All rights reserved.%
\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.}%
+ \texttt{usrguide-historic.tex} for full details.}%
}
-\date{30 August 2022}
+\date{09 November 2023}
\begin{document}
diff --git a/macros/latex-dev/base/usrguide.pdf b/macros/latex-dev/base/usrguide.pdf
index 4ab7004018..c9f3496f57 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 05fc93e7af..9f5cfb181a 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-2023
+% Copyright (C) 2020-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -43,7 +43,7 @@
\texttt{usrguide.tex} for full details.}%
}
-\date{2023-05-23}
+\date{2023-12-02}
\NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}}
\NewDocumentCommand\marg{m}{\arg{#1}}
@@ -794,6 +794,18 @@ a & b & c \\
\end{tabular}
\end{verbatim}
+\subsection{Performance}
+
+For document commands where the argument specification is entirely
+comprised of |m| or |+m| entries (or is entirely empty), the internal structure
+created by \cs{NewDocumentCommand} is essentially as efficient
+as provided by |\newcommand(*)|. As such, document commands may replace
+constructs arising from \cs{newcommand}, etc., without a need to be concerned
+about performance. Note that \cs{newcommand(*)} produces expandable
+results, so the direct replacement is \cs{NewExpandableDocumentCommand};
+in most cases, however, it is better to use \cs{NewDocumentCommand} to
+give more robust structures.
+
\subsection{Details about argument delimiters}
In normal (non-expandable) commands, the delimited types look for the
@@ -951,7 +963,7 @@ The differences between \cs{New...}, \cs{Renew...}, and
\begin{decl}
|\ShowEnvironment| \arg{env}
\end{decl}
-This displays the meaning of the begin end end code for environment \meta{env}.
+This displays the meaning of the begin and end code for environment \meta{env}.
@@ -1161,7 +1173,7 @@ therefore shows the same syntax peculiars as discussed
above. Nevertheless, in practice they are usually sufficient. For
example
\begin{verbatim}
-\newcommand\calculateheight[1]{%
+\NewDocumentCommand\calculateheight{m}{%
\setlength\textheight{\dimeval{\topskip+\baselineskip*\inteval{#1-1}}}}
\end{verbatim}
sets the \cs{textheight} to the appropriate value if a page should
@@ -1186,13 +1198,13 @@ Titlecasing here follows the definition given by the Unicode Consortium: the
first character of the input will be converted to (broadly) uppercase, and the
rest of the input to lowercase. The full range of Unicode UTF-8 input can be
supported.
-\begin{quotation}
+\begin{quote}
\begin{tabular}{rl}
|\MakeUppercase{hello WORLD ßüé}| & \MakeUppercase{hello WORLD ßüé} \\
|\MakeLowercase{hello WORLD ßüé}| & \MakeLowercase{hello WORLD ßüé} \\
|\MakeTitlecase{hello WORLD ßüé}| & \MakeTitlecase{hello WORLD ßüé} \\
\end{tabular}
-\end{quotation}
+\end{quote}
The case-changing commands take an optional argument which can be used to
tailor the output. This optional argument accepts the key \texttt{locale},
@@ -1208,14 +1220,14 @@ are the arguments to the commands \cs{label}, \cs{ref}, \cs{cite}, \cs{begin}
and \cs{end}. Additional exclusions can be added using the command
\cs{AddToNoCaseChangeList}. Input can be excluded from case changing using the
command \cs{NoCaseChange}.
-\begin{quotation}
+\begin{quote}
\begin{tabular}{rl}
|\MakeUppercase{Some text $y = mx + c$}|
& \MakeUppercase{Some text $y = mx + c$} \\
|\MakeUppercase{\NoCaseChange{iPhone}}|
& \MakeLowercase{\NoCaseChange{iPhone}} \\
\end{tabular}
-\end{quotation}
+\end{quote}
To allow robust commands to be used within case changing \emph{and} to produce
the expected output, two additional control commands are available.
@@ -1244,18 +1256,54 @@ apply to a specific one: this is given in BCP-47 format
(\url{https://en.wikipedia.org/wiki/IETF_language_tag}). For example,
the kernel customises the mapping for U+01F0 (\v{j}) when uppercasing in
8-bit engines:
-\begin{quotation}
+\begin{quote}
|\DeclareUppercaseMapping{"01F0}{\v{J}}|
-\end{quotation}
+\end{quote}
as there is no pre-composed \v{J} character, and this is problematic if
the engine does not support Unicode natively. Similarly, to set a locale
\texttt{xx} to behave in the same way as Turkish and retain the difference
between dotted- and dotless-i, one could use for example
-\begin{quotation}
+\begin{quote}
|\DeclareLowercaseMapping[xx]{"0049}{\i}|\\
|\DeclareLowercaseMapping[xx]{"0130}{i}|\\
|\DeclareUppercaseMapping[xx]{"0069}{\.{I}}|\\
|\DeclareUppercaseMapping[xx]{"0131}{I}|
-\end{quotation}
+\end{quote}
+
+\section{Support for problem solving}
+
+\begin{decl}
+ |\listfiles| \oarg{options}
+\end{decl}
+
+If this command is placed in the preamble then a list of the files
+read in (as a result of processing the document) will be displayed
+on the terminal (and in the log file) at the end of the run. Where
+possible, a short description will also be produced. These descriptions
+will (hopefully) include the descriptions, dates and version numbers
+for package and class files.
+
+Sometimes, it may be that a local edit has been made to a package or
+class file (or rather a copy of such a file). To allow these cases to
+be identified, \cs{listfiles} takes an optional argument which allows
+adjustment of the information printed using a key--value approach
+\begin{description}
+ \item[\texttt{hashes}] Adds the MD5 hash for each file to the
+ information printed
+ \item[\texttt{sizes}] Adds the file size for each file to the
+ information printed
+\end{description}
+Note that as Windows and Unix use different line endings (LF \emph{versus} LF
+CR), the hashes and file sizes from the two systems will not be the same. As
+such, you should compare these values between operating systems of the same
+type.
+
+\emph{Warning}: this command will list only files which were read
+using \LaTeX{} commands such as |\input|\arg{file} or
+|\include|\arg{file}. If the file was read using the primitive \TeX{}
+syntax |\input |\emph{file} (without |{ }| braces around the file name)
+then it will not be listed; failure to use the \LaTeX{} form with the
+braces can cause more severe problems, possibly leading to overwriting
+important files, so \textbf{always put in the braces}.
\end{document}
diff --git a/macros/latex-dev/base/utf8ienc.dtx b/macros/latex-dev/base/utf8ienc.dtx
index f1623ee0e6..a2701ac5c8 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-2023
+% Copyright (C) 1993-2024
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -886,7 +886,8 @@
\else
% \end{macrocode}
%
-% If the input is malformed UTF-8 there may not be enough closing ) so
+% If the input is malformed UTF-8 there may not be enough closing
+% \iffalse(\fi ) so
% add 5 so there are always some remaining then cleanup and remove
% any remaining ones at the end. This avoids |\numexpr| parse errors
% while outputting a package error.
@@ -1660,7 +1661,7 @@
% \end{macrocode}
% According to the Unicode standard Ux04C5 should be an L with ``tail'' not
% with descender (which also exists as Ux04A2) but it looks as if the char
-% names do not make this distinction). Should they?
+% names do not make this distinction. Should they?
% \begin{macrocode}
%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C5}{\CYRLDSC}
%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C6}{\cyrldsc}
diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf
index da31897579..a7e369b6eb 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.err b/macros/latex-dev/base/webcomp.err
index 1b3b7a2475..aabef28187 100644
--- a/macros/latex-dev/base/webcomp.err
+++ b/macros/latex-dev/base/webcomp.err
@@ -373,7 +373,7 @@ preferable in a form usable for this file, i.e.,
\begin{flushleft}
|\erroronpage{|\textit{page-number}|}{|\textit{line-identification}|}{|%
\textit{your-initials}|}{|\textit{date}|}{}| \\
- \hspace*{2em}\textit{description of the the errata}
+ \hspace*{2em}\textit{description of the errata}
\end{flushleft}
Here is an example:
\begin{verbatim}
diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf
index afda6ddc4b..c9664c681f 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 046d498ab8..a72fd43d9e 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 2024-06-01 pre-release 0
+Release 2024-06-01 pre-release 1
## Overview
@@ -38,5 +38,5 @@ The license is LPPL 1.3c.
This README file is
-Copyright (C) 2021-2023
+Copyright (C) 2021-2024
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
index ff13361fcc..b9095a2bd6 100644
--- a/macros/latex-dev/required/latex-lab/blocks-code.pdf
+++ b/macros/latex-dev/required/latex-lab/blocks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/blocks-doc.pdf b/macros/latex-dev/required/latex-lab/blocks-doc.pdf
index a0f0e5dfad..c72d60783c 100644
--- a/macros/latex-dev/required/latex-lab/blocks-doc.pdf
+++ b/macros/latex-dev/required/latex-lab/blocks-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/changes.txt b/macros/latex-dev/required/latex-lab/changes.txt
index 1a65830e8b..fd7e2d9333 100644
--- a/macros/latex-dev/required/latex-lab/changes.txt
+++ b/macros/latex-dev/required/latex-lab/changes.txt
@@ -1,3 +1,88 @@
+2024-02-12 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-block.dtx: left align description labels.
+
+2024-02-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-table.dtx: change value layout to presentation (as in ARIA).
+
+2024-02-09 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-math.dtx: add keys to suppress AF-files locally
+
+2024-02-09 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-title.dtx: force DisplayDocTitle if UA-standard is detected
+
+2024-02-08 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-testphase.dtx: add marginpar tagging to phase-III
+
+2024-02-08 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-math.dtx, latex-lab-table.dtx: adapt tagpdfsetup keys
+
+2024-02-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-table.dtx: change key names from table-tagging to table/tagging
+
+2024-02-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-float.dtx: fix caption outside float error
+
+2024-02-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-toc-kernel-changes.dtx: fix spurious space, tagging-project#50
+
+2024-01-29 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-math.dtx: disable mathgrabbing in begindocument hook.
+
+2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-firstaid.dtx: add support for \authors from amsart.
+
+2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-title.dtx: make \@title and \@author robust to avoid errors
+ if they are not set.
+
+2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-table.dtx: add support for layout tables.
+
+2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-block.dtx: add support to set an attribute-class for para-main.
+
+2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-table.dtx: add option table-tagging=layout
+
+2024-01-17 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-math.dtx, latex-lab-amsmath.dtx, redefine \text to
+ avoid faulty structure and faulty PDF from \mathchoice.
+ Add statistic for mathml handling.
+
+2024-01-14 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-float.dtx, correct destination, see tagging issue #55
+
+2024-01-14 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-block.dtx, correct error message for environments,
+ see tagging issue #57
+
+2024-01-12 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-table.dtx: add some variables for tag names
+
+2024-01-08 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * move mathml-AF support into latex-lab-math.ltx
+
+2023-12-27 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * added latex-lab-title.dtx for maketitle/title and author tagging.
+
+2023-11-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-block.dtx, correct error message for items outside lists
+ see tagging issue #35
+
+2023-11-17 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-block.dtx, latex-lab-sec.dtx: use wrapper for para counter,
+ see tagging issue #34
+
+2023-11-12 Joseph Wright <Joseph.Wright@latex-project.org>
+ * latex-lab-math.dtx: tidy variant creation, switch to e-type expansion
+
+2023-11-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-math.dtx: remove processor in \(..\), see tagging issue #29
+
+2023-11-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+ * latex-lab-math.dtx: handle also tabular*, see tagging issue #25
+ * latex-lab-table.dtx: use cmd hook for array, see tagging issue #28
+
2023-10-30 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
* added latex-lab-table.dtx for basic table tagging.
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 e7e0823f1e..c7d0fe107b 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 af93980113..ff0295a160 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 b37ae6c9d7..6bc7e232a1 100644
--- a/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx
+++ b/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx
@@ -84,8 +84,17 @@
% features developed as part of the multi-year ``Tagged PDF''
% project~\cite{blueprint}.
%
-%
-%
+% \section{The \cs{DocumentMetadata} command}
+%
+% \begin{function}{\DocumentMetadata}
+% \begin{syntax}
+% \cs{DocumentMetadata}\Arg{key-value list}
+% \end{syntax}
+%
+% The command should be used as the first command in a document, before
+% \cs{documentclass}. It takes a key-value argument.
+% \end{function}
+
% \section{Currently supported key/values}
%
%
@@ -215,6 +224,10 @@
% This code is also loaded by the \texttt{phase-III} key.
% \item[\texttt{math}] This adapts math for tagging. This is only a prototype.
% The module is currently not loaded by any \texttt{phase} key.
+% \item[\texttt{table}] This provides basic tagging for
+% \texttt{tabular}, \texttt{longtable} and similar table environments.
+% The module is currently not loaded by any \texttt{phase} key. Its use and
+% restrictions is documented in \texttt{latex-lab-table.pdf}.%
% \item[\texttt{firstaid}] This contains small adjustments to external packages.
% The module is currently not loaded by any \texttt{phase} key.
% \end{description}
@@ -274,8 +287,28 @@
\ExplSyntaxOn\makeatletter
% \end{macrocode}
+% \subsection{Variables}
+% These variable definitions are currently also done in ltdocinit.
+% They can be removed from there once latex-lab has been updated to
+% provide them too.
+% \begin{variable}{\g_@@_firstaidoff_clist}
+% A list to store the firstaid code which should be disabled
+% \begin{macrocode}
+\clist_if_exist:NF \g_@@_firstaidoff_clist
+ { \clist_new:N \g_@@_firstaidoff_clist }
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}{\g_@@_testphase_tl}
+% a tl to store the testphase loading code so that we can load them at
+% the end of the command.
+% \begin{macrocode}
+\tl_if_exist:NF \g_@@_testphase_tl
+ { \tl_new:N \g_@@_testphase_tl }
+% \end{macrocode}
+% \end{variable}
-
+% \subsection{\cs{DocumentMetadata}}
+%
% \begin{macro}{\DocumentMetadata}
%
% \cs{DocumentMetadata} should not be used after
@@ -348,15 +381,8 @@
% \end{macrocode}
% \end{macro}
-
-
-
+%\subsection{\cs{DocumentMetadata} keys}
% \begin{macrocode}
-%FMi defined elsewhere
-%FMi
-%FMi \clist_new:N \g_@@_firstaidoff_clist
-%FMi \tl_new:N \g_@@_testphase_tl
-% UFi should the definition move to here?
\keys_define:nn { document / metadata }
{
backend .choices:nn =
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx
index e1f95730fa..c50a40eedd 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-amsmath.dtx
%
-% Copyright (C) 2022,2023 The LaTeX Project
+% Copyright (C) 2022-2024 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
@@ -66,7 +66,7 @@
% \subsection{File declaration}
% \begin{macrocode}
\ProvidesFile{latex-lab-amsmath.ltx}
- [2023-01-05 v0.1a amsmath adaptions]
+ [2024-02-12 v0.1b amsmath adaptions]
% \end{macrocode}
% \subsection{Tagpdf support}
% To make the code independent from tagging being loaded and active
@@ -90,7 +90,11 @@
\def\intertext##1{%
\ifvmode\else\\\@empty\fi
\noalign{%
- \penalty\postdisplaypenalty\vskip\belowdisplayskip
+% \end{macrocode}
+% we have to flip the sign and use a negative \cs{belowdisplayskip}
+% as we flipped the sign at the outside.
+% \begin{macrocode}
+ \penalty\postdisplaypenalty\vskip-\belowdisplayskip
\vbox{
% \end{macrocode}
% Stop tagging when measuring:
@@ -105,9 +109,13 @@
% \begin{macrocode}
\tag_mc_end_push:
% \end{macrocode}
-% We are already in a par so we change now to Span:
+% We are already in a par so we change now to text:
+% \begin{macrocode}
+ \tagpdfsetup{paratag=P}%
+% \end{macrocode}
+% TODO why \cs{tagpdfparaOn} needed?
% \begin{macrocode}
- \tagpdfsetup{paratag=Span}%
+ \tagpdfparaOn
\noindent\ignorespaces##1\par
% \end{macrocode}
% Restart the MC
@@ -119,6 +127,78 @@
}
% \end{macrocode}
%
+% \subsection{\cs{text}}
+%
+% The \cs{text} command uses \cs{mathchoice} which \enquote{typesets} the argument
+% four times. This makes it quite problematic for tagging. Without precautions
+% structure objects would be created four times and would get MC-chunks as kids
+% that doesn't really exist. amsmath contains a switch that allows to execute code
+% only in the first (displaymath) branch, but that isn't usable here. At first because
+% we don't know if the first branch creates the same structure as the one that is
+% actually used. At second because the engines executes some commands like \cs{label}
+% and \cs{pdfannot} only at shipout from the branch that really was used. So we would
+% get structure data from one \cs{mathchoice}-branch and MC-labels and links from another
+% one and that gets very messy.
+%
+% We therefore have to avoid that tagging is active in unused branches. In pdflatex it
+% is not possible to detect the mathstyle before, so we use a label. With lualatex is
+% is possible to redefine \cs{text} not to use \cs{mathchoice}
+%
+% \begin{macrocode}
+\AddToHook{package/amstext/after}
+ {
+% \end{macrocode}
+% currently amsmath is loaded in a begindocument hook, so this
+% test is fine. If amstext is loaded earlier (in the kernel), this needs perhaps a change.
+% \begin{macrocode}
+ \tag_if_active:T
+ {
+ \sys_if_engine_luatex:TF
+ {
+ \def\text@#1{{%
+ \ifcase\mathstyle
+ \hbox{{#1}}\or
+ \hbox{{#1}}\or
+ \hbox{{#1}}\or
+ \hbox{{#1}}\or
+ \hbox{{\let\f@size\sf@size\selectfont#1}}\or
+ \hbox{{\let\f@size\sf@size\selectfont#1}}\or
+ \hbox{{\let\f@size\ssf@size\selectfont#1}}\or
+ \hbox{{\let\f@size\ssf@size\selectfont#1}}\or
+ \ERROR
+ \fi
+ \check@mathfonts
+ }}
+ }
+ {
+ \def\text@#1
+ {{
+ \int_gincr:N\g__math_mathchoice_int
+ \tag_stop:
+ \mathchoice
+ {
+ \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{0}
+ \textdef@\displaystyle\f@size{#1}
+ }
+ {
+ \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{2}
+ \textdef@\textstyle\f@size{\firstchoice@false #1}
+ }
+ {
+ \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{4}
+ \textdef@\textstyle\sf@size{\firstchoice@false #1}
+ }
+ {
+ \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{6}
+ \textdef@\textstyle \ssf@size{\firstchoice@false #1}
+ }
+ \check@mathfonts
+ }}
+ }
+ }
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
\ExplSyntaxOff
% \end{macrocode}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf
index 9c0073d19d..577c3cddab 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf
+++ 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-bib.dtx b/macros/latex-dev/required/latex-lab/latex-lab-bib.dtx
index a467bf3158..e8ee192a7b 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-bib.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-bib.dtx
@@ -16,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabbibdate{2023-07-20}
-\def\ltlabbibversion{0.81a}
+\def\ltlabbibdate{2024-02-12}
+\def\ltlabbibversion{0.81b}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -124,6 +124,17 @@
% but has to test if this anchor is already known.
% \end{description}
%
+% \section{Provided or redefined commands}
+%
+% \begin{function}{\@extra@binfo,\@extra@b@citeb}
+%
+% These are taken from hyperref, they are for chapterbib compability (and also
+% signal to chapterbib not to change the citation commands)
+% \end{function}
+%
+% \begin{function}{\@bibitem,\@lbibitem}
+% The internal item commands.
+% \end{function}
%
% \section{Implementation}
% \begin{macrocode}
@@ -264,7 +275,7 @@
\AddToHookWithArguments{bibcite/before}
{
\tag_mc_end_push:
- \exp_args:Nx\tagstructbegin{tag=Reference,ref=cite.#1\@extra@b@citeb}
+ \exp_args:Ne\tagstructbegin{tag=Reference,ref=cite.#1\@extra@b@citeb}
\tagmcbegin{}
}
\AddToHookWithArguments{bibcite/after}[tag]
@@ -318,7 +329,7 @@
{
\leavevmode
\tag_mc_end_push:
- \exp_args:Nx\tag_struct_begin:n{tag=Reference,ref=cite.#1\@extra@b@citeb}
+ \exp_args:Ne\tag_struct_begin:n{tag=Reference,ref=cite.#1\@extra@b@citeb}
\tag_mc_begin:n{}
}
\AddToHook{cmd/hyper@natlinkend/after}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf b/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf
index 59569a1735..4abf970ebf 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-block.dtx b/macros/latex-dev/required/latex-lab/latex-lab-block.dtx
index e0a723ca87..75203f8ed5 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-block.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-block.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-block.dtx (C) Copyright 2021-2023 LaTeX Project
+%% File: latex-lab-block.dtx (C) Copyright 2021-2024 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
@@ -9,10 +9,10 @@
%
% https://www.latex-project.org/lppl.txt
%
-\def\ltlabblockdate{2023-09-01}
-\def\ltlabblockversion{0.8h}
+\def\ltlabblockdate{2024-02-12}
+\def\ltlabblockversion{0.8l}
%<*driver>
-\documentclass{l3doc}
+\documentclass[kernel]{l3doc}
\usepackage{amstext}
\EnableCrossrefs
\CodelineIndex
@@ -308,7 +308,7 @@
% \end{TemplateDescription}
%
% The maximum number of \xt{blockenv}s that can be nested into each
-% other is is restricted by the \LaTeX{} counter
+% other 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
@@ -646,11 +646,59 @@
%
% \end{description}
%
+% \section{Debugging}
+%
+% \begin{function}{\DebugBlocksOn,\DebugBlocksOff, \block_debug_on:, \block_debug_off:}
+%
+% These commands enable/disable debugging messages.
+%
+% \end{function}
%
+% \section{New and redefined kernel command}
+%
+% \begin{function}{\@doendpe}
+% The original \LaTeXe{} command is augmented to allow for tagging.
+% \end{function}
%
+% \begin{function}{\legacyverbatimsetup,\legacylistsetupcode}
+% \emph{to be documented}
+% \end{function}
+%
+% \begin{function}{\@setupverbinvisiblespace}
+% A counterpart definition to the kernel command \cs{@setupverbinvisiblespace},
+% needed as we need to handle real space chars in verbatim.
+% \end{function}
+%
+% \begin{function}{endblockenv,\g_block_nesting_depth_int}
+% \emph{to be documented}
+% \end{function}
+%
+% \begin{function}{\newtheorem,\@thm,\@begintheorem}
+% Redefined to make theorems tagging aware.
+% \end{function}
%
+% \begin{function}{\item,\@itemlabel}
+% The \cs{item} is redefined.
+% \end{function}
%
-%
+% \begin{function}{\c@maxblocklevels}
+% A counter to increase or decrease the number of supported
+% level. If increased, one needs to supply additional level instances.
+% \end{function}
+%
+% \begin{function}{\begin}
+% The \cs{begin} is slightly redefine to handle \cs{@doendpe} better.
+% TODO: move to kernel
+% \end{function}
+%
+% \begin{function}{\para_end:}
+% TODO: consider name, document
+% \end{function}
+%
+% \begin{function}{para/begin}
+% The para/begin hook is enhanced to support list ends
+% \end{function}
+%
% \end{documentation}
%
% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
@@ -674,10 +722,6 @@
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}
@@ -691,7 +735,7 @@
\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
@@ -767,11 +811,11 @@
% 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}
+\NewTemplateType{blockenv}{1}
+\NewTemplateType{block}{1}
+\NewTemplateType{para}{1}
+\NewTemplateType{list}{1}
+\NewTemplateType{item}{1}
% \end{macrocode}
% \end{objecttype}
%
@@ -907,12 +951,9 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\tl_if_novalue:nTF}
-%
% \begin{macrocode}
\cs_generate_variant:Nn \tl_if_novalue:nTF { o }
% \end{macrocode}
-% \end{macro}
%
%
% \subsubsection{Debugging}
@@ -1342,14 +1383,14 @@
\@definecounter {#2}
\IfNoValueTF {#4}
{ % @ynthm
- \tl_gset:cx { the #2 }
+ \tl_gset:ce { the #2 }
{
\@thmcounter{#2}
}
}
{ % @xnthm
\@newctr{#1}[#4]
- \tl_gset:cx { the #2 }
+ \tl_gset:ce { the #2 }
{
\expandafter\noexpand\csname the#4\endcsname
\@thmcountersep
@@ -1802,7 +1843,7 @@
fixed-word-spaces = \l__par_fixed_word_spaces_bool , % name??
final-hyphen-demerits = \finalhyphendemerits ,
cr-cmd = \\ ,
- para-class = \l_tag_para_attr_class_tl ,
+ para-class = \l__tag_para_attr_class_tl ,
}
{
\tl_if_empty:nF {#1} { \SetTemplateKeys{para}{std}{#1} }
@@ -2488,10 +2529,13 @@
{
\@inmatherr \item
% \end{macrocode}
-% TODO: Test for being outside of a list needs updating!
+% TODO: Check if test for being outside of a list is sensible
% \begin{macrocode}
- \tl_if_empty:oTF \@@_item_instance:n %%FMi?
- { \msg_error:nnn { @@ } { item-in-nonlist } { \item[{#1}] } }
+ \cs_if_free:NTF \@@_item_instance:n
+ {
+ \@latex@error{Lonely~\string\item--perhaps~a~missing~
+ list~environment}\@ehc
+ }
{
\legacy_if:nTF { @newlist }
{ \__kernel_list_item_begin: }
@@ -2630,7 +2674,7 @@
%
% \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
+% \item At the end of the block close 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}.
@@ -3290,6 +3334,7 @@
\DeclareInstance{item}{description}{std}
{
label-format = \normalfont\bfseries #1 ,
+ label-align = left
}
% \end{macrocode}
% \end{instance}
@@ -3389,9 +3434,7 @@
%
% 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}
@@ -3424,8 +3467,12 @@
{
\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}
+ \__tag_gincr_para_main_begin_int:
+ \tag_struct_begin:n
+ {
+ tag=\l__tag_para_main_tag_tl,
+ attribute-class=\l__tag_para_main_attr_class_tl,
+ }
}
}
}
@@ -3445,7 +3492,7 @@
\cs_set:Npn \@@_beginpar_hmode:N #1
{
\tag_mc_end:
- \int_gincr:N \g__tag_para_end_int
+ \__tag_gincr_para_end_int:
\@@_debug_typeout:n{increment~ /P \on@line }
\bool_if:NT \l__tag_para_show_bool
{ \tag_mc_begin:n{artifact}
@@ -3492,7 +3539,7 @@
{
\@@_debug_typeout:n{Structure-end~
\l__tag_para_main_tag_tl\space after~ displayblock \on@line }
- \int_gincr:N \g__tag_para_main_end_int
+ \__tag_gincr_para_main_end_int:
\tag_struct_end: %text-unit
}
}
@@ -3551,16 +3598,20 @@
{
\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}
+ \__tag_gincr_para_main_begin_int:
+ \tag_struct_begin:n
+ {
+ tag=\l__tag_para_main_tag_tl,
+ attribute-class=\l__tag_para_main_attr_class_tl,
+ }
}
}
- \int_gincr:N \g__tag_para_begin_int
+ \__tag_gincr_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
+ ,attribute-class=\l__tag_para_attr_class_tl
}
\__tag_check_para_begin_show:nn {green}{#1}
\tag_mc_begin:n {}
@@ -3572,15 +3623,19 @@
\cs_new_protected:Npn \@@_start_para_structure_unconditionally:n #1 {
\bool_if:NF \l__tag_para_flattened_bool
{
- \int_gincr:N \g__tag_para_main_begin_int
- \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
+ \__tag_gincr_para_main_begin_int:
+ \tag_struct_begin:n
+ {
+ tag=\l__tag_para_main_tag_tl,
+ attribute-class=\l__tag_para_main_attr_class_tl,
+ }
}
- \int_gincr:N \g__tag_para_begin_int
+ \__tag_gincr_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
+ ,attribute-class=\l__tag_para_attr_class_tl
}
\__tag_check_para_begin_show:nn {green}{#1}
\tag_mc_begin:n {}
@@ -3594,14 +3649,14 @@
{
\bool_if:NT \l__tag_para_bool
{
- \int_gincr:N \g__tag_para_end_int
+ \__tag_gincr_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_gincr_para_main_end_int:
\tag_struct_end:
}
}
@@ -3657,7 +3712,7 @@
\DeclareRobustCommand*\begin[1]{%
\UseHook{env/#1/before}%
\@ifundefined{#1}%
- {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
+ {\def\reserved@a{\@latex@error{Environment~#1~undefined}\@eha}}%
{\def\reserved@a{\def\@currenvir{#1}%
\edef\@currenvline{\on@line}%
\@execute@begin@hook{#1}%
@@ -3680,7 +3735,7 @@
{
\bool_if:NF \l__tag_para_flattened_bool
{
- \int_gincr:N \g__tag_para_main_end_int
+ \__tag_gincr_para_main_end_int:
\tag_struct_end:
}
\@endpefalse
@@ -3722,7 +3777,7 @@
\@@_debug_typeout:n{block-end \on@line}
\legacy_if:nT { @endpe }
{
- \int_gincr:N \g__tag_para_main_end_int
+ \__tag_gincr_para_main_end_int:
\@@_debug_typeout:n{close~ /text-unit \on@line}
\tagstructend
}
@@ -3792,7 +3847,7 @@
\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
+% an artifact (after cleaning up the \item code ), therefore
% disabled for now
% \tl_if_empty:oTF \@itemlabel
% {
@@ -3835,7 +3890,7 @@
\cs_set:Npn \@@_list_item_end: {
\legacy_if:nT { @endpe }
{
- \int_gincr:N \g__tag_para_main_end_int
+ \__tag_gincr_para_main_end_int:
\tagstructend % text-unit
% \@@_debug_typeout:n{Structure-end~ P~ at~ item-end \on@line }
}
@@ -3854,7 +3909,7 @@
\cs_set:Npn \@@_list_end: {
\legacy_if:nT { @endpe }
{
- \int_gincr:N \g__tag_para_main_end_int
+ \__tag_gincr_para_main_end_int:
\tagstructend % text-unit
\@@_debug_typeout:n{Structure-end~ P~ at~ list-end \on@line }
}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-block.pdf b/macros/latex-dev/required/latex-lab/latex-lab-block.pdf
index 7cd08195e3..44c6602ada 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-block.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-block.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx
index e2ee78b2ff..a50b367837 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx
@@ -16,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabfirstaiddate{2023-07-20}
-\def\ltlabfirstaidversion{0.85a}
+\def\ltlabfirstaiddate{2024-01-21}
+\def\ltlabfirstaidversion{0.85b}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -64,7 +64,17 @@
\ltlabfirstaiddate\space v\ltlabfirstaiddate\space
Temporary patches to external packages needed for the tagging project]
% \end{macrocode}
-
+% \subsection{ams classes}
+% The amsart and amsbook classes do not use \cs{@author} to store the author list
+% but a command \cs{authors}. To be able to nevertheless use the authors in the
+% xmp-metadata we map \cs{@author} to this new command.
+%
+% \begin{macrocode}
+\AddToHook{class/amsart/after}
+ {\def\@author{\authors}}
+\AddToHook{class/amsbook/after}
+ {\def\@author{\authors}}
+% \end{macrocode}
% \subsection{blindtext}
% The blindtext package generates lists with nested \cs{loop} command.
% The inner loop introduces a group around the list which error when lists are tagged
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf
index 578d70101e..8db9946ef4 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-float.dtx b/macros/latex-dev/required/latex-lab/latex-lab-float.dtx
index 3bd3483600..e1c70968ab 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-float.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-float.dtx
@@ -16,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabfloatdate{2023-07-20}
-\def\ltlabfloatversion{0.81a}
+\def\ltlabfloatdate{2024-02-05}
+\def\ltlabfloatversion{0.81c}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -86,8 +86,8 @@
% In PDF~2.0 there is the suitable \texttt{Aside} tag which hopefully will
% be handled correctly regarding the reading order once processor actually support
% PDF~2.0. But in PDF~1.7 we rolemap it to \texttt{Note} and this doesn't lead to
-% a good reading order. The code therefore collect the float structures and moves
-% them to a \texttt{Sect} the end of the document or the chapter
+% a good reading order. The code therefore collects the float structures and moves
+% them to a \texttt{Sect} at the end of the document or the chapter
% (H-floats once they are handled will not be moved).
%
% To fulfill the requirement that a \texttt{Caption} should be at the begin or end, we always
@@ -106,6 +106,8 @@
%
% The code add two keys for the \cs{tagtool} command
%
+%
+% \begin{function}{flush-floats,split-float}
% \begin{description}
% \item[flush-floats] This will flush out the collected floats sofar (currently
% table and figure. The value is a sectioning level, e.g. \texttt{section} or \texttt{chapter},
@@ -117,9 +119,19 @@
% \item[split-float] This can be used inside a float if there are two captions.
% It will only work reasonably well if the content of the float parts are in a sensible order
% and can be separated by this command. More complex setups with tabulars will need more
-% thoughts
+% thoughts.
+% \end{description}
+% \end{function}
+%
+% \section{Kernel commands}
+% \begin{function}{\@current@float@struct}
+% This variable holds the structure number of current float structure.
+% \end{function}
%
-% \end{description}
+% \begin{function}{\@makecaption}
+% \cs{@makecaption} is defined by the classes so we overwrite it for now
+% at begin document.
+% \end{function}
%
%
% \begin{macrocode}
@@ -182,7 +194,7 @@
\seq_map_inline:Nn\g_@@_float_types_seq
{
\tag_struct_begin:n{tag=##1s,stash}
- \prop_gput:Nnx\g_@@_float_sect_prop {##1-struct}{\int_use:N\c@g__tag_struct_abs_int}
+ \prop_gput:Nne\g_@@_float_sect_prop {##1-struct}{\int_use:N\c@g__tag_struct_abs_int}
\tag_struct_end:
}
}
@@ -239,6 +251,7 @@
{\par\__tag_sec_end:n{-10}\@@_float_stop_sect:}
\DeclareHookRule{tagpdf/finish/before}{latex-lab/float}{before}{tagpdf}
% \end{macrocode}
+%
% \subsection{Splitting floats}
% \begin{macro}{split-float}
% TODO: check if the target affect spacing!!
@@ -249,7 +262,7 @@
{
\@@_float_end:
\@@_float_begin:
- \MakeLinkTarget[tagstructure]{g__tag_struct_abs_int}
+ \MakeLinkTarget*{floatstructure.\int_use:N\c@g__tag_struct_abs_int}
}
}
% \end{macrocode}
@@ -290,12 +303,12 @@
{
\exp_args:Ne
\tag_struct_begin:n{tag=float,parent=0\prop_item:No\g_@@_float_sect_prop{\@captype-struct}}%
- \prop_gput:Nxx \g_@@_float_sect_prop {\@captype-used}{true}
+ \prop_gput:Nee \g_@@_float_sect_prop {\@captype-used}{true}
}
{
\tag_struct_begin:n{tag=float}
}
- \tl_set:Nx\@current@float@struct{\tag_get:n{struct_num}}%
+ \tl_set:Ne\@current@float@struct{\tag_get:n{struct_num}}%
\typeout{Float structure: \@current@float@struct}
}
@@ -381,7 +394,7 @@
% \end{macrocode}
% We add a target for links. TODO: check that it doesn't affect spacing!!
% \begin{macrocode}
- \MakeLinkTarget[tagstructure]{g__tag_struct_abs_int}%
+ \MakeLinkTarget*{floatstructure.\number\value{g__tag_struct_abs_int}}%
}%
% \end{macrocode}
% The end code of the float ...
@@ -446,10 +459,24 @@
\let\@kernel@refstepcounter\refstepcounter %as long it is not in the kernel
\def\caption{%
\ifx\@captype\@undefined
- \@latex@error{\noexpand\caption outside float}\@ehd
+ \@latex@error{\noexpand\caption\c_space_tl outside~float}\@ehd
\expandafter\@gobble
- \else
- \@kernel@refstepcounter\@captype
+ \else
+% \end{macrocode}
+% if a caption is used outside a float no
+% target has been set and \cs{@current@float@struct} is empty
+% \begin{macrocode}
+ \tl_if_empty:NTF\@current@float@struct
+ {
+ \refstepcounter\@captype
+ }
+ {
+ \@kernel@refstepcounter\@captype
+% \end{macrocode}
+% we need to reset the target for \cs{addcontentsline}.
+% \begin{macrocode}
+ \xdef\@currentHref{floatstructure.\@current@float@struct}%
+ }
\expandafter\@firstofone
\fi
{\@dblarg{\@caption\@captype}}%
@@ -471,7 +498,6 @@
{
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
- \xdef\@currentHref{tagstructure.\@current@float@struct}%
% \end{macrocode}
% we don't want tagging when storing the caption for the singleline check
% \begin{macrocode}
@@ -482,12 +508,21 @@
% we stop paratagging. TODO: check
% \begin{macrocode}
\tagtool{para=false}
- \tag_struct_begin:n{tag=Caption,parent=\@current@float@struct}
+% \end{macrocode}
+% if caption is used outside a float there is perhaps no number, then we use
+% the parent structure and hope ...
+% \begin{macrocode}
+ \tl_if_empty:NT \@current@float@struct
+ { \tl_set:Ne \@current@float@struct {\tag_get:n{struct_num}} }
+ \tag_struct_begin:n{tag=Caption,parent=\@current@float@struct}
% \end{macrocode}
% move the caption to the begin of the float structure:
% \begin{macrocode}
- \seq_gpop_right:cN {g__tag_struct_kids_\@current@float@struct _seq}\l_@@_tmpa_tl
- \seq_gput_left:cV {g__tag_struct_kids_\@current@float@struct _seq}\l_@@_tmpa_tl
+ \tag_if_active:T
+ {
+ \seq_gpop_right:cN {g__tag_struct_kids_\@current@float@struct _seq}\l_@@_tmpa_tl
+ \seq_gput_left:cV {g__tag_struct_kids_\@current@float@struct _seq}\l_@@_tmpa_tl
+ }
\ifdim \wd\@tempboxa >\hsize
\tag_struct_begin:n{tag=Lbl}
\tag_mc_begin:n{}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-float.pdf b/macros/latex-dev/required/latex-lab/latex-lab-float.pdf
index 1af101107f..e691200085 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-float.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-float.pdf
Binary files differ
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 e0b8bc5580..4e291d6abf 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-graphic.dtx b/macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx
index 158b0d2a9c..9585bee189 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx
@@ -184,7 +184,10 @@
\RequirePackage{l3opacity}
% \end{macrocode}
%
-%
+% Needed during switch to e-type:
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_prop_gput:Nnn {cne}
+% \end{macrocode}
% \begin{macro}{\@@_graphic_savepos:n}
% this is the command which stores the position. Similar to
% zref-savepos it uses two savepos commands
@@ -894,7 +897,7 @@
% The structure and the mc must be open earlier, before the \cs{setbox} (at least
% for luatex it has to). TODO: think about interface if more attributes are needed.
% \begin{macrocode}
- \@@_prop_gput:cnx
+ \@@_prop_gput:cne
{ g_@@_struct_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
{ A }
{
@@ -970,7 +973,7 @@
{red}
{\int_use:N\g_@@_graphic_int}
}
- \@@_prop_gput:cnx
+ \@@_prop_gput:cne
{ g_@@_struct_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
{ A }
{
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf b/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf
index bf57d1bd95..fe21c3e51a 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx
new file mode 100644
index 0000000000..ca79d8a67f
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx
@@ -0,0 +1,259 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-marginpar.dtx
+%%
+% Copyright (C) 2024 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\ltlabmarginpardate{2024-02-12}
+\def\ltlabmarginparversion{0.85b}
+
+%<*driver>
+\documentclass[kernel]{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-marginpar.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \title{The \textsf{latex-lab-marginpar} package\\
+% Changes related to the tagging of margin notes}
+% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
+% \date{v\ltlabmarginparversion\ \ltlabmarginpardate}
+%
+% \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\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% This module contains changes to improve the tagging (in the standard classes) of
+% margin notes created with the \cs{marginpar} command.
+%
+% Such margin notes are rather small but nevertheless tagging is not trivial and poses
+% a number of interesting problems both regarding the structure and the implementation.
+%
+% \subsection{Structure}
+% \cs{marginpar} creates small boxes in the margin of a page.
+% While they are technically floats they also typically
+% relate to the paragraph beside them, so their structure element should be placed near
+% such a paragraph.
+%
+% They can be tagged either as artifacts (if they are merely distracting decoration),
+% as small headings before the paragraph, or as |Aside|. Unlike the PDF 1.7 fallback |Note|
+% the structure |Aside| is not allowed inside |P|,
+% so if |Aside| is used, it must be placed before or after the current |P| in the surounding |text-unit|,
+% or it must split the |P|. Splitting is probably not so good as
+% |\marginpar| is often used somewhere in the middle of sentence.
+% The best default is probably to use |Aside|, find the parent |text-unit| and add it there.
+%
+% \subsection{Implementation}
+%
+% |marginpar| has an optional argument which allows to define a different content
+% on left/right margins for odd/even pages (depending on twoside and \cs{reversemarginpar}).
+%
+% The current implementation stores *both* arguments in boxes and
+% decides in the output routine which
+% one to use. This is quite problematic for tagging, as the unused box produces
+% structure objects, literals, labels, MCID numbers,
+% and perhaps OBJR-objects from links
+% which must be later thrown away again (or are thrown away by the engine).
+% While it is theoretically not impossible to create
+% both boxes while taging is active but to keep everything on hold and insert
+% the real structure only when the box is used it is in practice quite difficult,
+% slow and error prone.
+%
+% There are a number of options to avoid this hassle.
+%
+% \begin{description}
+% \item[Minimal tagging] One option is to disable tagging when the boxes
+% are built and when the box is used to surround them with a simple Aside.
+%
+% \begin{description}
+% \item[Pro:] easy to implement
+% \item[Contra:]
+% Content that perhaps needed tagging (|\LaTeX| logo with /ActualText, images, links) is not tagged.
+% \end{description}
+%
+% \item[Remaking the box]
+% Tagging is deactivated when the boxes are created.
+% The arguments are stored and when the box should be used in the output routine
+% (and when it is known which one will be used) the box is (re)created, now with proper tagging.
+%
+% Contra: The content can change e.g. if it uses counters or macros that are redefine later before the
+% output routine is called. As tagging is done later, it is not trivial to insert the
+% |Aside| in the right place in the paragraph structure.
+%
+% \item[Two pass compilation]
+% A label is used to detect which argument/boxed is used and
+% tagging is activated only for this one.
+%
+% Contra: costs a |label| and requires a two pass compilation (which is needed anyway).
+% This should be ok. |\marginnote| uses a label too, and the same
+% label could also be used to resolve problems if a margin note
+% moves to a new page (and so replace the mparhack package).
+% \end{description}
+%
+% The last option seems the best and is therefore implemented.
+%
+%
+% \section{Implementation}
+% \begin{macrocode}
+%<*package>
+%<@@=tag>
+% \end{macrocode}
+% \begin{macrocode}
+\ProvidesExplPackage {latex-lab-testphase-marginpar} {\ltlabmarginpardate} {\ltlabmarginparversion}
+ {Changes related to the tagging of the margin notes}
+% \end{macrocode}
+% \subsection{Variables}
+% We need a variable to make the label unique.
+% Todo: Not sure about the name.
+% \begin{macro}{\g__kernel_marginpar_int}
+% \begin{macrocode}
+\int_new:N \g__kernel_marginpar_int
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Tagging sockets}
+%
+% \begin{socketdecl}{tagsupport/marginpar/begin,tagsupport/marginpar/end}
+% \begin{macrocode}
+\socket_new:nn {tagsupport/marginpar/begin}{0}
+\socket_new:nn {tagsupport/marginpar/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+% \begin{plugdecl}{tagsupport/marginpar/begin,tagsupport/marginpar/end}
+% \begin{macrocode}
+\socket_new_plug:nnn {tagsupport/marginpar/begin}{default}
+ {
+ \if_mode_horizontal:
+ \tag_mc_end:
+ \tag_struct_begin:n{tag=Aside,parent=\g__tag_para_main_struct_tl}%
+ \else:
+ \tag_struct_begin:n{tag=Aside}%
+ \fi:
+ }
+\socket_new_plug:nnn {tagsupport/marginpar/end}{default}
+ {
+ \tag_struct_end:
+ \if_mode_horizontal: \tag_mc_begin:n{} \fi:
+ }
+\socket_assign_plug:nn {tagsupport/marginpar/begin}{default}
+\socket_assign_plug:nn {tagsupport/marginpar/end}{default}
+% \end{macrocode}
+% \end{plugdecl}
+
+% \subsection{Kernel command changes}
+% \begin{macro}{\@savemarbox }
+% We add sockets that add a tagging structure Aside:
+% \begin{macrocode}
+\long\def \@savemarbox #1#2{%
+ \UseTaggingSocket{marginpar/begin}
+ \global\setbox #1%
+ \color@vbox
+ \vtop{%
+ \hsize\marginparwidth
+ \@parboxrestore
+ \@marginparreset
+ #2\par
+ \@minipagefalse
+ \outer@nobreak
+ }%
+ \color@endbox
+ \UseTaggingSocket{marginpar/end}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ympar}
+% We must avoid that \cs{@xympar} creates tagging structure:
+% \begin{macrocode}
+\long\def\@ympar#1{%
+ \@savemarbox\@marbox{#1}%
+ \global\setbox\@currbox\copy\@marbox
+ \tag_stop:
+ \@xympar
+ \tag_start:}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xmpar}
+% \cs{@xmpar} is the command used if an optional argument is present.
+% In this case we must stop tagging for \cs{@xympar} as above
+% but also decide which of the two @savemarbox should have tagging active.
+% We add a label to \cs{@marbox}. If that exist tagging is activated for this
+% box else for the other one.
+% \begin{macrocode}
+\long\def\@xmpar[#1]#2{%
+ \int_gincr:N\g__kernel_marginpar_int
+ \property_if_recorded:eTF { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int }
+ {
+ \@savemarbox\@marbox {#1
+ \property_record:ee
+ { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int }{page}
+ }%
+ \tag_stop:
+ \@savemarbox\@currbox{#2}%
+ \tag_start:
+ }
+% \end{macrocode}
+% order matters! the tagged box should be first so that it can pick up
+% the correct text-unit number.
+% \begin{macrocode}
+ {
+ \@savemarbox\@currbox{#2}%
+ \tag_stop:
+ \@savemarbox\@marbox{#1
+ \property_record:ee
+ { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int }{page}}
+ \tag_start:
+ }
+ \tag_stop:
+ \@xympar
+ \tag_start:
+ }
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<*latex-lab>
+\ProvidesFile{marginpar-latex-lab-testphase.ltx}
+ [\ltlabmarginpardate\space v\ltlabmarginparversion\space
+ Changes related to the tagging of the margin notes]
+
+\RequirePackage{latex-lab-testphase-marginpar}
+
+%</latex-lab>
+% \end{macrocode}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf
new file mode 100644
index 0000000000..33be164cfa
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-math.dtx b/macros/latex-dev/required/latex-lab/latex-lab-math.dtx
index 285471addc..03eb8e42d0 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-math.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-math.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-math.dtx
%
-% Copyright (C) 2022-2023 The LaTeX Project
+% Copyright (C) 2022-2024 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
@@ -19,8 +19,8 @@
% for those people who are interested or want to report an issue.
%
%
-\def\ltlabmathdate{2023-09-11}
-\def\ltlabmathversion{0.5c}
+\def\ltlabmathdate{2024-02-09}
+\def\ltlabmathversion{0.5i}
%
%<*driver>
\documentclass{l3doc}
@@ -46,7 +46,14 @@
% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
% \providecommand\class[1]{\texttt{#1.cls}}
% \providecommand\pkg[1]{\texttt{#1}}
-% \providecommand\hook[1]{\texttt{#1}}
+%
+% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
%
% ^^A \car {...} for marginal comments
% ^^A \car*{...} for longer inline comments
@@ -59,8 +66,6 @@
% {\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
@@ -75,6 +80,18 @@
% \car*{Todo: update all the documentation! Both here and
% (what little there is!) in the implementation section.}
%
+% Tagging math involves a variety of tasks that require that math is captured before the
+% typesetting
+% \begin{itemize}
+% \item When typesetting the math MC-tags and structure commands must
+% be inserted at the begin and the end, and perhaps also around lines
+% or other subparts of the equation.
+% \item The source and/or a mathml-representation of the source must be available
+% so that it can be (perhaps after some preprocessing) be used in an associated file
+% or in an alternate text
+% \item It must be possible to measure the math for e.g. a bbox setting.
+% \end{itemize}
+%
% 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
@@ -84,7 +101,24 @@
%\end{verbatim}
% would only result in a single capture of the tokens
% ``\verb*/a \in A \text{ for all $a<5$}/''.
+%
%
+% \section{Math capture} \label{sec:mathcapture}
+% In the current setup
+% \begin{itemize}
+% \item |$|, |\(...\)| and |$$| grab (through a command in \cs{everymath}/cs{everydisplay})
+% if the boolean \cs{l_@@_collected_bool} is false.
+% If the boolean is true they behave normally and can for example contain verbatim.
+%
+% \item All (registered) environments grab their body
+% regardless of the state of the boolean. For
+% |equation|, |equation*| and |math| this is a change as they no longer can
+% contain verbatim.
+%
+% \item BUG: |\[...\]| grabs if \cs{l_@@_collected_bool} is false. If it is
+% true it falls back to |equation*| and then errors because this can't find the end.
+% \end{itemize}
+%
% \subsection{Code level interfaces}
%
% \begin{function}{\math_register_env:n, \math_register_env:nn}
@@ -109,7 +143,8 @@
% \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|.
+% the content as |#2|. The processing is done before the typesetting. It is not
+% applied if \cs{ifmeasuring@} is true.
% \end{function}
%
% \subsection{Document level interfaces}
@@ -129,38 +164,275 @@
% \end{itemize}
% \end{function}
%
+% \section{Math tagging}
+%
+% The tagging code has to handle
+% \begin{itemize}
+% \item the embedding into the surrounding. This means
+% \begin{itemize}
+% \item closing and reopening MC-chunks
+% \item closing and reopening text/P-structures
+% \item handling interferences of the tagging code with penalties and spacing.
+% \end{itemize}
+% \item the actual tagging which means to do some or all of the following tasks:
+% \begin{itemize}
+% \item setup content for an associated source file
+% \item setup content for an associated mathml file
+% \item setup content for the /Alt key
+% \item setup content for the /ActualText key
+% \item setup attributes
+% \item add associated files
+% \item add a Formula structure
+% \item surround subparts (e.g. lines) with Formula sub structures
+% (perhaps with their own set of additional content)
+% \item surround elements of the equation with mathml structure elements
+% (currently only luatex with luamml)
+% \end{itemize}
+% \end{itemize}
+%
+% \subsection{Inline math}
+%
+% The embedding code is added through
+% the sockets
+% \begin{itemize}
+% \item |tagsupport/math/inline/begin|
+% \item |tagsupport/math/inline/end|
+% \end{itemize}
+% The sockets simply push and pop the MC currently. Without
+% tagging they use the noop-plug.
+%
+% The actual tagging is in done through the sockets
+% \begin{itemize}
+% \item |tagsupport/math/inline/formula/begin|
+% This socket takes the math as argument and its code
+% should output it for typesetting. Without tagging the
+% socket uses the identity plug.
+% The |default| plug of the socket calls these three internal sockets
+% for the tagging support:
+% \begin{itemize}
+% \item |tagsupport/math/content| This should set up the various
+% content variables (empty variables are ignored by the structure code
+% and so can be used to suppress a setting).
+% \item |tagsupport/math/struct/begin| This calls \cs{tag_struct_begin:n}.
+% It should also write the associated files if needed.
+% \item |tagsupport/math/substruct/begin| this handles subparts.
+% TODO: does it really make sense in inline math to have that??
+% \end{itemize}
+% \item |tagsupport/math/inline/formula/end|
+% This socket ends the formula structure(s). The |default|
+% plug calls these internal sockets:
+% \begin{itemize}
+% \item |tagsupport/math/substruct/end|
+% \item |tagsupport/math/struct/end|
+% \end{itemize}
+% \end{itemize}
+%
+% \subsection{Display math}
+%
+% \textit{to be written}
+%
+% \subsection{Associated Files}
+%
+% The current code allows the attachment of two types of associated file to the
+% Formula structure:
+% the \LaTeX\ source and a MathML representation.
+% Technically both can be attached---AF is an array
+% of file references---practically there can be problems with PDF consumers:
+% e.g. ngpdf used both and so showed the equation twice
+% (this has been corrected in the newest version) and
+% Foxit seems to see only the first AF in the array (so we attach the
+% mathml as first file).
+%
+% The \LaTeX\ source can be (and is) attached automatically.
+% It can be suppressed by an option with
+% \texttt{math/tex/AF=false}, see below.
+%
+% The MathML is attached if a file |\jobname-mathml.html| is found and
+% if it contains a suitable MathML snippet for the current formula.
+% The MathML processing can be suppressed globally by emptying the list of
+% mathml files with |math/mathml/sources=|. Locally for a formula |math/mathml/AF=false|
+% can be used.
+%
+% For a MathML representation a file with such representations must be provided.
+% If the equation is numbered the numbering should be part of the MathML as
+% the |Lbl| substructure is ignored if an MathML is used (see https://github.com/foxitsoftware/PDF_UA-2).
+%
+% The MathML representation is given in a special format.
+% It is meant to be a valid html file
+% that can be viewed in a browser.
+% For this it can start with |<!DOCTYPE html><html>| and end with |</html>|
+% It should have the extension \texttt{.html}. The \meta{mathml} content
+% is read with special catcodes, so can contain ambersands, hashes, comment chars
+% and unmatched braces such as |<mo>{</mo>|
+%
+% The file should contain a number of representations in this format:
+% \begin{quote}
+% |<div>| \\
+% | <h2>\mml| \meta{key}|</h2>|\\
+% | <p>|\meta{source}|</p>| \\
+% | <p>|\meta{hash}|</p>| \\
+% | <math | \meta{attributes} |>|\\
+% \meta{mathml}\\
+% | </math>|\\
+% |</div>|
+% \end{quote}
+% The keywords |<div>|, |<h2>\mml|, |<p>|, |<math|, |</math>| |</div>| are required as
+% they are used to delimit the arguments by the \LaTeX{} code.
+%
+% \meta{key} and \meta{source} are only used for debugging, they help to identify
+% the equation referred by this representation. The source should be used correctly escaped
+% |&| and |<| so that if gives valid html!
+%
+% \meta{attributes} is not required either, but can e.g. contain attributes
+% to improve the display in a browser:
+% \begin{verbatim}
+% <math alttext="\mathbf{G}" class="ltx_Math" display="inline">
+% \end{verbatim}
+% It can also contain the name space declaration: |xmlns="http://www.w3.org/1998/Math/MathML"|%
+% \footnote{But it is probably not needed and only blows up the PDF.}
+%
+%
+% By default the code tries at the begin of the document
+% to read a file |\jobname-mathml.html| in the |html|-format.
+% The file name can be changed with |mathml/setfiles={filename1,filename2}|
+% (without extension, |html| is added automatically).
+% If there is a list, all files are loaded.
+% If a file doesn't exist it is ignored, only an info is written to the log.
+%
+% Currently every MathML-snippet from a file is embedded into the PDF,
+% it is not checked first if it is actually used (simply writing everything to the PDF
+% is a bit easier than keeping everything in memory and also means that
+% the snippets are one after the other in the PDF).
+%
+% As mentioned above the MathML-AF can be suppressed for the equations in a group with
+% |math/mathml/AF=false|, or
+% completly by setting |math/mathml/sources=| in the preamble.
+%
+% Files embedded in a PDF can be listed in the attachments panel of a PDF viewer.
+% This is probably not so useful for lots of small files (but one could create
+% collections), but as long as PDF editors or viewers don't offer
+% proper support to access the AF it can help so have them there. The MathML are
+% added by default, but the \LaTeX{} source not. This can be changed with
+% |viewer/pane/mathsource=true| (anywhere in the document) and |viewer/pane/mathml=false| (in the
+% preamble, before the external file is read).
+%
+% \subsection{Options}
+%
+%
% \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.
+% For example,
+% \begin{verbatim}
+% $a\begin{minipage}{1cm}$b$\end{minipage}$
+% \end{verbatim}
+% would only result in the capture of the tokens
+% ``\verb*/a\begin {minipage}{1cm}/''.
+% This can be avoided by an additional brace group:
+% \begin{verbatim}
+% $a{\begin{minipage}{1cm}$b$\end{minipage}}$
+% \end{verbatim}
+%
% \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
+%
+% \item The math can't contain verbatim and verbatim-like commands. This is
+% nothing new for the \pkg{amsmath} environments but changes |$| and |\[\]|
+% and |equation*| (see e.g. tagging-project issue \#30).
+%
+% \item Begin and end of the math or math environment can not be hidden in commands.
+% For example \verb+>{$}l<{$}+ in a tabular would lead to errors.
+% Defining |\[| to fall back to |equation*| doesn't work if |equation*| is
+% a grabbing environment.
+%
+% \item The behaviour of |\[...\]| is faulty. See above.
% \end{enumerate}
%
+% \subsection{Fake math}
+% In a number of places in \LaTeX{} math commands (mainly |$|) is used
+% only for technical reason, e.g. to access a math font, to setup a symbol
+% or to use \cs{vcenter}.
+%
+% The code identifies such fake math mostly by making use of the \cs{m@th} command
+% where two methods are used for the automatic detection:
+%
+% \begin{itemize}
+% \item After grabbing math content the code checks if the content contains the token
+% \cs{m@th} and if yes it doesn't call the processor before reinserting
+% the content and perhaps adding tagging code.
+% This method requires that the math can be grabbed (e.g. that the end dollar is visible)
+% and that the \cs{m@th} is visible. It applies for example in \cs{@iiiparbox} where the
+% code from |$\vcenter| to |\m@th$| is grabbed an put back. It does not work for
+% example for |tabular| where the dollars and the \cs{m@th} token are spread around
+% over three commands. |tabular| needs therefore manual intervention.
+%
+% A look in the list of usages (in \texttt{usage-of-m@th.md}) justifies this approach.
+% All usages are either not math at all, or related to small elements that probably
+% shouldn't be grabbed and processed on their own.
+%
+% \item \cs{m@th} is redefined so that it sets the boolean \cs{l_@@_collected_bool}
+% to true. If \cs{m@th} is used inside math that has been grabbed
+% this doesn't change much as the boolean is set by the grabbing anyway. For usages
+% outside math the benefit is not so clear: The setting avoids that in \cs{LaTeXe}
+% the epsilon is processed as math, but it also prevents that the content of the amsmath
+% command \cs{boxed} is processed as math.
+% It means that if one wants to reenable math processing inside some (fake) math
+% one has to do it after \cs{m@th} calls.
+% \end{itemize}
+%
+% Open problems
+% \begin{enumerate}
+% \item The grabbing code doesn't pass the info that it detected a \cs{m@th} token.
+% This means that the tagging code has to do the same check (and doesn't do this
+% in all cases yet).
+%
+% \item Commands are missing to locally disable the grabbing and processing, e.g.
+% to handle |tabular|.
+%
+% \item It must be checked if setting the boolean in \cs{m@th} really makes sense
+% or if commands like \cs{LaTeXe} should be handled manually.
+%
+% \end{enumerate}
+%
+% \subsection{Processor}
+%
+% The grabbed math is at first passed to the processor. The processor is not called
+% in a measuring phase (from the amsmath \cs{ifmeasuring@}) and if the \cs{m@th}
+% token is detected.
+% It is not quite clear what purpose the processor has. As it is a public interface
+% it can't be used for internal code. And typesetting happens later and the processor
+% can't really change this. Currently it is mostly used for debugging and messages.
+% If the \cs{m@th} is found the \cs{l_@@_fakemath_bool} is set, so if the code
+% is changed this must be preserved.
+%
% \subsection{Other problems}
%
% \begin{enumerate}
% \item
-% The presence of \cs{m@th} in association with \cs{ensuremath}
+% 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).
+%
+% TODO: this claim needs some examples.
+%
% \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},
+% generated by a [(future)] dedicated command (\cs{DeclareMathEnvironment},
% 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.}
@@ -172,7 +444,10 @@
% \begin{enumerate}
% \item Add (some of) the math display commands that were \enquote{lifted from
% plain}, e.g., \cs{displaylines} \cs{eqalign}(??).
-% \item
+% \item The breqn packages changes catcodes and that isn't yet covered
+% by our mechanism.
+% \item \cs{intertext} is not correctly taken into account by the
+% code splitting multiline math into subformulas.
% \end{enumerate}
%
%
@@ -218,36 +493,823 @@
% have conditional definitions and deals with how to define \cs{[}/\cs{]}
% neatly.
% \begin{macrocode}
-\tl_gput_right:Nn \@kernel@before@begindocument
- { \RequirePackage { amsmath } }
+\AddToHook{begindocument/before}{ \RequirePackage { amsmath } }
% \end{macrocode}
%
%
% \subsection{Data structures}
%
-%
-%
-% \begin{variable}{\l_@@_collected_bool}
+% \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.
+% If true following math will not grab and/or process.
+% See \ref{sec:mathcapture} for details.
+% \begin{macrocode}
+\bool_new:N \l_@@_collected_bool
+% \end{macrocode}
+% \end{variable}
%
+% \begin{variable}{\l_@@_fakemath_bool}
+% Tracks whether math mode material has been identified as fake math during
+% the grabbing phase, which happens currently if the
+% grabbed contents contains the \cs{m@th} token.
%
% \begin{macrocode}
-\bool_new:N \l_@@_collected_bool
+\bool_new:N \l_@@_fakemath_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}
-% \cs{g_@@_grabbed_env_tl} contains the name of the math environment (\texttt{math} in the case
-% of inline math, \cs{g_@@_grabbed_math_tl} the math content.
+% \cs{g_@@_grabbed_env_tl} contains the name of the math environment
+% (\texttt{math} in the case of inline math,
+% \cs{g_@@_grabbed_math_tl} the math content.
% \begin{macrocode}
\tl_new:N \g_@@_grabbed_env_tl
\tl_new:N \g_@@_grabbed_math_tl
% \end{macrocode}
% \end{variable}
+%
+% \begin{variable}{\l_@@_tmpa_tl,\l_@@_tmpa_skip,\l_@@_tmpa_str}
+% Temporary variables
+% \begin{macrocode}
+\tl_new:N \l_@@_tmpa_tl
+\skip_new:N \l_@@_tmpa_skip
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_content_alt_tl,
+% \l_@@_content_actual_tl,
+% \l_@@_content_AF_tl}
+% Temporary variables to hold math content that should
+% be used in actual or alt text and stored as AF.
+% \begin{macrocode}
+\tl_new:N \l_@@_content_alt_tl
+\tl_new:N \l_@@_content_actual_tl
+\tl_new:N \l_@@_content_AF_source_tl
+\tl_new:N \l_@@_content_AF_source_tmpa_tl
+\tl_new:N \l_@@_content_AF_mathml_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Tagging tools}
+% The following commands implement small tagging code chunks.
+% This should probably be collected and moved into tagpdf later.
+% \begin{macro}{\__tag_tool_close_P:}
+% This closes a P/text-chunk, both the MC and the structure and
+% increases the counter manually.
+% \begin{macrocode}
+\cs_new_protected:Npn \__tag_tool_close_P:
+ {
+ \tag_if_active:T
+ {
+ \tag_mc_end: %end P-chunk, should perhaps be \tag_mc_end_push: ...
+ \__tag_gincr_para_end_int:
+ \__tag_check_para_end_show:nn{red}{} %debug: show para
+ \tag_struct_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% We add also an attribute.
+% \begin{macrocode}
+\tl_new:N\l_@@_attribute_class_tl
+\tagpdfsetup
+ {newattribute = {inline} {/O /Layout /Placement/Inline},
+ newattribute = {display} {/O /Layout /Placement/Block},
+ }
+% \end{macrocode}
+%
+% \subsection{Code related to AF}
+% Booleans to handle the options.
+% \begin{variable}{
+% \l__tag_math_texsource_AF_bool,
+% \l__tag_math_texsource_pane_bool,
+% \l__tag_math_mathml_AF_bool,
+% \g__tag_math_mathml_AF_bool,
+% \l__tag_math_mathml_pane_bool,
+% \l__tag_math_alt_bool
+% }
+% \begin{macrocode}
+\bool_new:N\l__tag_math_texsource_AF_bool
+\bool_new:N\l__tag_math_texsource_pane_bool
+\bool_new:N\l__tag_math_mathml_AF_bool
+\bool_new:N\g__tag_math_mathml_AF_bool
+\bool_new:N\l__tag_math_mathml_pane_bool
+\bool_new:N\l__tag_math_alt_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{
+% \g_@@_mathml_total_int,
+% \g_@@_mathml_int,
+% \g_@@_math_total_int,
+% \g_@@_mathml_AF_found_int,
+% \g_@@_mathml_AF_attached_int,
+% }
+% \cs{g_@@_mml_total_int} records the mathml fragments read in.
+% \cs{g_@@_mml_int} records the mathml fragments read in with a different hash.
+% \cs{g_@@_AF_total_int} records the number of math structures that try to
+% attach a mathml AF.
+% \cs{g_@@_AF_found_int} records the number of math structures for which a fitting
+% mathml is found.
+% \cs{g_@@_AF_attached_int} records the number of math structures which got a mathml fragment
+% (if mathml-AF are not disabled locally this should be the equal to the previous number.
+%
+% \begin{macrocode}
+\int_new:N\g_@@_mathml_total_int
+\int_new:N\g_@@_mathml_int
+\int_new:N\g_@@_math_total_int
+\int_new:N\g_@@_mathml_AF_found_int
+\int_new:N\g_@@_mathml_AF_attached_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l__tag_math_mathml_files_clist}
+% A sequence to store the file list for the mathml.
+% \begin{macrocode}
+\clist_new:N\l__tag_math_mathml_files_clist
+\clist_put_right:Ne\l__tag_math_mathml_files_clist {\c_sys_jobname_str-mathml}
+% \end{macrocode}
+% \end{variable}
+
+% This is the internal variant of the \cs{mml} command.
+% \begin{macro}{\@@_AF_mml:nnnn}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_AF_mml:nnnn #1 #2 #3 #4
+%#1 number, #2 tex source for debugging, #3 hash, #4 mathml
+ {
+ \int_gincr:N \g_@@_mathml_total_int
+% \end{macrocode}
+% mathml with the same hash should be included only once:
+% \begin{macrocode}
+ \tl_if_exist:cF { g_@@_mathml_#3_tl }
+ {
+ \int_gincr:N \g_@@_mathml_int
+% \end{macrocode}
+% a simple Desc key, take care that it is a valid string!
+% \begin{macrocode}
+ \pdfdict_put:nne {l_pdffile/Filespec} {Desc}{(mathml-#1)}
+ \pdffile_embed_stream:nnN {#4}{mathml-#1.xml}\l_tmpa_tl
+% \end{macrocode}
+% not strictly necessary but makes the files visible in the file attachment
+% page
+% \begin{macrocode}
+ \bool_if:NT \l__tag_math_mathml_pane_bool
+ {\pdfmanagement_add:nne {Catalog/Names}{EmbeddedFiles}{\l_tmpa_tl}}
+ \tl_new:c{g_@@_mathml_#3_tl}
+ \tl_gset_eq:cN{g_@@_mathml_#3_tl}\l_tmpa_tl
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% The html reader.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_AF_html_reader:w#1</h2>#2<p>#3</p>#4<p>#5</p>#6<math{
+ \begingroup
+ \char_set_catcode_other:N\{
+ \char_set_catcode_other:N\}
+ \char_set_catcode_other:N\#
+ \char_set_catcode_other:N\%
+ \@@_AF_html_reader_verb:w{#1}{#3}{#5}<math
+}
+% \end{macrocode}
+% \begin{macrocode}
+\cs_new_protected:Npn\@@_AF_html_reader_verb:w#1#2#3#4~</div>{
+ \endgroup
+ \@@_AF_mml:nnnn{#1}{#2}{#3}{#4}
+ }
+% \end{macrocode}
+
+%
+% \begin{socketdecl}{tagsupport/math/mathml/write}
+% This writes a html-dummy with the hash and the math content.
+% This should be optional, so it uses a socket that can be disabled
+%
+% \begin{macrocode}
+\socket_new:nn {tagsupport/math/mathml/write}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{plugdecl}{On}
+% \begin{macrocode}
+\socket_new_plug:nnn{tagsupport/math/mathml/write}{On}
+ {
+ \str_set:NV\l_@@_tmpa_str\l_@@_content_AF_source_tl
+ \str_replace_all:Nnn\l_@@_tmpa_str{&}{&amp;}
+ \str_replace_all:Nnn\l_@@_tmpa_str{<}{&lt;}
+ \iow_now:Ne \g_@@_writedummy_iow
+ {
+ \iow_newline:
+ <div>
+ \iow_newline:
+ <h2>\c_backslash_str mml\c_space_tl \int_use:N \g_@@_math_total_int </h2>
+ \iow_newline:
+ <p>\l_@@_tmpa_str</p>
+ \iow_newline:
+ <p>\l_@@_content_hash_tl </p>
+ \iow_newline:
+ <math></math>
+ \iow_newline:
+ </div>
+ \iow_newline:
+ }
+ }
+% \end{macrocode}
+% \end{plugdecl}
+% And now a key to activate the socket.
+% \begin{macrocode}
+
+\keys_define:nn { __tag / setup }
+ {
+ math/mathml/write-dummy .code:n =
+ {
+ \bool_gset_true:N \g__tag_math_mathml_AF_bool
+ \tl_if_exist:NF\g_@@_writedummy_iow
+ {
+ \iow_new:N \g_@@_writedummy_iow
+ \iow_open:Nn \g_@@_writedummy_iow
+ {
+ \c_sys_jobname_str-mathml-dummy.html
+ }
+ \iow_now:Ne \g_@@_writedummy_iow
+ {
+ <!DOCTYPE~html>
+ \iow_newline:
+ <html>
+ }
+ \AssignSocketPlug {tagsupport/math/mathml/write}{On}
+ \AddToHook{enddocument/afterlastpage}
+ {
+ \iow_now:Nn \g_@@_writedummy_iow {</html>}
+ \iow_close:N \g_@@_writedummy_iow
+ }
+ }
+ },
+ math/mathml/write-dummy .usage:n=preamble
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_AF_process_mathml_files:}
+% \begin{macrocode}
+\box_new:N\l_@@_tmpa_box
+\cs_new_protected:Npn \@@_AF_process_mathml_files:
+ {
+ \hbox_set:Nn \l_@@_tmpa_box
+ {
+ \pdfdict_put:nnn { l_pdffile/Filespec }{AFRelationship} { /Supplement }
+ \pdfdict_put:nne
+ { l_pdffile }{Subtype}
+ { \pdf_name_from_unicode_e:n{application/mathml+xml} }
+ \char_set_catcode_other:N \#
+ \cs_set_eq:NN\mml \@@_AF_html_reader:w
+ \clist_map_inline:Nn \l__tag_math_mathml_files_clist
+ {
+ \file_if_exist:nTF {##1.html}
+ {
+ \typeout{Info:~reading~mathml~file~##1}
+ \file_input:n {##1.html}
+ \bool_gset_true:N\g__tag_math_mathml_AF_bool
+ }
+ {
+ \typeout{Info:~mathml~file~##1~does~not~exist}%info message
+ }
+ }
+ }
+ \bool_if:NT\g__tag_math_mathml_AF_bool
+ {
+ \typeout{Info:~Activating~mathml~support}
+ \AssignSocketPlug{tagsupport/math/struct/begin}{test-mathml}
+ \AssignSocketPlug{tagsupport/math/struct/end}{test-mathml}
+% \end{macrocode}
+% mathml handling doesn't like subparts, so we disable them for now:
+% \begin{macrocode}
+ \AssignSocketPlug{tagsupport/math/substruct/begin}{single}
+ \AssignSocketPlug{tagsupport/math/substruct/end}{single}
+ \AddToHook{enddocument/info}
+ {
+ \iow_term:n{MathML~statistic}
+ \iow_term:n{================}
+ \iow_term:e{==>~\int_use:N\g_@@_mathml_total_int\c_space_tl
+ MathML~fragments~read}
+ \iow_term:e{==>~\int_use:N\g_@@_mathml_int\c_space_tl
+ different~MathML~fragments}
+ \iow_term:e{==>~\int_use:N\g_@@_math_total_int\c_space_tl
+ math~fragments~found}
+ \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_found_int\c_space_tl
+ fitting~MathML~AF~found}
+ \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_attached_int\c_space_tl
+ MathML~AF~attached}
+ }
+ }
+ }
+\AddToHook{begindocument}{\@@_AF_process_mathml_files:}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Mathstyle detection}
+% In some cases we need to detect the mathstyle used in a \cs{mathchoice}
+% command and to disable/enable tagging in the unused branches.
+% This is currently only used in the amstext command \cs{text}
+% but is perhaps also needed in other cases, so we create a general command.
+%
+%\begin{macro}{\l_@@_mathstyle_int,\g_@@_mathchoice_int,mathstyle}
+% \begin{macrocode}
+\int_new:N \l_@@_mathstyle_int
+\int_new:N \g_@@_mathchoice_int
+\property_new:nnnn{mathstyle}{now}{-1}{\int_use:N \l_@@_mathstyle_int }
+% \end{macrocode}
+%\end{macro}
+% For now internal, but perhaps will need a public version.
+% The command should be used in every branch of a \cs{mathchoice}
+% (with the correct mathstyle number) and with an unique label (which should
+% be the same in every branch).
+% \cs{g_@@_mathchoice_int} can be e.g. increased before the mathchoice and
+% then used.
+% \begin{macro}{\@@_tag_if_mathstyle:nn}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tag_if_mathstyle:nn #1 #2
+ %#1 refers to label
+ %#2 is a number for the mathstyle (typically 0,2,4,6)
+ {
+ \int_set:Nn \l_@@_mathstyle_int {#2}
+ \property_record:nn {#1} { mathstyle }
+ \int_compare:nNnTF { \property_ref:nn {#1}{ mathstyle} } = { #2 }
+ { \tag_start: }{ \tag_stop: }
+ }
+\cs_generate_variant:Nn \@@_tag_if_mathstyle:nn {en}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Tagging options}
+% \begin{macrocode}
+\keys_define:nn { __tag / setup }
+ {
+ math/mathml/sources .clist_set:N = \l__tag_math_mathml_files_clist,
+ math/alt/use .bool_set:N = \l__tag_math_alt_bool,
+ viewer/pane/mathml .bool_set:N = \l__tag_math_mathml_pane_bool,
+ viewer/pane/mathml .initial:n = true,
+ viewer/pane/mathsource .bool_set:N = \l__tag_math_texsource_pane_bool,
+ math/mathml/AF .bool_set:N = \l__tag_math_mathml_AF_bool,
+ math/mathml/AF .initial:n = true,
+ math/tex/AF .bool_set:N = \l__tag_math_texsource_AF_bool,
+ math/tex/AF .initial:n = true
+ }
+% \end{macrocode}
+%
+% \subsection{Sockets}
+% \subsubsection{Main inline math sockets}
+%
+% \begin{socketdecl}
+% {
+% tagsupport/math/inline/begin,
+% tagsupport/math/inline/end,
+% tagsupport/math/inline/formula/begin,
+% tagsupport/math/inline/formula/end,
+% }
+% The first two sockets are meant to embed inline
+% math into the surrounding (so to close/reopen e.g. MC-chunks).
+% The other two implement the actual formula structure.
+% The formula sockets are despite their naming not symmetric:
+% the begin socket is issued after the math has started, while
+% the end socket is after the math!
+% \begin{macrocode}
+\socket_new:nn {tagsupport/math/inline/begin}{0}
+\socket_new:nn {tagsupport/math/inline/end}{0}
+\socket_new:nn {tagsupport/math/inline/formula/begin}{1} %
+\socket_new:nn {tagsupport/math/inline/formula/end}{0}
+% \end{macrocode}
+%\end{socketdecl}
+%
+%
+% \begin{plugdecl}{MC}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/inline/begin}
+ {MC}
+ {\tag_mc_end_push:}
+\socket_new_plug:nnn
+ {tagsupport/math/inline/end}
+ {MC}
+ {\tag_mc_begin_pop:n{}}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% We probably will want to test different tagging receipes.
+% \begin{plugdecl}{default}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/inline/formula/begin}
+ {default}
+ {
+ \socket_use:n{tagsupport/math/content}
+ \socket_use:n{tagsupport/math/struct/begin}
+% \end{macrocode}
+% TODO: does inline math need subformula handling?
+% \begin{macrocode}
+ % inner formula if multiple parts (not really implemented yet)
+ \socket_use:n{tagsupport/math/substruct/begin}
+ #1
+ \socket_use:n{tagsupport/math/end}
+ }
+\socket_new_plug:nnn
+ {tagsupport/math/inline/formula/end}
+ {default}
+ {
+ \socket_use:n{tagsupport/math/substruct/end}
+ \socket_use:n{tagsupport/math/struct/end}
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \subsubsection{Main display math sockets}
+%
+% \begin{socketdecl}
+% {
+% tagsupport/math/display/begin,
+% tagsupport/math/display/end,
+% tagsupport/math/display/formula/begin,
+% tagsupport/math/display/formula/end,
+% }
+% The first two sockets are meant to embed display
+% math into the surrounding (so to close/reopen e.g. MC-chunks and
+% P-structure).
+% The other two implement the actual formula structure.
+% The formula sockets are despite their naming not symmetric:
+% the begin socket is issued after the math has started, while
+% the end socket is after the math!
+% \begin{macrocode}
+\socket_new:nn {tagsupport/math/display/begin}{0}
+\socket_new:nn {tagsupport/math/display/end}{0}
+\socket_new:nn {tagsupport/math/display/formula/begin}{1} %
+\socket_new:nn {tagsupport/math/display/formula/end}{0}
+% \end{macrocode}
+%\end{socketdecl}
+
+% \begin{plugdecl}{default}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/display/begin}
+ {default}
+ { \__tag_tool_close_P: }
+\socket_new_plug:nnn
+ {tagsupport/math/display/end}
+ {default}
+ {
+ }
+% \end{macrocode}
+% \end{plugdecl}
+
+
+% \begin{plugdecl}{default}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/display/formula/begin}
+ {default}
+ {
+ \socket_use:n{tagsupport/math/content}
+ \socket_use:n{tagsupport/math/struct/begin}
+ \socket_use:n{tagsupport/math/substruct/begin}
+ #1
+ \socket_use:n{tagsupport/math/end}
+ }
+\socket_new_plug:nnn
+ {tagsupport/math/display/formula/end}
+ {default}
+ {
+ \socket_use:n{tagsupport/math/substruct/end}
+ \socket_use:n{tagsupport/math/struct/end}
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \subsubsection{Internal sockets}
+%
+% \begin{variable}{\l_@@_content_template_tl}
+% The default text used as alt or actual text.
+% \begin{macrocode}
+\tl_new:N\l_@@_content_template_tl
+\tl_set:Nn \l_@@_content_template_tl
+ {
+ LaTeX~ formula~ starts~
+ \exp_not:N\begin{\g_@@_grabbed_env_tl}
+ \c_space_tl
+ \exp_not:V\g_@@_grabbed_math_tl
+ \c_space_tl
+ \exp_not:N\end{\g_@@_grabbed_env_tl}
+ \c_space_tl LaTeX~ formula~ ends~
+ }
+% \end{macrocode}
+% \end{variable}
+
+% \begin{variable}{\l_@@_texsource_template_tl}
+% The default text used as texsource
+% \begin{macrocode}
+\tl_new:N\l_@@_texsource_template_tl
+\tl_const:Nn\c_@@_inline_env_tl {math}
+\tl_set:Nn \l_@@_texsource_template_tl
+ {
+ \tl_if_eq:NNTF\g_@@_grabbed_env_tl\c_@@_inline_env_tl
+ {
+ $
+ \exp_not:V\g_@@_grabbed_math_tl
+ $
+ }
+ {
+ \exp_not:N\begin{\g_@@_grabbed_env_tl}
+ \exp_not:V\g_@@_grabbed_math_tl
+ \exp_not:N\end{\g_@@_grabbed_env_tl}
+ }
+ }
+% \end{macrocode}
+% \end{variable}
+
+%
+% \begin{socketdecl}{tagsupport/math/content}
+% The math content is stored in associated files and used for
+% actual and alternative text. As the exact text is still
+% unclear we use a socket to be able to test variants.
+% The socket should set all four tl vars above, if needed
+% to identical values. It can use the two variables
+% \cs{g_@@_grabbed_env_tl} and \cs{g_@@_grabbed_math_tl}
+% \begin{macrocode}
+\socket_new:nn {tagsupport/math/content}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% Some default sockets to set the contents.
+% TODO: think about naming convention.
+% TODO: think how this should organized so that one
+% has options to change from the outside and so that
+% there are less repetitions.
+% \begin{plugdecl}{actual+source}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/content}
+ {actual+source}
+ {
+ \tl_set:Ne\l_@@_content_actual_tl
+ {
+ \l_@@_content_template_tl
+ }
+ \tl_set:Ne \l_@@_content_AF_source_tl
+ {
+ \l_@@_texsource_template_tl
+ }
+ \tl_set:Nn \l_@@_content_AF_mathml_tl {}
+ \tl_set:Nn \l_@@_content_alt_tl {}
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{plugdecl}{alt+source}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/content}
+ {alt+source}
+ {
+ \tl_set:Ne\l_@@_content_alt_tl
+ {
+ \l_@@_content_template_tl
+ }
+ \tl_set:Ne \l_@@_content_AF_source_tl
+ {
+ \l_@@_texsource_template_tl
+ }
+ \tl_set:Nn \l_@@_content_AF_mathml_tl {}
+ \tl_set:Nn \l_@@_content_actual_tl {}
+ }
+% \end{macrocode}
+% \end{plugdecl}
+% \begin{macrocode}
+\socket_assign_plug:nn {tagsupport/math/content}{alt+source}
+% \end{macrocode}
+%
+% \begin{socketdecl}{tagsupport/math/struct/begin,
+% tagsupport/math/struct/end}
+% For the main structure we use a socket too.
+% This allow e.g. to create a special one for luamml
+% which setups additional objects.
+% The begin socket can use the two variables
+% \cs{g_@@_grabbed_env_tl} and \cs{g_@@_grabbed_math_tl}
+% \begin{macrocode}
+\socket_new:nn {tagsupport/math/struct/begin}{0}
+\socket_new:nn {tagsupport/math/struct/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{plugdecl}{default}
+% TODO: think about some naming convention ...
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/struct/begin}
+ {default}
+ {
+ \bool_if:NTF\l__tag_math_texsource_AF_bool
+ { \tl_set_eq:NN \l_@@_content_AF_source_tmpa_tl \l_@@_content_AF_source_tl }
+ { \tl_clear:N \l_@@_content_AF_source_tmpa_tl }
+ \tag_struct_begin:n
+ {
+ tag=Formula,
+ texsource = \l_@@_content_AF_source_tmpa_tl,
+ title-o = \g_@@_grabbed_env_tl,
+ actualtext = \l_@@_content_actual_tl,
+ alt = \l_@@_content_alt_tl
+ }
+ }
+\socket_new_plug:nnn
+ {tagsupport/math/struct/end}
+ {default}
+ { \tag_struct_end: }
+
+\socket_assign_plug:nn {tagsupport/math/struct/begin}{default}
+\socket_assign_plug:nn {tagsupport/math/struct/end}{default}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{plugdecl}{test-mathml}
+% This (test-)socket tries to add a mathml-AF to formula.
+% It is activated if a mathml.html has been found and loaded.
+% Additionally it also sets an attribute
+% (this can perhaps be done by default anyway.)
+% As it disturbs the reading of the AF it currently deactivates the /Alt key,
+% unless it has been reenabled with |math/alt/use=true|
+% \begin{macrocode}
+\cs_generate_variant:Nn \str_mdfive_hash:n {o}
+\tl_new:N\l_@@_content_hash_tl
+% \end{macrocode}
+% we need to save the grabbed math:
+% \begin{macrocode}
+\tl_new:N\l_@@_grabbed_math_tl
+% \end{macrocode}
+% the socket definition
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/struct/begin}
+ {test-mathml}
+ {
+ \int_gincr:N\g_@@_math_total_int
+ \tl_set:Ne\l_@@_content_hash_tl
+ {\str_mdfive_hash:o { \l_@@_content_AF_source_tl }}
+ \tl_set_eq:NN\l_@@_grabbed_math_tl\g_@@_grabbed_math_tl
+ \tl_if_eq:NnTF\g_@@_grabbed_env_tl {math}
+ {
+ \tl_set:Nn\l_@@_attribute_class_tl{inline}
+ }
+ {
+ \tl_set:Nn\l_@@_attribute_class_tl{display}
+ }
+ \bool_if:NF\l__tag_math_alt_bool
+ { \tl_set:Nn \l_@@_content_alt_tl{} }
+% \end{macrocode}
+% debugging option. TODO: hide in debug key.
+% \begin{macrocode}
+ \tl_if_exist:cTF { g_@@_mathml_ \l_@@_content_hash_tl _tl }
+ {
+ \int_gincr:N\g_@@_mathml_AF_found_int
+ \bool_if:NTF \l__tag_math_mathml_AF_bool
+ {
+ \int_gincr:N\g_@@_mathml_AF_attached_int
+ \typeout {Inserting~mathml~with~Hash~\l_@@_content_hash_tl}
+ }
+ {
+ \typeout {Ignoring~mathml~with~Hash~\l_@@_content_hash_tl}
+ }
+ }
+ {
+ \typeout{WARNING:~mathml~missing~for~hash~\l_@@_content_hash_tl}
+ }
+ \socket_use:n {tagsupport/math/mathml/write} % write hash if request
+ \bool_if:NTF\l__tag_math_texsource_AF_bool
+ { \tl_set_eq:NN \l_@@_content_AF_source_tmpa_tl \l_@@_content_AF_source_tl }
+ { \tl_clear:N \l_@@_content_AF_source_tmpa_tl }
+ \tag_struct_begin:n
+ {
+ tag=Formula,
+ attribute-class=\l_@@_attribute_class_tl, %
+ AFref =
+ \bool_if:NT\l__tag_math_mathml_AF_bool
+ {
+ \cs_if_exist_use:c {g_@@_mathml_ \l_@@_content_hash_tl _tl}
+ },
+ texsource = \l_@@_content_AF_source_tmpa_tl, % should be after mathml AF!
+ title-o = \g_@@_grabbed_env_tl, %
+ alt = \l_@@_content_alt_tl
+ }
+ }
+% \end{macrocode}
+% not really needed but looks more symmetric:
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/struct/end}
+ {test-mathml}
+ {
+ \tag_struct_end:
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{socketdecl}{tagsupport/math/substruct/begin,
+% tagsupport/math/substruct/end}
+% This holds the code to handle subparts of the formula.
+% \begin{macrocode}
+\socket_new:nn {tagsupport/math/substruct/begin}{0}
+\socket_new:nn {tagsupport/math/substruct/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+%
+% \begin{plugdecl}{default}
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/substruct/begin}
+ {default}
+ { \grabaformulapartandstart }
+\socket_new_plug:nnn
+ {tagsupport/math/substruct/end}
+ {default}
+ {
+ \tagmcend
+ \if@subformulas
+ \tagstructend
+ \fi
+ }
+\socket_assign_plug:nn {tagsupport/math/substruct/begin}{default}
+\socket_assign_plug:nn {tagsupport/math/substruct/end}{default}
+% \end{macrocode}
+% \end{plugdecl}
+
+% \begin{plugdecl}{single}
+% We need an option to disable subparts as it is unclear
+% if consumers can handle them:
+% \begin{macrocode}
+\socket_new_plug:nnn
+ {tagsupport/math/substruct/begin}
+ {single}
+ {
+ \typeout{====>subpart~splitting~deactivated}
+ \typeout{====>grabbed~math=\meaning\g_@@_grabbed_math_tl}
+ \tag_mc_begin:n{}
+ }
+\socket_new_plug:nnn
+ {tagsupport/math/substruct/end}
+ {single}
+ { \tag_mc_end:}
+% \end{macrocode}
+% \end{plugdecl}
+%
+% \begin{socketdecl}{tagsupport/math/end}
+% A socket used at the end of the math (before the closing dollar(s))
+% which can e.g. set a flag for luamml.
+% \begin{macrocode}
+\socket_new:nn {tagsupport/math/end}{0}
+% \end{macrocode}
+% \end{socketdecl}
+
+%
+% \begin{macro}{\__tag_math_disable:}
+% Similar to the table code we collect the plugs that should be
+% assigned to do nothing if we don't want tagging
+% \begin{macrocode}
+\cs_new_protected:Npn \__tag_math_disable:
+ {
+ \socket_assign_plug:nn {tagsupport/math/inline/begin}{noop}
+ \socket_assign_plug:nn {tagsupport/math/inline/end}{noop}
+ \socket_assign_plug:nn {tagsupport/math/inline/formula/begin}{identity}
+ \socket_assign_plug:nn {tagsupport/math/inline/formula/end}{noop}
+ \socket_assign_plug:nn {tagsupport/math/display/begin}{noop}
+ \socket_assign_plug:nn {tagsupport/math/display/end}{noop}
+ \socket_assign_plug:nn {tagsupport/math/display/formula/begin}{identity}
+ \socket_assign_plug:nn {tagsupport/math/display/formula/end}{noop}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\__tag_math_enable:}
+% Similar to the table code we collect the default plugs that should be
+% assigned if we want tagging
+% \begin{macrocode}
+\cs_new_protected:Npn \__tag_math_enable:
+ {
+ \socket_assign_plug:nn {tagsupport/math/inline/begin}{MC}
+ \socket_assign_plug:nn {tagsupport/math/inline/end}{MC}
+ \socket_assign_plug:nn {tagsupport/math/inline/formula/begin}{default}
+ \socket_assign_plug:nn {tagsupport/math/inline/formula/end}{default}
+ \socket_assign_plug:nn {tagsupport/math/display/begin}{default}
+ \socket_assign_plug:nn {tagsupport/math/display/end}{default}
+ \socket_assign_plug:nn {tagsupport/math/display/formula/begin}{default}
+ \socket_assign_plug:nn {tagsupport/math/display/formula/end}{default}
+ }
+% \end{macrocode}
+% \end{macro}
+% At begin document we can activate:
+% \begin{macrocode}
+\AtBeginDocument{\tag_if_active:T{\__tag_math_enable: }}
+% \end{macrocode}
%
% \subsection{Interface commands}
%
@@ -260,7 +1322,8 @@
{
\legacy_if:nF { measuring@ }
{
- \tl_if_in:nnF {#2} { \m@th }
+ \tl_if_in:nnTF {#2} { \m@th }
+ { \bool_set_true:N\l_@@_fakemath_bool }
{ \tl_trim_spaces_apply:nN {#2} \@@_process_auxi:nn {#1} }
}
}
@@ -287,15 +1350,15 @@
%
% \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}.
+% any processing if the token is \tn{m@th} found in the content.
+%
+% \fmi{what's that test doing?}
%
-% \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{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{cf.~the code for this in \cs{@ensuredmath}}
%
%\car{It is harmless but unnecessary in the dollardollar grabbing below.}
%
@@ -309,91 +1372,61 @@
\tl_if_blank:nF {#1}
{
\@@_process:nn { math } {#1} % $
-% fairly simple this one
% \end{macrocode}
-% We do not want math tagging in fakemath or when measuring,
-% so we imitate the test inside \cs{@@_process:nn} for now,
-% see https://github.com/latex3/tagging-project/issues/5
-% TODO: use socket to get more control about typesetting variants (tagged, drop etc)?
+% We do not want math tagging in fakemath or when measuring,
% \begin{macrocode}
- \legacy_if:nTF { measuring@ }
- { #1 $ }
- {
- \tl_if_in:nnTF {#1} { \m@th }
- { #1 $ }
- {
- \tagmcend %end P-chunk, in code: \tag_mc_end_push:
- \@kernel@math@begin
- #1 $
- \@kernel@math@end
- \tagmcbegin{} % restart P-chunk (whatsits in pdftex)
- }
- }
+ \bool_lazy_or:nnTF
+ {\legacy_if_p:n { measuring@ }}
+ { \l_@@_fakemath_bool }
+ { #1 $ }
+ {
+ \socket_use:n {tagsupport/math/inline/begin} %end P-MC
+ \socket_use:nn{tagsupport/math/inline/formula/begin}{#1}
+ $
+ \socket_use:n {tagsupport/math/inline/formula/end}
+ \socket_use:n {tagsupport/math/inline/end} % restart P-MC
+ }
}
}
% \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
+ \@@_process:nn { equation* } {#1}
+ \socket_use:n {tagsupport/math/display/begin}
+ \socket_use:nn{tagsupport/math/display/formula/begin}{#1}
$$
}
}
% \end{macrocode}
-% To allow to use the code without tagging we guard. But probably tagpdf should
-% provide some tools for such manual para-ends.
+%
+% The end code is added through a \cs{aftergroup} so we
+% store it inside a command.
% \begin{macrocode}
-\cs_new_protected:Npn \@kernel@close@P {
- \tag_if_active:T
- {
- \tagmcend %end P-chunk, should perhaps be \tag_mc_end_push: ...
- \int_gincr:N \g__tag_para_end_int
- \bool_if:NT \l__tag_para_show_bool
- { \tag_mc_begin:n{artifact}
- \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int}
- \tag_mc_end:
- }
- \tag_struct_end:
- }
-}
-
-
-
-\cs_new_protected:Npn \@@_tag_dollardollar_display:nn #1#2 {
- \@@_process:nn {#1} {#2}
- \@kernel@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
+\cs_new_protected:Npn \@@_tag_dollardollar_display_end:
+ {
+ % \typeout{== tag dollarldollar display end}
+ % \ShowTagging{struct-stack}
+ \para_raw_end:
+% \end{macrocode}
+% TODO why is that needed? where is para-tagging disabled?
+% \begin{macrocode}
+ \tagpdfparaOn
+ \l_@@_tmpa_skip \lastskip
+ \socket_use:n{tagsupport/math/display/formula/end}
+ \penalty \postdisplaypenalty
% \end{macrocode}
% This reinserts the below display skips. It must be doubled to
% get the right amount:
% \begin{macrocode}
- \skip_vertical:n { -\l_@@_tmpa_skip * 2 }
+ \skip_vertical:n { -\l_@@_tmpa_skip * 2 }
%
\@doendpe % this has no \end{...} to take care of it
}
@@ -410,13 +1443,13 @@
{
\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}
@@ -463,7 +1496,7 @@
% \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
{
@@ -472,15 +1505,8 @@
\cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
\cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
%
- \ExpandArgs { nnx } \RenewDocumentEnvironment {#1} { b }
+ \ExpandArgs { nne } \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}
@@ -490,34 +1516,22 @@
\cs_if_exist:cTF { @@_env #1 _aux: }
{
\exp_not:c { @@_env #1 _aux: }
- ####1 \exp_not:N \@@_env_end: {#1}
+ ##1 \exp_not:N \@@_env_end: {#1}
}
- { \exp_not:N \@@_process:nn {#1} {####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:N \tracingall
\exp_not:c { @@_env_ #1 _begin: }
- ####1
+ ##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}
@@ -525,15 +1539,8 @@
\cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
\cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
%
- \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
+ \ExpandArgs { nnee } \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}
@@ -543,23 +1550,24 @@
\cs_if_exist:cTF { @@_env #1 _aux: }
{
\exp_not:c { @@_env #1 _aux: }
- ####1 \exp_not:N \@@_env_end: {#1}
+ ##1 \exp_not:N \@@_env_end: {#1}
}
- { \exp_not:N \@@_process:nn {#1} {####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:N \tracingall
\exp_not:c { @@_env_ #1 _begin: }
- ####1
-% \exp_not:c { @@_env_ #1 _end: }
+ ##1
% \exp_not:N \tracingnone
}
- {
- \exp_not:c { @@_env_ #1 _end: }
- }
+ {
+ \exp_not:c { @@_env_ #1 _end: }
+ }
}
-
+% \end{macrocode}
+% TODO: the following command is neither documented nor used. Is is needed?
+% \begin{macrocode}
\cs_new_protected:Npn \math_register_odd_env:nn #1#2
{
\tl_set:Nn \l_@@_env_name_tl {#1}
@@ -567,7 +1575,7 @@
\cs_gset_eq:cc { @@_env_ #1 _begin: } {#1}
\cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 }
%
- \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b }
+ \ExpandArgs { nnee } \RenewDocumentEnvironment {#1} { b }
{
\exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool
{
@@ -578,19 +1586,19 @@
\cs_if_exist:cTF { @@_env #1 _aux: }
{
\exp_not:c { @@_env #1 _aux: }
- ####1 \exp_not:N \@@_env_end: {#1}
+ ##1 \exp_not:N \@@_env_end: {#1}
}
- { \exp_not:N \@@_process:nn {#1} {####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:N \tracingall
\exp_not:c { @@_env_ #1 _begin: }
- ####1
+ ##1
}
{
\exp_not:c { @@_env_ #1 _end: }
-% needed if we don't have $$...$$
+% needed if we don't have $$...$$
% \exp_not:n { \typeout{---> @kernel@math@registered@end }}
\exp_not:n { \@kernel@math@registered@end }
}
@@ -614,7 +1622,7 @@
\cs_new:Npn \@kernel@math@registered@begin {
-% \ShowTagging{struct-stack}
+% \ShowTagging{struct-stack}
%\typeout{==>A1}\ShowTagging{struct-stack,mc-current}
\mode_if_vertical:TF
{
@@ -623,19 +1631,21 @@
% { \__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!
+%
+ \tag_if_active:T
+ {
+ \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!
+ \__tag_tool_close_P:
}
- \@kernel@math@begin
+ \socket_use:nn{tagsupport/math/display/formula/begin}{}
\tagpdfparaOff
% \typeout{==>MC1}\ShowTagging{mc-current}
}
@@ -644,13 +1654,14 @@
% \typeout{==>MC2}\ShowTagging{mc-current}
\para_raw_end:
\tagpdfparaOn
- \@kernel@math@end
+ \socket_use:n{tagsupport/math/display/formula/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}
@@ -660,12 +1671,12 @@
%
% \begin{macro}{\@@_env_forward:w}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_env_forward:w #1 \@@_env_end: #2
+\cs_new_protected:Npn \@@_env_forward:w #1 \@@_env_end: #2
{ \@@_process:nn {#2} {#1} }
% \end{macrocode}
% \end{macro}
-%
-% \subsection{Document commands}
+%
+% \subsection{Document commands}
%
% \car*{Add one more here: \texttt{displaymath}, which
% is equivalent to \cs{[} , \cs{]}\\
@@ -692,9 +1703,9 @@
% 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
+% and this one doesn't work either
% \math_register_env:n { displaymath }
- \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{}
+ \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{}
}
% \end{macrocode}
% \end{macro}
@@ -737,29 +1748,31 @@
{
\cs_gset_protected:Npn \[ % \]
{
- \bool_if:NTF \l_@@_collected_bool
- { \begin { equation* } }
- { \@@_grab_eqn:w }
+ \@@_grab_eqn:w
+ % \bool_if:NTF \l_@@_collected_bool
+% { \begin { equation* } }
+% { \@@_grab_eqn:w }
} % \[
\cs_gset_protected:Npn \]
{
- \bool_if:NTF \l_@@_collected_bool
- { \end{ equation* } }
- { \@badmath }
+ \@badmath
+% \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
+%
+% \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
% {
@@ -786,47 +1799,6 @@
% 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
- {
- LaTeX~ formula~ starts~
- \exp_not:N\begin{\g_@@_grabbed_env_tl}
- \space
- \exp_not:V\g_@@_grabbed_math_tl
- \space
- \exp_not:N\end{\g_@@_grabbed_env_tl}
- \space LaTeX~ formula~ ends~
- }
- \tagstructbegin{tag=Formula,
- AFinline-o=\tmpmathcontent,
- title-o=\g_@@_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
@@ -841,24 +1813,21 @@
{
\tex_the:D \tex_everydisplay:D
\iftrue % this may have to be a settable flag!
-% {
% \typeout{==>~ in~ everydisplay}
% \end{macrocode}
-% flipping the \cs{belowdisplay} values is done so that we get (assumption)
-% a negative skip and not make the page bigger then we take that out,
-% then we add the tagging code (in \cs{@@_tag_dollardollar_display_end} ) and
-% then we put a real \cs{postdisplaypenalty} in and
-% the right skip (of which we don't know if it is short or a
-% normal \cs{belowdisplayskip}). This might need some refinement if that skip
-% is actually negative from the start
+% flipping the \cs{belowdisplay} values is done so that we get (assumption)
+% a negative skip and not make the page bigger then we take that out,
+% then we add the tagging code (in \cs{@@_tag_dollardollar_display_end} ) and
+% then we put a real \cs{postdisplaypenalty} in and
+% the right skip (of which we don't know if it is short or a
+% normal \cs{belowdisplayskip}). This might need some refinement if that skip
+% is actually negative from the start
% (not sure it ever is and is worth bothering about)
% \begin{macrocode}
\skip_set:Nn \belowdisplayskip {-\belowdisplayskip}
\skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip}
\int_set:Nn \postdisplaypenalty {10000}
-%
\group_insert_after:N \@@_tag_dollardollar_display_end:
-% }
\fi
\bool_if:NF \l_@@_collected_bool
{
@@ -876,14 +1845,23 @@
\math_register_env:n { eqnarray* }
% \end{macrocode}
%
-% Places where math mode is (ab)used.
+% Tabulars currently contain a \$ that shouldn't trigger math
+% tagging.
% \begin{macrocode}
-\clist_map_inline:nn
- { tabular }
- {
- \AddToHook{ env / #1 / begin }
- { \bool_set_true:N \l_@@_collected_bool }
- }
+\RequirePackage{array}
+\tl_if_in:NnT\@tabular{$}
+ {
+ \def\@tabular{%
+ \leavevmode
+ \UseTaggingSocket{tbl/hmode/begin}%
+ \hbox \bgroup
+ \bool_set_true:N \l_@@_collected_bool
+ $
+ \bool_set_false:N \l_@@_collected_bool
+ \col@sep\tabcolsep \let\d@llarbegin\begingroup
+ \let\d@llarend\endgroup
+ \@tabarray}
+ }
% \end{macrocode}
%
% \begin{macro}{\@@_m@th:, \m@th}
@@ -898,6 +1876,20 @@
}
% \end{macrocode}
% \end{macro}
+%
+% \subsection{Disable math grabbing in the begindocument hook}
+% For example amsart uses math to measure text there.
+%
+% \begin{macrocode}
+\tl_gput_right:Nn\@kernel@before@begindocument
+ {
+ \bool_set_true:N\l_@@_collected_bool
+ }
+\tl_gput_right:Nn\@kernel@after@begindocument
+ {
+ \bool_set_false:N\l_@@_collected_bool
+ }
+% \end{macrocode}
%
% \subsection{Modifying \pkg{amsmath}}
%
@@ -934,7 +1926,7 @@
$$\ignorespacesafterend
}
% \end{macrocode}
-%
+%
% \begin{macrocode}
\def\common@align@ending {
\math@cr \black@\totwidth@
@@ -1007,9 +1999,11 @@
% \end{macrocode}
%
% \begin{macrocode}
-%
+%
\math_register_halign_env:nn {align}{}
\math_register_halign_env:nn {align*}{}
+ \math_register_halign_env:nn {alignat}{}
+ \math_register_halign_env:nn {alignat*}{}
\math_register_halign_env:nn {flalign}{}
\math_register_halign_env:nn {flalign*}{}
\math_register_halign_env:nn {gather}{}
@@ -1032,44 +2026,8 @@
\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
@@ -1083,7 +2041,7 @@
\cr
}
% \end{macrocode}
-%
+%
% \begin{macrocode}
\@namedef{math@cr @ @ @ align}{%
\ifst@rred\nonumber\fi
@@ -1104,7 +2062,7 @@
\cr
}
% \end{macrocode}
-%
+%
% \begin{macrocode}
\def\restore@math@cr{\@namedef{math@cr @ @ @}{
%
@@ -1113,7 +2071,7 @@
\cr}}
\restore@math@cr
% \end{macrocode}
-%
+%
% \begin{macrocode}
}
% \end{macrocode}
@@ -1125,9 +2083,18 @@
%
%
-% \begin{macro}{}
+% \begin{macro}{\@@_split_at_nl:NN}
+% This splits grabbed math at newlines.
%
% \begin{macrocode}
+\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
+}
+% \end{macrocode}
+% and the auxiliary commands
+% \begin{macrocode}
\cs_new:Npn \@@_split_at_nl_first:w #1 \\ #2 \\ #3 \s_stop
{
\quark_if_nil:nTF {#2}
@@ -1137,8 +2104,15 @@
#2 \\ #3 \s_stop
}
}
-\cs_new:Npn \@@_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark
- #4 \\ \q_nil \\ \s_stop
+
+\cs_new_protected:Npn \@@_split_at_nl_aux:nnNN #1 #2 #3 #4
+ {
+ \tl_gset:Nn #4 {#1}
+ \tl_gset:Nn #3 {#2}
+ }
+
+\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} }
@@ -1148,7 +2122,9 @@
{ } { 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
@@ -1157,14 +2133,16 @@
}
\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 } }
+ { \@@_split:n { \@@_split_guard:n {#3} #4 } }
}
{
\exp_args:No \use_ii_i:nn
@@ -1184,29 +2162,17 @@
{ \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 {
+
+\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}
-}
-
+
+% this looks unused.
+%\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
+% }
% \end{macrocode}
% \end{macro}
%
@@ -1233,9 +2199,11 @@
\edef\resulttitle{\g_@@_grabbed_env_tl\space (part)}
\tagstructbegin{tag=Formula,
% \end{macrocode}
-% For now we don't put anything in /alt or /ActualText on subformulas
+% For now we don't put real content in /alt or /ActualText on subformulas
+% but we add a short text to satisfy the pdf/ua-2 validator
% \begin{macrocode}
% alt=\result,
+ alt = subformula,
title-o=\resulttitle
}
}
@@ -1301,10 +2269,6 @@
% \end{macrocode}
%
% \begin{macrocode}
-%
-% \end{macrocode}
-%
-% \begin{macrocode}
%</kernel>
% \end{macrocode}
%
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-math.pdf b/macros/latex-dev/required/latex-lab/latex-lab-math.pdf
index deab5ad914..4907833be8 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-math.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-math.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
index 14d8e94362..a8e8e810ad 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-mathpkg.dtx
%
-% Copyright (C) 2022,2023 The LaTeX Project
+% Copyright (C) 2022-2024 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
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf
index dbfcb0815b..1a2b8be781 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf
+++ 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-mathtools.dtx b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx
index c3f43243b1..1a0b8e0630 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx
@@ -2,7 +2,7 @@
%
%% File: latex-lab-mathtools.dtx
%
-% Copyright (C) 2022,2023 The LaTeX Project
+% Copyright (C) 2022-2024 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
@@ -109,7 +109,7 @@
\def\intertext##1{%
\ifvmode\else\\\@empty\fi
\noalign{%
- \penalty\postdisplaypenalty\vskip\belowdisplayskip
+ \penalty\postdisplaypenalty\vskip-\belowdisplayskip
\vskip-\lineskiplimit % CCS
\vskip\normallineskiplimit % CCS
\vskip\l_MT_above_intertext_sep
@@ -170,6 +170,7 @@
\MH_fi:
\tag_mc_end_push:
\tagpdfsetup{paratag=Span}
+ \tagpdfparaOn
\noindent\ignorespaces#1\par
\tag_mc_begin_pop:n{}}
\penalty\predisplaypenalty\vskip\abovedisplayshortskip%
@@ -197,7 +198,11 @@
\parshape\@ne \@totalleftmargin \linewidth
\MH_fi:
\tag_mc_end_push:
- \tagpdfsetup{paratag=Span}
+ \tagpdfsetup{paratag=P}
+% \end{macrocode}
+% Why is it needed to enable paratagging??
+% \begin{macrocode}
+ \tagpdfparaOn
\noindent\ignorespaces#1\par
\tag_mc_begin_pop:n{}}%
\penalty\predisplaypenalty\vskip\abovedisplayshortskip%
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf
index 97026901d6..63e5b1e169 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf
+++ 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-minipage.dtx b/macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx
index 1d3ee828aa..ffbe5357e7 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx
@@ -1,6 +1,8 @@
% \iffalse meta-comment
%
-%% File: latex-lab-minipage.dtx (C) Copyright 2023 LaTeX Project
+%% File: latex-lab-minipage.dtx
+%%
+% Copyright (C) 2023-2024 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
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf b/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf
index c91e93f2fc..6149b51afa 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx b/macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx
index 2ec9b0584b..a6087abe57 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx
@@ -1,6 +1,8 @@
% \iffalse meta-comment
%
-%% File: latex-lab-namespace.dtx (C) Copyright 2023 LaTeX Project
+%% File: latex-lab-namespace.dtx
+%%
+% Copyright (C) 2023-2024 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
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf b/macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf
index ff8e705be3..ec3c307a97 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-namespace.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
index cc60f50de0..9994b15cb8 100644
--- 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
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2023 Frank Mittelbach
+%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2024 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
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
index e670627022..05cb1fbb23 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx
index d2011256b1..ee20331a8f 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
%% File: latex-lab-new-or-2.dtx
-% Copyright (C) 2022-2023 The LaTeX Project
+% Copyright (C) 2022-2024 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
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf
index 13f4fa1265..df38c11015 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-sec.dtx
index ae7a0b85c3..f3786c2ddb 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-sec.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-sec.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-sec.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-sec.dtx (C) Copyright 2022-2024 LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -16,10 +16,10 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabsecdate{2023-10-16}
-\def\ltlabsecversion{0.84b}
+\def\ltlabsecdate{2024-02-12}
+\def\ltlabsecversion{0.84c}
%<*driver>
-\documentclass{l3doc}
+\documentclass[kernel]{l3doc}
\EnableCrossrefs
\CodelineIndex
\begin{document}
@@ -214,11 +214,11 @@
\fi
\IfBooleanTF {#1}
{
- \tl_gset:Nx \@currentHref {#3}
+ \tl_gset:Ne \@currentHref {#3}
}
{
\int_gincr:N\g__kernel_target_int
- \tl_gset:Nx \@currentHref {target*.\int_use:N\g__kernel_target_int}
+ \tl_gset:Ne \@currentHref {target*.\int_use:N\g__kernel_target_int}
}
}
\ExplSyntaxOff
@@ -260,7 +260,7 @@
tag= {\int_compare:nNnTF {#1}={-1}{Part}{Sect}}
,#2
}
- \seq_gpush:Nx \g__tag_sec_stack_seq {{\g__tag_struct_tag_tl}{\int_eval:n{#1}}}
+ \seq_gpush:Ne \g__tag_sec_stack_seq {{\g__tag_struct_tag_tl}{\int_eval:n{#1}}}
}
% \end{macrocode}
% \end{macro}
@@ -289,7 +289,7 @@
\__tag_sec_end:n {#1}
}
{
- \msg_warning:nnxx {tag}{wrong-sect-nesting}
+ \msg_warning:nnee {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 }
}
@@ -670,6 +670,7 @@
\cs_new_protected:Npn \@kernel@tag@hangfrom #1
{
\tagstructbegin{tag=\l__tag_para_tag_tl}
+ \cs_if_exist_use:N \__tag_gincr_para_begin_int:
\tagstructbegin{tag=Lbl}
\setbox\@tempboxa
\hbox
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf b/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf
index 4dc549e7c9..5e389feb11 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-table.dtx b/macros/latex-dev/required/latex-lab/latex-lab-table.dtx
index 700d4ce6c1..2eafb0a21e 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-table.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-table.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-table.dtx (C) Copyright 2023 LaTeX Project
+%% File: latex-lab-table.dtx (C) Copyright 2023-2024 LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -16,8 +16,8 @@
%
% for those people who are interested or want to report an issue.
%
-\def\ltlabtbldate{2023-10-30}
-\def\ltlabtblversion{0.85d}
+\def\ltlabtbldate{2024-02-07}
+\def\ltlabtblversion{0.85k}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -115,9 +115,17 @@
% Such tables can be nested.
%
% If a table should not be tagged as table, for example because it is merely used
-% to produce a layout or because it is a not yet (fully) supported table structure,
+% as a layout to ensure that the content is properly aligned
+% or because it is a not yet (fully) supported table structure,
% the tagging can be disabled with
-% \verb|\tagpdfsetup{table-tagging=false}|.
+% \verb|\tagpdfsetup{table/tagging=false}| or with \verb|\tagpdfsetup{table/tagging=presentation}|%
+% \footnote{The key has been renamed. The old name `table-tagging` still works but is
+% deprecated. The value \texttt{presentation} refers to the ARIA role \enquote{presentation}.}
+% The first option disables the table tagging code and he content of the tabular
+% is then treated more or less like running text. This works ok for simple tables using
+% only hmode-cells (l/c/r) with normal text content, but fails if the table uses vmode-cells
+% (p/m/b). In such cases the second option works better: it keeps the tagging code active
+% but changes the tag names to \texttt{Div} and the grouping structure \texttt{NonStruct}.
%
% Inside cells the automatic tagging of paragraphs is disabled with the exception of
% p/m/b-type cells.
@@ -126,9 +134,10 @@
% added with an empty TD-structure.
%
% There is some basic support\footnote{This is not meant to be the
-% final interface, though.} for headers. With
+% final interface, though.} for headers. With\footnote{The old key name \texttt{table-header-rows} still
+% works but is deprecated.}
% \begin{quote}
-% \verb|\tagpdfsetup{table-header-rows={|\meta{list of row numbers}\verb|}|
+% \verb|\tagpdfsetup{table/header-rows={|\meta{list of row numbers}\verb|}|
% \end{quote}
% you can
% declare which (absolute) row numbers should be tagged as header rows.
@@ -139,7 +148,7 @@
% for header columns yet. In a \env{longtable} the code will currently use the \cs{endhead} or
% \cs{endfirsthead} rows as header if one of these commands has been
% used and in that case the code
-% ignores a \texttt{table-header-rows} setting.
+% ignores a \texttt{table/header-rows} setting.
%
% You should not insert meaningful text with \verb+!{...}+ or \verb+@{...}+ or \cs{noalign}
% between the rows or columns of the table.
@@ -193,7 +202,8 @@
%
% \item Not every table should be tagged as a Table structure, often they are
% only used as layout help, e.g. to align authors in a title pages. In such uses
-% the tagging of the table must be deactivated with \verb|\tagpdfsetup{table-tagging=false}|.
+% the tagging of the table must be deactivated with \verb|\tagpdfsetup{table/tagging=false}|
+% or \verb|\tagpdfsetup{table/tagging=presentation}|.
%
% \item Only simple header rows are currently supported. Columns and complex headers with
% subheaders will be handled later as that needs some syntax changes. Tables
@@ -210,6 +220,8 @@
%
% \item The \env{longtable} environment supports footnotes in p-type columns, but it hasn't been
% tested yet if this works also with the tagging code.
+%
+% \item Vertical boxes (\cs{parbox}, \texttt{minipage}, \ldots) inside cells can be problematic.
%
% \item The code is quite noisy and fills the log with lots of
% messages.\footnote{Helpful for us at this stage.}
@@ -271,10 +283,11 @@
% \begin{macro}
% {
% \l_@@_celltag_tl
+% \l_@@_pcelltag_tl
% ,\l_@@_rowtag_tl
+% ,\l_@@_table_tl
% ,\l_@@_cellattribute_tl
% ,\l_@@_rowattribute_tl
-% ,\g_@@_missingcells_int
% ,\l_@@_tmpa_clist
% ,\l_@@_tmpa_seq
% ,\l_@@_tmpa_tl
@@ -283,12 +296,19 @@
% \begin{macrocode}
\tl_new:N \l_@@_celltag_tl
\tl_set:Nn \l_@@_celltag_tl {TD}
+\tl_new:N \l_@@_pcelltag_tl
+\tl_set:Nn \l_@@_pcelltag_tl {TD}
% \end{macrocode}
% For the rowtag, probably always TR:
% \begin{macrocode}
\tl_new:N \l_@@_rowtag_tl
\tl_set:Nn \l_@@_rowtag_tl {TR}
% \end{macrocode}
+% For the tabletag, probably always Table:
+% \begin{macrocode}
+\tl_new:N \l_@@_tabletag_tl
+\tl_set:Nn \l_@@_tabletag_tl {Table}
+% \end{macrocode}
% And here cell and row attributes:
% \begin{macrocode}
\tl_new:N \l_@@_cellattribute_tl
@@ -296,94 +316,27 @@
\tl_new:N \l_@@_rowattribute_tl
\tl_set:Nn \l_@@_rowattribute_tl {}
% \end{macrocode}
-% This will contain the number of missing cells used:
-% \begin{macrocode}
-\int_new:N \g_@@_missing_cells_int
-% \end{macrocode}
% Temp variables
% \begin{macrocode}
\clist_new:N \l_@@_tmpa_clist
-\seq_new:N \l_@@_tmpa_seq
\tl_new:N \l_@@_tmpa_tl
% \end{macrocode}
% \end{macro}
%
-% \subsection{Sockets}
-%
-% The code uses a number of sockets to inject the tagging
-% commands. These can be easily set to a noop-plug in case the
-% automated tagging is not wanted At first sockets for the begin and
-% end of cells and rows
-%
-% \begin{socketdecl}{tagsupport/tblcell/begin,
-% tagsupport/tblcell/end,
-% tagsupport/tblrow/begin,
-% tagsupport/tblrow/end,
-% }
-% \begin{macrocode}
-\NewSocket{tagsupport/tblcell/begin}{0}
-\NewSocket{tagsupport/tblcell/end}{0}
-\NewSocket{tagsupport/tblrow/begin}{0}
-\NewSocket{tagsupport/tblrow/end}{0}
-% \end{macrocode}
-% \end{socketdecl}
-%
-% \begin{socketdecl}{tagsupport/tbl/init}
-% This socket should be at the begin of the table, inside a group.
-% It is meant for settings like disabling paratagging. This socket
-% can perhaps be merged later into the begin-sockets when they are
-% no longer added as hooks but in the environment definitions.
-% \begin{macrocode}
-\NewSocket{tagsupport/tbl/init}{0}
-% \end{macrocode}
-% \end{socketdecl}
-%
-%
-% \begin{socketdecl}{tagsupport/tbl/finalize}
-% To fine tune the structure (change cells to header cells, remove
-% unwanted structures, move a foot to the end, etc.) we also need a
-% socket that is executed at the end of the table but \emph{before}
-% all the variables are restored to the outer or default values.
-% The code in the socket can make assignments, but probably
-% shouldn't do typesetting and not write whatsits.
-% \begin{macrocode}
-\NewSocket{tagsupport/tbl/finalize}{0}
-% \end{macrocode}
-% \end{socketdecl}
+% \subsection{Tagging support sockets}
%
-% \begin{socketdecl}{tagsupport/tbl/finalize/longtable}
-% \env{longtable} needs its own socket to fine tune the structure.
-% Simply switching the plug in the previous socket interferes with
-% enabling/disabling the tagging.
-% \begin{macrocode}
-\NewSocket{tagsupport/tbl/finalize/longtable}{0}
-% \end{macrocode}
-% \end{socketdecl}
-%
-% \begin{socketdecl}{tagsupport/tblhmode/begin,
-% tagsupport/tblhmode/end,
-% tagsupport/tblvmode/begin,
-% tagsupport/tblvmode/end
-% }
-%
-% These sockets are used in the begin and end code of environments,
-% to allow a fast enabling and disabling of the tagging. We
-% distinguish between tables that can be used inside paragraphs and
-% standalone tables like longtable.
-% \begin{macrocode}
-\NewSocket{tagsupport/tblhmode/begin}{0}
-\NewSocket{tagsupport/tblhmode/end}{0}
-\NewSocket{tagsupport/tblvmode/begin}{0}
-\NewSocket{tagsupport/tblvmode/end}{0}
-% \end{macrocode}
-% \end{socketdecl}
%
% This are the standard plugs for tagging of cells and rows.
%
% \begin{plugdecl}{TD}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblcell/begin}{TD}
+\NewSocketPlug{tagsupport/tbl/cell/begin}{TD}
{
+% \end{macrocode}
+% Next line was previously outside of the plug, so if we want to execute it
+% always even if the noop plug is in force this needs a different solution.
+% \begin{macrocode}
+ \@@_show_curr_cell_data:
\tag_struct_begin:n
{
tag =\l_@@_celltag_tl,
@@ -405,7 +358,7 @@
%
% \begin{plugdecl}{TD}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblcell/end}{TD}
+\NewSocketPlug{tagsupport/tbl/cell/end}{TD}
{
\tag_mc_end:
\tag_struct_end:
@@ -415,14 +368,14 @@
%
% In p-columns we need a slightly different plug which reactivates the
% paragraph tagging.
-% tagging
-% \begin{plugdecl}{TD}
+% \begin{plugdecl}{TDpbox}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblcell/begin}{TDpbox}
+\NewSocketPlug{tagsupport/tbl/pcell/begin}{TDpbox}
{
+ \@@_show_curr_cell_data:
\tag_struct_begin:n
{
- tag =\l__tbl_celltag_tl,
+ tag =\l__tbl_pcelltag_tl,
attribute-class =\l__tbl_cellattribute_tl
}
\seq_gput_right:Ne \g__tbl_struct_cur_seq { \tag_get:n {struct_num} }
@@ -436,9 +389,9 @@
% \end{macrocode}
% \end{plugdecl}
%
-% \begin{plugdecl}{TD}
+% \begin{plugdecl}{TDpbox}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblcell/end}{TDpbox}
+\NewSocketPlug{tagsupport/tbl/pcell/end}{TDpbox}
{
\tag_struct_end:
}
@@ -447,7 +400,7 @@
%
% \begin{plugdecl}{TR}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblrow/begin}{TR}
+\NewSocketPlug{tagsupport/tbl/row/begin}{TR}
{
\seq_gclear:N \g_@@_struct_cur_seq
\tag_struct_begin:n
@@ -462,24 +415,28 @@
%
% \begin{plugdecl}{TR}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblrow/end}{TR}
+\NewSocketPlug{tagsupport/tbl/row/end}{TR}
{
- \__tag_tbl_add_missing_cells:n { \g_@@_missing_cells_int }
+ \tag_if_active:T
+ {
+ \@@_add_missing_cells:
\seq_gput_right:Ne \g_@@_struct_cells_seq
{
\seq_use:Nn \g_@@_struct_cur_seq {,}
}
- \int_compare:nNnTF { \g_@@_row_int } = { \seq_count:N\g_@@_struct_cells_seq }
+ \int_compare:nNnTF { \g_@@_row_int } =
+ { \seq_count:N \g_@@_struct_cells_seq }
{
- \typeout
+ \@@_trace:n
{==>~
stucture~stored~for~row~\int_use:N\g_@@_row_int :~
\seq_use:Nn \g_@@_struct_cur_seq {,}
}
}
- { \ERROR } % should not happen ...
+ { \ERRORtbl/row } % should not happen ...
\tag_struct_end:
}
+ }
% \end{macrocode}
% \end{plugdecl}
%
@@ -497,6 +454,10 @@
\tag_if_active:T
{
\bool_set_false:N \l__tag_para_bool
+% \end{macrocode}
+% We also initialize the structure data variables a this point.
+% \begin{macrocode}
+ \@@_init_struct_data:
}
}
% \end{macrocode}
@@ -509,14 +470,41 @@
\NewSocketPlug{tagsupport/tbl/finalize}{Table}
{
\@@_set_header_rows:
+% \end{macrocode}
+% Similarly, we restore the outer values of the structure data when
+% we leave the table.
+% \begin{macrocode}
+ \@@_restore_struct_data:
}
% \end{macrocode}
% \end{plugdecl}
%
+%
+%
+%
+% \begin{plugdecl}{Table}
+% This plug will initialize the structure in longtable.
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/tbl/longtable/init}{Table}
+ {
+ \seq_gclear:N\g_@@_struct_rows_seq
+ \seq_gclear:N\g_@@_struct_cells_seq
+ \seq_gclear:N\g_@@_struct_cur_seq
+ \seq_gclear:N\g_@@_LT@firsthead_rows_seq
+ \seq_gclear:N\g_@@_LT@head_rows_seq
+ \seq_gclear:N\g_@@_LT@lastfoot_rows_seq
+ \seq_gclear:N\g_@@_LT@foot_rows_seq
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
+%
+
+
% \begin{plugdecl}{Table}
-% This plug will fine tune the structure of longtable.
+% This plug will fine tune the structure in longtable.
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tbl/finalize/longtable}{Table}
+\NewSocketPlug{tagsupport/tbl/longtable/finalize}{Table}
{
% \end{macrocode}
% If neither \cs{endhead} nor \cs{endfirsthead} has been used
@@ -683,11 +671,40 @@
% \end{macrocode}
% \end{plugdecl}
%
+%
+%
+% \begin{plugdecl}{Table}
+%
+% We must avoid that the reuse of the header foot box leads to duplicated
+% content, thus reset attribute of the box:
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/tbl/longtable/head}{Table}
+ {
+ \tagmcbegin{artifact}
+ \tag_mc_reset_box:N\LT@head
+ \tagmcend
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
% \begin{plugdecl}{Table}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblhmode/begin}{Table}
+\NewSocketPlug{tagsupport/tbl/longtable/foot}{Table}
+ {
+ \tagmcbegin{artifact}
+ \tag_mc_reset_box:N \LT@foot
+ \tagmcend
+ }
+% \end{macrocode}
+% \end{plugdecl}
+%
+%
+%
+%
+% \begin{plugdecl}{Table}
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/tbl/hmode/begin}{Table}
{
- \mode_leave_vertical:
\tag_mc_end_push:
% \end{macrocode}
% Close the P-chunk. This assumes that para-tagging is active.
@@ -696,7 +713,7 @@
\bool_lazy_and:nnT
{ \bool_if_exist_p:N \l__tag_para_bool } { \l__tag_para_bool }
{ \tag_struct_end:n { text } }
- \tag_struct_begin:n {tag=Table}
+ \tag_struct_begin:n {tag=\l_@@_tabletag_tl}
\tl_gset:Ne \g_@@_struct_table_tl { \tag_get:n {struct_num} }
}
% \end{macrocode}
@@ -704,7 +721,7 @@
%
% \begin{plugdecl}{Table}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblhmode/end}{Table}
+\NewSocketPlug{tagsupport/tbl/hmode/end}{Table}
{
\tag_struct_end:
% \end{macrocode}
@@ -721,9 +738,9 @@
%
% \begin{plugdecl}{Table}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblvmode/begin}{Table}
+\NewSocketPlug{tagsupport/tbl/vmode/begin}{Table}
{
- \tag_struct_begin:n {tag=Table}
+ \tag_struct_begin:n {tag=\l_@@_tabletag_tl}
\tl_gset:Ne \g_@@_struct_table_tl { \tag_get:n {struct_num} }
}
% \end{macrocode}
@@ -731,7 +748,7 @@
%
% \begin{plugdecl}{Table}
% \begin{macrocode}
-\NewSocketPlug{tagsupport/tblvmode/end}{Table}
+\NewSocketPlug{tagsupport/tbl/vmode/end}{Table}
{
\tag_struct_end:
\par
@@ -740,30 +757,50 @@
% \end{plugdecl}
%
%
+% \begin{plugdecl}{code}
+% This socket takes a number, checks if is larger than one,
+% checks if the colspan attribute already exists (we can't predefine an
+% arbitrary number), and updates \cs{l_@@_cellattribute_tl}.
+% \begin{macrocode}
+\NewSocketPlug{tagsupport/tbl/colspan}{code}
+ {
+ \int_compare:nNnT {#1}>{1}
+ {
+ \prop_get:NeNF \g__tag_attr_entries_prop
+ {colspan-\int_eval:n{#1}}
+ \l_@@_tmpa_tl
+ {
+ \__tag_attr_new_entry:ee
+ {colspan-\int_eval:n{#1}}
+ {/O /Table /ColSpan~\int_eval:n{#1}}
+ }
+ \tl_set:Ne \l_@@_cellattribute_tl
+ {colspan-\int_eval:n{#1}}
+ }
+ }
+% \end{macrocode}
+% TODO: move to tagpdf
+% \begin{macrocode}
+\tag_if_active:T
+ { \cs_generate_variant:Nn \__tag_attr_new_entry:nn {ee} }
+
+% \end{macrocode}
+% \end{plugdecl}
%
%
%
%\subsection{Environments}
%
-% Currently only tabular, tabular*, tabularx and longtable.
-% We must use the \texttt{before} and \texttt{after} hooks as the \texttt{end}
-% hook is executed before the end of the last row and then MC are messed up.
-% This means that this sockets should only contain code that doesn't needs to be
-% grouped!
-% \begin{macrocode}
-\AddToHook{env/tabular/before} {\UseSocket{tagsupport/tblhmode/begin}}
-\AddToHook{env/tabular/after} {\UseSocket{tagsupport/tblhmode/end}}
-\AddToHook{env/tabular*/before} {\UseSocket{tagsupport/tblhmode/begin}}
-\AddToHook{env/tabular*/after} {\UseSocket{tagsupport/tblhmode/end}}
-\AddToHook{env/tabularx/before} {\UseSocket{tagsupport/tblhmode/begin}}
-\AddToHook{env/tabularx/after} {\UseSocket{tagsupport/tblhmode/end}}
-\AddToHook{env/longtable/before}{\UseSocket{tagsupport/tblvmode/begin}}
-\AddToHook{env/longtable/after} {\UseSocket{tagsupport/tblvmode/end}}
-% \end{macrocode}
+% Currently we support only tabular, tabular*, tabularx and longtable
+% (and possibly environments build directly on top of them).
%
% The \env{array} environment is math. So we disable table tagging for now.
+% We use the command hook to catch also cases where \cs{array} is used directly
+% in other environments like matrix environments.
+% Perhaps table tagging should be disable for math generally, but then
+% we have to handle text insertions.
% \begin{macrocode}
-\AddToHook{env/array/begin} {\__tag_tbl_disable:}
+\AddToHook{cmd/array/before}{\__tag_tbl_disable:}
% \end{macrocode}
%
%
@@ -771,34 +808,6 @@
%
% \subsubsection{Tagging helper commands}
%
-% \begin{macro}{\@@_set_colspan:n}
-% This commands takes a number, checks if is larger than one,
-% checks if the colspan attribute exists (we can't predefine an
-% arbitrary number), and updates \cs{l_@@_cellattribute_tl}.
-% \begin{macrocode}
-\tag_if_active:T
- { \cs_generate_variant:Nn \__tag_attr_new_entry:nn {ee} }
-\cs_new_protected:Npn \@@_set_colspan:n #1
- {
- \tag_if_active:T
- {
- \int_compare:nNnT {#1}>{1}
- {
- \prop_get:NeNF \g__tag_attr_entries_prop
- {colspan-\int_eval:n{#1}}
- \l_@@_tmpa_tl
- {
- \__tag_attr_new_entry:ee
- {colspan-\int_eval:n{#1}}
- {/O /Table /ColSpan~\int_eval:n{#1}}
- }
- \tl_set:Ne \l_@@_cellattribute_tl
- {colspan-\int_eval:n{#1}}
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
%
% \subsubsection{Disabling/enabling}
%
@@ -810,17 +819,23 @@
% \begin{macrocode}
\cs_new_protected:Npn \__tag_tbl_disable:
{
- \AssignSocketPlug{tagsupport/tblcell/begin}{noop}
- \AssignSocketPlug{tagsupport/tblcell/end}{noop}
- \AssignSocketPlug{tagsupport/tblrow/begin}{noop}
- \AssignSocketPlug{tagsupport/tblrow/end}{noop}
+ \AssignSocketPlug{tagsupport/tbl/cell/begin}{noop}
+ \AssignSocketPlug{tagsupport/tbl/cell/end}{noop}
+ \AssignSocketPlug{tagsupport/tbl/pcell/begin}{noop}
+ \AssignSocketPlug{tagsupport/tbl/pcell/end}{noop}
+ \AssignSocketPlug{tagsupport/tbl/row/begin}{noop}
+ \AssignSocketPlug{tagsupport/tbl/row/end}{noop}
\AssignSocketPlug{tagsupport/tbl/init}{noop}
\AssignSocketPlug{tagsupport/tbl/finalize}{noop}
- \AssignSocketPlug{tagsupport/tbl/finalize/longtable}{noop}
- \AssignSocketPlug{tagsupport/tblhmode/begin}{noop}
- \AssignSocketPlug{tagsupport/tblhmode/end}{noop}
- \AssignSocketPlug{tagsupport/tblvmode/begin}{noop}
- \AssignSocketPlug{tagsupport/tblvmode/end}{noop}
+ \AssignSocketPlug{tagsupport/tbl/longtable/init}{noop}
+ \AssignSocketPlug{tagsupport/tbl/longtable/head}{noop}
+ \AssignSocketPlug{tagsupport/tbl/longtable/foot}{noop}
+ \AssignSocketPlug{tagsupport/tbl/longtable/finalize}{noop}
+ \AssignSocketPlug{tagsupport/tbl/hmode/begin}{noop}
+ \AssignSocketPlug{tagsupport/tbl/hmode/end}{noop}
+ \AssignSocketPlug{tagsupport/tbl/vmode/begin}{noop}
+ \AssignSocketPlug{tagsupport/tbl/vmode/end}{noop}
+ \AssignSocketPlug{tagsupport/tbl/colspan}{noop}
}
% \end{macrocode}
% \end{macro}
@@ -831,46 +846,58 @@
% \begin{macrocode}
\cs_new_protected:Npn \__tag_tbl_enable:
{
- \AssignSocketPlug{tagsupport/tblcell/begin}{TD}
- \AssignSocketPlug{tagsupport/tblcell/end}{TD}
- \AssignSocketPlug{tagsupport/tblrow/begin}{TR}
- \AssignSocketPlug{tagsupport/tblrow/end}{TR}
+ \AssignSocketPlug{tagsupport/tbl/cell/begin}{TD}
+ \AssignSocketPlug{tagsupport/tbl/cell/end}{TD}
+ \AssignSocketPlug{tagsupport/tbl/pcell/begin}{TDpbox}
+ \AssignSocketPlug{tagsupport/tbl/pcell/end}{TDpbox}
+ \AssignSocketPlug{tagsupport/tbl/row/begin}{TR}
+ \AssignSocketPlug{tagsupport/tbl/row/end}{TR}
\AssignSocketPlug{tagsupport/tbl/init}{Table}
\AssignSocketPlug{tagsupport/tbl/finalize}{Table}
- \AssignSocketPlug{tagsupport/tbl/finalize/longtable}{Table}
- \AssignSocketPlug{tagsupport/tblhmode/begin}{Table}
- \AssignSocketPlug{tagsupport/tblhmode/end}{Table}
- \AssignSocketPlug{tagsupport/tblvmode/begin}{Table}
- \AssignSocketPlug{tagsupport/tblvmode/end}{Table}
+ \AssignSocketPlug{tagsupport/tbl/longtable/head}{Table}
+ \AssignSocketPlug{tagsupport/tbl/longtable/foot}{Table}
+ \AssignSocketPlug{tagsupport/tbl/longtable/init}{Table}
+ \AssignSocketPlug{tagsupport/tbl/longtable/finalize}{Table}
+ \AssignSocketPlug{tagsupport/tbl/hmode/begin}{Table}
+ \AssignSocketPlug{tagsupport/tbl/hmode/end}{Table}
+ \AssignSocketPlug{tagsupport/tbl/vmode/begin}{Table}
+ \AssignSocketPlug{tagsupport/tbl/vmode/end}{Table}
+ \AssignSocketPlug{tagsupport/tbl/colspan}{code}
}
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
-% TODO decide about key name
+% See tagpdfsetup-keys.md in tagpdf/doc for the naming scheme.
\keys_define:nn { __tag / setup }
{
- table-tagging .choices:nn = { true, on }
+ table/tagging .choices:nn = { true, on }
{ \__tag_tbl_enable: },
- table-tagging .choices:nn = { false, off }
+ table/tagging .choices:nn = { false, off }
{ \__tag_tbl_disable: },
- table-tagging .default:n = true,
- table-tagging .initial:n = true
+ table/tagging .choice:,
+ table/tagging / presentation .code:n =
+ {
+ \__tag_tbl_enable:
+ \tl_set:Nn\l_@@_rowtag_tl {NonStruct}
+ \tl_set:Nn\l_@@_pcelltag_tl {NonStruct}
+ \tl_set:Nn\l_@@_celltag_tl {text}
+ \tl_set:Nn\l_@@_tabletag_tl {Div}
+ },
+ table/tagging .default:n = true,
+ table/tagging .initial:n = true
}
% \end{macrocode}
-%
-% Table tagging should be disabled in the head and foot.
+% This are the old key names kept for now for
+% compability. They will got at some time.
% \begin{macrocode}
-\AddToHook{begindocument}
- {
- \cs_if_exist:NT \@kernel@before@head
- {
- \tl_put_right:Nn \@kernel@before@head {\__tag_tbl_disable:}
- \tl_put_right:Nn \@kernel@before@foot {\__tag_tbl_disable:}
- }
- }
+\keys_define:nn { __tag / setup }
+ {
+ table-tagging .meta:n = {table/tagging={#1}}
+ }
% \end{macrocode}
%
+%
% \subsubsection{Header support}
%
% Accessible table must have header cells declaring the meaning of the
@@ -983,261 +1010,68 @@
% \end{macro}
%
% And some key support:
+% (See tagpdfsetup-keys.md for the naming scheme.)
% \begin{macrocode}
-% TODO decide about key name
\keys_define:nn { __tag / setup }
{
- table-header-rows .clist_set:N = \l_@@_header_rows_clist
+ table/header-rows .clist_set:N = \l_@@_header_rows_clist,
+% \end{macrocode}
+% obsolete older name:
+% \begin{macrocode}
+ table-header-rows .meta:n = {table/header-rows={#1}}
}
% \end{macrocode}
%
-% \subsection{Changes to \pkg{array} commands}
%
%
+% \subsection{Misc stuff}
%
% \begin{macro}{\@@_show_curr_cell_data:}
% Show the row/column index and span count for current table cell
% for debugging.
% \begin{macrocode}
\cs_new_protected:Npn \@@_show_curr_cell_data: {
- \typeout { ==>~ current~cell~data:~
- \int_use:N \g_@@_row_int ,
- \int_use:N \g_@@_col_int ,
- \g_@@_span_tl
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \begin{macro}{\insert@column}
-% \cs{insert@column} is defined in \pkg{array}, here only the two
-% sockets are inserted.
-% \begin{macrocode}
-\def\insert@column{%
- \@@_show_curr_cell_data:
- \UseSocket{tagsupport/tblcell/begin}%
- \the@toks \the \@tempcnta
- \ignorespaces \@sharp \unskip
- \the@toks \the \count@ \relax
- \UseSocket{tagsupport/tblcell/end}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@classz}
-% \begin{macrocode}
-\def\@classz{\@classx
- \@tempcnta \count@
- \prepnext@tok
- \@addtopreamble{\ifcase \@chnum
- \hfil
- \hskip1sp%
- \d@llarbegin
- \insert@column
- \d@llarend \do@row@strut \hfil \or
- \hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \hfil \or
- \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \or
- \setbox\ar@mcellbox\vbox
- \@startpbox{\@nextchar}
- \AssignSocketPlug{tagsupport/tblcell/begin}{TDpbox}
- \AssignSocketPlug{tagsupport/tblcell/end}{TDpbox}
- \insert@column \@endpbox
- \ar@align@mcell
- \do@row@strut \or
- \vtop \@startpbox{\@nextchar}
- \AssignSocketPlug{tagsupport/tblcell/begin}{TDpbox}
- \AssignSocketPlug{tagsupport/tblcell/end}{TDpbox}
- \insert@column \@endpbox\do@row@strut \or
- \vbox \@startpbox{\@nextchar}
- \AssignSocketPlug{tagsupport/tblcell/begin}{TDpbox}
- \AssignSocketPlug{tagsupport/tblcell/end}{TDpbox}
- \insert@column \@endpbox\do@row@strut
- \fi}\prepnext@tok}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@array,\@@@@array}
-% We modificate the \cs{@array} from \pkg{array}.
-% \begin{macrocode}
-\def\@array[#1]#2{%
- \@tempdima \ht \strutbox
- \advance \@tempdima by\extrarowheight
- \setbox \@arstrutbox \hbox{\vrule
- \@height \arraystretch \@tempdima
- \@depth \arraystretch \dp \strutbox
- \@width \z@}%
-% \end{macrocode}
-% The total number of table columns of the current table is
-% determined in \cs{@@_determine_table_cols:} but this is called in
-% a group, so local settings do not survive. Thus, to save away the
-% outer value of \cs{g_@@_table_cols_tl} we do it before the group.
-% \begin{macrocode}
- \tl_set_eq:NN \l_@@_saved_table_cols_tl \g_@@_table_cols_tl
-% \end{macrocode}
-%
-% \begin{macrocode}
- \begingroup
- \@mkpream{#2}
-% \end{macrocode}
-% Next call has to happen immediately after \cs{@mkpream} because
-% it uses implementation details from that.
-% \begin{macrocode}
- \@@_determine_table_cols:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \xdef\@preamble{%
- \noexpand
-% \end{macrocode}
-% \cs{ialign} in the original definition is replaced by
-% \cs{ar@ialign} defined below.
-% \begin{macrocode}
- \ar@ialign
- \@halignto
- \bgroup \@arstrut
-% \end{macrocode}
-% A socket is inserted
-% \begin{macrocode}
- \UseSocket{tagsupport/tblrow/begin}%
-% \end{macrocode}
-% At the start of the preamble for the first column we set
-% \cs{g_@@_col_int} to \texttt{1} as we are no longer "at" but "in"
-% the first column. This is done in \cs{@@_init_cell_data:}. In
-% later columns this data is updated via \cs{@@_update_cell_data:}.
-% \begin{macrocode}
- \@@_init_cell_data:
- \@preamble
- \tabskip \z@ \cr}%
- \endgroup
- \@arrayleft
-% \end{macrocode}
-% Another socket for tagging. TODO: what about \cs{arrayleft}?
-% \begin{macrocode}
- \UseSocket{tagsupport/tbl/init}
- \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
- \bgroup
- \let \@sharp ##\let \protect \relax
- \lineskip \z@
- \baselineskip \z@
- \m@th
- \let\\\@arraycr \let\tabularnewline\\\let\par\@empty
-%\show\@preamble
- \@preamble}
-% \end{macrocode}
-% Finally, also set \cs{@@@@array} to the new definition:
-% \begin{macrocode}
-\let\@@@@array\@array
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_init_cell_data:}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_init_cell_data: {
- \int_gset:Nn \g_@@_col_int {1}
- \tl_gset:Nn \g_@@_span_tl {1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_update_cell_data:}
-% Updating cell data in columns after the first means we have to
-% increment the \cs{g_@@_col_int} by the span count of the previous
-% cell (in case it was a \cs{multicolumn} and then reset the
-% \cs{g_@@_span_tl} to one (as the default).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_update_cell_data: {
- \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl }
- \tl_gset:Nn \g_@@_span_tl {1}
+ \@@_trace:n { ==>~ current~cell~data:~
+ \int_use:N \g_@@_row_int ,
+ \int_use:N \g_@@_col_int ,
+ \g_@@_span_tl
+ }
}
% \end{macrocode}
% \end{macro}
%
%
%
-% \begin{macro}{\@@_determine_table_cols:}
-% Current implementation of \cs{@mkpream} uses the scratch counter
-% \cs{count@} to keep track of the number of toks registers it needs
-% (2 per column), but this can't be used as it counts also
-% insertings made with \verb+!{}+ and \verb+@{}+.
-% So similar as does longtable for \cs{LT@cols} we count the
-% numbers of ambersands instead.
-% \begin{macrocode}
-\cs_new:Npn \@@_determine_table_cols: {
- \seq_set_split:NnV\l_@@_tmpa_seq {&}\@preamble
- \tl_gset:Ne \g_@@_table_cols_tl { \seq_count:N \l_@@_tmpa_seq }
- \typeout{ ==>~ Table~ has~ \g_@@_table_cols_tl \space columns }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@arraycr}
-% Add code that figures out if the current table row is incomplete
-% (not enough \verb=&=s). It can then do extra actions, such as
-% inserting missing cell tags.
+% \begin{macro}{\@@_add_missing_cells:}
+% The storing and use of the number of missing cells must happen at
+% different places as the testing happens at the end of the last
+% cell of a row, but still inside that cell, so we use two
+% commands. The one adding is used in the row/end socket.
% \begin{macrocode}
-\protected\def\@arraycr{
- \relax
- \@@_store_missing_cells:n{@arraycr}
- %
- \iffalse{\fi\ifnum 0=`}\fi
- \@ifstar \@xarraycr \@xarraycr}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\@@_store_missing_cells:n,
-% \__tag_tbl_add_missing_cells:n}
-% The storing and use of the number of missing cells
-% must happen at different places as the testing happens at
-% the end of the last cell of a row, but
-% still inside that cell, so we use two commands. The second is used in
-% the endrow socket.
-% \begin{macrocode}
-\cs_new:Npn \@@_store_missing_cells:n #1 {
- \int_compare:nNnT \g_@@_col_int > 0
- {
- \int_gset:Nn \g_@@_missing_cells_int
- {
- \g_@@_table_cols_tl
- - \g_@@_col_int
- - \g_@@_span_tl
- + 1
- }
- \int_compare:nNnT \g_@@_missing_cells_int < 0 \ERROR % should not happen
- \typeout{==>~
- (#1)~
- This~ row~ needs~
- \int_use:N \g_@@_missing_cells_int \space
- additional~ cell(s)
- }
- }
-}
+\NewSocket{tbl/celldata/missingcount}{1}
+\NewSocketPlug{tbl/celldata/missingcount}{code}{\tbl_count_missing_cells:n{#1}}
+\AssignSocketPlug{tbl/celldata/missingcount}{code}
+
% \end{macrocode}
%
% \begin{macrocode}
-\cs_new:Npn \__tag_tbl_add_missing_cells:n #1
+\cs_new:Npn \@@_add_missing_cells:
{
% \end{macrocode}
-% The TD-socket messages are issued after the message about the end-row socket,
-% but the structure is ok, so better issue a message for now to avoid confusion:
+% The TD-socket messages are issued after the message about the
+% end-row socket, but the structure is ok, so better issue a
+% message for now to avoid confusion:
% \begin{macrocode}
- \int_compare:nNnT {#1}>{0}
- {
- \typeout{==>~
- ~Inserting~\int_eval:n{#1}~additional~cell(s)~into~previous~row:}
- }
- \int_step_inline:nn { #1 }
+ \int_compare:nNnT \g_@@_missing_cells_int > 0
{
- \UseSocket{tagsupport/tblcell/begin}
- \UseSocket{tagsupport/tblcell/end}
+ \@@_trace:n {==>~
+ ~Inserting~\int_use:N \g_@@_missing_cells_int \space
+ additional~cell(s)~into~previous~row:}
+ \int_step_inline:nn { \g_@@_missing_cells_int }
+ {
+ \UseTaggingSocket{tbl/cell/begin}
+ \UseTaggingSocket{tbl/cell/end}
+ }
}
}
% \end{macrocode}
@@ -1245,120 +1079,9 @@
%
%
%
-% \begin{macro}{\endarray}
-% If tables are nested into another then it is necessary to
-% restore information about the cell the inner table started
-% in. Otherwise, \cs{g_@@_row_int}, \cs{g_@@_col_int}, and
-% \cs{g_@@_span_tl} reflect the status in the outer table as they
-% are globally manipulated. We restore in all cases even if we are
-% not in a nesting situation as that makes the code simpler (and
-% probably faster).
-%
-% \cs{endtabular} and \cs{endtabular*} inherit from \cs{endarray}
-% so we only need to change that. \texttt{tabularx} is handled
-% below.
-% \begin{macrocode}
-\def\endarray{
- \@@_store_missing_cells:n{endarray}
- \crcr \egroup
- \UseSocket{tagsupport/tbl/finalize}
- \int_gset:Nn \g_@@_col_int { \l_@@_saved_col_tl }
- \int_gset:Nn \g_@@_row_int { \l_@@_saved_row_tl }
- \tl_gset_eq:NN \g_@@_span_tl \l_@@_saved_span_tl
- \tl_gset_eq:NN \g_@@_table_cols_tl \l_@@_saved_table_cols_tl
- \tl_gset_eq:NN \g_@@_struct_table_tl \l_@@_saved_struct_table_tl
- \seq_gset_eq:NN \g_@@_struct_rows_seq \l_@@_saved_struct_rows_seq
- \seq_gset_eq:NN \g_@@_struct_cells_seq\l_@@_saved_struct_cells_seq
- \seq_gset_eq:NN \g_@@_struct_cur_seq \l_@@_saved_struct_cur_seq
- \typeout{==>~ restored~cell~data:~
- \int_use:N \g_@@_row_int,
- \int_use:N \g_@@_col_int,
- \l_@@_saved_span_tl \space
- (
- \int_compare:nNnTF \g_@@_table_cols_tl = 0
- { outer~ level }
- { max:~ \g_@@_table_cols_tl }
- )
- }
- \egroup
- \@arrayright \gdef\@preamble{}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@addamp}
-% If we are after the first column we have to insert a \verb=&= and
-% also update the cell data.
-% \begin{macrocode}
-\def\@addamp {
- \if@firstamp
- \@firstampfalse
- \else
- \edef\@preamble{\@preamble &
- \@@_update_cell_data:
- }
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{
-% \g_@@_col_int,
-% \g_@@_row_int,
-% \g_@@_span_tl,
-% \g_@@_table_cols_tl}
-% \cs{g_@@_row_int} holds the current row number in the table. The value
-% \texttt{0} means we haven't yet processed the table preamble. It
-% is incremented by every \cs{cr} including the one ending the
-% table preamble.
-%
-% \cs{g_@@_col_int} holds the current column number. The value
-% \texttt{0} means we have not yet started the table or just finished a table row
-% (with \verb=\\= typically); any other positive value means we
-% are currently typesetting a cell in that column in some row
-% (denoted by the \cs{g_@@_row_int}.
%
-% In a \cs{multicolumn} it holds the column number of the first
-% spanned column and \cs{g_@@_span_tl} the info how many cells are
-% spanned.
-%
-% \cs{g_@@_span_tl} is normally \texttt{1} except in a
-% \cs{multicolumn} cell.
-% \begin{macrocode}
-\int_new:N \g_@@_col_int
-\int_new:N \g_@@_row_int
-\tl_new:N \g_@@_span_tl
-\tl_new:N \g_@@_table_cols_tl
-
-\tl_gset:Nn \g_@@_span_tl {1}
-\tl_gset:Nn \g_@@_table_cols_tl {0} % indicates outer level
-% \end{macrocode}
-% \end{macro}
%
%
-% \begin{macro}{\l_@@_saved_col_tl,\l_@@_saved_row_tl,
-% \l_@@_saved_span_tl,\l_@@_saved_table_cols_tl}
-%
-% Saving the outer values if we are nesting tables is necessary (as
-% the above variables are globally altered. For this we use always
-% token lists because they don't change and we do not need to blow
-% additional integer registers.
-% \begin{macrocode}
-\tl_new:N \l_@@_saved_col_tl
-\tl_new:N \l_@@_saved_row_tl
-\tl_new:N \l_@@_saved_span_tl
-\tl_new:N \l_@@_saved_table_cols_tl
-
-\tl_set:Nn \l_@@_saved_col_tl{0}
-\tl_set:Nn \l_@@_saved_row_tl{0}
-\tl_set:Nn \l_@@_saved_span_tl{1}
-\tl_set:Nn \l_@@_saved_table_cols_tl{0} % indicates outer level
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}
% {
% \g_@@_struct_table_tl, \l_@@_saved_struct_table_tl,
@@ -1390,474 +1113,53 @@
\seq_new:N \l_@@_saved_struct_cur_seq
% \end{macrocode}
% \end{macro}
+
+
+
+% \begin{macro}{\@@_init_struct_data:}
+% Save the global structure data variables locally so the we can
+% restore them when the table ends (important in case of nested
+% tables).
%
-% \begin{macro}{\ar@ialign}
-% A new command that replaces \cs{ialign} above. \cs{everycr} is
-% also applied to the \cs{cr} ending the preamble so we have to
-% program around that.
-% \begin{macrocode}
-\def\ar@ialign{%
-% \end{macrocode}
-% Before starting a table we locally stored the information related
-% to the current cell (if any) so that we can restore it once the
-% table is finished.
+% This is also the right point to initialize
+% them. \cs{g_@@_struct_table_tl} is set elsewhere.
% \begin{macrocode}
- \tl_set:No \l_@@_saved_col_tl {\int_use:N \g_@@_col_int }
- \tl_set:No \l_@@_saved_row_tl {\int_use:N \g_@@_row_int }
- \tl_set_eq:NN \l_@@_saved_span_tl \g_@@_span_tl
+\cs_new_protected:Npn \@@_init_struct_data: {
\tl_set_eq:NN \l_@@_saved_struct_table_tl \g_@@_struct_table_tl
\seq_set_eq:NN \l_@@_saved_struct_rows_seq \g_@@_struct_rows_seq
\seq_set_eq:NN \l_@@_saved_struct_cells_seq \g_@@_struct_cells_seq
\seq_set_eq:NN \l_@@_saved_struct_cur_seq \g_@@_struct_cur_seq
%
- \typeout{==>~ saved~cell~data:~
- \l_@@_saved_row_tl,
- \l_@@_saved_col_tl,
- \l_@@_saved_span_tl \space
- (
- \int_compare:nNnTF \l_@@_saved_table_cols_tl = 0
- { outer~ level }
- { max:~ \l_@@_saved_table_cols_tl }
- )
- }
-% \end{macrocode}
-% These are the initial values when starting a table:
-% \begin{macrocode}
- \int_gzero:N \g_@@_row_int
- \int_gzero:N \g_@@_col_int
- \tl_gset:Nn \g_@@_span_tl {1}
\seq_gclear:N\g_@@_struct_rows_seq
\seq_gclear:N\g_@@_struct_cells_seq
\seq_gclear:N\g_@@_struct_cur_seq
+}
% \end{macrocode}
-%
-% \begin{macrocode}
- \everycr{%
- \noalign{%
-% \end{macrocode}
-% We use \cs{g_@@_col_int} equal zero to indicate that we are just
-% after a TR (or at the very beginning of the table). Using the row
-% count is not so good as longtable may split the table in chunks.
-% \begin{macrocode}
- \int_compare:nNnT \g_@@_col_int > 0
- { \UseSocket{tagsupport/tblrow/end} }
- \int_gincr:N \g_@@_row_int % this row about to start
- \int_gzero:N \g_@@_col_int % we are before first col
- }%
- }%
- \tabskip\z@skip\halign}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\multicolumn}
-%
-% \cs{multicolumn} is also defined in \pkg{array}. The redefinition
-% has to solve two problems: it must handle the row begin if it is
-% used there, and it must save the numbers of cells it spans so
-% that we can add a suitable ColSpan attribute.\footnote{FMi: This can
-% now perhaps cleaned up somewhat}
-% \begin{macrocode}
-\long\def\multicolumn#1#2#3{%
- % alternative: determine first col with vmode test ...
- % \ifvmode
- % \multispan{#1}\typeout{A==> vmode}%
- % \else
- % \multispan{#1}\typeout{A==> not vmode}
- % \fi
- % but this makes the \crcr handling really complicated which would
- % then need to become something like
- % \ifvmode \expandafter \@gobble
- % \else \expandafter \@iden \fi {\cr\noalign{do something}}%
- % so not used.
- % Instead:
- \multispan{#1}\begingroup
-% \end{macrocode}
-% Insert rowbegin socket only if this multicolumn
-% replaces the preamble of the first column. In that case we have
-% to set \cs{g_@@_col_int} to 1 since this is no longer done in the
-% preamble for the cell.
-% \begin{macrocode}
- \int_compare:nNnTF \g_@@_col_int = 0
- {
- \UseSocket{tagsupport/tblrow/begin}
- \int_gset:Nn \g_@@_col_int {1}
- }
-% \end{macrocode}
-% If we are in a later column we use \cs{g_@@_span_tl} from the
-% previous column to update.
-% \begin{macrocode}
- {
- \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl }
- }
-% \end{macrocode}
-% Then we set the span value so that it can be use in the next column.
+% \end{macro}
+
+
+
+
+% \begin{macro}{\@@_restore_struct_data:}
+%
% \begin{macrocode}
- \tl_gset:Nn \g_@@_span_tl {#1}
+\cs_new_protected:Npn \@@_restore_struct_data: {
+ \tl_gset_eq:NN \g_@@_struct_table_tl \l_@@_saved_struct_table_tl
+ \seq_gset_eq:NN \g_@@_struct_rows_seq \l_@@_saved_struct_rows_seq
+ \seq_gset_eq:NN \g_@@_struct_cells_seq\l_@@_saved_struct_cells_seq
+ \seq_gset_eq:NN \g_@@_struct_cur_seq \l_@@_saved_struct_cur_seq
+}
% \end{macrocode}
+% \end{macro}
+
+
%
-% \begin{macrocode}
- \def\@addamp{\if@firstamp\@firstampfalse \else
- \@preamerr 5\fi}%
- \@mkpream{#2}\@addtopreamble\@empty
- \endgroup
-% \end{macrocode}
-% Now we update the colspan attribute. This needs setting after
-% the group as it is hidden inside the plug in \cs{insert@column}.
-% \begin{macrocode}
- \@@_set_colspan:n {#1}
-% \end{macrocode}
-% \begin{macrocode}
- \def\@sharp{#3}%
- \@arstrut \@preamble
- \null
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
%
% \subsection{longtable}
%
-% Longtable is complicated. When at the begin the \cs{endhead},
-% \cs{endfirsthead}, \cs{endfoot} and \cs{endlastfoot} are used to
-% setup head and foot they create each a structure subtree with one or
-% more rows. From this structures we want to keep at most two (head
-% and foot) and move the foot to the end of the table. When the head
-% and foot boxes are (re)inserted on following pages we want to mark
-% them up as artifact with the exception of the head at the begin and
-% the foot box at the end.
-%
-% TODO: When a line is killed the structure subtree is there already
-% too and must be removed.
-%
-% Hyperref patches longtable. This must be disabled and replace with
-% genuine code
-% \begin{macrocode}
-\let\@kernel@refstepcounter\refstepcounter
-\def\hyper@nopatch@longtable{}
-% \end{macrocode}
-% \begin{macrocode}
-\def\@@_patch_LT@array[#1]#2{%
-% \end{macrocode}
-% \cs{LT@array} is executed in a group, so we can disable para-tagging here.
-% \begin{macrocode}
- \UseSocket{tagsupport/tbl/init}%
- \@kernel@refstepcounter{table}\stepcounter{LT@tables}%
-% \end{macrocode}
-% The target is created rather late and a \cs{label} can come earlier,
-% so we have to define \cs{@currentHref} explicitly. We can't currently
-% assume that \cs{theHtable} is defined always.
-% \begin{macrocode}
- \tl_gset:Ne \@currentHref {table.\cs_if_exist_use:N\theHtable}
- \int_gzero:N \g_@@_row_int
- \seq_gclear:N\g_@@_struct_rows_seq
- \seq_gclear:N\g_@@_struct_cells_seq
- \seq_gclear:N\g_@@_struct_cur_seq
- \seq_gclear:N\g_@@_LT@firsthead_rows_seq
- \seq_gclear:N\g_@@_LT@head_rows_seq
- \seq_gclear:N\g_@@_LT@lastfoot_rows_seq
- \seq_gclear:N\g_@@_LT@foot_rows_seq
- \if l#1%
- \LTleft\z@ \LTright\fill
- \else\if r#1%
- \LTleft\fill \LTright\z@
- \else\if c#1%
- \LTleft\fill \LTright\fill
- \fi\fi\fi
- \let\LT@mcol\multicolumn
- \let\LT@@@@tabarray\@tabarray
- \let\LT@@@@hl\hline
- \def\@tabarray{%
- \let\hline\LT@@@@hl
- \LT@@@@tabarray}%
- \let\\\LT@tabularcr
- \let\tabularnewline\\%
- \def\newpage{\noalign{\break}}%
- \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
- \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
- \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
- \@tempdima\ht\strutbox
- \let\@endpbox\LT@endpbox
- \ifx\extrarowheight\@undefined
- \let\@acol\@tabacol
- \let\@classz\@tabclassz \let\@classiv\@tabclassiv
- \def\@startpbox{\vtop\LT@startpbox}%
- \let\@@@@startpbox\@startpbox
- \let\@@@@endpbox\@endpbox
- \let\LT@LL@FM@cr\@tabularcr
- \else
- \advance\@tempdima\extrarowheight
- \col@sep\tabcolsep
- \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
- \fi
- \setbox\@arstrutbox\hbox{\vrule
- \@height \arraystretch \@tempdima
- \@depth \arraystretch \dp \strutbox
- \@width \z@}%
- \let\@sharp##\let\protect\relax
- \begingroup
- \@mkpream{#2}%
- \@@_determine_table_cols:
- \xdef\LT@bchunk{%
-% \end{macrocode}
-% At the start of a chunk we set \cs{g_@@_col_int} to zero to make
-% sure that we aren't generating /TR with the \cs{cr} ending the
-% chunk preamble.
-% \begin{macrocode}
- \int_gzero:N \g_@@_col_int
- \global\advance\c@LT@chunks\@ne
- \global\LT@rows\z@\setbox\z@\vbox\bgroup
- \LT@setprevdepth
- \tabskip\LTleft \noexpand\halign to\hsize\bgroup
- \tabskip\z@ \@arstrut
-% \end{macrocode}
-% Insert the socket and the setting of the conditional
-% \begin{macrocode}
- \UseSocket{tagsupport/tblrow/begin}%
- \@@_init_cell_data:
-% \end{macrocode}
-% \begin{macrocode}
- \@preamble \tabskip\LTright \cr}%
- \endgroup
- \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
- \LT@make@row
- \m@th\let\par\@empty
-% \end{macrocode}
-% Socket and conditional
-% \begin{macrocode}
- \everycr{%
- \noalign{%
-% \end{macrocode}
-% In \pkg{longtable} we have a bunch of extra \cs{cr}s that are
-% executed whenever a chunk ends. In that case they should not
-% increment the main row counter, sigh.
-% \begin{macrocode}
- \typeout{--longtable-->~chunk~row:~ \the\LT@rows \space
- row:~ \the\g_@@_row_int \space
- column:~ \the\g_@@_col_int
- }
- \int_compare:nNnT \g_@@_col_int > 0
- {
- \UseSocket{tagsupport/tblrow/end}
- }
-% \end{macrocode}
-% This prevents any of the additional \cs{cr}s at the end of the
-% chunk to add another /TR. Then once we really start a new chunk
-% it gets incremented so\ldots
-% \begin{macrocode}
- \int_gzero:N \g_@@_col_int % before first col
-% \end{macrocode}
-% And for the same reason such \cs{cr}s should not increment the
-% main row counter (but it has to be incremented after the preamble
-% of a chunk), so here we test against \cs{LT@rows} which is
-% \cs{LTchunksize} at the end of a chunk.
-% \begin{macrocode}
- \int_compare:nNnT \LT@rows < \LTchunksize
- { \int_gincr:N \g_@@_row_int } % this row about to start
- }%
- }%
-% \end{macrocode}
-% \begin{macrocode}
- \lineskip\z@\baselineskip\z@
- \LT@bchunk}
-% \end{macrocode}
-% The end code most stop to insert the endrow too.
-% \begin{macrocode}
-\def\@@_patch_endlongtable{%
- \@@_store_missing_cells:n{endlongtable}
- \crcr
- \noalign{%
- \UseSocket{tagsupport/tbl/finalize/longtable}
- \int_gzero:N \g_@@_row_int % this prevents considering the next
- % \crcr as another row end.
- \let\LT@entry\LT@entry@chop
- \xdef\LT@save@row{\LT@save@row}}%
- \LT@echunk
- \LT@start
- \unvbox\z@
- \LT@get@widths
- \if@filesw
- {\let\LT@entry\LT@entry@write\immediate\write\@auxout{%
- \gdef\expandafter\noexpand
- \csname LT@\romannumeral\c@LT@tables\endcsname
- {\LT@save@row}}}%
- \fi
- \ifx\LT@save@row\LT@@@@save@row
- \else
- \LT@warn{Column~\@width s~have~changed\MessageBreak
- in~table~\thetable}%
- \LT@final@warn
- \fi
- \endgraf\penalty -\LT@end@pen
- \ifvoid\LT@foot\else
- \global\advance\vsize\ht\LT@foot
- \global\advance\@colroom\ht\LT@foot
- \dimen@\pagegoal\advance\dimen@\ht\LT@foot\pagegoal\dimen@
- \fi
- \endgroup
- \global\@mparbottom\z@
- \endgraf\penalty\z@\addvspace\LTpost
- \ifvoid\footins\else\insert\footins{}\fi}
-% \end{macrocode}
-%
-%
-%
-% \begin{macro}{\@@_patch_LT@t@bularcr}
-%
-% \begin{macrocode}
-\def\@@_patch_LT@t@bularcr{%
- \global\advance\LT@rows\@ne
- \ifnum\LT@rows=\LTchunksize
-% \end{macrocode}
-% At the end of the chunk \verb=\\= is doing something special and
-% so we loose \cs{@@_store_missing_cells:n}. Below is about the
-% right place to add it do this code branch.
-% \begin{macrocode}
- \@@_store_missing_cells:n{echunk}
- \gdef\LT@setprevdepth{%
- \prevdepth\z@
- \global\let\LT@setprevdepth\relax}%
- \expandafter\LT@xtabularcr
- \else
- \ifnum0=`{}\fi
- \expandafter\LT@LL@FM@cr
- \fi}
-
-% \end{macrocode}
-% \end{macro}
-%
%
%
-% \begin{macro}{\@@_patch_LT@end@hd@ft}
-% This command is used to store the head and foot boxes.
-% We need to retrieve and store the row so that we can clean
-% up the structure in the finalize code.
-% \begin{macrocode}
-\def\@@_patch_LT@end@hd@ft#1{%
-% \end{macrocode}
-% To handle missing columns in the header we need this:
-% \begin{macrocode}
- \__tbl_store_missing_cells:n{head/foot}
- \int_step_inline:nn
- { \LT@rows + 1 }
- {
- \seq_gput_left:ce
- {g_@@_\cs_to_str:N #1 _rows_seq }
- { \int_eval:n {\g_@@_row_int + 1 - ##1 } }
- }
-% \end{macrocode}
-% We also have to set the chunk rows to its max value before
-% calling \cs{LTechunk} so that we don't get extra increments of
-% the main row counter due to \cs{everycr}.
-% \begin{macrocode}
- \int_gset:Nn \LT@rows { \LTchunksize }
- \LT@echunk
- \ifx\LT@start\endgraf
- \LT@err
- {Longtable head or foot not at start of table}%
- {Increase LTchunksize}%
- \fi
- \setbox#1\box\z@
- \LT@get@widths
- \LT@bchunk}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\@@_patch_LT@start}
-% \begin{macrocode}
-\def\@@_patch_LT@start{%
- \let\LT@start\endgraf
- \endgraf\penalty\z@\vskip\LTpre\endgraf
- \ifdim \pagetotal<\pagegoal \else
- \dimen@=\pageshrink
- \advance \dimen@ 1sp %
- \kern\dimen@\penalty 9999\endgraf \kern-\dimen@
- \fi
- \dimen@\pagetotal
- \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
- \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
- \advance\dimen@ \ht\LT@foot
- \edef\LT@reset@vfuzz{\vfuzz\the\vfuzz\vbadness\the\vbadness\relax}%
- \vfuzz\maxdimen
- \vbadness\@M
- \setbox\tw@\copy\z@
- \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
- \setbox\tw@\vbox{\unvbox\tw@}%
- \LT@reset@vfuzz
- \advance\dimen@ \ht
- \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
- \advance\dimen@\dp
- \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
- \advance\dimen@ -\pagegoal
- \ifdim \dimen@>\z@
- \vfil\break
- \else
- \ifdim\pageshrink>\z@\pageshrink\z@\fi
- \fi
- \global\@colroom\@colht
- \ifvoid\LT@foot\else
- \global\advance\vsize-\ht\LT@foot
- \global\advance\@colroom-\ht\LT@foot
- \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
- \maxdepth\z@
- \fi
- \MakeLinkTarget{table}
- \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
-% \end{macrocode}
-% Avoid that following uses of the box add content:
-% \begin{macrocode}
- \tagmcbegin{artifact}
- \tag_mc_reset_box:N\LT@head
- \tagmcend
- \output{\LT@output}}
-% \end{macrocode}
-% \end{macro}
-%
%
-% \begin{macro}{\@@_patch_LT@output}
-% We must also avoid that the reuse of the foot box leads to
-% duplicated content:
-% \begin{macrocode}
-\def\@@_patch_LT@output{%
- \ifnum\outputpenalty <-\@Mi
- \ifnum\outputpenalty > -\LT@end@pen
- \LT@err{floats and marginpars not allowed in a longtable}\@ehc
- \else
- \setbox\z@\vbox{\unvbox\@cclv}%
- \ifdim \ht\LT@lastfoot>\ht\LT@foot
- \dimen@\pagegoal
- \advance\dimen@\ht\LT@foot
- \advance\dimen@-\ht\LT@lastfoot
- \ifdim\dimen@<\ht\z@
- \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
- \@makecol
- \@outputpage
- \global\vsize\@colroom
- \setbox\z@\vbox{\box\LT@head}%
- \fi
- \fi
- \unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi
-% \end{macrocode}
-% Reset attribute of foot box:
-% \begin{macrocode}
- \tagmcbegin{artifact}
- \tag_mc_reset_box:N \LT@foot
- \tagmcend
- \fi
- \else
- \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
-% \end{macrocode}
-% Reset attribute of foot box:
-% \begin{macrocode}
- \tagmcbegin{artifact}
- \tag_mc_reset_box:N \LT@foot
- \tagmcend
- \@makecol
- \@outputpage
- \global\vsize\@colroom
- \copy\LT@head\nobreak
- \fi}
-% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\@@_patch_\LT@makecaption}
% This patch is quite similar to the one for LaTeX's \cs{@makecaption}
@@ -1893,74 +1195,11 @@
% \begin{macrocode}
\AddToHook{package/longtable/after}
{
- \seq_new:N \g_@@_LT@firsthead_rows_seq
- \seq_new:N \g_@@_LT@head_rows_seq
- \seq_new:N \g_@@_LT@lastfoot_rows_seq
- \seq_new:N \g_@@_LT@foot_rows_seq
- \cs_set_eq:NN \LT@array\@@_patch_LT@array
- \cs_set_eq:NN \endlongtable\@@_patch_endlongtable
- \cs_set_eq:NN \LT@start\@@_patch_LT@start
- \cs_set_eq:NN \LT@output\@@_patch_LT@output
- \cs_set_eq:NN \LT@t@bularcr\@@_patch_LT@t@bularcr
- \cs_set_eq:NN \LT@end@hd@ft\@@_patch_LT@end@hd@ft
\cs_set_eq:NN \LT@makecaption\@@_patch_LT@makecaption
}
% \end{macrocode}
-
-
-
-% \subsection{tabularx}
-%
-% In tabularx we mainly need to ensure that no tagging is done during
-% the trial.
-%
-% \begin{macrocode}
-\def\@@_patch_TX@endtabularx{%
- \expandafter\expandafter\expandafter
- \TX@find@endtabularxa\csname end\TX@\endcsname
- \endtabularx\TX@\endtabularx\TX@find@endtabularxa
- \expandafter\TX@newcol\expandafter{\tabularxcolumn{\TX@col@width}}%
- \let\verb\TX@verb
- \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
- \edef\TX@ckpt{\cl@@@@ckpt}%
- \let\@elt\relax
- \TX@old@table\maxdimen
- \TX@col@width\TX@target
- \global\TX@cols\@ne
- \TX@typeout@
- {\@spaces Table Width\@spaces Column Width\@spaces X Columns}%
-% \end{macrocode}
-% Here we stop tagging:
-% \begin{macrocode}
- \tag_stop:n{tabularx}
- \TX@trial{\def\NC@rewrite@X{%
- \global\advance\TX@cols\@ne\NC@find p{\TX@col@width}}}%
- \loop
- \TX@arith
- \ifTX@
- \TX@trial{}%
- \repeat
-% \end{macrocode}
-% And now we restart it again.
-% \begin{macrocode}
- \tag_start:n{tabularx}
- {\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext
- \csname tabular*\expandafter\endcsname\expandafter\TX@target
- \the\toks@
- \csname endtabular*\endcsname}%
- \global\TX@ftn\expandafter{\expandafter}\the\TX@ftn
- \ifnum0=`{\fi}%
- \expandafter\expandafter\expandafter
- \TX@find@endtabularxbb
- \expandafter\end\expandafter{\TX@}%
- \endtabularx\TX@\endtabularx\TX@find@endtabularxb
-}
-
-\AddToHook{package/tabularx/after}
- {\cs_set_eq:NN \TX@endtabularx\@@_patch_TX@endtabularx }
-% \end{macrocode}
% \begin{macrocode}
%</package>
% \end{macrocode}
@@ -1973,3 +1212,11 @@
\RequirePackage{latex-lab-testphase-table}
%</latex-lab>
% \end{macrocode}
+
+% \begin{macrocode}
+%<*latex-lab-alias>
+\ProvidesFile{tabular-latex-lab-testphase.ltx}
+ [\ltlabtbldate\space v\ltlabtblversion\space latex-lab wrapper tabular]
+\RequirePackage{latex-lab-testphase-table}
+%</latex-lab-alias>
+% \end{macrocode}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-table.pdf b/macros/latex-dev/required/latex-lab/latex-lab-table.pdf
index 997db2d1a7..a8c827c2e6 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-table.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-table.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 b2ed5ecf8a..ca3afe896d 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-2023 The LaTeX Project
+% Copyright (C) 2021-2024 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
@@ -79,7 +79,7 @@
% \begin{macrocode}
%<*phase-III>
\ProvidesFile{phase-III-latex-lab-testphase.ltx}
- [2023-07-20 v0.1b latex-lab wrapper phase-III]
+ [2024-02-12 v0.1c latex-lab wrapper phase-III]
\input{phase-II-latex-lab-testphase.ltx}
\IfFormatAtLeastTF{2023-06-01}
{
@@ -91,6 +91,7 @@
\RequirePackage{latex-lab-testphase-float}
\RequirePackage{latex-lab-testphase-bib}
\RequirePackage{latex-lab-testphase-text}
+ \RequirePackage{latex-lab-testphase-marginpar}
}
{\PackageWarning{latex-lab}{Testphase III needs newer format}{}}
%</phase-III>
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 c65847a04f..e10f2c04f1 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-text.dtx b/macros/latex-dev/required/latex-lab/latex-lab-text.dtx
index 4041336ecb..fe9b6ababc 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-text.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-text.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-text.dtx (C) Copyright 2023 LaTeX Project
+%% File: latex-lab-text.dtx (C) Copyright 2023-2024 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
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-text.pdf b/macros/latex-dev/required/latex-lab/latex-lab-text.pdf
index a4e26db75f..6847dff5a4 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-text.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-text.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-title.dtx b/macros/latex-dev/required/latex-lab/latex-lab-title.dtx
new file mode 100644
index 0000000000..757bb284a4
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-title.dtx
@@ -0,0 +1,518 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-title.dtx (C) Copyright 2023-2024 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\ltlabtitledate{2024-02-09}
+\def\ltlabtitleversion{0.85c}
+
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-title.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \title{The \textsf{latex-lab-title} package\\
+% Changes related to the tagging of the title}
+% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}}
+% \date{v\ltlabtitleversion\ \ltlabtitledate}
+%
+% \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}
+%
+% This module contains changes to improve the tagging (in the standard classes) of
+% the title created with the \cs{maketitle} command. It also improves the
+% setting of the metadata related to the title and the author.
+%
+% For basic tagging of the printed title there are basically three things to do:
+%
+% \begin{itemize}
+% \item The actual title should be tagged with the \texttt{Title} tag.
+% \item The tabular used to format the author list should \emph{not} be tagged as a tabular.
+% \item \cs{maketitle} redefines footnote internals. These must be made tagging aware.
+% \end{itemize}
+%
+% A second task related to title is to store the authors and the title text
+% (or a shorter version) inside the XMP-metadata and (in PDF 1.7 or lower) in
+% the Info dictionary. Currently this can only be set if hyperref
+% is loaded and requires the use of the \texttt{pdftitle} and \texttt{pdfauthor} keys.
+% The new code therefore extends the \cs{title} and \cs{author} commands: They
+% stores their argument and use them at the end of the document
+% for the PDF metadata if the data hasn't been given in another way.
+% The code also gives \cs{title} and \cs{author}
+% an optional argument where the PDF title or author can be given with
+% in a key-value syntax. As with hyperref it is possible to store titles
+% in more than one language:
+%
+% \begin{verbatim}
+% \title
+% [pdftitle =
+% {[en]English Title,[de] Deutscher Titel,[fr]{titre français, avec comma}}]
+% {Document title}
+% \end{verbatim}
+%
+% It is also possible to set a subtitle which is then stored in the XMP-metadata:
+%
+% \begin{verbatim}
+% \title
+% [pdfsubtitle =
+% {[en]English Subtitle,[de] Deutscher Subtitel,[fr]{subtitre français, avec comma}}]
+% {Document title}
+% \end{verbatim}
+
+%
+% If using the \texttt{pdfauthor} key authors should be separated
+% by commas, and to hide commas in a name inside braces if needed:
+%
+% \begin{verbatim}
+% \author[pdfauthor = {Bär, Peter Anteater, {Riley, the sloth}}]{\ldots}
+% \end{verbatim}
+%
+% If hyperref is loaded there is no difference to the \texttt{pdftitle} and
+% \texttt{pdfauthor} key used in \cs{hypersetup}. Both can be used (and the last
+% key used will win).
+%
+% \subsection{Open questions and TODOs}
+%
+% \begin{itemize}
+% \item Writing into the Info dictionary needs to convert the input into a PDF string.
+% This is here done with a simple version of hyperref's \cs{pdfstringdef}, similar code
+% exist also in in the generic hyperref driver. This should be moved into a better place
+% module.
+%
+% \item Is it sensible to enhance \cs{author} and \cs{title} with an optional argument as done here?
+% An advantage is that it is rather light-weight and
+% doesn't require to decide how this values should be set in \cs{DocumentMetadata} (and would also work
+% without \cs{DocumentMetadata}. But a problem could be that various classes and packages already
+% extend this commands with other optional arguments.
+%
+% \item Some of the definitions related to metadata should perhaps be moved into l3pdfmeta.
+%
+% \item Are the names \texttt{pdftitle} and \texttt{pdfauthor} ok?
+%
+% \item The patch for \cs{thanks} to get a rlap-footnotemarker looks wrong. This
+% probably means that some configuration option is missing in the footnote code.
+% \end{itemize}
+%
+%
+%
+% \section{Implementation}
+% \begin{macrocode}
+%<*package>
+%<@@=tag>
+% \end{macrocode}
+% \begin{macrocode}
+\ProvidesExplPackage {latex-lab-testphase-title} {\ltlabtitledate} {\ltlabtitleversion}
+ {Changes related to the tagging of the title}
+% \end{macrocode}
+%
+% \subsection{\cs{maketitle} in article class}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_thanks:n #1
+ {
+ \rlap{\footnotemark}
+ \protected@xdef\@thanks{\@thanks
+ \protect\footnotetext[\the\c@footnote]{#1}}
+ }
+% \end{macrocode}
+% The no-titlepage version of article, report and book
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_maketitle:
+ {
+ \par
+ \begingroup
+% \end{macrocode}
+% Disable table tagging
+% \begin{macrocode}
+ \cs_if_exist_use:N\__tag_tbl_disable:
+ \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+% \end{macrocode}
+% the original definition redefines \cs{@makefnmark} and
+% \cs{@makefntext} to get an rlap-mark in the text without
+% affecting the mark in the note (which gives by the way
+% a wrong link area with hyperref). There seem to be currently
+% no good way in the footnote to configure this, so we redefine
+% \cs{thanks} instead
+% \begin{macrocode}
+ \cs_set_eq:NN \thanks \@@_patch_thanks:n
+ \if@twocolumn
+ \ifnum \col@number=\@ne
+ \@maketitle
+ \else
+ \twocolumn[\@maketitle]%
+ \fi
+ \else
+ \newpage
+ \global\@topnum\z@ % Prevents figures from going at top of page.
+ \@maketitle
+ \fi
+ \thispagestyle{plain}\@thanks
+ \endgroup
+ \setcounter{footnote}{0}%
+ \global\let\thanks\relax
+ \global\let\maketitle\relax
+ \global\let\@maketitle\relax
+ \global\let\@thanks\@empty
+ \global\let\@author\@empty
+ \global\let\@date\@empty
+ \global\let\@title\@empty
+ \global\let\title\relax
+ \global\let\author\relax
+ \global\let\date\relax
+ \global\let\and\relax
+ }
+% \end{macrocode}
+% We must also change \cs{@maketitle} to insert a Title tag
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_@maketitle:
+ {
+ \newpage
+ \null
+ \vskip 2em%
+ \begin{center}%
+ \let \footnote \thanks
+% \end{macrocode}
+% use Title around the title. As in PDF 1.7 this is
+% rolemapped to P we change the text-unit tag there.
+% \begin{macrocode}
+ \pdf_version_compare:NnTF > {1.7}
+ {{\LARGE \tag_struct_begin:n{tag=Title}\@title \par\tag_struct_end:}}
+ {{\LARGE \tagtool{paratag=Title}\@title \par}}%
+ \vskip 1.5em%
+ {\large
+ \lineskip .5em%
+ \begin{tabular}[t]{c}%
+ \@author
+ \end{tabular}\par}%
+ \vskip 1em%
+ {\large \@date}%
+ \end{center}%
+ \par
+ \vskip 1.5em
+ }
+
+% \end{macrocode}
+% The titlepage variant
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_maketitle_page:
+ {\begin{titlepage}%
+% \end{macrocode}
+% disable table tagging
+% \begin{macrocode}
+ \cs_if_exist_use:N\__tag_tbl_disable:
+ \let\footnotesize\small
+ \let\footnoterule\relax
+ \let \footnote \thanks
+ \null\vfil
+ \vskip 60\p@
+% \end{macrocode}
+% use Title around the title. As in PDF 1.7 this is
+% rolemapped to P we change the text-unit tag there.
+% \begin{macrocode}
+ \begin{center}%
+ \pdf_version_compare:NnTF > {1.7}
+ {{\LARGE \tag_struct_begin:n{tag=Title}\@title \par\tag_struct_end:}}
+ {{\LARGE \tagtool{paratag=Title}\@title \par}}%
+ \vskip 3em%
+ {\large
+ \lineskip .75em%
+ \begin{tabular}[t]{c}%
+ \@author
+ \end{tabular}\par}%
+ \vskip 1.5em%
+ {\large \@date \par}% % Set date in \large size.
+ \end{center}\par
+ \@thanks
+ \vfil\null
+ \end{titlepage}%
+ \setcounter{footnote}{0}%
+ \global\let\thanks\relax
+ \global\let\maketitle\relax
+ \global\let\@thanks\@empty
+ \global\let\@author\@empty
+ \global\let\@date\@empty
+ \global\let\@title\@empty
+ \global\let\title\relax
+ \global\let\author\relax
+ \global\let\date\relax
+ \global\let\and\relax
+ }
+
+% \end{macrocode}
+% Map the new commands onto \cs{maketitle}:
+% \begin{macrocode}
+\AddToHook{class/article/after}
+ {
+ \if@titlepage
+ \cs_set_eq:NN \maketitle \@@_patch_maketitle_page:
+ \else
+ \cs_set_eq:NN \maketitle \@@_patch_maketitle:
+ \cs_set_eq:NN \@maketitle \@@_patch_@maketitle:
+ \fi
+ }
+\AddToHook{class/report/after}
+ {
+ \if@titlepage
+ \cs_set_eq:NN \maketitle \@@_patch_maketitle_page:
+ \else
+ \cs_set_eq:NN \maketitle \@@_patch_maketitle:
+ \cs_set_eq:NN \@maketitle \@@_patch_@maketitle:
+ \fi
+ }
+\AddToHook{class/book/after}
+ {
+ \if@titlepage
+ \cs_set_eq:NN \maketitle \@@_patch_maketitle_page:
+ \else
+ \cs_set_eq:NN \maketitle \@@_patch_maketitle:
+ \cs_set_eq:NN \@maketitle \@@_patch_@maketitle:
+ \fi
+ }
+% \end{macrocode}
+%
+% \subsection{Helper commands to set metadata}
+%
+% Some temp variables
+% \begin{macrocode}
+\str_new:N \g_@@_title_tmpa_str
+\str_new:N \l_@@_title_tmpa_str
+\tl_new:N \l_@@_title_tmpa_tl
+\seq_new:N \l_@@_title_tmpa_seq
+% \end{macrocode}
+% Support for \cs{texorpdfstring}
+% \begin{macrocode}
+\providecommand\texorpdfstring[2]{#1}%
+% \end{macrocode}
+%
+% A helper command to convert the title into a pdfstring similar to
+% \cs{pdfstringdef}.
+% As we use \cs{text_purify} we must ensure that the default definitions
+% of \cs{@title} and \cs{@author} are robust:
+% \begin{macrocode}
+\protected\def\@title{\@latex@error{No \noexpand\title given}\@ehc}
+\protected\def\@author{\@latex@warning@no@line{No \noexpand\author given}}
+% \end{macrocode}
+% TODO: This should be improved and moved into the pdf module so that
+% it is generally available.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_title_pdfstring:nnN #1 #2 #3 % #1 text, #2 e.g. utf16/hex
+ {
+ \group_begin:
+% \end{macrocode}
+% TODO: we need probably a common boolean to handle
+% \cs{texorpdfstring} also without hyperref.
+% \begin{macrocode}
+ \cs_set_eq:NN\texorpdfstring\use_ii:nn
+ \str_set:Ne \l_@@_title_tmpa_str {\text_purify:n { #1 } }
+ \pdf_string_from_unicode:nVN { #2 } \l_@@_title_tmpa_str \l_@@_title_tmpa_str
+ \str_gset_eq:NN \g_@@_title_tmpa_str\l_@@_title_tmpa_str
+ \group_end:
+ \str_set_eq:NN #3 \g_@@_title_tmpa_str
+ }
+\cs_generate_variant:Nn\@@_title_pdfstring:nnN {e}
+% \end{macrocode}
+
+% \subsection{Extend title to set metadata}
+% At first a variable to store the title, as \cs{@title} is emptied by \LaTeX.
+% \begin{macrocode}
+\tl_new:N \g_@@_title_title_tl
+% \end{macrocode}
+% Now we redefine \cs{title} so that it stores the title, and processes
+% keys in the optional argument. We use \texttt{hyp} as module
+% name for the key as this means that if hyperref is loaded its definition
+% of \texttt{pdftitle} will be used -- at some time probably this
+% should be moved out of hyperref so that we have only one definition.
+%
+% \begin{macrocode}
+\RenewDocumentCommand\title{O{}m}
+ {
+ \gdef\@title{#2}
+ \tl_gset_eq:NN\g_@@_title_title_tl\@title
+ \keys_set:nn {hyp}{#1}
+ }
+% \end{macrocode}
+% Now we define the \texttt{pdftitle} key. This is more or less
+% the same definition as in the generic hyperref driver.
+% \begin{macrocode}
+\regex_new:N\l_@@_title_optlang_regex
+\regex_set:Nn\l_@@_title_optlang_regex {\A\[([A-Za-z\-]+)\](.*)}
+\cs_generate_variant:Nn \regex_extract_once:NnN{NVN}
+\cs_generate_variant:Nn \clist_item:nn {on}
+% \end{macrocode}
+% and now the keys.
+% \begin{macrocode}
+\keys_define:nn { hyp }
+ {
+ pdftitle .code:n =
+ {
+ \tl_if_blank:nTF {#1}
+ {
+ \pdfmanagement_remove:nn {Info}{Title}
+ }
+ {
+ \tl_set:Ne\l_@@_title_tmpa_tl {\clist_item:on{#1}{1}}
+ \regex_extract_once:NVN
+ \l_@@_title_optlang_regex
+ \l_@@_title_tmpa_tl
+ \l_@@_title_tmpa_seq
+ \seq_if_empty:NTF\l_@@_title_tmpa_seq
+ {
+ \@@_title_pdfstring:nnN {#1}{utf16/hex}\l_@@_title_tmpa_str
+ }
+ {
+ \@@_title_pdfstring:enN
+ {\seq_item:Nn \l_@@_title_tmpa_seq{3}}{utf16/hex}\l_@@_title_tmpa_str
+ }
+ \str_if_eq:VnF\l_@@_title_tmpa_str{<FEFF>}
+ {
+ \pdfmanagement_add:nne {Info}{Title}{\l_@@_title_tmpa_str}
+ }
+ }
+ \AddToDocumentProperties[hyperref]{pdftitle}{#1}
+ }
+ ,pdfsubtitle .code:n = { \AddToDocumentProperties[hyperref]{pdfsubtitle}{#1} }
+ }
+% \end{macrocode}
+%
+% \subsection{Extend \cs{author} to set metadata}
+%
+% At first a variable to store the authors, as \cs{@author} is emptied by \LaTeX.
+% \begin{macrocode}
+\tl_new:N \g_@@_title_author_tl
+% \end{macrocode}
+% Now we redefine \cs{author} so that it stores the authors, and processes
+% keys in the optional argument. We use \texttt{hyp} as module
+% name for the key as this means that if hyperref is loaded its definition
+% of \texttt{pdfauthor} will be used -- at some time probably this
+% should be moved out of hyperref so that we have only one definition.
+%
+% \begin{macrocode}
+\RenewDocumentCommand\author{O{}m}
+ {
+ \gdef\@author{#2}
+ \tl_gset_eq:NN\g_@@_title_author_tl\@author
+ \keys_set:nn {hyp}{#1}
+ }
+% \end{macrocode}
+%
+% Now we define the \texttt{pdfauthor} key. This is more or less
+% the same definition as in the generic hyperref driver.
+
+% \begin{macrocode}
+\keys_define:nn { hyp }
+ {
+ pdfauthor .code:n =
+ {
+ \tl_if_blank:nTF {#1}
+ {
+ \pdfmanagement_remove:nn {Info}{Author}
+ }
+ {
+ \tl_set:Ne\l_@@_title_tmpa_tl {\clist_item:on{#1}{1}}
+ \regex_extract_once:NVN
+ \l_@@_title_optlang_regex
+ \l_@@_title_tmpa_tl
+ \l_@@_title_tmpa_seq
+ \seq_if_empty:NTF\l_@@_title_tmpa_seq
+ {
+ \@@_title_pdfstring:nnN {#1}{utf16/hex}\l_@@_title_tmpa_str
+ }
+ {
+ \@@_title_pdfstring:enN
+ {\seq_item:Nn \l_@@_title_tmpa_seq{3}}{utf16/hex}\l_@@_title_tmpa_str
+ }
+ \str_if_eq:VnF\l_@@_title_tmpa_str{<FEFF>}
+ {
+ \pdfmanagement_add:nne {Info}{Author}{\l_@@_title_tmpa_str}
+ }
+ }
+ \AddToDocumentProperties[hyperref]{pdfauthor}{#1}
+ }
+ }
+% \end{macrocode}
+% \subsection{Fallback for classes and packages that redefine \cs{title} or \cs{author}}
+% If a class redefines \cs{author} and \cs{title} again, we try to retrieve at
+% least the values.
+% \begin{macrocode}
+\AddToHook{cmd/maketitle/before}
+ {
+ \tl_gset_eq:NN \g_@@_title_author_tl\@author
+ \tl_gset_eq:NN \g_@@_title_title_tl\@title
+ }
+% \end{macrocode}
+%
+% \subsection{Finalize document}
+% At last we set the title and the author at the end of document
+% if that hasn't happened yet:
+% \begin{macrocode}
+\AddToHook{shipout/lastpage}
+ {
+ \tl_if_empty:eT{\GetDocumentProperties{hyperref/pdftitle}}
+ {
+ \group_begin:
+ \cs_set_eq:NN\thanks \use_none:n
+ \str_set:Ne \l_@@_title_tmpa_str {\text_purify:n { \g_@@_title_title_tl } }
+ \keys_set:ne{hyp}{pdftitle={\exp_not:V\l_@@_title_tmpa_str}}
+ \group_end:
+ }
+ \tl_if_empty:eT{\GetDocumentProperties{hyperref/pdfauthor}}
+ {
+ \group_begin:
+ \cs_set_eq:NN\thanks \use_none:n
+ \cs_set:Npn \and {,}
+ \str_set:Ne \l_@@_title_tmpa_str {\text_purify:n { \g_@@_title_author_tl } }
+ \keys_set:ne{hyp}{pdfauthor={\exp_not:V\l_@@_title_tmpa_str}}
+ \group_end:
+ }
+% \end{macrocode}
+% force display title, if an UA-standard is detected.
+% \begin{macrocode}
+ \tl_if_empty:eF{\GetDocumentProperties{document/pdfstandard-UA}}
+ {
+ \pdfmanagement_add:nnn {Catalog / ViewerPreferences } { DisplayDocTitle } { true }
+ }
+ }
+\DeclareHookRule{shipout/lastpage}{latex-lab-testphase-title}{before}{pdfmanagement-testphase}
+%</package>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*latex-lab>
+\ProvidesFile{title-latex-lab-testphase.ltx}
+ [\ltlabtitledate\space v\ltlabtitleversion\space
+ Changes related to the tagging of the title]
+
+\RequirePackage{latex-lab-testphase-title}
+
+%</latex-lab>
+% \end{macrocode}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-title.pdf b/macros/latex-dev/required/latex-lab/latex-lab-title.pdf
new file mode 100644
index 0000000000..2e60580ba6
--- /dev/null
+++ b/macros/latex-dev/required/latex-lab/latex-lab-title.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
index 2f00b83c05..ff9dd950b7 100644
--- 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
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-toc-hyperref-changes.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-toc-hyperref-changes.dtx (C) Copyright 2022-2024 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
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
index 161e96f338..6fdcf836af 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf
Binary files 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
index 81c9edfe4d..bb88ffdcb0 100644
--- 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
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2024 LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -17,8 +17,8 @@
% for those people who are interested or want to report an issue.
%
% dates for latex-lab-kernel-changes.sty (pulled from various sources, see ins)
-\def\ltlabkerneldate{2023-10-16}
-\def\ltlabkernelversion{0.85b}
+\def\ltlabkerneldate{2024-02-12}
+\def\ltlabkernelversion{0.85c}
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
@@ -235,7 +235,7 @@
\makeatletter
\@starttoc@cfgpoint@before{#1}%
\@input{\jobname.#1}%
- \@starttoc@cfgpoint@after{#1}
+ \@starttoc@cfgpoint@after{#1}%
\if@filesw
\expandafter\newwrite\csname tf@#1\endcsname
\immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
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
index 0a78ca15d9..de2dd29b50 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf
Binary files differ
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc.dtx b/macros/latex-dev/required/latex-lab/latex-lab-toc.dtx
index 6def505e11..7235eb9ed9 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-toc.dtx
+++ b/macros/latex-dev/required/latex-lab/latex-lab-toc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex-lab-toc.dtx (C) Copyright 2022-2023 LaTeX Project
+%% File: latex-lab-toc.dtx (C) Copyright 2022-2024 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
@@ -271,7 +271,7 @@
{ \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}}
+ \seq_gpush:Ne \g_@@_toc_stack_seq {{TOC}\use:c{toclevel@#1}}
\tag_struct_begin:n{tag=TOC}
}
% \end{macrocode}
@@ -298,7 +298,7 @@
% \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}}}
+ \exp_args:Ne \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.
@@ -307,9 +307,9 @@
% need to store fake names.
% \end{NOTE}
% \begin{macrocode}
- \prop_gput:Nxx \g_@@_struct_ref_by_dest_prop
+ \prop_gput:Nee \g_@@_struct_ref_by_dest_prop
{ \tag_get:n {struct_num} }{#3}
- \seq_gpush:Nx \g_@@_toc_stack_seq {{TOCI}\use:c{toclevel@#1}}
+ \seq_gpush:Ne \g_@@_toc_stack_seq {{TOCI}\use:c{toclevel@#1}}
\group_end:
}
}
diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc.pdf b/macros/latex-dev/required/latex-lab/latex-lab-toc.pdf
index eafeeec42e..38122e3322 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab-toc.pdf
+++ b/macros/latex-dev/required/latex-lab/latex-lab-toc.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 548f18a6fa..7071ed6e3d 100644
--- a/macros/latex-dev/required/latex-lab/latex-lab.ins
+++ b/macros/latex-dev/required/latex-lab/latex-lab.ins
@@ -154,8 +154,16 @@ where one can also log issues in case there are any.
%table
\generate{\file{table-latex-lab-testphase.ltx}{\from{latex-lab-table.dtx}{latex-lab}}}
+\generate{\file{tabular-latex-lab-testphase.ltx}{\from{latex-lab-table.dtx}{latex-lab-alias}}}
\generate{\file{latex-lab-testphase-table.sty}{\from{latex-lab-table.dtx}{package}}}
+%title
+\generate{\file{title-latex-lab-testphase.ltx}{\from{latex-lab-title.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-title.sty}{\from{latex-lab-title.dtx}{package}}}
+
+%marginpar
+\generate{\file{marginpar-latex-lab-testphase.ltx}{\from{latex-lab-marginpar.dtx}{latex-lab}}}
+\generate{\file{latex-lab-testphase-marginpar.sty}{\from{latex-lab-marginpar.dtx}{package}}}
% stop docstrip adding \endinput
\preamble
diff --git a/macros/latex-dev/required/tools/README.md b/macros/latex-dev/required/tools/README.md
index c87b522b3c..8c55bf3449 100644
--- a/macros/latex-dev/required/tools/README.md
+++ b/macros/latex-dev/required/tools/README.md
@@ -1,7 +1,7 @@
The LaTeX `tools` bundle
========================
-Release 2024-06-01 pre-release 0
+Release 2024-06-01 pre-release 1
Overview
--------
diff --git a/macros/latex-dev/required/tools/afterpage.dtx b/macros/latex-dev/required/tools/afterpage.dtx
index 518b70761d..72df39402c 100644
--- a/macros/latex-dev/required/tools/afterpage.dtx
+++ b/macros/latex-dev/required/tools/afterpage.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/afterpage.ins b/macros/latex-dev/required/tools/afterpage.ins
index 6fec5edc6f..17792ddfa1 100644
--- a/macros/latex-dev/required/tools/afterpage.ins
+++ b/macros/latex-dev/required/tools/afterpage.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2023
+%% Copyright (C) 1993-2024
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/required/tools/afterpage.pdf b/macros/latex-dev/required/tools/afterpage.pdf
index 1e62bd8f2b..a6f340967f 100644
--- a/macros/latex-dev/required/tools/afterpage.pdf
+++ b/macros/latex-dev/required/tools/afterpage.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/array-2023-11-01.sty b/macros/latex-dev/required/tools/array-2023-11-01.sty
new file mode 100644
index 0000000000..cd6eee6a0f
--- /dev/null
+++ b/macros/latex-dev/required/tools/array-2023-11-01.sty
@@ -0,0 +1,375 @@
+%%
+%% This is file `array.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% array.dtx (with options: `package,ncols')
+%%
+%% This is a generated file.
+%%
+%% The source is maintained by the LaTeX Project team and bug
+%% reports for it can be opened at https://latex-project.org/bugs/
+%% (but please observe conditions on bug reports sent to that address!)
+%%
+%%
+%% Copyright (C) 1993-2023
+%% The LaTeX Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+%% without such generated files.
+%%
+%% The list of all files belonging to the LaTeX `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% Package `array' to use with LaTeX 2e
+%% Copyright (C) 1989-1998 Frank Mittelbach, all rights reserved.
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+
+\DeclareRelease{}{2016-10-06}{array-2016-10-06.sty}
+\DeclareRelease{v2.4}{2020-02-10}{array-2020-02-10.sty}
+\DeclareCurrentRelease{}{2020-10-01}
+
+\ProvidesPackage{array}
+ [2023/10/16 v2.5g Tabular extension package (FMi)]
+%%
+
+\def\@addtopreamble#1{\xdef\@preamble{\@preamble #1}}
+\def\@testpach{\@chclass
+ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+ \ifnum \@lastchclass=7 5 \else
+ \ifnum \@lastchclass=8 \tw@ \else
+ \ifnum \@lastchclass=9 \thr@@
+ \else \z@
+ \ifnum \@lastchclass = 10 \else
+ \edef\@nextchar{\expandafter\string\@nextchar}%
+ \@chnum
+ \if \@nextchar c\z@ \else
+ \if \@nextchar l\@ne \else
+ \if \@nextchar r\tw@ \else
+ \z@ \@chclass
+ \if\@nextchar |\@ne \else
+ \if \@nextchar !6 \else
+ \if \@nextchar @7 \else
+ \if \@nextchar <8 \else
+ \if \@nextchar >9 \else
+ 10
+ \@chnum
+ \if \@nextchar m\thr@@\else
+ \if \@nextchar p4 \else
+ \if \@nextchar b5 \else
+ \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi
+ \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi}
+\def\@xexpast#1*#2#3#4\@@{%
+ \@tempcnta #2
+ \toks@={#1}\@temptokena={#3}%
+ \let\the@toksz\relax \let\the@toks\relax
+ \def\@tempa{\the@toksz}%
+ \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
+ {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
+ \let \@tempb \@xexpast \else
+ \let \@tempb \@xexnoop \fi
+ \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
+ \edef\@tempa{\@tempa}%
+ \expandafter \@tempb \@tempa #4\@@}
+\def\prepnext@tok{\advance \count@ \@ne
+ \toks\count@{}}
+\def\save@decl{\toks\count@ \expandafter{\@nextchar}}
+\def\insert@column{%
+ \the@toks \the \@tempcnta
+ \ignorespaces \@sharp \unskip
+ \the@toks \the \count@ \relax}
+\newdimen\col@sep
+\def\@acol{\@addtopreamble{\hskip\col@sep}}
+\def\@classx{%
+ \ifcase \@lastchclass
+ \@acolampacol \or
+ \@addamp \@acol \or
+ \@acolampacol \or
+ \or
+ \@acol \@firstampfalse \or
+ \@addamp
+ \fi}
+\def\@classz{\@classx
+ \@tempcnta \count@
+ \prepnext@tok
+ \@addtopreamble{\ifcase \@chnum
+ \hfil
+ \hskip1sp%
+ \d@llarbegin
+ \insert@column
+ \d@llarend \do@row@strut \hfil \or
+ \hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \hfil \or
+ \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \or
+ \setbox\ar@mcellbox\vbox
+ \@startpbox{\@nextchar}\insert@column \@endpbox
+ \ar@align@mcell
+ \do@row@strut \or
+ \vtop \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut \or
+ \vbox \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut
+ \fi}\prepnext@tok}
+
+\newbox\ar@mcellbox
+\def\ar@align@mcell{%
+ \ifdim \ht\ar@mcellbox > \ht\strutbox
+ \begingroup
+ \dimen@\ht\ar@mcellbox
+ \advance\dimen@-\ht\@arstrutbox
+ \advance\dimen@\baselineskip
+ \lower.5\dimen@\box\ar@mcellbox
+ \endgroup
+ \else % assume one line and align at baseline
+ \box\ar@mcellbox
+ \fi}
+
+\def\@arrayrule{\@addtopreamble \vline}
+\def\@classvii{\ifnum \@lastchclass = \thr@@
+ \@preamerr \thr@@ \fi}
+\def\@classvi{\ifcase \@lastchclass
+ \@acol \or
+ \@addtopreamble{\hskip \doublerulesep}\or
+ \@acol \or
+ \@classvii
+ \fi}
+\def\@classii{\advance \count@ \m@ne
+ \save@decl\prepnext@tok}
+\def\@classi{\@classvi
+ \ifcase \@chnum \@arrayrule \or
+ \@classv \fi}
+\def\@startpbox#1{\bgroup
+ \color@begingroup
+ \setlength\hsize{#1}\@arrayparboxrestore
+ \everypar{%
+ \vrule \@height \ht\@arstrutbox \@width \z@
+ \everypar{}}%
+ }
+\def\@endpbox{\@finalstrut\@arstrutbox \par \color@endgroup \egroup\hfil}
+\def\@array[#1]#2{%
+ \@tempdima \ht \strutbox
+ \advance \@tempdima by\extrarowheight
+ \setbox \@arstrutbox \hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+ \begingroup
+ \@mkpream{#2}%
+ \xdef\@preamble{\noexpand \ialign \@halignto
+ \bgroup \@arstrut \@preamble
+ \tabskip \z@ \cr}%
+ \endgroup
+ \@arrayleft
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
+ \bgroup
+ \let \@sharp ##\let \protect \relax
+ \lineskip \z@
+ \baselineskip \z@
+ \m@th
+ \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
+\def\arraybackslash{\let\\\tabularnewline}
+\newdimen \extrarowheight
+\extrarowheight=0pt
+\def\@arstrut{\unhcopy\@arstrutbox}
+\protected\def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi
+ \@ifstar \@xarraycr \@xarraycr}
+\def\@xarraycr{\@ifnextchar [%
+ \@argarraycr {\ifnum 0=`{}\fi\cr}}
+\def\@argarraycr[#1]{\ifnum0=`{}\fi\ifdim #1>\z@
+ \expandafter\@xargarraycr\else
+ \expandafter\@yargarraycr\fi{#1}}
+\def\@xargarraycr#1{\unskip\gdef\do@row@strut
+ {\@tempdima #1\advance\@tempdima \dp\@arstrutbox
+ \vrule \@depth\@tempdima \@width\z@\global\let\do@row@strut\relax}%
+ \ifnum\@multicnt >\z@ \do@row@strut \fi
+ \cr}
+\let\do@row@strut\relax
+\long\def\multicolumn#1#2#3{%
+ \multispan{#1}\begingroup
+ \def\@addamp{\if@firstamp \@firstampfalse \else
+ \@preamerr 5\fi}%
+ \@mkpream{#2}\@addtopreamble\@empty
+ \endgroup
+ \def\@sharp{#3}%
+ \@arstrut \@preamble
+ \null
+ \ignorespaces}
+\let\d@llarbegin\begingroup
+\let\d@llarend\endgroup
+\def\array{\col@sep\arraycolsep
+ \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%
+ \@tabarray}
+\def\tabular{\def\@halignto{}\@tabular}
+\expandafter\def\csname tabular*\endcsname#1{%
+ \setlength\dimen@{#1}%
+ \edef\@halignto{to\the\dimen@}\@tabular}
+\def\@tabular{%
+ \leavevmode
+ \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup
+ \let\d@llarend\endgroup
+ \@tabarray}
+\def\endtabular{\endarray\m@th $\egroup}
+\expandafter\let\csname endtabular*\endcsname=\endtabular
+\let\@ampacol=\relax \let\@expast=\relax
+\let\@arrayclassiv=\relax \let\@arrayclassz=\relax
+\let\@tabclassiv=\relax \let\@tabclassz=\relax
+\let\@arrayacol=\relax \let\@tabacol=\relax
+\let\@tabularcr=\relax \let\@@endpbox=\relax
+\let\@argtabularcr=\relax \let\@xtabularcr=\relax
+\def\@preamerr#1{\def\@tempd{{..} at wrong position: }%
+ \PackageError{array}{%
+ \ifcase #1 Illegal pream-token (\@nextchar): `c' used\or %0
+ Missing arg: token ignored\or %1
+ Empty preamble: `l' used\or %2
+ >\@tempd token ignored\or %3
+ <\@tempd changed to !{..}\or %4
+ Only one column-spec. allowed.\fi}\@ehc} %5
+\def\newcolumntype#1{%
+ \edef\NC@char{\string#1}%
+ \@ifundefined{NC@find@\NC@char}%
+ {\@tfor\next:=<>clrmbp@!|\do
+ {%
+ \if\expandafter\noexpand\next\NC@char
+ \PackageWarning{array}%
+ {Redefining primitive column \NC@char}\fi}%
+ \NC@list\expandafter{\the\NC@list\NC@do#1}}%
+ {\PackageWarning{array}{Column \NC@char\space is already defined}}%
+ \@namedef{NC@find@\NC@char}##1#1{\NC@{##1}}%
+ \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}}
+\def\newcol@#1[#2]#3{\expandafter\@reargdef
+ \csname NC@rewrite@#1\endcsname[#2]{\NC@find#3}}
+\def\NC@#1{%
+ \@temptokena\expandafter{\the\@temptokena#1}\futurelet\next\NC@ifend}
+\def\NC@ifend{%
+ \ifx\next\relax
+ \else\@tempswatrue\expandafter\NC@rewrite\fi}
+\def\NC@do#1{%
+ \expandafter\let\expandafter\NC@rewrite
+ \csname NC@rewrite@\string#1\endcsname
+ \expandafter\let\expandafter\NC@find
+ \csname NC@find@\string#1\endcsname
+ \expandafter\@temptokena\expandafter{\expandafter}%
+ \expandafter\NC@find\the\@temptokena#1\relax}
+\def\showcols{{\def\NC@do##1{\let\NC@do\NC@show}\the\NC@list}}
+\def\NC@show#1{%
+ \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip
+ \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}}
+\def\NC@strip#1:#2->#3 #4\@@{#2 -> #4}
+\newtoks\NC@list
+\newcolumntype{*}[2]{}
+\long\@namedef{NC@rewrite@*}#1#2{%
+ \count@#1\relax
+ \loop
+ \ifnum\count@>\z@
+ \advance\count@\m@ne
+ \@temptokena\expandafter{\the\@temptokena#2}%
+ \repeat
+ \NC@find}
+\let\@xexpast\relax
+\let\@xexnoop\relax
+\def\save@decl{\toks \count@ = \expandafter\expandafter\expandafter
+ {\expandafter\@nextchar\the\toks\count@}}
+\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+ \let\@sharp\relax
+ \def\@startpbox##1{\unexpanded\expandafter{\expandafter
+ \@startpbox\expandafter{##1}}}\let\@endpbox\relax
+ \let\do@row@strut\relax
+ \let\ar@align@mcell\relax
+ \@temptokena{#1}\@tempswatrue
+ \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
+ \count@\m@ne
+ \let\the@toks\relax
+ \prepnext@tok
+ \expandafter \@tfor \expandafter \@nextchar
+ \expandafter :\expandafter =\the\@temptokena \do
+ {\@testpach
+ \ifcase \@chclass \@classz \or \@classi \or \@classii
+ \or \save@decl \or \or \@classv \or \@classvi
+ \or \@classvii \or \@classviii
+ \or \@classx
+ \or \@classx \fi
+ \@lastchclass\@chclass}%
+ \ifcase\@lastchclass
+ \@acol \or
+ \or
+ \@acol \or
+ \@preamerr \thr@@ \or
+ \@preamerr \tw@ \@addtopreamble\@sharp \or
+ \or
+ \else \@preamerr \@ne \fi
+ \def\the@toks{\the\toks}}
+\let\@classix\relax
+\def\@classviii{\ifnum \@lastchclass >\z@\ifnum\@lastchclass=\tw@\else
+ \@preamerr 4\@chclass 6 \@classvi \fi\fi}
+\def\@classv{\save@decl
+ \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+ \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+ \prepnext@tok}
+\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}%
+ \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi}
+\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
+\let\@@array\@array
+\def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}}
+\let\@arrayleft\@empty
+\let\@arrayright\@empty
+\newlength{\extratabsurround}
+\setlength{\extratabsurround}{2pt}
+\newlength{\backup@length}
+\newcommand{\firsthline}{%
+ \multicolumn1{@{}c@{}}{%
+ \global\backup@length\ht\@arstrutbox
+ \global\advance\backup@length\dp\@arstrutbox
+ \global\advance\backup@length\arrayrulewidth
+ \raise\extratabsurround\copy\@arstrutbox
+ \kern-1sp%
+ }\\[-\backup@length]\hline
+}
+\newcommand{\lasthline}{\hline\multicolumn1{@{}c@{}}{%
+ \global\backup@length2\ht\@arstrutbox
+ \global\advance\backup@length2\dp\@arstrutbox
+ \global\advance\backup@length\arrayrulewidth
+ }\\[-\backup@length]%
+ \multicolumn1{@{}c@{}}{%
+ \lower\extratabsurround\copy\@arstrutbox
+ \kern-1sp%
+ }%
+}
+\CheckCommand*\@xhline{\ifx\reserved@a\hline
+ \vskip\doublerulesep
+ \vskip-\arrayrulewidth
+ \fi
+ \ifnum0=`{\fi}}
+\renewcommand*\@xhline{\ifx\reserved@a\hline
+ \vskip\doublerulesep
+ \fi
+ \ifnum0=`{\fi}}
+
+\newsavebox\ar@cellbox
+\newcolumntype{w}[2]{%
+ >{\begin{lrbox}\ar@cellbox\d@llarbegin}%
+ c%
+ <{\d@llarend \end{lrbox}%
+ \makebox[#2][#1]{\unhbox\ar@cellbox}}}
+
+\newcolumntype{W}[2]
+ {>{\begin{lrbox}\ar@cellbox\d@llarbegin}%
+ c%
+ <{\d@llarend\end{lrbox}%
+ \let\hss\hfil
+ \makebox[#2][#1]{\unhbox\ar@cellbox}}}
+\endinput
+%%
+%% End of file `array.sty'.
diff --git a/macros/latex-dev/required/tools/array.dtx b/macros/latex-dev/required/tools/array.dtx
index 6e4e34ea26..66c40a5267 100644
--- a/macros/latex-dev/required/tools/array.dtx
+++ b/macros/latex-dev/required/tools/array.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -30,10 +30,15 @@
%<+package>
%<+package>\DeclareRelease{}{2016-10-06}{array-2016-10-06.sty}
%<+package>\DeclareRelease{v2.4}{2020-02-10}{array-2020-02-10.sty}
-%<+package>\DeclareCurrentRelease{}{2020-10-01}
+%<+package>\DeclareRelease{v2.5}{2023-11-01}{array-2023-11-01.sty}
+%<+package>\DeclareCurrentRelease{}{2024-06-01}
%<+package>
+% \end{macrocode}
+% Current version needs a new kernel.
+% \begin{macrocode}
+%<+package>\NeedsTeXFormat{LaTeX2e}[2024/06/01]
%<+package>\ProvidesPackage{array}
-%<+package> [2023/10/16 v2.5g Tabular extension package (FMi)]
+%<+package> [2023/12/11 v2.6a Tabular extension package (FMi)]
%
% \fi
%
@@ -177,6 +182,18 @@
% \DoNotIndex{\xdef}
% \DoNotIndex{\z@}
%
+%
+% \providecommand\env[1]{\texttt{#1}}
+%
+% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}}
+% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}}
+% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}}
+%
+% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl}
+% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl}
+% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl}
+%
+%
% \GetFileInfo{array.sty}
%
% \title{A new implementation of \LaTeX's \textsf{tabular}
@@ -195,6 +212,8 @@
% \MaintainedByLaTeXTeam{tools}
% \maketitle
%
+%
+%
% \MakeShortVerb{\=}
%
% \begin{abstract}
@@ -750,12 +769,29 @@
% \end{itemize}
%
%
+% \section{Support for tagged PDF}
%
-% \changes{v2.2b}{1994/02/04}{Removed interactive prompt}
+% With version 2.6a the package is made tagging aware, which means that
+% it will automatically produce tagged tables (necessary, for example, for
+% accessibility) if tagging is requested via \cs{DocumentMetadata}.
%
-% \MaybeStop{
+% More granular control, e.g., explicitly deciding which cells are
+% header cells, etc., is currently under development, but syntax for
+% this will not appear in this package. Instead it will become
+% available across all tabular-generating packages and then
+% automatically apply here as well.
+%
+% Enabling \LaTeX{} to automatically produce tagged PDF is a long-term
+% project and this is a tiny step in this puzzle. For more information
+% on the project and already available functionality, see
+% \url{https://latex-project.org/publications/indexbytopic/pdf} and
+% \url{https://github.com/latex3/tagging-project}.
%
%
+%
+% \changes{v2.2b}{1994/02/04}{Removed interactive prompt}
+%
+% \MaybeStop{
% \begin{thebibliography}{1}
% \bibitem{bk:GMS94} \textsc{M.~Goossens}, \textsc{F.~Mittelbach}
% and \textsc{A.~Samarin}.
@@ -772,7 +808,6 @@
% \newblock
% Addison-Wesley, Reading, Massachusetts, 1986.
% \end{thebibliography}
-%
% } ^^A end of \MaybeStop
%
%
@@ -786,8 +821,49 @@
% \texttt{docstrip} program.
% \begin{macrocode}
%<*driver>
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\documentclass{ltxdoc}
+\NeedsTeXFormat{LaTeX2e}[2024/06/01]
+% \end{macrocode}
+%
+% We switched from \cls{ltxdoc} to \cls{l3doc} to get support for
+% code written in the L3 programming layer. The first is that we
+% are currently missing \cs{MaintainedByLaTeXTeam}, so we have to
+% provide that for now.
+% \begin{macrocode}
+\documentclass{l3doc}
+
+% currently missing in l3doc
+\makeatletter
+\def\MaintainedBy#1{\gdef\@maintainedby{#1}}
+\let\@maintainedby\@empty
+\def\MaintainedByLaTeXTeam#1{%
+{\gdef\@maintainedby{%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs.html}.}}}
+\def\@maketitle{%
+ \newpage
+ \null
+ \vskip 2em%
+ \begin{center}%
+ \let \footnote \thanks
+ {\LARGE \@title \par}%
+ \vskip 1.5em%
+ {\large
+ \lineskip .5em%
+ \begin{tabular}[t]{c}%
+ \@author
+ \end{tabular}\par}%
+ \vskip 1em%
+ {\large \@date}%
+ \ifx\@maintainedby\@empty
+ \else
+ \vskip 1em%
+ \fbox{\fbox{\begin{tabular}{@{}l@{}}\@maintainedby\end{tabular}}}%
+ \fi
+ \end{center}%
+ \par
+ \vskip 1.5em}
+\makeatother
% undo the default is not used:
@@ -817,6 +893,29 @@
% \end{macrocode}
%
%
+% \section{A note on the updates done December 2023}
+%
+% We introduced support for tagged PDf and at the same time we added
+% code to determine row and column numbers for each cell in
+% preparation for supporting formatting or type specifications for individual
+% cells (or group of cells) from the outside, e.g., \enquote{rows 1,
+% 2, and 10 are header rows} (syntax to be decided).
+%
+% This new code is already written with L3 programming layer conventions
+% while most of the legay code is still as it was before. This make the code
+% currently somewhat clattered, unfortunately. Eventually this will all move to L3
+% programming layer but this will take time.
+%
+%
+% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+%
+%
+%
% \section{The construction of the preamble}
%
% \DeleteShortVerb{\"}
@@ -972,6 +1071,7 @@
% =\@chclass= and =\@chnum=.
% \changes{v2.0f}{1992/02/29}{Argument removed since implicitly known}
% \begin{macrocode}
+\ExplSyntaxOff
\def\@testpach{\@chclass
% \end{macrocode}
% First we deal with the cases in which the \textsf{token}
@@ -981,7 +1081,7 @@
\ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
\ifnum \@lastchclass=7 5 \else
\ifnum \@lastchclass=8 \tw@ \else
- \ifnum \@lastchclass=9 \thr@@
+ \ifnum \@lastchclass=9 \thr@@@@
% \end{macrocode}
% Otherwise we will assume that the \textsf{token} belongs to the
% class $0$
@@ -1032,7 +1132,7 @@
% \begin{macrocode}
10
\@chnum
- \if \@nextchar m\thr@@\else
+ \if \@nextchar m\thr@@@@ \else
\if \@nextchar p4 \else
\if \@nextchar b5 \else
% \end{macrocode}
@@ -1042,6 +1142,7 @@
% \begin{macrocode}
\z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi
\fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi}
+\ExplSyntaxOn
% \end{macrocode}
% \end{macro}
%
@@ -1062,10 +1163,10 @@
% they are in explicit braces, as in =@{*}=.
%
% This macro is called via
-% =\@xexpast=\meta{preamble}=*0x\@@=.
+% =\@xexpast=\meta{preamble}=*0x\@@@@=.
% The $*$--expression =*0x= is being used to terminate the
% recursion,
-% as we shall see later, and =\@@= serves as an argument
+% as we shall see later, and =\@@@@= serves as an argument
% delimiter. =\@xexpast= has four arguments. The first
% one is the part of the
% user preamble before the first $*$--expression while the second
@@ -1074,7 +1175,7 @@
% above).
% The fourth argument is the rest of the preamble.
% \begin{macrocode}
-\def\@xexpast#1*#2#3#4\@@{%
+\def\@xexpast#1*#2#3#4\@@@@{%
% \end{macrocode}
% The number of copies of \textit{String} (=#2=) that are to be
% produced will be saved in a \textsf{count} register.
@@ -1111,7 +1212,7 @@
% \end{macrocode}
% If \textit{N\/} was greater than zero we prepare for another call
% of =\@xexpast=. Otherwise we assume we have reached the end of
-% the user preamble, because we had appended =*0x\@@= when we first
+% the user preamble, because we had appended =*0x\@@@@= when we first
% called =\@xexpast=. In other words: if the user inserts
% =*{0}{..}= in his preamble, \LaTeX\ ignores the rest of it.
% \begin{macrocode}
@@ -1133,7 +1234,7 @@
% $*$--expression is handled, or to the macro =\@xexnoop=,
% which only ends the recursion by deleting its argument.
% \begin{macrocode}
- \expandafter \@tempb \@tempa #4\@@}
+ \expandafter \@tempb \@tempa #4\@@@@}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1142,10 +1243,10 @@
% \begin{macro}{\@xexnoop}
% So the first big problem is solved. Now it is easy to
% specify =\@xexnoop=.
-% Its argument is delimited by =\@@= and it simply expands to
+% Its argument is delimited by =\@@@@= and it simply expands to
% nothing.
% \begin{macrocode}
-% \def\@xexnoop#1\@@{}
+% \def\@xexnoop#1\@@@@{}
% \end{macrocode}
% \end{macro}
%
@@ -1275,6 +1376,13 @@
% \begin{macrocode}
\def\insert@column{%
% \end{macrocode}
+%
+% For tagging we insert as special socket, that adds the necessary
+% PDF tag at the beginning of the cell if tagging is enabled.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/cell/begin}%
+% \end{macrocode}
% Here, we assume that the \textsf{count} register
% =\@tempcnta= has saved the value $=\count@= - 1$.
% \begin{macrocode}
@@ -1302,12 +1410,36 @@
% \changes{v2.0c}{1990/08/14}{\cs{relax} added to avoid problem
% \cs{the}\cs{toks0}\cs{the}\cs{toks1}.}
% \begin{macrocode}
- \the@toks \the \count@ \relax}
+ \the@toks \the \count@ \relax
+% \end{macrocode}
+%
+% And another socket for tagging that adds the necessary closing tag
+% if enabled.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/cell/end}%
+}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
+% \begin{macro}{\insert@pcolumn}
+% Handling pcolumn-cells needs slightly different handling when
+% doing tagging. Rather than changing the plugs in
+% \cs{insert@column} back and forth, we simply use a different
+% version of \cs{insert@column} that has its own sockets.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+\def\insert@pcolumn{%
+ \UseTaggingSocket{tbl/pcell/begin}%
+ \the@toks \the \@tempcnta
+ \ignorespaces \@sharp \unskip
+ \the@toks \the \count@ \relax
+ \UseTaggingSocket{tbl/pcell/end}%
+}
+% \end{macrocode}
+% \end{macro}
%
%
% \subsection{The separation of columns}
@@ -1321,11 +1453,24 @@
% =\@addamp=, the macro that inserts the =&=.
% \begin{macrocode}
% \newif \@iffirstamp
-% \def\@addamp{\if@firstamp \@firstampfalse
-% \else \@addtopreamble &\fi}
+\def\@addamp {
+ \if@firstamp
+ \@firstampfalse
+ \else
+% \end{macrocode}
+% If we are after the first column we have to insert a \verb=&= and
+% also update the cell data.
+% \changes{v2.6a}{2023/12/11}{Managing cell indexes}
+% \begin{macrocode}
+ \edef\@preamble{\@preamble &
+ \noexpand\tbl_update_cell_data: }
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
+%
+%
% \begin{macro}{\@acol}
% \begin{macro}{\@acolampacol}
% \begin{macro}{\col@sep}
@@ -1393,7 +1538,7 @@
% command =\@xexpast=. As we already know, this command saves
% its result in the macro =\@tempa=.
% \begin{macrocode}
-% \@xexpast #1*0x\@@
+% \@xexpast #1*0x\@@@@
% \end{macrocode}
% Afterwards we initialize all registers and macros, that we need
% for the build-up of the preamble.
@@ -1477,7 +1622,7 @@
% \texttt{r}, \texttt{p},\texttt{m} or \texttt{b}. We report an
% error and ignore the declaration given by ={..}=.
% \begin{macrocode}
-% \@preamerr \thr@@ \or
+% \@preamerr \thr@@@@ \or
% \end{macrocode}
% If =\@lastchclass= is $4$ the user preamble has been empty.
% To continue, we insert a =#= in the preamble.
@@ -1671,18 +1816,17 @@
\setbox\ar@mcellbox\vbox
% \end{macrocode}
% The part of the templates which is the same in all three cases
-% (\texttt{p}, \texttt{m} and \texttt{b})
-% is built by the macros =\@startpbox= and
-% =\@endpbox=. =\@startpbox= has an argument:
-% the width of the column which is stored in the current
-% \textsf{token} (i.e.\ =\@nextchar=).
-% Between these two macros we find the well known
-% =\insert@column=.
-% The strut is places after the box
+% (\texttt{p}, \texttt{m} and \texttt{b}) is built by the macros
+% =\@startpbox= and =\@endpbox=. =\@startpbox= has an argument: the
+% width of the column which is stored in the current \textsf{token}
+% (i.e.\ =\@nextchar=). Between these two macros we find the well
+% known =\insert@column= or rather the variant for tagging:
+% \cs{insert@pcolumn}. The strut is placed after the box.
% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
% \begin{macrocode}
- \@startpbox{\@nextchar}\insert@column \@endpbox
+ \@startpbox{\@nextchar}\insert@pcolumn \@endpbox
\ar@align@mcell
\do@row@strut \or
% \end{macrocode}
@@ -1690,9 +1834,10 @@
% same way though we do not need the =$= characters because we use
% =\vtop= or =\vbox=.
% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
% \begin{macrocode}
- \vtop \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut \or
- \vbox \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut
+ \vtop \@startpbox{\@nextchar}\insert@pcolumn \@endpbox\do@row@strut \or
+ \vbox \@startpbox{\@nextchar}\insert@pcolumn \@endpbox\do@row@strut
% \end{macrocode}
% Other values for =\@chnum= are impossible. Therefore we
% end the arguments to =\@addtopreamble= and =\ifcase=.
@@ -1783,8 +1928,8 @@
% So the declarations defined by the first =>{...}=
% are ignored.
% \begin{macrocode}
-%\def\@classix{\ifnum \@lastchclass = \thr@@
-% \@preamerr \thr@@ \fi
+%\def\@classix{\ifnum \@lastchclass = \thr@@@@
+% \@preamerr \thr@@@@ \fi
% \end{macrocode}
% Furthermore, we call up =\@class10= because afterwards always a
% new column is started by \texttt{c}, \texttt{l}, \texttt{r},
@@ -1836,14 +1981,14 @@
% We only check if the last \textsf{token} was of class $3$ which is
% forbidden.
% \begin{macrocode}
-\def\@classvii{\ifnum \@lastchclass = \thr@@
+\def\@classvii{\ifnum \@lastchclass = \thr@@@@
% \end{macrocode}
% If this is true we output an error message and
% ignore the declarations stored
% by the last =>{...}=, because these are overwritten
% by the argument of \texttt{@}.
% \begin{macrocode}
- \@preamerr \thr@@ \fi}
+ \@preamerr \thr@@@@ \fi}
% \end{macrocode}
% \end{macro}
%
@@ -2032,7 +2177,7 @@
% second one describes the wanted preamble,
% e.g.\ it has the form =|c|c|c|=.
% \begin{macrocode}
-\def\@array[#1]#2{%
+\def\@array[#1]#2{
% \end{macrocode}
% First we define a \textsf{strut} whose size basically corresponds
% to a normal \textsf{strut} multiplied by the factor
@@ -2051,6 +2196,14 @@
\@depth \arraystretch \dp \strutbox
\@width \z@}%
% \end{macrocode}
+% The total number of table columns of the current table is
+% determined in \cs{tbl_count_table_cols:} but this is called in
+% a group, so local settings do not survive. Thus, to save away the
+% outer value of \cs{g_@@_table_cols_tl} we do it before the group.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \tbl_save_outer_table_cols:
+% \end{macrocode}
% Then we open a group, in which the user preamble is evaluated by
% the macro =\@mkpream=. As we know this must happen locally.
% This macro creates a preamble for a =\halign= and saves
@@ -2059,6 +2212,11 @@
\begingroup
\@mkpream{#2}%
% \end{macrocode}
+% Figure out how many columns this table has:
+% \changes{v2.6a}{2023/12/11}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_count_table_cols:
+% \end{macrocode}
% We again redefine =\@preamble= so that a call up of =\@preamble=
% now starts the =\halign=. Thus also the arguments of \texttt{>},
% \texttt{<}, \texttt{@} and \texttt{!}, saved in the
@@ -2085,13 +2243,38 @@
% unsupported redefinition of a \TeX{} primitive for the moment (as people rely
% on that experimental code).
% \begin{macrocode}
- \xdef\@preamble{\noexpand \ialign \@halignto
- \bgroup \@arstrut \@preamble
- \tabskip \z@ \cr}%
+ \xdef\@preamble{
+% \end{macrocode}
+% \cs{ialign} in the original definition is replaced by
+% \cs{ar@ialign} defined below. This does what \cs{ialign} does but
+% additionally handles the tagging structure for the whole table if necessary.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \noexpand \ar@ialign
+ \@halignto
+ \bgroup \@arstrut
% \end{macrocode}
% What we have not explained yet is the macro =\@halignto=
% that was just used. Depending on its replacement text the
% =\halign= becomes a =\halign= \texttt{to} \meta{dimen}.
+%
+% Next, a tagging support socket is inserted adding the start row tag.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/row/begin}
+% \end{macrocode}
+% At the start of the preamble for the first column we call
+% \cs{tbl_init_cell_data_for_row:} to initialize the cell index data. In
+% later columns this data is updated via \cs{tbl_update_cell_data:}.
+% \changes{v2.6a}{2023/12/11}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_init_cell_data_for_row:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@preamble
+ \tabskip \z@ \cr}
+% \end{macrocode}
% Now we close the group again. Thus
% =\@startpbox= and =\@endpbox= as well as all
% \textsf{token} registers get their former meaning back.
@@ -2128,12 +2311,16 @@
% around every column in the \textsf{array}--environment
% the parameter =\mathsurround= should
% also be set to \textsf{0pt}. This prevents additional space between
-% the rows. The
-% \PlainTeX--macro =\m@th= does this.
+% the rows.
% \begin{macrocode}
\lineskip \z@
\baselineskip \z@
- \m@th
+% \end{macrocode}
+% Don't use \cs{m@th} here as that signals to the math taggingg
+% code that this is fake math that should not be tagged.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \mathsurround \z@
% \end{macrocode}
% Beside, we have to assign a special meaning (which we still have
% to specify) to the line separator =\\=. We also have to
@@ -2144,10 +2331,61 @@
% start the wanted =\halign=.
% \changes{1994/12/08}{v2.3b}{add \cs{tabularnewline}}
% \begin{macrocode}
- \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
+ \let\\\@arraycr \let\tabularnewline\\\let\par\@empty
+% \end{macrocode}
+% Another socket for tagging. TODO: what about \cs{arrayleft} above?
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/init}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@preamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\ar@ialign}
+% A new command that replaces \cs{ialign} used previously. \cs{everycr} is
+% also applied to the \cs{cr} ending the preamble so we have to
+% program around that.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+\def\ar@ialign{%
+% \end{macrocode}
+% Before starting a table we have to initialize the variables
+% holding row and column information for cells. We also have
+% locally store the information related to the current cell (if we
+% are already inside a table) so that we can restore it once the
+% inner table is finished.
+% \changes{v2.6a}{2023/12/11}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_init_cell_data_for_table:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \everycr{%
+ \noalign{%
+% \end{macrocode}
+% If this \cs{cr} was at the end of a real row (e.g., not at the
+% end of the table preamble) we have add a row end tag.
+% \begin{macrocode}
+ \tbl_if_row_was_started:T { \UseTaggingSocket{tbl/row/end} }
+% \end{macrocode}
+% The we prepare for the next row.
+% \begin{macrocode}
+ \tbl_update_cell_data_for_next_row:
+ }%
+ }%
+ \tabskip\z@skip\halign}
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
+%
% \begin{macro}{\arraybackslash}
% \changes{v2.4a}{2003/12/17}{(DPC) Macro added (from tabularx)}
% Restore =\\= for use in array and tabular environment (after
@@ -2182,7 +2420,27 @@
% \begin{macro}{\@arraycr}
% In the macro =\@array= the line separator =\\= is
% =\let= to the command =\@arraycr=.
-% Its definition starts with a special brace which I have directly
+% \changes{v2.3c}{1995/04/23}{Avoid adding an ord atom in math}
+% \changes{v2.5e}{2021/04/20}{Use \cs{protected} for \cs{\bslash} variant (gh/548)}
+% \begin{macrocode}
+\protected\def\@arraycr {
+% \end{macrocode}
+% Add code that figures out if the current table row is incomplete
+% (not enough \verb=&=s). It can then do extra actions, such as
+% inserting missing cell tags.
+% \changes{v2.6a}{2023/12/11}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_count_missing_cells:n {@arraycr}
+% \end{macrocode}
+% TODO: maybe this is also the right place to add a socket that
+% could be used to actually enter missing cells instead of just
+% adding tagging structures for them later. This would be optional
+% but in many cases it would be the right thing to do (for example
+% if tables contain vertical lines or similar visual structures
+% that require fully specified rows.
+%
+%
+% We then start a special brace which I have directly
% copied from the original definition. It is
% necessary, because the =\futurlet= in =\@ifnextchar=
% might
@@ -2198,10 +2456,8 @@
% =\halign= while we are looking for a =*= or =[=.
% For further information see
% \cite[Appendix D]{bk:knuth}.
-% \changes{v2.3c}{1995/04/23}{Avoid adding an ord atom in math}
-% \changes{v2.5e}{2021/04/20}{Use \cs{protected} for \cs{\bslash} variant (gh/548)}
% \begin{macrocode}
-\protected\def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi
+ \iffalse{\fi\ifnum 0=`}\fi
% \end{macrocode}
% Then we test whether the user is using the star form and ignore
% a possible star (I also disagree with this procedure, because a
@@ -2210,6 +2466,11 @@
\@ifstar \@xarraycr \@xarraycr}
% \end{macrocode}
% \end{macro}
+
+
+
+
+
%
% \begin{macro}{\@xarraycr}
% In the command =\@xarraycr= we test if an optional argument
@@ -2301,6 +2562,7 @@
% the result column and the actual column entry.
% \changes{v2.3j}{1998/01/29}{Command made \cs{long} to match
% kernel change for pr/2180}
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
% \begin{macrocode}
\long\def\multicolumn#1#2#3{%
% \end{macrocode}
@@ -2310,6 +2572,16 @@
% \begin{macrocode}
\multispan{#1}\begingroup
% \end{macrocode}
+% For tagging support we have to solve two problems:
+% \cs{multicolumn} must handle the row begin if it is used there,
+% and it must save the numbers of cells it spans so that we can add
+% a suitable ColSpan attribute. We do this in the next macro
+% (which in turn calls the \texttt{tbl/row/begin} socket, if
+% necessary).
+% \changes{v2.6a}{2023/12/11}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_update_multicolumn_cell_data:n {#1}
+% \end{macrocode}
% Since a =\multicolumn= should only describe the format of a
% result column, we redefine =\@addamp= in such a way that one gets
% an error message if one uses more than one \texttt{c},
@@ -2336,6 +2608,12 @@
% \begin{macrocode}
\endgroup
% \end{macrocode}
+% Now we update the colspan attribute. This needs setting after
+% the group as it is hidden inside the plug in \cs{insert@column}.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/colspan}{#1}%
+% \end{macrocode}
% In the special situation of =\multicolumn= =\@preamble=
% is not needed as preamble for a =\halign= but it is directly
% inserted into our table. Thus instead of =\sharp=
@@ -2458,6 +2736,12 @@
% \begin{macrocode}
\leavevmode
% \end{macrocode}
+% Now that we know we are in hmode we can add the start tag for the
+% whole table.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/hmode/begin}%
+% \end{macrocode}
% It should be taken into consideration that the macro =\@array=
% must be called in math mode. Therefore we open a \textsf{box},
% insert a =$= and then assign the correct values to =\col@sep= and
@@ -2486,11 +2770,41 @@
% =\@array=. To save \textsf{token} space we then redefine
% =\@preamble=
% because its replacement text isn't longer needed.
+%
+% To handle cell indexes, we do not use \cs{crcr} but a variant
+% that also handles missing cells as necessary.
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+\def\endarray {
+ \tbl_crcr:n{endarray} \egroup
+ \UseTaggingSocket{tbl/finalize}
+% \end{macrocode}
+%
+% If tables are nested into another then it is necessary to
+% restore information about the cell the inner table started
+% in. Otherwise, the cell index data structures reflect the
+% status in the outer table as they
+% are globally manipulated. We restore in all cases even if we are
+% not in a nesting situation as that makes the code simpler (and
+% probably faster).
+%
+% \cs{endtabular} and \cs{endtabular*} inherit from \cs{endarray}
+% so we only need to change that. \texttt{tabularx} uses a similar method.
+% \changes{v2.6a}{2023/12/11}{Managing cell indexes}
% \begin{macrocode}
-%\def\endarray{\crcr \egroup \egroup \gdef\@preamble{}}
+ \tbl_restore_outer_cell_data:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \egroup
+ \@arrayright \gdef\@preamble{}%
+}
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
% \begin{macro}{\endtabular}
% \begin{macro}{\endtabular*}
% To end a \textsf{tabular} or \textsf{tabular$*$} environment we
@@ -2499,7 +2813,13 @@
% any =\mathsurround= so we cancel that with =\m@th=.
% \changes{v2.5f}{2021/07/12}{Cancel any outside \cs{mathsurround} (gh/614)}
% \begin{macrocode}
-\def\endtabular{\endarray\m@th $\egroup}
+\def\endtabular{\endarray\m@th $\egroup
+% \end{macrocode}
+%
+% \changes{v2.6a}{2023/12/11}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/hmode/end}%
+}
\expandafter\let\csname endtabular*\endcsname=\endtabular
% \end{macrocode}
% \end{macro}
@@ -2518,7 +2838,7 @@
\let\@arrayclassiv=\relax \let\@arrayclassz=\relax
\let\@tabclassiv=\relax \let\@tabclassz=\relax
\let\@arrayacol=\relax \let\@tabacol=\relax
-\let\@tabularcr=\relax \let\@@endpbox=\relax
+\let\@tabularcr=\relax \let\@@@@endpbox=\relax
\let\@argtabularcr=\relax \let\@xtabularcr=\relax
% \end{macrocode}
%
@@ -2576,6 +2896,7 @@
% to define letters, to be used in the same way as the primitive
% column specifiers, `c' `p' etc.
% \begin{macrocode}
+\ExplSyntaxOff % this is really oldstyle using \@tfor :=
\def\newcolumntype#1{%
% \end{macrocode}
% "\NC@char" was added in V2.01 so that active characters, like "@" in
@@ -2615,6 +2936,7 @@
% If an optional argument was not given, give a default argument of 0.
% \begin{macrocode}
\@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}}
+\ExplSyntaxOn
% \end{macrocode}
% \end{macro}
% \begin{macro}{\newcol@}
@@ -2710,16 +3032,18 @@
% produced and then "\typeout" the required string.
% \begin{macrocode}
\def\NC@show#1{%
- \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip
- \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}}
+ \typeout{Column~ #1\expandafter\expandafter\expandafter\NC@strip
+ \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@@@}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\NC@strip}
% Delimit the arguments to "\NC@strip" with `\texttt{:}', `\texttt{->}',
-% a space, and "\@@" to pull out the required parts of the output from
+% a space, and "\@@@@" to pull out the required parts of the output from
% "\meaning".
% \begin{macrocode}
-\def\NC@strip#1:#2->#3 #4\@@{#2 -> #4}
+\ExplSyntaxOff
+\def\NC@strip#1:#2->#3 #4\@@@@{#2 -> #4}
+\ExplSyntaxOn
% \end{macrocode}
% \end{macro}
% \begin{macro}{\NC@list}
@@ -2807,6 +3131,7 @@
% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
% \begin{macrocode}
+\ExplSyntaxOff % really oldstyle using \@tfor :=
\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
\let\@sharp\relax
% \end{macrocode}
@@ -2869,11 +3194,12 @@
\@acol \or
\or
\@acol \or
- \@preamerr \thr@@ \or
+ \@preamerr \thr@@@@ \or
\@preamerr \tw@ \@addtopreamble\@sharp \or
\or
\else \@preamerr \@ne \fi
\def\the@toks{\the\toks}}
+\ExplSyntaxOn
% \end{macrocode}
% \end{macro}
%
@@ -2908,7 +3234,7 @@
% \texttt{array.sty} 2.0h.
% \begin{macrocode}
\def\@classv{\save@decl
- \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+ \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@@@@
\@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
\prepnext@tok}
% \end{macrocode}
@@ -2920,7 +3246,7 @@
% second "\extracolsep", there is no point in the user entering two of
% these commands anyway, so this is not really a restriction.
% \begin{macrocode}
-\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}%
+\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@@@@{\def\@tempa{#2}%
\ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi}
%</ncols>
% \end{macrocode}
@@ -2936,28 +3262,27 @@
%
% \begin{macro}{\@tabarray}
% This macro tests for an optional bracket and then calls up
-% "\@@array" or "\@@array[c]" (as default).
+% "\@@@@array" or "\@@@@array[c]" (as default).
% \begin{macrocode}
%<*package>
-\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
+\def\@tabarray{\@ifnextchar[{\@@@@array}{\@@@@array[c]}}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\@@array}
+% \begin{macro}{\@@@@array}
% This macro tests could then test an optional delimiter before the
% left brace of the main preamble argument. Here in the main package
% it simply is let to be "\@array".
% \begin{macrocode}
-\let\@@array\@array
+\let\@@@@array\@array
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\endarray}
+% \begin{macro}{\@arrrayleft}
% \begin{macro}{\@arrayright}
% We have to declare the hook we put into "\@array" above.
-% A similar hook `"\@arrayright"' will be inserted into the
+% A similar hook \cs{@arrayright} will be inserted into the
% "\endarray" to gain control. Both defaults to empty.
% \begin{macrocode}
-\def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}}
\let\@arrayleft\@empty
\let\@arrayright\@empty
% \end{macrocode}
@@ -3182,6 +3507,14 @@
% \end{macro}
%
%
+%
+%
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+%
% \PrintIndex
% \PrintChanges
%
diff --git a/macros/latex-dev/required/tools/array.pdf b/macros/latex-dev/required/tools/array.pdf
index 9cf73a7e98..87880c97fb 100644
--- a/macros/latex-dev/required/tools/array.pdf
+++ b/macros/latex-dev/required/tools/array.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/bm.dtx b/macros/latex-dev/required/tools/bm.dtx
index a608c6aeb5..d7d6eb54ee 100644
--- a/macros/latex-dev/required/tools/bm.dtx
+++ b/macros/latex-dev/required/tools/bm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -22,7 +22,7 @@
% \fi
%
% \iffalse
-%% Copyright 1996 1997 1998 1999 2002 2003 2004 2016 2017 2019 2021 2022
+%% Copyright 1996 1997 1998 1999 2002 2003 2004 2016 2017 2019 2021 2022 2023
%% David Carlisle Frank Mittelbach
%%
%% Development of this package was commissioned by Y&Y Inc.
@@ -36,7 +36,7 @@
%<driver>\ProvidesFile{bm.drv}
% \fi
% \ProvidesFile{bm.dtx}
- [2023/07/08 v1.2f Bold Symbol Support (DPC/FMi)]
+ [2023/12/19 v1.2f Bold Symbol Support (DPC/FMi)]
%
% \iffalse
%<*driver>
@@ -178,14 +178,14 @@
% spacing). So the third example produces identical output to the first
% (but \TeX\ takes more time producing it).
%
-% In the fourth example the |\mathrm{\bm{g}}| is essentially
+% In the fourth example the |\mathrm{\bm{{g}}}| is essentially
% equivalent to |\mathrm{\mbox{\boldmath$g$}}|. Currently math alphabet
% settings are not passed down to `nested' math lists, and so in this
% example, the |\mathrm| has no effect, and a bold math italic $\bm g$
% is obtained.
%
% Similarly the last example is equivalent to
-% |$\mbox{\boldmath$\mathrm{g}$}}| and so in this case, one obtains a
+% |$\mbox{\boldmath$\mathrm{g}$}$| and so in this case, one obtains a
% bold roman \textbf{g}.
%
% \subsection{Delimiters}
diff --git a/macros/latex-dev/required/tools/bm.ins b/macros/latex-dev/required/tools/bm.ins
index a7424a0e67..c0c8125d10 100644
--- a/macros/latex-dev/required/tools/bm.ins
+++ b/macros/latex-dev/required/tools/bm.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2023
+%% Copyright (C) 1993-2024
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/required/tools/bm.pdf b/macros/latex-dev/required/tools/bm.pdf
index c39e17aca0..1f9efb0b02 100644
--- a/macros/latex-dev/required/tools/bm.pdf
+++ b/macros/latex-dev/required/tools/bm.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/calc.dtx b/macros/latex-dev/required/tools/calc.dtx
index 2c4cecbf03..154c6ba26a 100644
--- a/macros/latex-dev/required/tools/calc.dtx
+++ b/macros/latex-dev/required/tools/calc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/calc.pdf b/macros/latex-dev/required/tools/calc.pdf
index 4c0230c693..3cff423972 100644
--- a/macros/latex-dev/required/tools/calc.pdf
+++ b/macros/latex-dev/required/tools/calc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/changes.txt b/macros/latex-dev/required/tools/changes.txt
index 7b38392bd4..ebf705e687 100644
--- a/macros/latex-dev/required/tools/changes.txt
+++ b/macros/latex-dev/required/tools/changes.txt
@@ -5,11 +5,51 @@ completeness or accuracy and it contains some references to files that
are not part of the distribution.
=======================================================================
+2024-01-22 Lars Madsen <daleif@math.au.dk>
+
+ * verbatim.dtx: added TAB marking support to \verbatiminput* (gh/1245)
+
+2023-12-16 David Carlisle <David.Carlisle@latex-project.org>
+
+ * showkeys.dtx: avoid adding extra box to \@lables gh/1123
+
+2023-12-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * longtable.dtx:
+ Support for tagged PDF
+ Manage and provide cell indexes
+
+2023-12-12 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx:
+ Support for tagged PDF
+ Manage and provide cell indexes
+
+2023-12-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * tabularx.dtx:
+ Require newer LaTeX kernel (that supports tagging)
+ Suspend any tagging while doing trial typesetting
+
+2023-11-10 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx (subsection{Maintaining the mark registers}]):
+ Get rid of forced breaks for mark extraction (gh/1130)
+
================================================================================
All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2023-11-01c Release
+#########################
+
+2023-11-06 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * verbatim.dtx (subsection{Preliminaries}):
+ Update code so that \verb does not show visible spaces (gh/1160)
+
+#########################
# 2023-11-01b Release
#########################
@@ -23,8 +63,8 @@ All changes above are only part of the development branch for the next release.
2023-08-25 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
- * longtable.dtx: use \everypar to insert the strut in \LT@startpbox
- to match the array use, github/1128
+ * longtable.dtx: use \everypar to insert the strut in \LT@startpbox
+ to match the array use, github/1128
#########################
# 2023-06-01 Release
diff --git a/macros/latex-dev/required/tools/dcolumn.dtx b/macros/latex-dev/required/tools/dcolumn.dtx
index c8ddaf4ce6..feb3096cce 100644
--- a/macros/latex-dev/required/tools/dcolumn.dtx
+++ b/macros/latex-dev/required/tools/dcolumn.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/dcolumn.pdf b/macros/latex-dev/required/tools/dcolumn.pdf
index 967e011d28..588505c218 100644
--- a/macros/latex-dev/required/tools/dcolumn.pdf
+++ b/macros/latex-dev/required/tools/dcolumn.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/delarray.dtx b/macros/latex-dev/required/tools/delarray.dtx
index 86a1a6203f..61d40b5c74 100644
--- a/macros/latex-dev/required/tools/delarray.dtx
+++ b/macros/latex-dev/required/tools/delarray.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/delarray.pdf b/macros/latex-dev/required/tools/delarray.pdf
index 1a8212075a..1fe65b8c75 100644
--- a/macros/latex-dev/required/tools/delarray.pdf
+++ b/macros/latex-dev/required/tools/delarray.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/enumerate.dtx b/macros/latex-dev/required/tools/enumerate.dtx
index 2818a73a09..c3889a9157 100644
--- a/macros/latex-dev/required/tools/enumerate.dtx
+++ b/macros/latex-dev/required/tools/enumerate.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/enumerate.pdf b/macros/latex-dev/required/tools/enumerate.pdf
index 17a894442e..66a10c9002 100644
--- a/macros/latex-dev/required/tools/enumerate.pdf
+++ b/macros/latex-dev/required/tools/enumerate.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/fileerr.dtx b/macros/latex-dev/required/tools/fileerr.dtx
index eef222bb6e..0e8eeb1ffb 100644
--- a/macros/latex-dev/required/tools/fileerr.dtx
+++ b/macros/latex-dev/required/tools/fileerr.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/fileerr.pdf b/macros/latex-dev/required/tools/fileerr.pdf
index 3fc612b3d8..102b8c865d 100644
--- a/macros/latex-dev/required/tools/fileerr.pdf
+++ b/macros/latex-dev/required/tools/fileerr.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/fontsmpl.dtx b/macros/latex-dev/required/tools/fontsmpl.dtx
index 525065cde5..6e9835e20e 100644
--- a/macros/latex-dev/required/tools/fontsmpl.dtx
+++ b/macros/latex-dev/required/tools/fontsmpl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/fontsmpl.pdf b/macros/latex-dev/required/tools/fontsmpl.pdf
index 61648a2c33..a40e5d5566 100644
--- a/macros/latex-dev/required/tools/fontsmpl.pdf
+++ b/macros/latex-dev/required/tools/fontsmpl.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/ftnright.dtx b/macros/latex-dev/required/tools/ftnright.dtx
index 663fa304a9..a3826376db 100644
--- a/macros/latex-dev/required/tools/ftnright.dtx
+++ b/macros/latex-dev/required/tools/ftnright.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/ftnright.pdf b/macros/latex-dev/required/tools/ftnright.pdf
index 2a4e24a432..e7f13295c7 100644
--- a/macros/latex-dev/required/tools/ftnright.pdf
+++ b/macros/latex-dev/required/tools/ftnright.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/hhline.dtx b/macros/latex-dev/required/tools/hhline.dtx
index 49ac1ae208..b2d833d965 100644
--- a/macros/latex-dev/required/tools/hhline.dtx
+++ b/macros/latex-dev/required/tools/hhline.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/hhline.pdf b/macros/latex-dev/required/tools/hhline.pdf
index d8f969b7b0..c8484ff875 100644
--- a/macros/latex-dev/required/tools/hhline.pdf
+++ b/macros/latex-dev/required/tools/hhline.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/indentfirst.dtx b/macros/latex-dev/required/tools/indentfirst.dtx
index 2314db1c70..9bbe1871e1 100644
--- a/macros/latex-dev/required/tools/indentfirst.dtx
+++ b/macros/latex-dev/required/tools/indentfirst.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/indentfirst.pdf b/macros/latex-dev/required/tools/indentfirst.pdf
index 235e364993..96440b6c57 100644
--- a/macros/latex-dev/required/tools/indentfirst.pdf
+++ b/macros/latex-dev/required/tools/indentfirst.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/layout.dtx b/macros/latex-dev/required/tools/layout.dtx
index 2798bd4f60..a2fc87a6a5 100644
--- a/macros/latex-dev/required/tools/layout.dtx
+++ b/macros/latex-dev/required/tools/layout.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/layout.pdf b/macros/latex-dev/required/tools/layout.pdf
index 4e0722c710..b2d34d40fc 100644
--- a/macros/latex-dev/required/tools/layout.pdf
+++ b/macros/latex-dev/required/tools/layout.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/longtable.dtx b/macros/latex-dev/required/tools/longtable.dtx
index 2a61ab0c87..5a23f3ecb3 100644
--- a/macros/latex-dev/required/tools/longtable.dtx
+++ b/macros/latex-dev/required/tools/longtable.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -37,7 +37,7 @@
%<driver> \ProvidesFile{longtable.drv}
% \fi
% \ProvidesFile{longtable.dtx}
- [2023-11-01 v4.19 Multi-page Table package (DPC)]
+ [2023-12-16 v4.19 Multi-page Table package (DPC)]
%
% \iffalse
%<*driver>
@@ -1048,6 +1048,14 @@
\if@twocolumn
\LT@err{longtable not in 1-column mode}\@ehc
\fi
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/vmode/begin}%
+% \end{macrocode}
+%
+% \begin{macrocode}
\begingroup
% \end{macrocode}
% Check for an optional argument.
@@ -1056,7 +1064,14 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
% \begin{macro}{\LT@array}
+% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
+% \end{macrocode}
+%
% Start setting the alignment.
% Based on "\@array" from the \LaTeX\ kernel
% and the \package{array} package.
@@ -1066,7 +1081,43 @@
% so that "\caption" works correctly.
% \begin{macrocode}
\def\LT@array[#1]#2{%
- \refstepcounter{table}\stepcounter{LT@tables}%
+% \end{macrocode}
+%
+% With respect to tagging we have a complicated situation with
+% longtable. When at the begin the \cs{endhead},
+% \cs{endfirsthead}, \cs{endfoot} and \cs{endlastfoot} are used to
+% setup head and foot they create each a structure subtree with one or
+% more rows. From these structures we want to keep at most two (head
+% and foot) and move the foot to the end of the table. When the head
+% and foot boxes are (re)inserted on following pages we want to mark
+% them up as artifact with the exception of the head at the begin and
+% the foot box at the end.
+%
+% TODO: When a line is killed the structure subtree is there already
+% too and must be removed. If hard to do, then maybe at first warn if the
+% construction is used.
+%
+% \cs{LT@array} is executed in a group, so we can disable para-tagging here.
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/init}
+ \@kernel@refstepcounter{table}\stepcounter{LT@tables}
+% \end{macrocode}
+% The target is created rather late and a \cs{label} can come earlier,
+% so we have to define \cs{@currentHref} explicitly. We can't currently
+% assume that \cs{theHtable} is defined always.
+% \begin{macrocode}
+ \tl_gset:Ne \@currentHref {table.\cs_if_exist_use:N\theHtable}
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_gzero_row_count:
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/longtable/init}
% \end{macrocode}
% Set up the glue around the table if an optional argument given.
% \begin{macrocode}
@@ -1101,17 +1152,18 @@
% here so that you can load the \package{array} package before or after
% \package{longtable}.
% \begin{macrocode}
- \let\LT@@tabarray\@tabarray
- \let\LT@@hl\hline
+ \let\LT@@@@tabarray\@tabarray
+ \let\LT@@@@hl\hline
\def\@tabarray{%
- \let\hline\LT@@hl
+ \let\hline\LT@@@@hl
% \end{macrocode}
%\begin{verbatim}
% \let\multicolumn\LT@mcol
%\end{verbatim}
% \begin{macrocode}
- \LT@@tabarray}%
- \let\\\LT@tabularcr\let\tabularnewline\\%
+ \LT@@@@tabarray}%
+ \let\\\LT@tabularcr
+ \let\tabularnewline\\%
\def\newpage{\noalign{\break}}%
% \end{macrocode}
% \changes{v4.05}{1996/11/12}
@@ -1128,8 +1180,8 @@
% \end{macrocode}
%
% \changes{v4.08}{1998/01/20}
-% {Move \cs{@endpbox} definition earlier and define \cs{@@endpbox}
-% and \cs{@@startpbox} for non-array case. tools/2736}
+% {Move \cs{@endpbox} definition earlier and define \cs{@@@@endpbox}
+% and \cs{@@@@startpbox} for non-array case. tools/2736}
% \begin{macrocode}
\let\@endpbox\LT@endpbox
% \end{macrocode}
@@ -1142,8 +1194,8 @@
\let\@acol\@tabacol
\let\@classz\@tabclassz \let\@classiv\@tabclassiv
\def\@startpbox{\vtop\LT@startpbox}%
- \let\@@startpbox\@startpbox
- \let\@@endpbox\@endpbox
+ \let\@@@@startpbox\@startpbox
+ \let\@@@@endpbox\@endpbox
\let\LT@LL@FM@cr\@tabularcr
\else
% \end{macrocode}
@@ -1172,6 +1224,11 @@
\begingroup
\@mkpream{#2}%
% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_count_table_cols:
+% \end{macrocode}
% We need to rename "\@preamble" here as F.M.'s scheme uses
% "\global", and we may need to nest "\@mkpream", eg for
% "\multicolumn"
@@ -1180,6 +1237,11 @@
% \begin{macrocode}
\xdef\LT@bchunk{%
% \end{macrocode}
+% We aren't inside any row when a chunk starts.
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_inbetween_rows:
+% \end{macrocode}
% \changes{v4.00}{1996/04/08}
% {(DK) Increment Chunk counter}
% \begin{macrocode}
@@ -1205,7 +1267,21 @@
% \begin{macrocode}
\tabskip\LTleft \noexpand\halign to\hsize\bgroup
% \tabskip\LTleft\halign to\hsize\bgroup
- \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
+ \tabskip\z@ \@arstrut
+% \end{macrocode}
+% Insert the tagging socket to start the row and initialize the cell
+% data for the row.
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/row/begin}%
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_init_cell_data_for_row:
+% \end{macrocode}
+% \begin{macrocode}
+ \@preamble \tabskip\LTright \cr}%
\endgroup
% \end{macrocode}
% Find out how many columns we have (store in "\LT@cols").
@@ -1220,11 +1296,57 @@
% A few more internal commands for \env{longtable}.
% \begin{macrocode}
\m@th\let\par\@empty
- \everycr{}\lineskip\z@\baselineskip\z@
+% \end{macrocode}
+% Tagging socket and conditional
+% \begin{macrocode}
+ \everycr{%
+ \noalign{%
+% \end{macrocode}
+% In \pkg{longtable} we have a bunch of extra \cs{cr}s that are
+% executed whenever a chunk ends. In that case they should not
+% increment the main row counter, sigh.
+%
+% TODO: At the moment this tracing still exposes the internal row counter!
+% \begin{macrocode}
+ \@@_trace:n {--longtable-->~chunk~row:~ \the\LT@rows \space
+ row:~ \the\g_@@_row_int \space
+ column:~ \the\g_@@_col_int
+ }
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \tbl_if_row_was_started:T
+ {
+ \UseTaggingSocket{tbl/row/end}
+% \end{macrocode}
+% The next setting prevents any of the additional \cs{cr}s at the end of the
+% chunk to add another /TR. Then once we really start a new chunk
+% it gets incremented so\ldots
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_inbetween_rows:
+ }
+% \end{macrocode}
+% And for the same reason such \cs{cr}s should not increment the
+% main row counter (but it has to be incremented after the preamble
+% of a chunk), so here we test against \cs{LT@rows} which is
+% \cs{LTchunksize} at the end of a chunk.
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \int_compare:nNnT \LT@rows < \LTchunksize
+ { \tbl_gincr_row_count: } % next is row about to start
+ }%
+ }%
+% \end{macrocode}
+% \begin{macrocode}
+ \lineskip\z@\baselineskip\z@
% \end{macrocode}
% Start the first chunk.
% \begin{macrocode}
\LT@bchunk}
+\ExplSyntaxOff
+%<@@=>
% \end{macrocode}
% \end{macro}
%
@@ -1251,6 +1373,11 @@
% force the page-breaker to wake up. The second "\endgraf" is there so
% that "\pagetotal" is updated and so takes "\LTpre" into account.
% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
\def\LT@start{%
\let\LT@start\endgraf
\endgraf\penalty\z@\vskip\LTpre\endgraf
@@ -1334,7 +1461,7 @@
% \changes{v3.14}{1995/05/02}
% {Set \cs{@colroom}, for tools/1584}
% \begin{macrocode}
- \global\@colroom\@colht
+ \global\@colroom\@colht
% \end{macrocode}
% If the foot is non empty, reduce the "\vsize" and "\@colroom"
% accordingly.
@@ -1342,24 +1469,46 @@
% {Rearrange vertical space tests for tools/3512 (floats on same page)}
% \begin{macrocode}
\ifvoid\LT@foot\else
-% \advance\vsize-\ht\LT@foot
\global\advance\vsize-\ht\LT@foot
\global\advance\@colroom-\ht\LT@foot
\dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
\maxdepth\z@
\fi
% \end{macrocode}
+%
+% \begin{macrocode}
+ \MakeLinkTarget{table}
+% \end{macrocode}
% Put the table head on the page, and then switch to the new output
% routine.
% \changes{v4.11}{2004/02/01}
% {\cs{nobreak}, for tools/3484}
% \begin{macrocode}
\ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/longtable/head}
+% \end{macrocode}
+%
+% \begin{macrocode}
\output{\LT@output}}
+\ExplSyntaxOff
+%<@@=>
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
% \begin{macro}{\endlongtable}
+%
+% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
+% \end{macrocode}
+%
% Called by "\end{longtable}".
% \begin{macrocode}
\def\endlongtable{%
@@ -1370,11 +1519,23 @@
% been shortened, or the table numbering has gone awry). In that case
% we at least start collecting valid new information with the last
% chunk of this table, by removing the width constraint.
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \tbl_crcr:n {endlongtable}
+% \end{macrocode}
+%
% \changes{v4.01}{1996/04/11}
% {(DPC) use \cs{noalign} to sneak in \cs{LT@entry@chop}}
% \begin{macrocode}
- \crcr
\noalign{%
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/longtable/finalize}
+% \end{macrocode}
+%
+% \begin{macrocode}
\let\LT@entry\LT@entry@chop
\xdef\LT@save@row{\LT@save@row}}%
\LT@echunk
@@ -1414,10 +1575,10 @@
% \changes{v4.04}{1996/05/24}
% {Use \cs{LT@final@warn}}
% \begin{macrocode}
- \ifx\LT@save@row\LT@@save@row
+ \ifx\LT@save@row\LT@@@@save@row
\else
- \LT@warn{Column \@width s have changed\MessageBreak
- in table \thetable}%
+ \LT@warn{Column~ widths~ have~ changed\MessageBreak
+ in~ table~ \thetable}%
\LT@final@warn
\fi
% \end{macrocode}
@@ -1449,7 +1610,15 @@
% \end{macrocode}
% Footnotes. As done in the \package{multicol} package.
% \begin{macrocode}
- \ifvoid\footins\else\insert\footins{}\fi}
+ \ifvoid\footins\else\insert\footins{}\fi
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/vmode/end}%
+}
+\ExplSyntaxOff
+%<@@=>
% \end{macrocode}
% \end{macro}
%
@@ -1518,6 +1687,10 @@
\protected\def\LT@tabularcr{%
\relax\iffalse{\fi\ifnum0=`}\fi
\@ifstar
+% \end{macrocode}
+% TODO: as we replace crcr later in one case, we probably have to
+% implement some further logic there!
+% \begin{macrocode}
{\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
\LT@t@bularcr}%
{\LT@t@bularcr}}
@@ -1544,8 +1717,13 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
% \begin{macro}{\LT@t@bularcr}
% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
\def\LT@t@bularcr{%
% \end{macrocode}
% Increment the counter, and do \env{tabular}'s "\\" or finish the
@@ -1555,6 +1733,13 @@
% \begin{macrocode}
\global\advance\LT@rows\@ne
\ifnum\LT@rows=\LTchunksize
+% \end{macrocode}
+% At the end of the chunk \verb=\\= is doing something special and
+% so we lose \verb=\tbl_count_missing_cells:n=. Below is about the
+% right place to add it do this code branch.
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_count_missing_cells:n {echunk}
\gdef\LT@setprevdepth{%
\prevdepth\z@
\global\let\LT@setprevdepth\relax}%
@@ -1563,6 +1748,8 @@
\ifnum0=`{}\fi
\expandafter\LT@LL@FM@cr
\fi}
+\ExplSyntaxOff
+%<@@=>
% \end{macrocode}
% \end{macro}
%
@@ -1943,7 +2130,9 @@
% This code is based on "\cline". Two copies of the line are produced,
% as described above.
% \begin{macrocode}
-\def\LT@@hline{%
+%<@@=tbl>
+\ExplSyntaxOn
+\def\LT@@@@hline{%
\ifx\@let@token\hline
\global\let\@gtempa\@gobble
\gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
@@ -1954,11 +2143,25 @@
\ifnum0=`{\fi}%
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
- \noalign{\LT@sep}%
+% \end{macrocode}
+% Don't update the row counter, or rather undo the update done in \cs{everycr}:
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \noalign{
+ \tbl_gdecr_row_count:
+ \LT@sep}
\multispan\LT@cols
\unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
- \noalign{\penalty\@M}%
+% \end{macrocode}
+% Same here.
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \noalign{
+ \tbl_gdecr_row_count:
+ \penalty\@M}
\@gtempa}
+\ExplSyntaxOff
+%<@@=>
% \end{macrocode}
% \end{macro}
%
@@ -2049,13 +2252,15 @@
% \begin{macro}{\LT@output}
% Actually this is not so bad, with FM leading the way.
% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
\def\LT@output{%
\ifnum\outputpenalty <-\@Mi
\ifnum\outputpenalty > -\LT@end@pen
% \end{macrocode}
% If this was a float or a marginpar we complain.
% \begin{macrocode}
- \LT@err{floats and marginpars not allowed in a longtable}\@ehc
+ \LT@err{floats~ and~ marginpars~ not~ allowed~ in~ a~ longtable}\@ehc
\else
% \end{macrocode}
% We have reached the end of the table, on the scroll at least,
@@ -2103,6 +2308,13 @@
% \begin{macrocode}
\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi
% \end{macrocode}
+% Handle foot box when tagging:
+%
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/longtable/foot}
+% \end{macrocode}
+%
% End of "\ifnum\outputpenalty > -\LT@end@pen".
% \begin{macrocode}
\fi
@@ -2114,6 +2326,15 @@
% If we have not reached the end of the table,
% \begin{macrocode}
\setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
+% \end{macrocode}
+%
+% Handle foot box when tagging:
+% \changes{v4.19}{2023/12/16}{Support for tagged PDF}
+% \begin{macrocode}
+ \UseTaggingSocket{tbl/longtable/foot}
+% \end{macrocode}
+%
+% \begin{macrocode}
\@makecol
\@outputpage
% \end{macrocode}
@@ -2133,8 +2354,15 @@
% \begin{macrocode}
\fi}
% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%<@@=>
+% \end{macrocode}
% \end{macro}
%
+%
+%
% \subsection{Commands for the table head and foot}
%
% \begin{macro}{\LT@end@hd@ft}
@@ -2142,20 +2370,86 @@
% box specified by "#1". Issue an error if the table has already
% started. Then start a new chunk.
% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
\def\LT@end@hd@ft#1{%
+% \end{macrocode}
+%
+% This command is used to store the head and foot boxes.
+% We need to retrieve and store the row so that we can clean
+% up the structure in the finalize code.
+%
+% To handle missing columns in the header we need this:
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_if_row_was_started:TF
+ {
+% \end{macrocode}
+% TODO: This is exposing internal counters, so it should be encapsulated
+% in some interface command (but I'm not sure what that should be
+% called, so not done yet.
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_count_missing_cells:n {head/foot}
+ \int_step_inline:nn
+ { \LT@rows + 1 }
+ {
+ \seq_gput_left:ce
+ {g_@@_\cs_to_str:N #1 _rows_seq }
+ { \int_eval:n {\g_@@_row_int + 1 - ##1 } }
+ }
+% \end{macrocode}
+% We also have to set the chunk rows to its max value before
+% calling \cs{LTechunk} so that we don't get extra increments of
+% the main row counter due to \cs{everycr}.
+% \begin{macrocode}
+ \int_gset:Nn \LT@rows { \LTchunksize }
+ }
+% \end{macrocode}
+
+% If we are still in column zero then we had an empty \cs{endhead}
+% and so making any assignment, etc., would start a row --- something we don't want.
+% To get out of this trap we run \cs{crcr} (which would normally
+% come inside \cs{LT@echunk}. That will then trigger \cs{everycr}
+% and update row counter unnecessarily, but now we have a defined state, so
+% we can use \cs{noalign} to undo that.
+% We also change \cs{LT@rows} so that further \cs{cr}s do not do
+% any harm (as explained above.
+%
+% The \cs{crcr} inside \cs{LT@echunk} will be bypassed in that case
+% as we have just executed a \cs{crcr} and are still in scanning modus for
+% \cs{omit} or \cs{noalign}.
+% \begin{macrocode}
+ {
+ \crcr
+ \noalign{
+% \end{macrocode}
+%
+% \changes{v4.19}{2023/12/16}{Managing cell indexes}
+% \begin{macrocode}
+ \tbl_gdecr_row_count: % undo the increment
+ \int_gset:Nn \LT@rows { \LTchunksize }
+ }
+ }
\LT@echunk
% \end{macrocode}
% Changed from "\relax" to "\endgraf" at V3.04, see "\LT@start".
% \begin{macrocode}
\ifx\LT@start\endgraf
\LT@err
- {Longtable head or foot not at start of table}%
- {Increase LTchunksize}%
+ {Longtable~ head~ or~ foot~ not~ at~ start~ of~ table}%
+ {Increase~ LTchunksize}%
\fi
\setbox#1\box\z@
+ \@@_trace:n {-->>~ Saving~\noexpand#1}
\LT@get@widths
\LT@bchunk}
% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%<@@=>
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\endfirsthead}
@@ -2255,6 +2549,24 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
+%
+% Some variables need for the tagging support.
+% \begin{macrocode}
+%<@@=tbl>
+\ExplSyntaxOn
+ \seq_new:N \g_@@_LT@firsthead_rows_seq
+ \seq_new:N \g_@@_LT@head_rows_seq
+ \seq_new:N \g_@@_LT@lastfoot_rows_seq
+ \seq_new:N \g_@@_LT@foot_rows_seq
+\ExplSyntaxOff
+%<@@=>
+% \end{macrocode}
+%
+%
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/macros/latex-dev/required/tools/longtable.ins b/macros/latex-dev/required/tools/longtable.ins
index 5c3ad27063..60b7461571 100644
--- a/macros/latex-dev/required/tools/longtable.ins
+++ b/macros/latex-dev/required/tools/longtable.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2023
+%% Copyright (C) 1993-2024
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/required/tools/longtable.pdf b/macros/latex-dev/required/tools/longtable.pdf
index f24ff36f4f..5fb3c4a917 100644
--- a/macros/latex-dev/required/tools/longtable.pdf
+++ b/macros/latex-dev/required/tools/longtable.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/multicol.dtx b/macros/latex-dev/required/tools/multicol.dtx
index 2676d03aa1..9c680ab563 100644
--- a/macros/latex-dev/required/tools/multicol.dtx
+++ b/macros/latex-dev/required/tools/multicol.dtx
@@ -99,10 +99,10 @@
%<driver> \ProvidesFile{multicol.drv}
% \fi
% \ProvidesFile{multicol.dtx}
- [2023/03/30 v1.9f multicolumn formatting (FMi)]
+ [2024/01/29 v1.9g multicolumn formatting (FMi)]
+%
%
%
-%%
%
% \changes{v1.9c}{2021/11/30}{Added rollback to v1.8}
% \changes{v1.5n}{1997/06/05}{Applied improvement of documentation,
@@ -919,9 +919,22 @@
% And we don't show macro names in the margin.
% \begin{macrocode}
\setcounter{IndexColumns}{4}
-\let\DescribeMacro\SpecialUsageIndex
-\let\DescribeEnv\SpecialEnvIndex
-\renewcommand\PrintMacroName[1]{}
+% \end{macrocode}
+%
+% The following redefinitions have to be moved until after the
+% preamble because version 3 of \pkg{doc} resets them after the
+% premable (this is tmp, because \pkg{hypdoc} is not yet
+% integrated, but as we all know, tmp solutions have a tendency to
+% survive for a long time\ldots).
+% \begin{macrocode}
+\AddToHook{begindocument}{%
+ \let\DescribeMacro\SpecialUsageIndex
+ \let\DescribeEnv\SpecialEnvIndex
+ \renewcommand\PrintMacroName[1]{}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
\CodelineIndex
%\DisableCrossrefs % Partial index
\RecordChanges % Change log
@@ -1082,7 +1095,7 @@
% better test for this situation. Otherwise, we will get a \TeX{}
% stack overflow as this would generate a self-referencing definition.
% \changes{v1.6e}{2004/02/14}{Avoid self-referencing definition of
-% \cs{@footnotetext} (pr/3618)}.
+% \cs{@footnotetext} (pr/3618)}
% \begin{macrocode}
\ifx\@footnotetext\mult@footnotetext
\else
@@ -2376,7 +2389,7 @@
% If |\raggedcolumns| is in force we add a |vfill| at the bottom by
% unboxing the split box.
% But we need to unbox anyway to ensure that at the end of the box
-% we do not have unwanted space. This can sneak in in certain
+% we do not have unwanted space. This can sneak in, in certain
% situations, for example, if two lists follow each other and we
% break between them. While such space is usually zero it still has
% an effect because it hides depth of the last line in the column
@@ -2925,7 +2938,11 @@
% We start by setting the kept marks by updating them with any
% marks from this box. This has to be done \emph{before} we add a
% penalty of $-10000$ to the top of the box, otherwise only an
-% empty box will be considered.
+% empty box will be considered. But even that is not enough: the box
+% may contain \cs{columnbreak}s in which case doing some artifical
+% splitting to get the marks out still fails to see all marks
+% unless we take some special precaution in \cs{get@keptmarks}
+% (which is now done).
% \changes{v1.5h}{1994/08/26}{Get kept marks first}
% \begin{macrocode}
\get@keptmarks\mult@box
@@ -3751,8 +3768,15 @@
% everything is split off. As a result |\splitfirstmark| and
% |\splitbotmark| will contain the first and last mark in the box
% respectively.
+%
+% Unfortunately, a simple \cs{vsplit} is not enough if the material
+% contains forced breaks in that case we first have to get rid of
+% those which is why we do this work in a separate macro that can
+% call itself recursively.
+% \changes{v1.9g}{2023/11/10}{Get rid of forced breaks for mark
+% extraction (gh/1130)}
% \begin{macrocode}
- \setbox#1\vsplit#1to\maxdimen
+ \mc@get@all@box@marks #1%
% \end{macrocode}
% Therefore we can now set the kept marks which is a global
% operation and afterwards close the group. This will restore the
@@ -3773,6 +3797,29 @@
% \end{macro}
%
%
+% \begin{macro}{\mc@get@all@box@marks}
+% This macro splits a box to \cs{maxdimen} in order to get at the
+% marks inside. If it turns out that we have a remainder after the
+% split (e.g., if there was a \cs{columnbreak} in the material) we
+% stitch the two parts together again (which omits the forced
+% break) and recurse. Eventually, everything is split off and the
+% split marks will then have the appropriate values.
+% \changes{v1.9g}{2023/11/10}{Get rid of forced breaks for mark
+% extraction (gh/1130)}
+% \begin{macrocode}
+\def\mc@get@all@box@marks #1{%
+ \setbox\@tempboxa\vsplit#1to\maxdimen
+ \ifvoid#1\else
+ \setbox#1\vbox{\unvbox\@tempboxa \unvbox#1}%
+ \mc@get@all@box@marks #1%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
% \begin{macro}{\set@keptmarks}
% The macro |\set@keptmarks| is responsible for setting
% |\kept@firstmark| and |\kept@botmark|, by checking the current
diff --git a/macros/latex-dev/required/tools/multicol.ins b/macros/latex-dev/required/tools/multicol.ins
index fa561e0bb1..7a7ef27d24 100644
--- a/macros/latex-dev/required/tools/multicol.ins
+++ b/macros/latex-dev/required/tools/multicol.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2023
+%% Copyright (C) 1993-2024
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/required/tools/multicol.pdf b/macros/latex-dev/required/tools/multicol.pdf
index 031d1920fa..360c09d0b9 100644
--- a/macros/latex-dev/required/tools/multicol.pdf
+++ b/macros/latex-dev/required/tools/multicol.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/rawfonts.dtx b/macros/latex-dev/required/tools/rawfonts.dtx
index 4b930f3ea7..3ffa2032c3 100644
--- a/macros/latex-dev/required/tools/rawfonts.dtx
+++ b/macros/latex-dev/required/tools/rawfonts.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/rawfonts.pdf b/macros/latex-dev/required/tools/rawfonts.pdf
index 08f8d71317..98bfaa374a 100644
--- a/macros/latex-dev/required/tools/rawfonts.pdf
+++ b/macros/latex-dev/required/tools/rawfonts.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/shellesc.dtx b/macros/latex-dev/required/tools/shellesc.dtx
index aa707fe550..8a556de922 100644
--- a/macros/latex-dev/required/tools/shellesc.dtx
+++ b/macros/latex-dev/required/tools/shellesc.dtx
@@ -1,6 +1,6 @@
% \iffalse
%% Source File: shellesc.dtx
-%% Copyright (C) 2015-2023
+%% Copyright (C) 2015-2024
%%
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
diff --git a/macros/latex-dev/required/tools/shellesc.pdf b/macros/latex-dev/required/tools/shellesc.pdf
index ee1a87cc01..c41228c1b9 100644
--- a/macros/latex-dev/required/tools/shellesc.pdf
+++ b/macros/latex-dev/required/tools/shellesc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/showkeys.dtx b/macros/latex-dev/required/tools/showkeys.dtx
index c90b3863e1..aba96a7eab 100644
--- a/macros/latex-dev/required/tools/showkeys.dtx
+++ b/macros/latex-dev/required/tools/showkeys.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -22,7 +22,7 @@
% \fi
% \iffalse
%% File: showkeys.dtx Copyright (C) 1992-1997 David Carlisle
-%% File: showkeys.dtx Copyright (C) 2006-2019 David Carlisle, LaTeX Project
+%% File: showkeys.dtx Copyright (C) 2006-2023 David Carlisle, LaTeX Project
%
%<*dtx>
\ProvidesFile{showkeys.dtx}
@@ -39,7 +39,7 @@
%<driver> \ProvidesFile{showkeys.drv}
% \fi
% \ProvidesFile{showkeys.dtx}
- [2023/07/08 v3.19 Show cite and label keys (DPC, MH)]
+ [2023/12/16 v3.20 Show cite and label keys (DPC, MH)]
%
% \iffalse
%<*driver>
@@ -417,6 +417,8 @@
% \end{macrocode}
% \changes{v3.02}{1995/03/17}
% {New code for `in label' case.}
+% \changes{v3.20}{2023/12/16}
+% {Avoid adding an extra box layer github/1123}
% If the |\label| is straight after |\item| (|\bibitem| is handled by
% this case as well) then the item label has not been added to the page
% yet. It is hanging around in the box |\@labels| waiting for the
@@ -425,7 +427,7 @@
\global\setbox\@labels\hbox{%
\llap{\SK@lab\SK@lab@relax
\kern\@totalleftmargin\kern\marginparsep}%
- \box\@labels}%
+ \unhbox\@labels}%
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/macros/latex-dev/required/tools/showkeys.pdf b/macros/latex-dev/required/tools/showkeys.pdf
index 2d4da0c5a7..6b1ae4549e 100644
--- a/macros/latex-dev/required/tools/showkeys.pdf
+++ b/macros/latex-dev/required/tools/showkeys.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/somedefs.dtx b/macros/latex-dev/required/tools/somedefs.dtx
index 02653a1393..156621d70e 100644
--- a/macros/latex-dev/required/tools/somedefs.dtx
+++ b/macros/latex-dev/required/tools/somedefs.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/somedefs.pdf b/macros/latex-dev/required/tools/somedefs.pdf
index 9d282b58f3..07a32befaa 100644
--- a/macros/latex-dev/required/tools/somedefs.pdf
+++ b/macros/latex-dev/required/tools/somedefs.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tabularx.dtx b/macros/latex-dev/required/tools/tabularx.dtx
index 6d59ca4c22..52ee62cad9 100644
--- a/macros/latex-dev/required/tools/tabularx.dtx
+++ b/macros/latex-dev/required/tools/tabularx.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -31,7 +31,7 @@
%<driver> \ProvidesFile{tabularx.drv}
% \fi
% \ProvidesFile{tabularx.dtx}
- [2023/07/08 v2.11c `tabularx' package (DPC)]
+ [2023/12/11 v2.12a `tabularx' package (DPC)]
% \iffalse
%<*driver>
\documentclass{ltxdoc}
@@ -261,6 +261,25 @@
% This behaviour of the package can be customised slightly
% as noted in the documentation of the code section.
%
+% \section{Support for tagged PDF}
+%
+% With version 2.12a the package is made tagging aware, which means that
+% it will automatically produce tagged tables (necessary, for example, for
+% accessibility) if tagging is requested via \cs{DocumentMetadata}.
+%
+% More granular control, e.g., explicitly deciding which cells are
+% header cells, etc., is currently under development, but syntax for
+% this will not appear in this package. Instead it will become
+% available across all tabular-generating packages and then
+% automatically apply here as well.
+%
+% Enabling \LaTeX{} to automatically produce tagged PDF is a long-term
+% project and this is a tiny step in this puzzle. For more information
+% on the project and already available functionality, see
+% \url{https://latex-project.org/publications/indexbytopic/pdf} and
+% \url{https://github.com/latex3/tagging-project}.
+%
+%
% \MaybeStop{}
%
% \section{The Macros}
@@ -269,6 +288,14 @@
%<*package>
% \end{macrocode}
%
+% We only need two changes for tagging support, but they require
+% that a recent \LaTeX{} kernel is used (which should be no problem
+% if \texttt{tools} is distributed in parallel with the kernel.
+% \changes{v2.12a}{2023/12/11}{Require newer LaTeX kernel}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[2024/06/01]
+% \end{macrocode}
+%
% \changes{v2.00}{1994/02/07}
% {New Option Handling}
% \begin{macrocode}
@@ -506,7 +533,15 @@
% \begin{macrocode}
\TX@typeout@
{\@spaces Table Width\@spaces Column Width\@spaces X Columns}%
-% \end{macrocode}%
+% \end{macrocode}
+%
+% While we do trial typesetting we suspend any tagging if that is
+% active:
+% \changes{v2.12a}{2023/12/11}
+% {Suspend any tagging while doing trial typesetting}
+% \begin{macrocode}
+ \SuspendTagging {tabularx}%
+% \end{macrocode}
% First attempt. Modify the {\ttfamily X} definition to count {\ttfamily
% X} columns.
% \begin{macrocode}
@@ -523,6 +558,12 @@
\TX@trial{}%
\repeat
% \end{macrocode}
+%
+% And here we restart it again:
+% \begin{macrocode}
+ \ResumeTagging {tabularx}%
+% \end{macrocode}
+%
% One last time, with warnings back on (see appendix D)
% use {\ttfamily tabular*} to put it in a box of the right size, in case
% the algorithm failed to find the correct size.
@@ -737,8 +778,9 @@
% Make the table, and finish the hbox.
% Since v1.06, "\toks@" contains the preamble specification,
% and possible optional argument, as well as the table body.
+%
% \begin{macrocode}
- \expandafter\tabular\the\toks@
+ \expandafter\tabular\the\toks@
\endtabular}%
% \end{macrocode}
% Since v1.05 reset all \LaTeX\ counters, by executing "\TX@ckpt".
@@ -961,6 +1003,7 @@
% \end{macrocode}
% \end{macro}
%
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/macros/latex-dev/required/tools/tabularx.ins b/macros/latex-dev/required/tools/tabularx.ins
index 6e81e93432..fdce598d37 100644
--- a/macros/latex-dev/required/tools/tabularx.ins
+++ b/macros/latex-dev/required/tools/tabularx.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2023
+%% Copyright (C) 1993-2024
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/required/tools/tabularx.pdf b/macros/latex-dev/required/tools/tabularx.pdf
index 9f68f26643..28b61a3da3 100644
--- a/macros/latex-dev/required/tools/tabularx.pdf
+++ b/macros/latex-dev/required/tools/tabularx.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/theorem.dtx b/macros/latex-dev/required/tools/theorem.dtx
index e3a8e90b8c..a9c3ccae3e 100644
--- a/macros/latex-dev/required/tools/theorem.dtx
+++ b/macros/latex-dev/required/tools/theorem.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/theorem.pdf b/macros/latex-dev/required/tools/theorem.pdf
index 5cdc977c98..96c8c8512f 100644
--- a/macros/latex-dev/required/tools/theorem.pdf
+++ b/macros/latex-dev/required/tools/theorem.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tools-overview.pdf b/macros/latex-dev/required/tools/tools-overview.pdf
index 300602a9ed..b5dd0670fb 100644
--- a/macros/latex-dev/required/tools/tools-overview.pdf
+++ b/macros/latex-dev/required/tools/tools-overview.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tools-overview.tex b/macros/latex-dev/required/tools/tools-overview.tex
index 3bc325d67c..54f4b5ed63 100644
--- a/macros/latex-dev/required/tools/tools-overview.tex
+++ b/macros/latex-dev/required/tools/tools-overview.tex
@@ -1,7 +1,7 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{tools-overview.tex}[2015/03/31 v1.0 Tools overview]
-% Copyright (C) 2006-2023
+% Copyright (C) 2006-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/tools.ins b/macros/latex-dev/required/tools/tools.ins
index 6898faead3..2fd1cd174b 100644
--- a/macros/latex-dev/required/tools/tools.ins
+++ b/macros/latex-dev/required/tools/tools.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2023
+%% Copyright (C) 1993-2024
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -49,7 +49,7 @@ reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/required/tools/trace.dtx b/macros/latex-dev/required/tools/trace.dtx
index 788f831620..27a39c776b 100644
--- a/macros/latex-dev/required/tools/trace.dtx
+++ b/macros/latex-dev/required/tools/trace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/trace.pdf b/macros/latex-dev/required/tools/trace.pdf
index 7ddd4fc6b7..f0065a21c3 100644
--- a/macros/latex-dev/required/tools/trace.pdf
+++ b/macros/latex-dev/required/tools/trace.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/varioref.dtx b/macros/latex-dev/required/tools/varioref.dtx
index e801c54f81..ccf3468c9b 100644
--- a/macros/latex-dev/required/tools/varioref.dtx
+++ b/macros/latex-dev/required/tools/varioref.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/varioref.ins b/macros/latex-dev/required/tools/varioref.ins
index dcc41d0176..88527a20ba 100644
--- a/macros/latex-dev/required/tools/varioref.ins
+++ b/macros/latex-dev/required/tools/varioref.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright (C) 1993-2023
+%% Copyright (C) 1993-2024
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug
reports for it can be opened at https://latex-project.org/bugs/
(but please observe conditions on bug reports sent to that address!)
-Copyright (C) 1993-2023
+Copyright (C) 1993-2024
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex-dev/required/tools/varioref.pdf b/macros/latex-dev/required/tools/varioref.pdf
index 6a8d722fd7..01a079a5ff 100644
--- a/macros/latex-dev/required/tools/varioref.pdf
+++ b/macros/latex-dev/required/tools/varioref.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/verbatim.dtx b/macros/latex-dev/required/tools/verbatim.dtx
index 832f80ef3a..468dead3e8 100644
--- a/macros/latex-dev/required/tools/verbatim.dtx
+++ b/macros/latex-dev/required/tools/verbatim.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -55,7 +55,7 @@
\and
Chris Rowley}
-\date{2023/07/08}
+\date{2023/11/06}
\begin{document}
\markboth{Verbatim style option}{Verbatim style option}
\MaintainedByLaTeXTeam{tools}
@@ -69,6 +69,8 @@
%\fi
%
%
+%
+% \changes{v1.5x}{2024/01/22}{Added TAB marking support to \cs{verbatiminput*}}
% \changes{v1.5u}{2020-07-07}{Typo repair and added a missing comment
% character}
% \changes{v1.5q}{2003/08/22}{Reintroduced \cs{@noligs}, by popular
@@ -508,7 +510,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{verbatim}
- [2022-07-02 v1.5u LaTeX2e package for verbatim enhancements]
+ [2024-01-22 v1.5x LaTeX2e package for verbatim enhancements]
\@ifundefined{verbatim@@@}{}{\endinput}
% \end{macrocode}
%
@@ -549,9 +551,17 @@
% to be printed as spaces in the output.
% \begin{macrocode}
\begingroup
- \catcode`\ =\active%
- \def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
- \expandafter\endgroup\x
+\catcode`\ =\active%
+% \end{macrocode}
+% Because space is active we can't indent the following code
+% nicely---we would then get the spaces at the beginning of the
+% line as the third and fourth argument to \cs{@ifl@t@r}.
+% \changes{v1.5v}{2023/11/06}{\cs{@vobeytabs} added when available (gh/1160)}
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2023-11-01}%
+{\def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp\@vobeytabs}}}%
+{\def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}}%
+\expandafter\endgroup\x
% \end{macrocode}
% \end{macro}
%
@@ -1562,7 +1572,14 @@
% arguments, depending on whether an asterisk follows.
% \begin{macrocode}
\def\verbatiminput{\begingroup
- \@ifstar{\verbatim@input\relax}%
+% \end{macrocode}
+%
+% \changes{v1.5x}{2024/01/22}{Added TAB marking support into the
+% starred version (gh/1245)}
+% If starred, we mark spaces and TABs, the two
+% added pieces are the same as for verbatim*.
+% \begin{macrocode}
+ \@ifstar{\verbatim@input{\@setupverbvisiblespace\@vobeyspaces}}%
{\verbatim@input{\frenchspacing\@vobeyspaces}}}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex-dev/required/tools/verbatim.pdf b/macros/latex-dev/required/tools/verbatim.pdf
index 3908ca304d..bc055db066 100644
--- a/macros/latex-dev/required/tools/verbatim.pdf
+++ b/macros/latex-dev/required/tools/verbatim.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/xr.dtx b/macros/latex-dev/required/tools/xr.dtx
index be48f5a01b..3914cebcd9 100644
--- a/macros/latex-dev/required/tools/xr.dtx
+++ b/macros/latex-dev/required/tools/xr.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/xr.pdf b/macros/latex-dev/required/tools/xr.pdf
index 58217a12d2..b3c4530a59 100644
--- a/macros/latex-dev/required/tools/xr.pdf
+++ b/macros/latex-dev/required/tools/xr.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/xspace.dtx b/macros/latex-dev/required/tools/xspace.dtx
index 807fc9c5df..be20fc9e52 100644
--- a/macros/latex-dev/required/tools/xspace.dtx
+++ b/macros/latex-dev/required/tools/xspace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2023
+% Copyright (C) 1993-2024
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex-dev/required/tools/xspace.pdf b/macros/latex-dev/required/tools/xspace.pdf
index 573624719e..792cae7e6c 100644
--- a/macros/latex-dev/required/tools/xspace.pdf
+++ b/macros/latex-dev/required/tools/xspace.pdf
Binary files differ
diff --git a/macros/latex/contrib/eolang/README.md b/macros/latex/contrib/eolang/README.md
index 47fa929241..2214b74e38 100644
--- a/macros/latex/contrib/eolang/README.md
+++ b/macros/latex/contrib/eolang/README.md
@@ -22,7 +22,7 @@ x -> [
\end{document}
```
-Otherwise, you can download [`eolang.sty`](https://yegor256.github.io/eolang.sty) and add to your project.
+Otherwise, you can download [`eolang.sty`](https://objectionary.github.io/eolang.sty/eolang.sty) and add to your project.
If you want to contribute yourself, make a fork, then create a branch,
then run `l3build ctan` in the root directory.
diff --git a/macros/latex/contrib/eolang/eolang.1 b/macros/latex/contrib/eolang/eolang.1
index bcac9db30d..8ab1954d87 100644
--- a/macros/latex/contrib/eolang/eolang.1
+++ b/macros/latex/contrib/eolang/eolang.1
@@ -1,4 +1,4 @@
-.TH eolang 1 "2024-01-11"
+.TH eolang 1 "2024-02-14"
.SH NAME
eolang \- Automated Editor of TeX Files that Use "eolang" Package
.SH SYNOPSIS
diff --git a/macros/latex/contrib/eolang/eolang.dtx b/macros/latex/contrib/eolang/eolang.dtx
index 262c10f2ca..97d558ccaa 100644
--- a/macros/latex/contrib/eolang/eolang.dtx
+++ b/macros/latex/contrib/eolang/eolang.dtx
@@ -50,7 +50,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{eolang}
%<*package>
-[2024-01-11 0.18.0 Formulas and Graphs for EO Programming Language]
+[2024-02-14 0.18.1 Formulas and Graphs for EO Programming Language]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -877,7 +877,7 @@
$macro = $ARGV[0];
open(my $fh, '<', $ARGV[1]);
my $tex; { local $/; $tex = <$fh>; }
-print "% This file is auto-generated by 0.18.0\n";
+print "% This file is auto-generated by 0.18.1\n";
print '% There are ', length($tex),
' chars in the input: ', $ARGV[1], "\n";
print '% ---', "\n";
@@ -1219,6 +1219,10 @@ sub fmt {
$tex =~ s/\|([^\|]+)\|/\\textnormal{\\texttt{\1}}/g;
return $tex;
}
+sub toem {
+ my ($cm) = @_;
+ return $cm * 2.8;
+}
sub vertex {
my ($v) = @_;
if (index($v, 'v0') == 0) {
@@ -1315,7 +1319,7 @@ for (my $c = 0; $c < 0+@cmds; $c++) {
$draw = $draw . " (<MF:${to}><B:break-v>)";
if (exists $opts{'break'}) {
print tailor($draw, 'F') . ";\n";
- print ' \node[outer sep=.1cm,inner sep=0cm] ' .
+ print ' \node[outer sep=' . toem(0.1) . 'em,inner sep=0em] ' .
'at (break) (break-v) {$' . vertex($to) .
'$};' . "\n";
print ' ' . tailor($draw, 'B');
@@ -1326,10 +1330,10 @@ for (my $c = 0; $c < 0+@cmds; $c++) {
my ($from, $to) = split (/=+>/, $head);
my $size = () = $head =~ /=/g;
if ($from eq '') {
- print '\node [phi-arrow, left=' . ($size * 0.6) . 'cm of ' .
+ print '\node [phi-arrow, left=' . toem($size * 0.6) . 'em of ' .
$to . '.center]';
} elsif ($to eq '') {
- print '\node [phi-arrow, right=' . ($size * 0.6) . 'cm of ' .
+ print '\node [phi-arrow, right=' . toem($size * 0.6) . 'em of ' .
$from . '.center]';
} else {
print '\node [phi-arrow] at ($(' .
@@ -1340,7 +1344,7 @@ for (my $c = 0; $c < 0+@cmds; $c++) {
my ($v, $marker) = split (/!+/, $head);
my $size = () = $head =~ /!/g;
print '\node [phi-marker, left=' .
- ($size * 0.6) . 'cm of ' .
+ toem($size * 0.6) . 'em of ' .
$v . '.center]{' . fmt($marker) . '}';
} elsif (index($head, '+') >= 0) {
my ($v, $suffix) = split (/\+/, $head);
@@ -1417,8 +1421,8 @@ for (my $c = 0; $c < 0+@cmds; $c++) {
$loc = $loc . 'left';
}
print ',' . $loc . '=';
- print abs(num($down)) . 'cm and ' .
- abs(num($right)) . 'cm of ' . $v . '.center';
+ print toem(abs(num($down))) . 'em and ' .
+ toem(abs(num($right))) . 'em of ' . $v . '.center';
}
if (exists $opts{'data'}) {
print ',phi-data';
@@ -1521,17 +1525,17 @@ print '\endinput';
% \begin{macrocode}
\newenvironment{phicture}%
{\noindent\begin{tikzpicture}[
- ->,>=stealth',node distance=0,thick,
+ ->,>=stealth',node distance=0,line width=.08em,
pics/parallel arrow/.style={
code={\draw[-latex,phi-rho] (##1) -- (-##1);}}]}%
{\end{tikzpicture}}
\tikzstyle{phi-arrow} = [fill=white!80!black, single arrow,
- minimum height=0.5cm, minimum width=0.5cm,
+ minimum height=0.05em, minimum width=0.05em,
single arrow head extend=2mm]
\tikzstyle{phi-marker} = [inner sep=0pt, minimum height=1.4em,
minimum width=1.4em, font={\small\color{white}\ttfamily},
fill=gray]
-\tikzstyle{phi-thing} = [thick,inner sep=0pt,minimum height=2.4em,
+\tikzstyle{phi-thing} = [inner sep=0pt,minimum height=2.4em,
draw,font={\small}]
\tikzstyle{phi-object} = [phi-thing,circle]
\tikzstyle{phi-data} = [phi-thing,regular polygon,
@@ -1593,7 +1597,7 @@ print '\endinput';
\tikzstyle{phi-pi} = [draw,dotted]
\tikzstyle{phi-atom} = [phi-object,double]
\tikzstyle{phi-box} = [xshift=-5pt,yshift=3pt,draw,fill=white,
- rectangle,thin,minimum width=1.2em,anchor=north west,
+ rectangle,line width=.04em,minimum width=1.2em,anchor=north west,
font={\scriptsize}]
\tikzstyle{phi-attr} = [midway,sloped,inner sep=0pt,
above=2pt,sloped/.append style={transform shape},
diff --git a/macros/latex/contrib/eolang/eolang.pdf b/macros/latex/contrib/eolang/eolang.pdf
index 23028cf96a..2bf8e39de4 100644
--- a/macros/latex/contrib/eolang/eolang.pdf
+++ b/macros/latex/contrib/eolang/eolang.pdf
Binary files differ
diff --git a/macros/latex/contrib/eolang/eolang.pl b/macros/latex/contrib/eolang/eolang.pl
index 3ac32331a4..48ba53dc5b 100755
--- a/macros/latex/contrib/eolang/eolang.pl
+++ b/macros/latex/contrib/eolang/eolang.pl
@@ -21,7 +21,7 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-# 2024-01-11 0.18.0
+# 2024-02-14 0.18.1
package eolang;
use warnings;
@@ -45,6 +45,8 @@ sub savefile {
open(my $f, '>', $path) or error('Cannot open file for writing: ' . $path);
print $f $content;
close($f);
+ my $size = -s $path;
+ info("File saved to '$path' ($size bytes)");
}
# Print INFO message to the console.
@@ -78,7 +80,7 @@ if (@ARGV+0 eq 0 or exists $args{'--help'} or exists $args{'-?'}) {
" --tmpdir=path Temp directory with .tex files ('_eolang' by default)\n\n" .
"If any issues, report to GitHub: https://github.com/yegor256/bibcop");
} elsif (exists $args{'--version'} or exists $args{'-v'}) {
- info('0.18.0 2024-01-11');
+ info('0.18.1 2024-02-14');
} else {
my ($src, $target) = grep { not($_ =~ /^-.*$/) } @ARGV;
if (not $src) {
@@ -146,7 +148,6 @@ if (@ARGV+0 eq 0 or exists $args{'--help'} or exists $args{'-?'}) {
}
debug('Target: ' . $target);
savefile($target, $tex);
- info("New TeX file save to: ". $target);
}
# In order to finish it with success:
diff --git a/macros/latex/contrib/huawei/LICENSE.txt b/macros/latex/contrib/huawei/LICENSE.txt
index 5744f745f0..1f211e0287 100644
--- a/macros/latex/contrib/huawei/LICENSE.txt
+++ b/macros/latex/contrib/huawei/LICENSE.txt
@@ -1,6 +1,6 @@
(The MIT License)
-Copyright (c) 2021-2023 Yegor Bugayenko
+Copyright (c) 2021-2024 Yegor Bugayenko
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the 'Software'), to deal
diff --git a/macros/latex/contrib/huawei/README.md b/macros/latex/contrib/huawei/README.md
index b7a0640cf2..e2f585d214 100644
--- a/macros/latex/contrib/huawei/README.md
+++ b/macros/latex/contrib/huawei/README.md
@@ -21,6 +21,8 @@ Hello, world!
\end{document}
```
+Otherwise, you can download [`huawei.cls`](https://yegor256.github.io/huawei.cls/huawei.sty) and add to your project.
+
Read the detailed documentation [in PDF](http://mirrors.ctan.org/macros/latex/contrib/huawei/huawei.pdf).
If you need more formatting options,
diff --git a/macros/latex/contrib/huawei/huawei.dtx b/macros/latex/contrib/huawei/huawei.dtx
index 88af315984..1140958502 100644
--- a/macros/latex/contrib/huawei/huawei.dtx
+++ b/macros/latex/contrib/huawei/huawei.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
% (The MIT License)
%
-% Copyright (c) 2021-2023 Yegor Bugayenko
+% Copyright (c) 2021-2024 Yegor Bugayenko
%
% Permission is hereby granted, free of charge, to any person obtaining a copy
% of this software and associated documentation files (the 'Software'), to deal
@@ -50,7 +50,7 @@
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesClass{huawei}
%<*class>
-[2023-09-21 0.18.2 Template for Huawei Documents]
+[2024-02-14 0.18.3 Template for Huawei Documents]
%</class>
%<*driver>
\documentclass{ltxdoc}
@@ -782,7 +782,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
% \begin{macrocode}
\makeatletter\renewcommand\maketitle{%
\vspace*{18pt}%
- {\bfseries{\Huge\raggedright\thetitle\par}}%
+ {\bfseries{\begin{spacing}{.9}\Huge\raggedright\thetitle\par\end{spacing}}}%
\ifx\thesubtitle\empty\else%
{\color{gray!50!black}\large\raggedright\thesubtitle\par}%
\fi%
@@ -997,7 +997,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
\setlength\parindent{0pt}%
\setlength\parskip{6pt}%
\setlength\columnsep{32pt}%
-\def\arraystretch{1.5}%
+\renewcommand{\arraystretch}{1}%
}
% \end{macrocode}
diff --git a/macros/latex/contrib/huawei/huawei.ins b/macros/latex/contrib/huawei/huawei.ins
index daa75a374e..784d524942 100644
--- a/macros/latex/contrib/huawei/huawei.ins
+++ b/macros/latex/contrib/huawei/huawei.ins
@@ -1,6 +1,6 @@
%% (The MIT License)
%%
-%% Copyright (c) 2021-2023 Yegor Bugayenko
+%% Copyright (c) 2021-2024 Yegor Bugayenko
%%
%% Permission is hereby granted, free of charge, to any person obtaining a copy
%% of this software and associated documentation files (the 'Software'), to deal
@@ -26,7 +26,7 @@
\preamble
(The MIT License)
-Copyright (c) 2021-2023 Yegor Bugayenko
+Copyright (c) 2021-2024 Yegor Bugayenko
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the 'Software'), to deal
diff --git a/macros/latex/contrib/huawei/huawei.pdf b/macros/latex/contrib/huawei/huawei.pdf
index 827b703b74..c0c742fa02 100644
--- a/macros/latex/contrib/huawei/huawei.pdf
+++ b/macros/latex/contrib/huawei/huawei.pdf
Binary files differ
diff --git a/macros/latex/contrib/jnuexam/jnuexam.cls b/macros/latex/contrib/jnuexam/jnuexam.cls
index c70cee0fd9..6fa3b722ca 100644
--- a/macros/latex/contrib/jnuexam/jnuexam.cls
+++ b/macros/latex/contrib/jnuexam/jnuexam.cls
@@ -6,7 +6,7 @@
% ----------------------------------------------------------------------------
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{jnuexam}[2023/12/18 v2.1 An exam class for Jinan University]
+\ProvidesClass{jnuexam}[2024/02/02 v2.1.1 An exam class for Jinan University]
%% 旧版本的 LaTeX 不能识别 2022-11-01 这种日期格式
%\@ifl@t@r\fmtversion{2022-11-01}{}{
@@ -56,7 +56,7 @@
% 在 xeCJK 中已经禁止载入 CJK,但是在新版本 ctex 宏包中却失效了
% 我们假装 CJK 已经载入,再载入 CJKnumb,避免出现 \CJKglue 重复定义的问题
% 注意用 PDFLaTeX 编译时需要用到 CJK,所以只在未定义时才作修改
-\ifdefined\else
+\ifdefined\CJKglue
\@namedef{ver@CJK.sty}{}
%\@namedef{opt@CJK.sty}{}
\fi
@@ -926,7 +926,7 @@
\newcommand*{\my@alignment@check}[1]{%
\ifx\my@let@token #1%
\def\my@alignment@offset{5}%
- \listbreak
+ \expandafter\listbreak
\fi
}
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index a8e4cb8d77..472c43a655 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,26 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2024-02-13]
+
+### Added
+- Checking missing `\endgroup` at the end of `\DocInclude`
+- Linked storage type for large property lists (issue \#1040, pull \#1059)
+
+### Changed
+- `\meta` now typesets in `\texttt`, along with `\Arg`
+- Improved the performance of `\cs_if_exist:NTF`, `\cs_if_free:NTF`,
+ `\cs_if_exist_use:NTF`, and most notably their `c`-type variants.
+
+### Fixed
+- Inconsistent local/global assignments in `\vcoffin_gset:Nnn` and
+ `\vcoffin_gset:Nnw`
+- Tokenization by `\peek_analysis_map_inline:n` of one additional
+ character after any space or brace
+
+### Deprecated
+- `\msg_gset:nnn(n)`
+
## [2024-01-22]
### Added
@@ -1648,7 +1668,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step functions have been added for dim variables,
e.g. `\dim_step_inline:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2024-01-22...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2024-02-13...HEAD
+[2024-02-13]: https://github.com/latex3/latex3/compare/2024-01-22...2024-02-13
[2024-01-22]: https://github.com/latex3/latex3/compare/2024-01-04...2024-01-22
[2024-01-04]: https://github.com/latex3/latex3/compare/2023-12-11...2024-01-04
[2023-12-11]: https://github.com/latex3/latex3/compare/2023-12-08...2023-12-11
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 96b7e958f9..ee146d0405 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2024-01-22
+Release 2024-02-13
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 8fbb777dcb..a2f820f71f 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2024-01-22}%
+\def\ExplFileDate{2024-02-13}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 8f722bc6b4..03b7a491c1 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 7b5ffdc3e9..dcbc798249 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index 06b8b3d8a6..c4c45a6bca 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -42,12 +42,6 @@ for those people who are interested.
\documentclass[kernel]{l3doc}
-% fix for l3doc class
-\ExplSyntaxOn
-\DeclareDocumentCommand \meta { m }
- { \texttt{ \__codedoc_meta:n {#1} } }
-\ExplSyntaxOff
-
\newif\ifinterface
\interfacetrue
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index 0be8bdc8b2..bc79956d05 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -92,6 +92,9 @@
% to occur within the same function. Indeed, it is often necessary
% to start a group within one function and finish it within another,
% for example when seeking to use non-standard category codes.
+% \begin{texnote}
+% These are the \TeX{} primitives \tn{begingroup} and \tn{endgroup}.
+% \end{texnote}
% \end{function}
%
% \begin{function}{\group_insert_after:N}
@@ -1248,11 +1251,13 @@
%
% \begin{function}[EXP]{\if:w, \if_charcode:w, \if_catcode:w}
% \begin{syntax}
-% "\if:w" <token_1> <token_2> <true code> "\else:" <false code> "\fi:" \\
-% "\if_catcode:w" <token_1> <token_2> <true code> "\else:" <false code> "\fi:"
+% "\if:w" <token(s)> <true code> "\else:" <false code> "\fi:" \\
+% "\if_catcode:w" <token(s_> <true code> "\else:" <false code> "\fi:"
% \end{syntax}
-% These conditionals expand any following tokens until two
-% unexpandable tokens are left. If you wish to prevent this expansion,
+% These conditionals expand \meta{token(s)} until two
+% unexpandable tokens \meta{token_1} and \meta{tokens_2} are left;
+% any further tokens become part of the \meta{true code}.
+% If you wish to prevent this expansion,
% prefix the token in question with "\exp_not:N". "\if_catcode:w"
% tests if the category codes of the two tokens are the same whereas
% "\if:w" tests if the character codes are
@@ -2451,22 +2456,28 @@
% (to be defined) if it does not already exist.
%
% \begin{macro}[pTF, EXP]{\cs_if_exist:N, \cs_if_exist:c}
+% \begin{macro}{\@@_if_exist_c_aux:,\@@_if_exist_c_aux:w}
% Two versions for checking existence. For the |N| form we firstly
% check for \cs{scan_stop:} and then if it is in the hash
% table. There is no problem when inputting something like \cs{else:}
% or \cs{fi:} as \TeX{} will only ever skip input in case the token
% tested against is \cs{scan_stop:}.
+%
+% In both the |N| and |c| form we use the way \cs{prg_set_conditional:Npnn}
+% optimizes the conditionals to negate the tests using \cs{else:} (the
+% \cs{else:} in the top level functions will be removed by the optimization,
+% and this usage of \cs{else:} will be fine).
% \begin{macrocode}
\prg_set_conditional:Npnn \cs_if_exist:N #1 { p , T , F , TF }
{
\if_meaning:w #1 \scan_stop:
- \prg_return_false:
+ \use_i:nnnn
+ \else:
+ \fi:
+ \if_cs_exist:N #1
+ \prg_return_true:
\else:
- \if_cs_exist:N #1
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
+ \prg_return_false:
\fi:
}
% \end{macrocode}
@@ -2477,87 +2488,148 @@
% disturb the scanner. Therefore, we ensure that the second test is
% performed after the first one has concluded completely.
% \begin{macrocode}
-\prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF }
+\cs_if_exist:NTF \tex_lastnamedcs:D
{
- \if_cs_exist:w #1 \cs_end:
- \exp_after:wN \use_i:nn
- \else:
- \exp_after:wN \use_ii:nn
- \fi:
- {
- \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop:
- \prg_return_false:
- \else:
- \prg_return_true:
- \fi:
- }
- \prg_return_false:
+ \prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF }
+ {
+ \if_cs_exist:w #1 \cs_end:
+ \@@_if_exist_c_aux:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+ \cs_set:Npn \@@_if_exist_c_aux:
+ { \fi: \exp_after:wN \if_meaning:w \tex_lastnamedcs:D \scan_stop: \else: }
+ }
+ {
+ \prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF }
+ {
+ \if_cs_exist:w #1 \cs_end:
+ \@@_if_exist_c_aux:w
+ \fi:
+ \use_none:n {#1}
+ \if_false:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+ \cs_set:Npn \@@_if_exist_c_aux:w \fi: \use_none:n #1 \if_false:
+ { \fi: \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: \else: }
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}[pTF, EXP]{\cs_if_free:N, \cs_if_free:c}
% The logical reversal of the above.
% \begin{macrocode}
\prg_set_conditional:Npnn \cs_if_free:N #1 { p , T , F , TF }
{
+ \if_cs_exist:N #1
+ \else:
+ \use_none:nnnn
+ \fi:
\if_meaning:w #1 \scan_stop:
\prg_return_true:
\else:
- \if_cs_exist:N #1
- \prg_return_false:
- \else:
- \prg_return_true:
- \fi:
+ \prg_return_false:
\fi:
}
-\prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF }
+\cs_if_exist:NTF \tex_lastnamedcs:D
{
- \if_cs_exist:w #1 \cs_end:
- \exp_after:wN \use_i:nn
- \else:
- \exp_after:wN \use_ii:nn
- \fi:
+ \prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF }
+ {
+ \if_cs_exist:w #1 \cs_end:
+ \@@_if_free_c_aux:w
+ \fi:
+ \if_true:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+ \cs_set:Npn \@@_if_free_c_aux:w \fi: \if_true:
+ { \fi: \exp_after:wN \if_meaning:w \tex_lastnamedcs:D \scan_stop: }
+ }
+ {
+ \prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF }
{
- \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop:
+ \if_cs_exist:w #1 \cs_end:
+ \@@_if_free_c_aux:w
+ \fi:
+ \use_none:n {#1}
+ \if_true:
\prg_return_true:
\else:
\prg_return_false:
\fi:
}
- { \prg_return_true: }
+ \cs_set:Npn \@@_if_free_c_aux:w \fi: \use_none:n #1 \if_true:
+ { \fi: \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: }
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP,noTF,added=2011-10-10]
% {\cs_if_exist_use:N, \cs_if_exist_use:c}
+% \begin{macro}{\@@_if_exist_use_aux:w, \@@_if_exist_use_aux:Nnn}
% The \cs[index=cs_if_exist_use:N]{cs_if_exist_use:\ldots{}}
% functions cannot be implemented
% as conditionals because the true branch must leave both the control
% sequence itself and the true code in the input stream.
% For the \texttt{c} variants, we are careful not to put the control
% sequence in the hash table if it does not exist.
-% In \LuaTeX{} we could use the \tn{lastnamedcs} primitive.
+% If available we use the \tn{lastnamedcs} primitive.
% \begin{macrocode}
\cs_set:Npn \cs_if_exist_use:NTF #1#2
{ \cs_if_exist:NTF #1 { #1 #2 } }
\cs_set:Npn \cs_if_exist_use:NF #1
- { \cs_if_exist:NTF #1 { #1 } }
+ { \cs_if_exist:NTF #1 #1 }
\cs_set:Npn \cs_if_exist_use:NT #1 #2
- { \cs_if_exist:NTF #1 { #1 #2 } { } }
+ { \cs_if_exist:NT #1 { #1 #2 } }
\cs_set:Npn \cs_if_exist_use:N #1
- { \cs_if_exist:NTF #1 { #1 } { } }
-\cs_set:Npn \cs_if_exist_use:cTF #1#2
- { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } }
+ { \cs_if_exist:NT #1 #1 }
+\cs_if_exist:NTF \tex_lastnamedcs:D
+ {
+ \cs_set:Npn \cs_if_exist_use:cTF #1
+ {
+ \if_cs_exist:w #1 \cs_end:
+ \@@_if_exist_use_aux:w
+ \fi:
+ \use_ii:nn
+ }
+ \cs_set:Npn \@@_if_exist_use_aux:w \fi: \use_ii:nn
+ { \fi: \exp_after:wN \@@_if_exist_use_aux:Nnn \tex_lastnamedcs:D }
+ }
+ {
+ \cs_set:Npn \cs_if_exist_use:cTF #1
+ {
+ \if_cs_exist:w #1 \cs_end:
+ \@@_if_exist_use_aux:w
+ \fi:
+ \use_iii:nnn {#1}
+ }
+ \cs_set:Npn \@@_if_exist_use_aux:w \fi: \use_iii:nnn #1
+ { \fi: \exp_after:wN \@@_if_exist_use_aux:Nnn \cs:w #1 \cs_end: }
+ }
+\cs_set:Npn \@@_if_exist_use_aux:Nnn #1#2
+ {
+ \if_meaning:w #1 \scan_stop:
+ \exp_after:wN \use_iii:nnn
+ \fi:
+ \use_i:nn { #1 #2 }
+ }
\cs_set:Npn \cs_if_exist_use:cF #1
- { \cs_if_exist:cTF {#1} { \use:c {#1} } }
+ { \cs_if_exist_use:cTF {#1} {} }
\cs_set:Npn \cs_if_exist_use:cT #1#2
- { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } { } }
+ { \cs_if_exist_use:cTF {#1} {#2} {} }
\cs_set:Npn \cs_if_exist_use:c #1
- { \cs_if_exist:cTF {#1} { \use:c {#1} } { } }
+ { \cs_if_exist_use:cTF {#1} {} {} }
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \subsection{Preliminaries for new functions}
%
@@ -3270,7 +3342,7 @@
\cs_new_protected:Npn \group_show_list:
{ \@@_group_show:NN \use_none:n 1 }
\cs_new_protected:Npn \group_log_list:
- { \@@_group_show:NN \int_zero:N 0 }
+ { \@@_group_show:NN \int_gzero:N 0 }
\cs_new_protected:Npn \@@_group_show:NN #1#2
{
\use:e
@@ -3280,7 +3352,7 @@
\int_set:Nn \tex_errorcontextlines:D { -1 }
\exp_not:N \exp_after:wN \scan_stop:
\tex_showgroups:D
- \int_set:Nn \tex_interactionmode:D
+ \int_gset:Nn \tex_interactionmode:D
{ \int_use:N \tex_interactionmode:D }
\int_set:Nn \tex_tracingonline:D
{ \int_use:N \tex_tracingonline:D }
diff --git a/macros/latex/contrib/l3kernel/l3bitset.dtx b/macros/latex/contrib/l3kernel/l3bitset.dtx
index 498e9954cc..e87a9c9e0f 100644
--- a/macros/latex/contrib/l3kernel/l3bitset.dtx
+++ b/macros/latex/contrib/l3kernel/l3bitset.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index c1fb85f8c0..b6a747f833 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index ae3bc283c2..5cb80d888d 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -1343,9 +1343,9 @@
{ \exp_args:No \@@_log:nNnn { \tex_the:D \tex_interactionmode:D } }
\cs_new_protected:Npn \@@_log:nNnn #1#2#3#4
{
- \int_set:Nn \tex_interactionmode:D { 0 }
+ \int_gset:Nn \tex_interactionmode:D { 0 }
\@@_show:NNff 0 #2 { \int_eval:n {#3} } { \int_eval:n {#4} }
- \int_set:Nn \tex_interactionmode:D {#1}
+ \int_gset:Nn \tex_interactionmode:D {#1}
}
\cs_generate_variant:Nn \box_log:Nnn { c }
% \end{macrocode}
@@ -2279,7 +2279,7 @@
\cs_generate_variant:Nn \box_autosize_to_wd_and_ht:Nnn { c }
\cs_new_protected:Npn \box_gautosize_to_wd_and_ht:Nnn #1#2#3
{ \@@_autosize:NnnnN #1 {#2} {#3} { \box_ht:N #1 } \hbox_gset:Nn }
-\cs_generate_variant:Nn \box_autosize_to_wd_and_ht:Nnn { c }
+\cs_generate_variant:Nn \box_gautosize_to_wd_and_ht:Nnn { c }
\cs_new_protected:Npn \box_autosize_to_wd_and_ht_plus_dp:Nnn #1#2#3
{
\@@_autosize:NnnnN #1 {#2} {#3} { \box_ht:N #1 + \box_dp:N #1 }
diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx
index e3285d9bd9..a11b0e31a7 100644
--- a/macros/latex/contrib/l3kernel/l3cctab.dtx
+++ b/macros/latex/contrib/l3kernel/l3cctab.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index a8e24c2a30..54b558f7ea 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index c6882fe5b3..c8a71eb252 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -128,7 +128,7 @@
% environment in a coffin.
% \end{function}
%
-% \begin{function}[added = 2011-08-17, updated = 2019-01-21]
+% \begin{function}[added = 2011-08-17, updated = 2023-02-03]
% {
% \vcoffin_set:Nnn, \vcoffin_set:cnn,
% \vcoffin_gset:Nnn, \vcoffin_gset:cnn
@@ -142,7 +142,7 @@
% size of the typeset material.
% \end{function}
%
-% \begin{function}[added = 2011-09-10, updated = 2019-01-21]
+% \begin{function}[added = 2011-09-10, updated = 2023-02-03]
% {
% \vcoffin_set:Nnw, \vcoffin_set:cnw, \vcoffin_set_end:,
% \vcoffin_gset:Nnw, \vcoffin_gset:cnw, \vcoffin_gset_end:
@@ -702,7 +702,7 @@
% \vcoffin_set:Nnn, \vcoffin_set:cnn,
% \vcoffin_gset:Nnn, \vcoffin_gset:cnn
% }
-% \begin{macro}{\@@_set_vertical:NnnNN}
+% \begin{macro}{\@@_set_vertical:NnnNNN}
% \begin{macro}{\@@_set_vertical_aux:}
% Setting vertical coffins is more complex. First, the material is
% typeset with a given width. The default handles and poles are set as
@@ -714,17 +714,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \vcoffin_set:Nnn #1#2#3
{
- \@@_set_vertical:NnnNN #1 {#2} {#3}
- \vbox_set:Nn \coffin_reset_poles:N
+ \@@_set_vertical:NnnNNN #1 {#2} {#3}
+ \vbox_set:Nn \coffin_reset_poles:N \@@_set_pole:Nnn
}
\cs_generate_variant:Nn \vcoffin_set:Nnn { c }
\cs_new_protected:Npn \vcoffin_gset:Nnn #1#2#3
{
- \@@_set_vertical:NnnNN #1 {#2} {#3}
- \vbox_gset:Nn \coffin_greset_poles:N
+ \@@_set_vertical:NnnNNN #1 {#2} {#3}
+ \vbox_gset:Nn \coffin_greset_poles:N \@@_gset_pole:Nnn
}
\cs_generate_variant:Nn \vcoffin_gset:Nnn { c }
-\cs_new_protected:Npn \@@_set_vertical:NnnNN #1#2#3#4#5
+\cs_new_protected:Npn \@@_set_vertical:NnnNNN #1#2#3#4#5#6
{
\@@_if_exist:NT #1
{
@@ -736,7 +736,7 @@
}
#5 #1
\vbox_set_top:Nn \l_@@_internal_box { \vbox_unpack:N #1 }
- \@@_set_pole:Nne #1 { T }
+ #6 #1 { T }
{
{ 0pt }
{
@@ -804,25 +804,25 @@
%
% \begin{macro}
% {\vcoffin_set:Nnw, \vcoffin_set:cnw, \vcoffin_gset:Nnw, \vcoffin_gset:cnw}
-% \begin{macro}{\@@_set_vertical:NnNNNNw}
+% \begin{macro}{\@@_set_vertical:NnNNNNNw}
% \begin{macro}{\vcoffin_set_end:, \vcoffin_gset_end:}
% The same for vertical coffins.
% \begin{macrocode}
\cs_new_protected:Npn \vcoffin_set:Nnw #1#2
{
- \@@_set_vertical:NnNNNNw #1 {#2} \vbox_set:Nw
+ \@@_set_vertical:NnNNNNNw #1 {#2} \vbox_set:Nw
\vcoffin_set_end:
- \vbox_set_end: \coffin_reset_poles:N
+ \vbox_set_end: \coffin_reset_poles:N \@@_set_pole:Nnn
}
\cs_generate_variant:Nn \vcoffin_set:Nnw { c }
\cs_new_protected:Npn \vcoffin_gset:Nnw #1#2
{
- \@@_set_vertical:NnNNNNw #1 {#2} \vbox_gset:Nw
+ \@@_set_vertical:NnNNNNNw #1 {#2} \vbox_gset:Nw
\vcoffin_gset_end:
- \vbox_gset_end: \coffin_greset_poles:N
+ \vbox_gset_end: \coffin_greset_poles:N \@@_gset_pole:Nnn
}
\cs_generate_variant:Nn \vcoffin_gset:Nnw { c }
-\cs_new_protected:Npn \@@_set_vertical:NnNNNNw #1#2#3#4#5#6
+\cs_new_protected:Npn \@@_set_vertical:NnNNNNNw #1#2#3#4#5#6#7
{
\@@_if_exist:NT #1
{
@@ -834,7 +834,7 @@
#5
#6 #1
\vbox_set_top:Nn \l_@@_internal_box { \vbox_unpack:N #1 }
- \@@_set_pole:Nne #1 { T }
+ #7 #1 { T }
{
{ 0pt }
{
@@ -989,7 +989,7 @@
% \coffin_gset_vertical_pole:Nnn, \coffin_gset_vertical_pole:cnn
% }
% \begin{macro}{\@@_set_vertical_pole:NnnN}
-% \begin{macro}{\@@_set_pole:Nnn, \@@_set_pole:Nne}
+% \begin{macro}{\@@_set_pole:Nnn, \@@_gset_pole:Nnn}
% Setting the pole of a coffin at the user/designer level requires a
% bit more care. The idea here is to provide a reasonable interface to
% the system, then to do the setting with full expansion. The
@@ -1033,10 +1033,14 @@
}
\cs_new_protected:Npn \@@_set_pole:Nnn #1#2#3
{
- \prop_put:cnn { coffin ~ \@@_to_value:N #1 ~ poles }
+ \prop_put:cne { coffin ~ \@@_to_value:N #1 ~ poles }
+ {#2} {#3}
+ }
+\cs_new_protected:Npn \@@_gset_pole:Nnn #1#2#3
+ {
+ \prop_gput:cne { coffin ~ \@@_to_value:N #1 ~ poles }
{#2} {#3}
}
-\cs_generate_variant:Nn \@@_set_pole:Nnn { Nne }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2068,7 +2072,7 @@
\tl_if_in:nnTF {#2} { - }
{ \tl_set:Nn \l_@@_internal_tl { {#2} } }
{ \tl_set:Nn \l_@@_internal_tl { { #1 - #2 } } }
- \exp_last_unbraced:NNo \@@_set_pole:Nne \l_@@_aligned_coffin
+ \exp_last_unbraced:NNo \@@_set_pole:Nnn \l_@@_aligned_coffin
{ \l_@@_internal_tl }
{
{ \dim_use:N \l_@@_x_dim } { \dim_use:N \l_@@_y_dim }
@@ -2130,11 +2134,11 @@
{
\dim_compare:nNnTF {#2} < {#6}
{
- \@@_set_pole:Nne #9 { T }
+ \@@_set_pole:Nnn #9 { T }
{ { 0pt } {#6} { 1000pt } { 0pt } }
}
{
- \@@_set_pole:Nne #9 { T }
+ \@@_set_pole:Nnn #9 { T }
{ { 0pt } {#2} { 1000pt } { 0pt } }
}
}
@@ -2142,11 +2146,11 @@
{
\dim_compare:nNnTF {#2} < {#6}
{
- \@@_set_pole:Nne #9 { B }
+ \@@_set_pole:Nnn #9 { B }
{ { 0pt } {#2} { 1000pt } { 0pt } }
}
{
- \@@_set_pole:Nne #9 { B }
+ \@@_set_pole:Nnn #9 { B }
{ { 0pt } {#6} { 1000pt } { 0pt } }
}
}
diff --git a/macros/latex/contrib/l3kernel/l3color.dtx b/macros/latex/contrib/l3kernel/l3color.dtx
index 950bf3d6be..6ecdf216c4 100644
--- a/macros/latex/contrib/l3kernel/l3color.dtx
+++ b/macros/latex/contrib/l3kernel/l3color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index e8f577a4bb..f345c6d303 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -55,71 +55,9 @@
%
% \section{\pkg{l3debug} implementation}
%
-% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N}
-% \begin{syntax}
-% \cs{__kernel_chk_var_local:N} \meta{var}
-% \cs{__kernel_chk_var_global:N} \meta{var}
-% \end{syntax}
-% Applies \cs{__kernel_chk_var_exist:N} \meta{var} as well as
-% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}, where
-% \meta{scope} is |l| or~|g|.
-% \end{function}
-%
-% \begin{function}{\__kernel_chk_var_scope:NN}
-% \begin{syntax}
-% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}
-% \end{syntax}
-% Checks the \meta{var} has the correct \meta{scope}, and if not
-% raises a kernel-level error. This function is only created if
-% debugging is enabled. The \meta{scope} is a single letter |l|, |g|,
-% |c| denoting local variables, global variables, or constants. More
-% precisely, if the variable name starts with a letter and an
-% underscore (normal \pkg{expl3} convention) the function checks that
-% this single letter matches the \meta{scope}. Otherwise the function
-% cannot know the scope \meta{var} the first time: instead, it defines
-% |\__debug_chk_/|\meta{var name} to store that information for the
-% next call. Thus, if a given \meta{var} is subject to assignments of
-% different scopes a kernel error will result.
-% \end{function}
-%
-% \begin{function}
-% {
-% \__kernel_chk_cs_exist:N,
-% \__kernel_chk_cs_exist:c,
-% \__kernel_chk_var_exist:N
-% }
-% \begin{syntax}
-% \cs{__kernel_chk_cs_exist:N} \meta{cs}
-% \cs{__kernel_chk_var_exist:N} \meta{var}
-% \end{syntax}
-% These functions are only created if debugging is enabled. They
-% check that their argument is defined according to the criteria for
-% \cs{cs_if_exist_p:N},
-% and if not raises a kernel-level error. Error messages are
-% different.
-% \end{function}
-%
-% \begin{function}[EXP]{\__kernel_chk_flag_exist:NN}
-% \begin{syntax}
-% \cs{__kernel_chk_flag_exist:NN}
-% \meta{function} \meta{flag}
-% \end{syntax}
-% This function is only created if debugging is enabled. It checks
-% that the \meta{flag} is defined according to the criterion for
-% \cs{flag_if_exist_p:N}, and if not raises a kernel-level error and
-% calls the function with the argument \cs{l_tmpa_flag} to proceed
-% somehow without producing too many errors.
-% \end{function}
-%
-% \begin{function}{\__kernel_debug_log:e}
-% \begin{syntax}
-% \cs{__kernel_debug_log:e} \Arg{message text}
-% \end{syntax}
-% If the \texttt{log-functions} option is active, this function writes
-% the \meta{message text} to the log file using \cs{iow_log:e}.
-% Otherwise, the \meta{message text} is ignored using \cs{use_none:n}.
-% This function is only created if debugging is enabled.
-% \end{function}
+% Internal kernel functions that are only defined here are listed in
+% \pkg{l3kernel-functions},
+% see~\ref{sec:l3kernel-functions:l3debug-internals}.
%
% \begin{macrocode}
%<*package>
@@ -131,7 +69,7 @@
%
% Standard file identification.
% \begin{macrocode}
-\ProvidesExplFile{l3debug.def}{2024-01-22}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2024-02-13}{}{L3 Debugging support}
% \end{macrocode}
%
% \begin{variable}{\s_@@_stop}
@@ -782,6 +720,8 @@
{
\clist_concat:NNN
\clist_gconcat:NNN
+ \prop_concat:NNN
+ \prop_gconcat:NNN
\seq_concat:NNN
\seq_gconcat:NNN
\str_concat:NNN
@@ -836,6 +776,17 @@
\muskip_add:Nn
\muskip_sub:Nn
\muskip_set_eq:NN
+ \prop_clear:N
+ \prop_concat:NNN
+ \prop_pop:NnN
+ \prop_pop:NnNT
+ \prop_pop:NnNF
+ \prop_pop:NnNTF
+ \prop_put:Nnn
+ \prop_put_if_new:Nnn
+ \prop_put_from_keyval:Nn
+ \prop_remove:Nn
+ \prop_set_eq:NN
\seq_set_eq:NN
\skip_zero:N
\skip_set:Nn
@@ -905,6 +856,17 @@
\muskip_gadd:Nn
\muskip_gsub:Nn
\muskip_gset_eq:NN
+ \prop_gclear:N
+ \prop_gconcat:NNN
+ \prop_gpop:NnN
+ \prop_gpop:NnNT
+ \prop_gpop:NnNF
+ \prop_gpop:NnNTF
+ \prop_gput:Nnn
+ \prop_gput_if_new:Nnn
+ \prop_gput_from_keyval:Nn
+ \prop_gremove:Nn
+ \prop_gset_eq:NN
\seq_gset_eq:NN
\skip_gzero:N
\skip_gset:Nn
@@ -952,6 +914,8 @@
\int_const:Nn
\intarray_const_from_clist:Nn
\muskip_const:Nn
+ \prop_const_from_keyval:Nn
+ \prop_const_linked_from_keyval:Nn
\skip_const:Nn
\str_const:Nn
\tl_const:Nn
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index 99b52ec961..674ca610bd 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -313,6 +313,21 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Deprecated \pkg{l3msg} functions}
+%
+% \begin{macrocode}
+%<@@=msg>
+% \end{macrocode}
+%
+% \begin{macro}[deprecated]{\msg_gset:nnnn, \msg_gset:nnn}
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2024-01-17 } { \msg_set:nnnn }
+\cs_new_protected:Npn \msg_gset:nnnn { \msg_set:nnnn }
+\__kernel_patch_deprecation:nnNNpn { 2024-01-17 } { \msg_set:nnn }
+\cs_new_protected:Npn \msg_gset:nnn { \msg_set:nnn }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Deprecated \pkg{l3pdf} functions}
%
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index fde5ddd103..48e022ae80 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -71,7 +71,7 @@ and all files in that bundle must be distributed together.
% This isn't included in the typeset documentation because it's a bit
% ugly:
%<*class>
-\ProvidesExplClass{l3doc}{2024-01-22}{}
+\ProvidesExplClass{l3doc}{2024-02-13}{}
{L3 Experimental documentation class}
%</class>
% \fi
@@ -84,7 +84,7 @@ and all files in that bundle must be distributed together.
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
% \maketitle
% \tableofcontents
%
@@ -1740,7 +1740,7 @@ and all files in that bundle must be distributed together.
% A document-level command.
% \begin{macrocode}
\DeclareDocumentCommand \meta { m }
- { \@@_meta:n {#1} }
+ { \texttt{ \@@_meta:n {#1} } }
% \end{macrocode}
% \end{macro}
%
@@ -1760,10 +1760,11 @@ and all files in that bundle must be distributed together.
{ < \tl_to_str:n {#1} > }
\pdfstringdefDisableCommands
{
- \cs_set_eq:NN \cmd \@@_pdfstring_cmd:w
- \cs_set_eq:NN \cs \@@_pdfstring_cs:w
- \cs_set_eq:NN \tn \@@_pdfstring_cs:w
- \cs_set_eq:NN \meta \@@_pdfstring_meta:w
+ \cs_set_eq:NN \cmd \@@_pdfstring_cmd:w
+ \cs_set_eq:NN \cs \@@_pdfstring_cs:w
+ \cs_set_eq:NN \tn \@@_pdfstring_cs:w
+ \cs_set_eq:NN \meta \@@_pdfstring_meta:w
+ \cs_set_eq:NN \@@_meta:n \@@_pdfstring_meta:w
}
% \end{macrocode}
% \end{macro}
@@ -1775,10 +1776,10 @@ and all files in that bundle must be distributed together.
% Finally, \cs{Arg} is the same as \cs{marg}.
% \begin{macrocode}
\newcommand\Arg[1]
- { \texttt{\char`\{} \meta{#1} \texttt{\char`\}} }
+ { \texttt{\char`\{} \@@_meta:n {#1} \texttt{\char`\}} }
\providecommand\marg[1]{ \Arg{#1} }
-\providecommand\oarg[1]{ \texttt[ \meta{#1} \texttt] }
-\providecommand\parg[1]{ \texttt( \meta{#1} \texttt) }
+\providecommand\oarg[1]{ \texttt[ \@@_meta:n {#1} \texttt] }
+\providecommand\parg[1]{ \texttt( \@@_meta:n {#1} \texttt) }
% \end{macrocode}
% \end{macro}
%
@@ -3727,10 +3728,22 @@ and all files in that bundle must be distributed together.
%
% \begin{macro}{\DocInclude}
% More or less exactly the same as \tn{include}, but uses
-% \tn{DocInput} on a \file{.dtx} file, not \tn{input} on a \file{.tex}
-% file.
+% \tn{DocInput} on a \file{.fdd} or \file{.dtx} file (without file
+% extension), not \tn{input} on a \file{.tex} file.
%
% \begin{macrocode}
+\msg_new:nnn { l3doc } { missing-endgroup }
+ {
+ \str_if_eq:VnTF \@currenvir { document }
+ {
+ There~are~\int_use:N \tex_currentgrouplevel:D
+ \c_space_tl unclosed~groups~in~#1.
+ }
+ {
+ The~\@currenvir \c_space_tl environment~on~line~\@currenvline
+ \c_space_tl doesn't~have~a~matching~\iow_char:N\\end{\@currenvir}.
+ }
+ }
\NewDocumentCommand \DocInclude { m }
{
\relax\clearpage
@@ -3741,6 +3754,13 @@ and all files in that bundle must be distributed together.
\int_compare:nNnTF \@auxout = \@partaux
{ \@latexerr{\string\include\space cannot~be~nested}\@eha }
{ \@docinclude {#1} }
+ % check missing \endgroup, e.g., missing "\end{macro}" in time
+ \int_compare:nNnF { \tex_currentgrouplevel:D } = { 0 }
+ {
+ \int_compare:nNnT { \tex_interactionmode:D } = { 0 }
+ { \int_gset:Nn \tex_interactionmode:D { 1 } }
+ \msg_fatal:nne { l3doc } { missing-endgroup } { \currentfile }
+ }
}
% \end{macrocode}
%
@@ -4087,7 +4107,7 @@ and all files in that bundle must be distributed together.
\int_set:Nn \l_@@_tmpa_int { \tex_interactionmode:D }
\errorstopmode
\ClassError { l3doc } { \l_@@_tmpa_tl } { }
- \int_set:Nn \tex_interactionmode:D { \l_@@_tmpa_int }
+ \int_gset:Nn \tex_interactionmode:D { \l_@@_tmpa_int }
}
}
}
diff --git a/macros/latex/contrib/l3kernel/l3doc.pdf b/macros/latex/contrib/l3kernel/l3doc.pdf
index 352082c2ab..9d301da547 100644
--- a/macros/latex/contrib/l3kernel/l3doc.pdf
+++ b/macros/latex/contrib/l3kernel/l3doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index 9034fb7176..f55be84c36 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index 2098a2ce21..923689f3d8 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index 5ea58b75d5..7527b4091a 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -571,6 +571,7 @@
% \exp_last_unbraced:Nco,
% \exp_last_unbraced:NcV,
% \exp_last_unbraced:Nno,
+% \exp_last_unbraced:Nnf,
% \exp_last_unbraced:Noo,
% \exp_last_unbraced:Nfo,
% \exp_last_unbraced:NNNo,
@@ -1436,6 +1437,7 @@
% \exp_last_unbraced:NNNV,
% \exp_last_unbraced:NNNf,
% \exp_last_unbraced:Nno,
+% \exp_last_unbraced:Nnf,
% \exp_last_unbraced:Noo,
% \exp_last_unbraced:Nfo,
% \exp_last_unbraced:NnNo,
@@ -1494,6 +1496,7 @@
\exp:w \exp_end_continue_f:w #4
}
\cs_new:Npn \exp_last_unbraced:Nno { \::n \::o_unbraced \::: }
+\cs_new:Npn \exp_last_unbraced:Nnf { \::n \::f_unbraced \::: }
\cs_new:Npn \exp_last_unbraced:Noo { \::o \::o_unbraced \::: }
\cs_new:Npn \exp_last_unbraced:Nfo { \::f \::o_unbraced \::: }
\cs_new:Npn \exp_last_unbraced:NnNo { \::n \::N \::o_unbraced \::: }
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index cc14b48980..091c7b57f0 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -718,10 +718,8 @@
% \cs{file_if_exist_p:n} \Arg{file name}
% \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code}
% \end{syntax}
-% Expands the argument of the \cs{file name} to give a string, then
-% searches for this string using the current \TeX{} search
-% path and the additional paths controlled by
-% \cs{l_file_search_path_seq}.
+% Tests if \meta{file name} is found in the path as detailed for
+% \cs{file_if_exist:nTF}.
% \end{function}
%
% \subsection{Information about files and file contents}
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index b0a586d48b..d1325b2c96 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index e2e9937c2c..ca71600b16 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index cc54b7e02b..1c8c57a3f9 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index ed13beb5fd..4227b8f6f5 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index d5b73e7d97..413d4988a5 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index 2c86293101..0013d859a9 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index 0e4e48a0a9..be9cc93107 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-functions.dtx b/macros/latex/contrib/l3kernel/l3fp-functions.dtx
index 3e423c0908..4024dbacf3 100644
--- a/macros/latex/contrib/l3kernel/l3fp-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-functions.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index 13eeed8888..42d88735c4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index ef6c2ad392..2bcd5a2c89 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 8c68289d60..7d32a59a51 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index a01b9505da..e6bb4e58c0 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx b/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
index 01e883f136..088c118b9c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 6212ff731c..90f33a7aa4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index 5cf22fd7e9..c7d235b991 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-types.dtx b/macros/latex/contrib/l3kernel/l3fp-types.dtx
index fc6a34f6a1..2843b9131c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-types.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-types.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index bdc1d3fae3..cfd8b118fc 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index 2d8cd62f14..b9b4e4a096 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index 4d5f91cf53..9a6d09f193 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index 118e44ff3b..cc3f7a2c6c 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index 6b3db5fd7d..c19add5937 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -55,17 +55,77 @@
%
% \section{\pkg{l3kernel-functions}: kernel-reserved functions}
%
-% \subsection{Internal kernel functions}
+% \subsection{Internal \pkg{l3debug} kernel functions}
+% \label{sec:l3kernel-functions:l3debug-internals}
+%
+% These function are only created if debugging is enabled, hence they are
+% actually defined in \pkg{l3debug}.
+%
+% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N}
+% \begin{syntax}
+% \cs{__kernel_chk_var_local:N} \meta{var}
+% \cs{__kernel_chk_var_global:N} \meta{var}
+% \end{syntax}
+% Applies \cs{__kernel_chk_var_exist:N} \meta{var} as well as
+% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}, where
+% \meta{scope} is |l| or~|g|.
+% \end{function}
%
-% \begin{function}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c}
+% \begin{function}{\__kernel_chk_var_scope:NN}
+% \begin{syntax}
+% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}
+% \end{syntax}
+% Checks the \meta{var} has the correct \meta{scope}, and if not
+% raises a kernel-level error.
+% The \meta{scope} is a single letter |l|, |g|,
+% |c| denoting local variables, global variables, or constants. More
+% precisely, if the variable name starts with a letter and an
+% underscore (normal \pkg{expl3} convention) the function checks that
+% this single letter matches the \meta{scope}. Otherwise the function
+% cannot know the scope \meta{var} the first time: instead, it defines
+% |\__debug_chk_/|\meta{var name} to store that information for the
+% next call. Thus, if a given \meta{var} is subject to assignments of
+% different scopes a kernel error will result.
+% \end{function}
+%
+% \begin{function}
+% {
+% \__kernel_chk_cs_exist:N,
+% \__kernel_chk_cs_exist:c,
+% \__kernel_chk_var_exist:N
+% }
% \begin{syntax}
% \cs{__kernel_chk_cs_exist:N} \meta{cs}
+% \cs{__kernel_chk_var_exist:N} \meta{var}
+% \end{syntax}
+% Checks that their argument is defined according to the criteria for
+% \cs{cs_if_exist_p:N},
+% and if not raises a kernel-level error. Error messages are
+% different.
+% \end{function}
+%
+% \begin{function}[EXP]{\__kernel_chk_flag_exist:NN}
+% \begin{syntax}
+% \cs{__kernel_chk_flag_exist:NN}
+% \meta{function} \meta{flag}
% \end{syntax}
-% This function is only created if debugging is enabled. It checks
-% that \meta{cs} exists according to the criteria for
-% \cs{cs_if_exist_p:N}, and if not raises a kernel-level error.
+% Checks that the \meta{flag} is defined according to the criterion for
+% \cs{flag_if_exist_p:N}, and if not raises a kernel-level error and
+% calls the function with the argument \cs{l_tmpa_flag} to proceed
+% somehow without producing too many errors.
% \end{function}
%
+% \begin{function}{\__kernel_debug_log:e}
+% \begin{syntax}
+% \cs{__kernel_debug_log:e} \Arg{message text}
+% \end{syntax}
+% If the \texttt{log-functions} option is active, this function writes
+% the \meta{message text} to the log file using \cs{iow_log:e}.
+% Otherwise, the \meta{message text} is ignored using \cs{use_none:n}.
+% \end{function}
+%
+% \subsection{Internal kernel functions}
+%
% \begin{function}{\__kernel_chk_defined:NT}
% \begin{syntax}
% \cs{__kernel_chk_defined:NT} \meta{variable} \Arg{true code}
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index 54155d6d4e..18b42ae30d 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -89,7 +89,7 @@
% \end{verbatim}
% As illustrated, keys are created inside a \meta{module}: a set of related
% keys, typically those for a single module/\LaTeXe{} package. See
-% Section~\label{sec:l3keys:subdivision} for suggestions on how to divide
+% Section~\ref{sec:l3keys:subdivision} for suggestions on how to divide
% large numbers of keys for a single module.
%
% At a document level, \cs{keys_set:nn} is used within a
@@ -3504,7 +3504,7 @@
{ \prg_return_true: }
{ \prg_return_false: }
}
-\prg_generate_conditional_variant:Nnn \keys_if_exist:nn { ne } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \keys_if_exist:nn { ne } { p , T , F , TF }
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index f8846e7cb8..0a7b8bb9a1 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index 55f33b80a5..8a18c7fbf1 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index dced50e37f..5cbf548e0e 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -120,7 +120,7 @@
% used. An error is raised if the \meta{message} already exists.
% \end{function}
%
-% \begin{function}{\msg_set:nnnn, \msg_set:nnn, \msg_gset:nnnn, \msg_gset:nnn}
+% \begin{function}{\msg_set:nnnn, \msg_set:nnn}
% \begin{syntax}
% \cs{msg_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
% \end{syntax}
@@ -809,15 +809,17 @@
% \msg_new:nnnn, \msg_new:nnee, \msg_new:nnxx,
% \msg_new:nnn, \msg_new:nne, \msg_new:nnx
% }
-% \begin{macro}{\msg_gset:nnnn, \msg_gset:nnn}
% \begin{macro}{\msg_set:nnnn, \msg_set:nnn}
% Setting a message simply means saving the appropriate text
% into two functions. A sanity check first.
% \begin{macrocode}
-\cs_new_protected:Npn \msg_new:nnnn #1#2
+\cs_new_protected:Npn \msg_new:nnnn #1#2#3#4
{
\@@_chk_free:nn {#1} {#2}
- \msg_gset:nnnn {#1} {#2}
+ \cs_gset:cpn { \c_@@_text_prefix_tl #1 / #2 }
+ ##1##2##3##4 {#3}
+ \cs_gset:cpn { \c_@@_more_text_prefix_tl #1 / #2 }
+ ##1##2##3##4 {#4}
}
\cs_generate_variant:Nn \msg_new:nnnn { nnee , nnxx }
\cs_new_protected:Npn \msg_new:nnn #1#2#3
@@ -832,19 +834,9 @@
}
\cs_new_protected:Npn \msg_set:nnn #1#2#3
{ \msg_set:nnnn {#1} {#2} {#3} { } }
-\cs_new_protected:Npn \msg_gset:nnnn #1#2#3#4
- {
- \cs_gset:cpn { \c_@@_text_prefix_tl #1 / #2 }
- ##1##2##3##4 {#3}
- \cs_gset:cpn { \c_@@_more_text_prefix_tl #1 / #2 }
- ##1##2##3##4 {#4}
- }
-\cs_new_protected:Npn \msg_gset:nnn #1#2#3
- { \msg_gset:nnnn {#1} {#2} {#3} { } }
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \subsection{Messages: support functions and text}
%
@@ -2227,6 +2219,14 @@
{ internal~structure:\\\\\iow_indent:n {#4} }
}
}
+\msg_new:nnnn { prop } { bad-link }
+ { Variable~'#1'~is~not~a~valid~(linked)~prop. }
+ {
+ \c_@@_coding_error_text_tl
+ The~variable~'#1'~has~an~incorrect~internal~structure.~
+ Its~internal~entry~'#2'~points~to~'#3',~whose~name~is~not~of~the~
+ form~'#4~<key>'.
+ }
\msg_new:nnnn { clist } { non-clist }
{ Variable~'#1'~is~not~a~valid~clist. }
{
@@ -2236,6 +2236,24 @@
should~be~a~clist~variable,~but~it~includes~empty~or~blank~items~
without~braces.
}
+\msg_new:nnnn { prop } { misused }
+ { A~property~list~was~misused. }
+ {
+ \c_@@_coding_error_text_tl
+ A~property~list~variable~was~used~without~an~accessor~function.~
+ It~
+ \tl_if_empty:nTF {#1}
+ { is~empty. }
+ { contains~the~key-value~pairs \use_none:n #1 . }
+ }
+\msg_new:nnnn { prop } { inner-make }
+ { '#1'~ cannot~ be~ used~ in~ a~ group. }
+ {
+ \c_@@_coding_error_text_tl
+ The~ command~ '#1'~ was~ applied~ to~ the~ property~ list~
+ variable~ '#2', but~ the~ storage~ type~ can~ only~ be~ changed~
+ at~ the~ outermost~ group~ level.
+ }
% \end{macrocode}
%
% Some errors only appear in expandable settings,
@@ -2247,8 +2265,6 @@
{ Erroneous~variable~#1 used! }
\msg_new:nnn { seq } { misused }
{ A~sequence~was~misused. }
-\msg_new:nnn { prop } { misused }
- { A~property~list~was~misused. }
\msg_new:nnn { prg } { negative-replication }
{ Negative~argument~for~\iow_char:N\\prg_replicate:nn. }
\msg_new:nnn { prop } { prop-keyval }
@@ -2272,7 +2288,8 @@
{ The~integer~array~#1~contains~#2~items: \\ #3 . }
\msg_new:nnn { prop } { show }
{
- The~property~list~#1~
+ The~ \str_if_eq:nnF {#3} { flat } { #3~ }
+ property~list~#1~
\tl_if_empty:nTF {#2}
{ is~empty \\>~ . }
{ contains~the~pairs~(without~outer~braces): #2 . }
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index 66e4056a05..6a1bb766d1 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index 4719901866..31473fd53c 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
index 155535a4fd..1e97f4aaca 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
index 678d28fe51..ed804fc6b3 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
index c4d3285b7e..ffcf4a37f2 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
index 996d2face0..971bea5082 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
index daea9c248a..bbdc0373a5 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
index 8193ffab13..3a46d423fa 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
index 9492361a4a..6c9632fdf4 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
index 62d965b72f..5ec72ff809 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
index 988790dadf..a2ea7832c0 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
index 6c13a5cbb1..113dfe2f19 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
index d78d434fa7..74d21a3c62 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
index 6f9eac3b37..ccbd0305ff 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3pdf.dtx b/macros/latex/contrib/l3kernel/l3pdf.dtx
index d1e2a7e185..0490af4c46 100644
--- a/macros/latex/contrib/l3kernel/l3pdf.dtx
+++ b/macros/latex/contrib/l3kernel/l3pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index e3512672ff..286be82652 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -12,8 +12,8 @@ alloc,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https
ampersand,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
apfs,apfontspec,Qing Lee,https://github.com/CTeX-org/apfontspec,https://github.com/CTeX-org/apfontspec.git,https://github.com/CTeX-org/apfontspec/issues,2020-05-17,2020-05-17,
arch,archaeologie,Lukas C. Bossert,http://www.biblatex-archaeologie.de,https://github.com/LukasCBossert/biblatex-archaeologie.git,https://github.com/LukasCBossert/biblatex-archaeologie/issues,2017-03-24,2017-03-24,
-arsenal,arsenal,Boris Veytsman,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal/issues,2023-09-04,2023-09-04,
array,hobby,Andrew Stacey,https://github.com/loopspace/hobby,https://github.com/loopspace/hobby,https://github.com/loopspace/hobby/issues,2013-03-16,2020-10-29,
+arsenal,arsenal,Boris Veytsman,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal/issues,2023-09-04,2023-09-04,
atsign,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
avm,langsci-avm,Felix Kopecky,https://ctan.org/pkg/langsci-avm,https://github.com/langsci/langsci-avm,https://github.com/langsci/langsci-avm/issues,2020-03-11,2020-03-11,
babellatin,babel-latin,Keno Wehr,https://ctan.org/pkg/babel-latin,https://github.com/wehro/babel-latin,https://github.com/wehro/babel-latin/issues,2021-08-23,2021-08-23,
@@ -59,6 +59,7 @@ ctuthesis,ctuthesis,Tom Hejda,https://github.com/tohecz/ctuthesis,https://github
debug,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2017-07-15,2017-07-15,
denisbdoc,denisbdoc,Denis Bitouzé,https://github.com/dbitouze/denisbdoc,git@github.com:dbitouze/denisbdoc.git,,2020-05-13,2020-05-13,
deriv,derivative,Simon Jensen,,,,2019-07-24,2019-07-24,
+didec,didec,Thomas F. Sturm,https://github.com/T-F-S/didec,https://github.com/T-F-S/didec.git,https://github.com/T-F-S/didec/issues,2024-02-02,2024-02-02,
diffcoeff,diffcoeff,Andrew Parsloe,,,,2019-08-26,2019-08-26,
dim,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
document,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
@@ -131,7 +132,7 @@ keys,"l3kernel,l3keys2e,ltkeys",The LaTeX Project,https://www.latex-project.org/
keyval,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
kgl,kantlipsum,Enrico Gregorio,,,,2013-03-16,2013-03-16,
kivitendo,"kiviletter, kivitables",Marei Peischl for Kivitendo,https://www.kivitendo.de/,https://github.com/kivitendo/kivitendo-erp,https://forum.kivitendo.de/,2021-05-28,2021-05-28,
-langsci,langscibook ,Language Science Press,https://langsci-press.org,https://github.com/langsci/langscibook,https://github.com/langsci/langscibook/issues,2021-07-20,2021-07-21,
+langsci,langscibook,Language Science Press,https://langsci-press.org,https://github.com/langsci/langscibook,https://github.com/langsci/langscibook/issues,2021-07-20,2021-07-21,
left,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
lltxmath,lualatex-math,Philipp Stephani,https://github.com/phst/lualatex-math,https://github.com/phst/lualatex-math.git,https://github.com/phst/lualatex-math/issues,2012-11-07,2012-11-07,
log,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
@@ -204,7 +205,7 @@ prop,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https:
property,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-01-20,2021-03-03,
pseudo,pseudo,Magnus Lie Hetland,https://github.com/mlhetland/pseudo.sty,https://github.com/mlhetland/pseudo.sty.git,https://github.com/mlhetland/pseudo.sty/issues,2019-06-24,2019-06-24,
ptex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-07-28,2015-07-28,
-ptxcd,ptxcd, Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates
+ptxcd,ptxcd,Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates
qrbill,qrbill,Marei Peischl,https://github.com/peiTeX/qrbill,https://github.com/peiTeX/qrbill.git,https://github.com/peiTeX/qrbill/issues,2020-06-27,2020-06-27,
quark,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
rainbow,beamertheme-rainbow,samcarter,https://github.com/samcarter/beamertheme-rainbow,https://github.com/samcarter/beamertheme-rainbow,https://github.com/samcarter/beamertheme-rainbow/issues,2023-07-04,2023-07-04,
@@ -250,7 +251,7 @@ template,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,htt
term,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
tex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
text,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2020-01-15,2020-01-15,
-tikzfill,tikzfill,Thomas F. Sturm,https://github.com/T-F-S/tikzfill,https://github.com/T-F-S/tikzfill.git,https://github.com/T-F-S/tikzfill/issues,2022-07-19,2022-07-19,
+tikzfill,tikzfill,Thomas F. Sturm,https://github.com/T-F-S/tikzfill,https://github.com/T-F-S/tikzfill.git,https://github.com/T-F-S/tikzfill/issues,2022-07-19,2022-07-19,
tikzlings,tikzlings,samcarter,https://github.com/samcarter/tikzlings,git@github.com:samcarter/tikzlings.git,https://github.com/samcarter/tikzlings/issues,2023-02-17,2023-02-17,
tikzsymbols,tikzsymbols,Ben Vitecek,https://github.com/Vidabe/tikzsymbols,https://github.com/Vidabe/tikzsymbols.git,https://github.com/Vidabe/tikzsymbols/issues,2018-09-26,2018-09-26,
tilde,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index ea2bf15903..2bd39c3787 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 0b134d713f..5b7a36238b 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index f6190ebee7..8281611924 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,19 +43,19 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
% \begin{documentation}
%
-% \pkg{expl3} implements a property list data type, which contain
-% an unordered list of entries each of which consists of a \meta{key} and
-% an associated \meta{value}. The \meta{key} and \meta{value} may both
-% be any balanced text, and the \meta{key} is processed using
-% \cs{tl_to_str:n}, meaning that category codes are ignored. It is possible to
-% map functions to property lists such that the function is applied to every
-% key--value pair within the list.
+% \pkg{expl3} implements a \enquote{property list} data type, which contain
+% an unordered list of entries each of which consists of a \meta{key} (string)
+% and an associated \meta{value} (token list). The \meta{key} and \meta{value}
+% may both be given as any balanced text, and the \meta{key} is processed using
+% \cs{tl_to_str:n}, meaning that category codes are ignored. Entries can be
+% manipulated individually, as well as collectively by applying a function to
+% every key--value pair within the list.
%
% Each entry in a property list must have a unique \meta{key}: if an entry is
% added to a property list which already contains the \meta{key} then the new
@@ -63,8 +63,41 @@
% string basis, using the same method as \cs{str_if_eq:nnTF}.
%
% Property lists are intended for storing key-based information for use within
-% code. This is in contrast to key--value lists, which are a form of
-% \emph{input} parsed by the \pkg{l3keys} module.
+% code. They can be converted from and to key--value lists, which are a form of
+% \emph{input} parsed by the \pkg{l3keys} module. If a key--value list contains
+% a \meta{key} multiple times, only the last \meta{value} associated to it will
+% be kept in the conversion to a property list.
+%
+% Internally, property lists can use two distinct implementations with different
+% data storage, which are decided when declaring the property list variable
+% using \cs{prop_new:N} (\enquote{flat} storage) or \cs{prop_new_linked:N}
+% (\enquote{linked} storage). After a property list is declared with
+% \cs{prop_new:N} or \cs{prop_new_linked:N}, the type of internal data storage
+% can be changed by \cs{prop_make_flat:N} or \cs{prop_make_linked:N}, but only
+% at the outermost group level. All other \pkg{l3prop} functions transparently
+% manipulate either storage method and convert as needed.
+% \begin{itemize}
+% \item
+% The (default) \enquote{flat} storage method is suited for a relatively
+% small number of entries, or when the property list is likely to be
+% manipulated (copied, mapped) as a whole rather than entry-wise. It is
+% significantly faster for \cs{prop_set_eq:NN}, and only slightly faster for
+% \cs{prop_clear:N}, \cs{prop_concat:NNN}, and mapping functions
+% \cs[no-index]{prop_map_\ldots{}}.
+%
+% \item
+% The \enquote{linked} storage method is meant for property lists with a
+% large numbers of entries. It takes up more of \TeX{}'s memory during a run, but is
+% significantly faster (for long lists) when accessing or modifying
+% individual entries using functions such as \cs{prop_if_in:Nn},
+% \cs{prop_item:Nn}, \cs{prop_put:Nnn}, \cs{prop_get:NnN},
+% \cs{prop_pop:NnN}, \cs{prop_remove:Nn}, as it takes a constant
+% time for these operations (rather than the number of items for a
+% \enquote{flat} property list). A technical drawback is that
+% memory is permanently used\footnote{Until the end of the run, that
+% is.} by \meta{keys} stored in a \enquote{linked} property list,
+% even after they are removed and the property list is deleted.
+% \end{itemize}
%
% \section{Creating and initialising property lists}
%
@@ -72,9 +105,20 @@
% \begin{syntax}
% \cs{prop_new:N} \meta{property list}
% \end{syntax}
-% Creates a new \meta{property list} or raises an error if the name is
-% already taken. The declaration is global. The \meta{property list}
-% initially contains no entries.
+% Creates a new \enquote{flat} \meta{property list} or raises an error if the
+% name is already taken. The declaration is global. The \meta{property list}
+% initially contains no entries. See also \cs{prop_new_linked:N}.
+% \end{function}
+%
+% \begin{function}[added = 2024-02-12]{\prop_new_linked:N, \prop_new_linked:c}
+% \begin{syntax}
+% \cs{prop_new_linked:N} \meta{property list}
+% \end{syntax}
+% Creates a new \enquote{linked} \meta{property list} or raises an error if
+% the name is already taken. The declaration is global. The \meta{property
+% list} initially contains no entries. The internal data storage differs from
+% that produced by \cs{prop_new:N} and it is optimized for property lists with
+% a large number of entries.
% \end{function}
%
% \begin{function}
@@ -95,8 +139,28 @@
% \end{syntax}
% Ensures that the \meta{property list} exists globally by applying
% \cs{prop_new:N} if necessary, then applies
-% \cs[index=prop_clear:N]{prop_(g)clear:N} to leave
-% the list empty.
+% \cs[index=prop_clear:N]{prop_(g)clear:N} to leave the list empty.
+% \begin{texnote}
+% If the property list exists and is of \enquote{linked} type, it
+% is cleared but not made into a flat property list.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2024-02-12]
+% {
+% \prop_clear_new_linked:N, \prop_clear_new_linked:c,
+% \prop_gclear_new_linked:N, \prop_gclear_new_linked:c
+% }
+% \begin{syntax}
+% \cs{prop_clear_new_linked:N} \meta{property list}
+% \end{syntax}
+% Ensures that the \meta{property list} exists globally by applying
+% \cs{prop_new_linked:N} if necessary, then applies
+% \cs[index=prop_clear:N]{prop_(g)clear:N} to leave the list empty.
+% \begin{texnote}
+% If the property list exists and is of \enquote{flat} type, it
+% is cleared but not made into a linked property list.
+% \end{texnote}
% \end{function}
%
% \begin{function}
@@ -107,8 +171,8 @@
% \begin{syntax}
% \cs{prop_set_eq:NN} \meta{property list_1} \meta{property list_2}
% \end{syntax}
-% Sets the content of \meta{property list_1} equal to that of
-% \meta{property list_2}.
+% Sets the content of \meta{property list_1} equal to that of \meta{property
+% list_2}. This converts as needed between the two storage types.
% \end{function}
%
% \begin{function}[added = 2017-11-28, updated = 2021-11-07]
@@ -125,6 +189,9 @@
% \end{syntax}
% Sets \meta{property list} to contain key--value pairs given in the second
% argument. If duplicate keys appear only the last of the values is kept.
+% In contrast to most keyval lists (\emph{e.g.}~those in \pkg{l3keys}), each
+% key here \emph{must} be followed with an \texttt{=} sign even to specify an
+% empty \meta{value}.
%
% Spaces are trimmed around every \meta{key} and every \meta{value},
% and if the result of trimming spaces consists of a single brace
@@ -133,10 +200,6 @@
% signs. The \meta{key} is then processed by \cs{tl_to_str:n}.
% This function correctly detects the |=| and |,| signs provided they
% have the standard category code~$12$ or they are active.
-%
-% Notice that in contrast to most keyval lists (\emph{e.g.}~those in
-% \pkg{l3keys}), each key here \emph{must} be followed with an \texttt{=}
-% sign.
% \end{function}
%
% \begin{function}[added = 2017-11-28, updated = 2021-11-07]
@@ -148,17 +211,55 @@
% \meta{key2} |=| \meta{value2} |,| \ldots{}
% \}
% \end{syntax}
-% Creates a new constant \meta{property list} or raises an error if the
+% Creates a new constant \enquote{flat} \meta{property list} or raises
+% an error if the
% name is already taken. The \meta{property list} is set globally to
% contain key--value pairs given in the second argument, processed in
% the way described for \cs{prop_set_from_keyval:Nn}. If duplicate
% keys appear only the last of the values is kept.
% This function correctly detects the |=| and |,| signs provided they
% have the standard category code~$12$ or they are active.
+% \end{function}
+%
+% \begin{function}[added = 2024-02-12]
+% {\prop_const_linked_from_keyval:Nn, \prop_const_linked_from_keyval:cn}
+% \begin{syntax}
+% \cs{prop_const_linked_from_keyval:Nn} \meta{prop~var}
+% \{
+% \meta{key1} |=| \meta{value1} |,|
+% \meta{key2} |=| \meta{value2} |,| \ldots{}
+% \}
+% \end{syntax}
+% Creates a new constant \enquote{linked} \meta{prop~var} or raises an
+% error if the
+% name is already taken. The \meta{prop~var} is set globally to
+% contain key--value pairs given in the second argument, processed in
+% the way described for \cs{prop_set_from_keyval:Nn}. If duplicate
+% keys appear only the last of the values is kept.
+% This function correctly detects the |=| and |,| signs provided they
+% have the standard category code~$12$ or they are active.
+% \end{function}
%
-% Notice that in contrast to most keyval lists (\emph{e.g.}~those in
-% \pkg{l3keys}), each key here \emph{must} be followed with an \texttt{=}
-% sign.
+% \begin{function}[added = 2024-02-12]{\prop_make_flat:N, \prop_make_flat:c}
+% \begin{syntax}
+% \cs{prop_make_flat:N} \meta{property list}
+% \end{syntax}
+% Changes the internal storage type of the \meta{property list} to be
+% the same \enquote{flat} storage as \cs{prop_new:N}. The key--value
+% pairs of the \meta{property list} are preserved by the change. If
+% the property list was already flat then nothing is done. This
+% function can only be used at the outermost group level.
+% \end{function}
+%
+% \begin{function}[added = 2024-02-12]{\prop_make_linked:N, \prop_make_linked:c}
+% \begin{syntax}
+% \cs{prop_make_linked:N} \meta{property list}
+% \end{syntax}
+% Changes the internal storage type of the \meta{property list} to be
+% the same \enquote{linked} storage as \cs{prop_new_linked:N}. The
+% key--value pairs of the \meta{property list} are preserved by the
+% change. If the property list was already linked then nothing is
+% done. This function can only be used at the outermost group level.
% \end{function}
%
% \section{Adding and updating property list entries}
@@ -171,22 +272,20 @@
% \prop_put:Nen, \prop_put:NeV, \prop_put:Nev, \prop_put:Nee,
% \prop_put:Nno, \prop_put:Non, \prop_put:Noo,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cnv, \prop_put:cne,
-% \prop_put:cno,
% \prop_put:cVn, \prop_put:cVV, \prop_put:cVv, \prop_put:cVe,
% \prop_put:cvn, \prop_put:cvV, \prop_put:cvv, \prop_put:cve,
% \prop_put:cen, \prop_put:ceV, \prop_put:cev, \prop_put:cee,
-% \prop_put:con, \prop_put:coo,
+% \prop_put:cno, \prop_put:con, \prop_put:coo,
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nnv, \prop_gput:Nne,
% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVv, \prop_gput:NVe,
% \prop_gput:Nvn, \prop_gput:NvV, \prop_gput:Nvv, \prop_gput:Nve,
% \prop_gput:Nen, \prop_gput:NeV, \prop_gput:Nev, \prop_gput:Nee,
% \prop_gput:Nno, \prop_gput:Non, \prop_gput:Noo,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cnv, \prop_gput:cne,
-% \prop_gput:cno,
% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVv, \prop_gput:cVe,
% \prop_gput:cvn, \prop_gput:cvV, \prop_gput:cvv, \prop_gput:cve,
% \prop_gput:cen, \prop_gput:ceV, \prop_gput:cev, \prop_gput:cee,
-% \prop_gput:con, \prop_gput:coo
+% \prop_gput:cno, \prop_gput:con, \prop_gput:coo
% }
% \begin{syntax}
% \cs{prop_put:Nnn} \meta{property list} \Arg{key} \Arg{value}
@@ -227,6 +326,7 @@
% \meta{property list_3}, and saves the result in \meta{property list_1}. If a
% key appears in both \meta{property list_2} and \meta{property list_3} then the
% last value, namely the value in \meta{property list_3} is kept.
+% This converts as needed between the two storage types.
% \end{function}
%
% \begin{function}[added = 2021-05-16, updated = 2021-11-07]
@@ -319,7 +419,7 @@
% the \meta{token list variable} is local. See also \cs{prop_gpop:NnNTF}.
% \end{function}
%
-% \begin{function}[added = 2014-07-17, EXP]
+% \begin{function}[EXP, added = 2014-07-17]
% {
% \prop_item:Nn, \prop_item:NV, \prop_item:Ne, \prop_item:No,
% \prop_item:cn, \prop_item:cV, \prop_item:ce, \prop_item:co
@@ -331,8 +431,11 @@
% the \meta{property list}. If the \meta{key} is missing, this has
% an empty expansion.
% \begin{texnote}
-% This function is slower than the non-expandable analogue
-% \cs{prop_get:NnN}.
+% For \enquote{flat} property lists, this expandable function iterates
+% through every key--value pair and is therefore slower than a
+% non-expandable approach based on \cs{prop_get:NnN}.
+% (For \enquote{linked} property lists both functions are fast.)
+%
% The result is returned within the \tn{unexpanded}
% primitive (\cs{exp_not:n}), which means that the \meta{value}
% does not expand further when appearing in an \texttt{e}-type
@@ -354,7 +457,7 @@
% \end{syntax}
% Expands to the \meta{property list} in a key--value notation. Keep in mind
% that a \meta{property list} is \emph{unordered}, while key--value interfaces
-% don't necessarily are, so this can't be used for arbitrary interfaces.
+% are not necessarily, so this cannot be used for arbitrary interfaces.
% \begin{texnote}
% The result is returned within the \tn{unexpanded} primitive
% (\cs{exp_not:n}), which means that the key--value list does not expand
@@ -402,7 +505,7 @@
% Tests if the \meta{property list} is empty (containing no entries).
% \end{function}
%
-% \begin{function}[updated = 2011-09-15, EXP, pTF]
+% \begin{function}[EXP, pTF, updated = 2011-09-15]
% {
% \prop_if_in:Nn, \prop_if_in:NV, \prop_if_in:Ne, \prop_if_in:No,
% \prop_if_in:cn, \prop_if_in:cV, \prop_if_in:ce, \prop_if_in:co
@@ -414,9 +517,10 @@
% Tests if the \meta{key} is present in the \meta{property list},
% making the comparison using the method described by \cs{str_if_eq:nnTF}.
% \begin{texnote}
-% This function iterates through every key--value pair in the
-% \meta{property list} and is therefore slower than using the
-% non-expandable \cs{prop_get:NnNTF}.
+% For \enquote{flat} property lists, this expandable function iterates
+% through every key--value pair and is therefore slower than a
+% non-expandable approach based on \cs{prop_get:NnNTF}.
+% (For \enquote{linked} property lists both functions are fast.)
% \end{texnote}
% \end{function}
%
@@ -424,11 +528,11 @@
%
% The functions in this section combine tests for the presence of a key
% in a property list with recovery of the associated valued. This makes them
-% useful for cases where different cases follow dependent on the presence
+% useful for cases where different code follows depending on the presence
% or absence of a key in a property list. They offer increased readability
% and performance over separate testing and recovery phases.
%
-% \begin{function}[updated = 2012-05-19, TF]
+% \begin{function}[TF, updated = 2012-05-19]
% {
% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN,
% \prop_get:NoN,
@@ -458,7 +562,8 @@
% \prop_pop:coN
% }
% \begin{syntax}
-% \cs{prop_pop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \Arg{true code} \Arg{false code}
+% \cs{prop_pop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\
+% ~~\Arg{true code} \Arg{false code}
% \end{syntax}
% If the \meta{key} is not present in the \meta{property list}, leaves
% the \meta{false code} in the input stream. The value of the
@@ -479,7 +584,8 @@
% \prop_gpop:coN
% }
% \begin{syntax}
-% \cs{prop_gpop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \Arg{true code} \Arg{false code}
+% \cs{prop_gpop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\
+% ~~\Arg{true code} \Arg{false code}
% \end{syntax}
% If the \meta{key} is not present in the \meta{property list}, leaves
% the \meta{false code} in the input stream. The value of the
@@ -498,7 +604,7 @@
% local assignments made by the \meta{function} or \meta{code} discussed
% below remain in effect after the loop.
%
-% \begin{function}[updated = 2013-01-08, rEXP]
+% \begin{function}[rEXP, updated = 2013-01-08]
% {\prop_map_function:NN, \prop_map_function:cN}
% \begin{syntax}
% \cs{prop_map_function:NN} \meta{property list} \meta{function}
@@ -509,7 +615,7 @@
% The order in which \meta{entries} are returned is not defined and
% should not be relied upon.
% To pass further arguments to the \meta{function}, see
-% \cs{prop_map_tokens:Nn}.
+% \cs{prop_map_inline:Nn} (non-expandable) or \cs{prop_map_tokens:Nn}.
% \end{function}
%
% \begin{function}[updated = 2013-01-08]
@@ -543,7 +649,7 @@
% arguments. For that specific task, \cs{prop_item:Nn} is faster.
% \end{function}
%
-% \begin{function}[updated = 2012-06-29, rEXP]{\prop_map_break:}
+% \begin{function}[rEXP, updated = 2012-06-29]{\prop_map_break:}
% \begin{syntax}
% \cs{prop_map_break:}
% \end{syntax}
@@ -570,7 +676,7 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[updated = 2012-06-29, rEXP]{\prop_map_break:n}
+% \begin{function}[rEXP, updated = 2012-06-29]{\prop_map_break:n}
% \begin{syntax}
% \cs{prop_map_break:n} \Arg{code}
% \end{syntax}
@@ -604,27 +710,34 @@
% \begin{syntax}
% \cs{prop_show:N} \meta{property list}
% \end{syntax}
-% Displays the entries in the \meta{property list} in the terminal.
+% Displays the entries in the \meta{property list} in the terminal,
+% and specifies its storage type.
% \end{function}
%
% \begin{function}[added = 2014-08-12, updated = 2021-04-29]{\prop_log:N, \prop_log:c}
% \begin{syntax}
% \cs{prop_log:N} \meta{property list}
% \end{syntax}
-% Writes the entries in the \meta{property list} in the log file.
+% Writes the entries in the \meta{property list} in the log file,
+% and specifies its storage type.
% \end{function}
%
% \section{Scratch property lists}
%
+% There is no need to include both flat and linked property lists as
+% scratch variables. We arbitrarily pick the older implementation.
+%
% \begin{variable}[added = 2012-06-23]{\l_tmpa_prop, \l_tmpb_prop}
-% Scratch property lists for local assignment. These are never used by
+% Scratch \enquote{flat} property lists for local assignment.
+% These are never used by
% the kernel code, and so are safe for use with any \LaTeX3-defined
% function. However, they may be overwritten by other non-kernel
% code and so should only be used for short-term storage.
% \end{variable}
%
% \begin{variable}[added = 2012-06-23]{\g_tmpa_prop, \g_tmpb_prop}
-% Scratch property lists for global assignment. These are never used by
+% Scratch \enquote{flat} property lists for global assignment.
+% These are never used by
% the kernel code, and so are safe for use with any \LaTeX3-defined
% function. However, they may be overwritten by other non-kernel
% code and so should only be used for short-term storage.
@@ -652,97 +765,98 @@
%<@@=prop>
% \end{macrocode}
%
-% A property list is a macro whose top-level expansion is of the form
+% With the (default) flat data storage, a property list is a macro whose
+% top-level expansion is of the form
% \begin{quote}
-% \cs{s_@@}
+% \cs{s_@@} \cs{@@_chk:w}
% \cs{@@_pair:wn} \meta{key_1} \cs{s_@@} \Arg{value_1} \\
% \ldots{} \\
% \cs{@@_pair:wn} \meta{key_n} \cs{s_@@} \Arg{value_n} \\
% \end{quote}
-% where \cs{s_@@} is a scan mark
-% (equal to \cs{scan_stop:}), and \cs{@@_pair:wn} can be used to map
-% through the property list.
-%
-% \begin{variable}{\s_@@}
-% The internal token used at the beginning of property lists. This is
-% also used after each \meta{key} (see \cs{@@_pair:wn}).
-% \end{variable}
-%
-% \begin{variable}{\@@_pair:wn}
-% \begin{syntax}
-% \cs{@@_pair:wn} \meta{key} \cs{s_@@} \Arg{item}
-% \end{syntax}
-% The internal token used to begin each key--value pair in the
-% property list. If expanded outside of a mapping or manipulation
-% function, an error is raised. The definition should always be
-% set globally.
-% \end{variable}
-%
-% \begin{variable}{\l_@@_internal_tl}
-% Token list used to store new key--value pairs to be inserted by
-% functions of the \cs{prop_put:Nnn} family.
-% \end{variable}
-%
-% \begin{function}[updated = 2013-01-08]{\@@_split:NnTF}
-% \begin{syntax}
-% \cs{@@_split:NnTF} \meta{property list} \Arg{key} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Splits the \meta{property list} at the \meta{key}, giving three
-% token lists: the \meta{extract} of \meta{property list} before the
-% \meta{key}, the \meta{value} associated with the \meta{key} and the
-% \meta{extract} of the \meta{property list} after the \meta{value}.
-% Both \meta{extracts} retain the internal structure of a property
-% list, and the concatenation of the two \meta{extracts} is a
-% property list.
-% If the \meta{key} is present in the \meta{property list} then the
-% \meta{true code} is left in the input stream, with |#1|, |#2|, and
-% |#3| replaced by the first \meta{extract}, the \meta{value}, and the
-% second extract.
-% If the \meta{key} is not present in the \meta{property list} then
-% the \meta{false code} is left in the input stream, with no trailing
-% material.
-% Both \meta{true code} and \meta{false code} are used in the
-% replacement text of a macro defined internally, hence macro
-% parameter characters should be doubled, except |#1|, |#2|, and |#3|
-% which stand in the \meta{true code} for the three extracts from the
-% property list.
-% The \meta{key} comparison takes place as described for \cs{str_if_eq:nn}.
-% \end{function}
+% where \cs{s_@@} is a scan mark (equal to \cs{scan_stop:}), \cs{@@_chk:w}
+% produces a suitable error if the property list is used directly in the input
+% stream, and \cs{@@_pair:wn} can be used to map through the property list.
+%
+% With the linked data storage, each property list entry
+% \meta{key_i}--\meta{value_i} is stored into a token list
+% \cs[no-index]{@@~\meta{prefix}~\meta{key_i}}. The \meta{prefix} is one or
+% more characters (no spaces), constructed automatically only once, when the
+% property list is initially declared. The control sequence name does not
+% conform to standard naming for variables because (1) this is an internal
+% control sequence, not really a \pkg{expl3} variable; (2) keeping track of the
+% scope |l| or~|g| throughout all functions would be a pretty big mess,
+% especially if users accidentally mix local and global use (we would have to
+% always check for such mistakes, rather than only checking when suitable debug
+% options are set); (3) shorter control sequence names use less memory and are
+% quicker in case of hash collisions, which may matter since we are using many
+% control sequences.
+%
+% We need to enable mapping through such a property list, but without storing a
+% list of all entries anywhere: this is achieved by making each of these token
+% lists also store a pointer to the next entry. To enable efficient deletion,
+% the token lists also store a pointer to the previous entry. This means we
+% have a doubly-linked list. To avoid having to special-case the two ends of
+% the doubly-linked list when deleting entries, we include as a zeroth entry in
+% the doubly-linked list the property list variable itself, and we include as an
+% $(n+1)$-th entry in the doubly-linked list an end-pointer
+% \cs{@@~\meta{prefix}} (no trailing space, so it differs from an empty key).
+% The space before \meta{prefix} ensures there is no collision with
+% other \pkg{l3prop} internal functions, even if we have very many
+% linked property lists being defined.
+%
+% The property list variable itself is a token list of the form
+% \begin{quote}
+% \cs{@@_flatten:w} \cs{@@~\meta{prefix}} \cs{s_@@} \Arg{prefix}
+% \cs[no-index]{@@~\meta{prefix}~\meta{key_1}}
+% \end{quote}
+% Here, \cs{@@_flatten:w} serves as an efficiently recognized marker, and when
+% \texttt{f}-expanded it is tasked with fully unpacking the property list into
+% the same form as the default data storage so as to ease conversion. The
+% \meta{prefix} is used when looking up an entry. The token list
+% \cs{@@~\meta{prefix}} (see below) contains a pointer to the last key to help
+% insert a new entry. The pointer to \meta{key_1} is needed to start a mapping.
+% The token list labeled by \meta{key_i} is of the form
+% \begin{quote}
+% \cs{use_none:n} \cs[no-index]{@@~\meta{prefix}~\meta{key$_{i-1}$}}
+% \cs{@@_pair:wn} \meta{key_i} \cs{s_@@} \Arg{value_i}
+% \cs[no-index]{@@~\meta{prefix}~\meta{key$_{i+1}$}}
+% \end{quote}
+% where the pointer to \meta{key$_{i-1}$} is needed when deleting the
+% \meta{key_i}. Expanding this will run \cs{@@_pair:wn} on the
+% \meta{key_i}--\meta{value_i} pair (for speed, \meta{key_i} is kept as explicit
+% tokens rather than slowly extracting it from a control sequence name), then
+% move on to the next key, thus mapping through the whole list. The mapping is
+% ended upon expanding \cs{@@~\meta{prefix}}, which is the token list
+% \begin{quote}
+% \cs{use_none:n} \cs[no-index]{@@~\meta{prefix}~\meta{key_n}}
+% \end{quote}
+% Let us think about deleting the \meta{key_i}. We need to update the
+% \meta{key$_{i-1}$} and \meta{key$_{i+1}$} to point to each other
+% instead of \meta{key_i}. To edit the corresponding token lists, it is
+% important that \cs[no-index]{@@~\meta{prefix}~\meta{key_i}} be at the
+% \enquote{same place} in the token lists also in the boundary cases
+% $i=1$ or $i=n$, namely as the second token, or as the second argument
+% after \cs{s_@@}.
%
-% \begin{macro}{\s_@@}
-% A private scan mark is used as a marker after each key, and at the
-% very beginning of the property list.
-% \begin{macrocode}
-\scan_new:N \s_@@
-% \end{macrocode}
-% \end{macro}
+% \subsection{Internal auxiliaries}
%
-% \begin{macro}{\@@_pair:wn}
-% The delimiter is always defined, but when misused simply triggers an
-% error and removes its argument.
+% \begin{macro}{\@@_tmp:w}
+% Scratch macro, defined as needed, for instance to save \cs{@@_pair:wn} when
+% concatenating.
% \begin{macrocode}
-\cs_new:Npn \@@_pair:wn #1 \s_@@ #2
- { \msg_expandable_error:nn { prop } { misused } }
+\cs_new_eq:NN \@@_tmp:w ?
% \end{macrocode}
% \end{macro}
%
% \begin{variable}{\l_@@_internal_tl}
-% Token list used to store the new key--value pair inserted by
-% \cs{prop_put:Nnn} and friends.
+% Token list used in various places: for the prefix; when converting from flat
+% to linked props; and to store the new key--value pair inserted by
+% \cs{prop_put:Nnn}.
% \begin{macrocode}
\tl_new:N \l_@@_internal_tl
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}[tested = m3prop004]{\c_empty_prop}
-% An empty prop.
-% \begin{macrocode}
-\tl_const:Nn \c_empty_prop { \s_@@ }
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Internal auxiliaries}
-%
% \begin{variable}{\s_@@_mark,\s_@@_stop}
% Internal scan marks.
% \begin{macrocode}
@@ -769,10 +883,160 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Structure of a property list}
+%
+% \begin{macro}{\s_@@}
+% A private scan mark is used as a marker after each key, and at the
+% very beginning of the property list.
+% \begin{macrocode}
+\scan_new:N \s_@@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_chk:w, \@@_chk_loop:nw, \@@_chk_get:nw}
+% This removes the flat property list from the input stream and complains
+% about a bad use of a property list. Since property lists do not have an
+% end-marker, we slowly peek ahead in a loop. Speed does not matter since
+% this is for an error situation. While \cs{@@_pair:wn} does not keep a fixed
+% definition, it always includes the internal \cs{s_@@} in its argument
+% specification, so that there is no risk of accidentally picking up a public
+% token instead of \cs{@@_pair:wn} when doing a meaning test. We collect the
+% keys and values to produce a more useful error message.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_chk:w { \@@_chk_loop:nw { } }
+\cs_new_protected:Npn \@@_chk_loop:nw #1
+ {
+ \peek_meaning:NTF \@@_pair:wn
+ { \@@_chk_get:nw {#1} }
+ { \msg_error:nne { prop } { misused } {#1} }
+ }
+\cs_new_protected:Npn \@@_chk_get:nw #1 \@@_pair:wn #2 \s_@@ #3
+ { \@@_chk_loop:nw { #1 , ~ {#2} = { \tl_to_str:n {#3} } } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_pair:wn}
+% Used as \cs{@@_pair:wn} \meta{key} \cs{s_@@} \Arg{item} for both storage
+% types, this internal token starts each key--value pair in the property list.
+% This default definition is changed globally by any mapping function, so
+% there is not much point trying to make it an error. Instead, the error is
+% produced by \cs{@@_chk:w}.
+% \begin{macrocode}
+\cs_new:Npn \@@_pair:wn #1 \s_@@ #2 { }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_flatten:w}
+% We implement here the fact that \texttt{f}-expanding a linked property list
+% gives a flat property list.
+% Leaving a linked property list in the input stream will turn it into a flat
+% property list so that the error implemented by \cs{@@_chk:w} will correctly
+% be triggered.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_flatten:w #1 \s_@@ #2#3
+ { \use:e { \@@_flatten_aux:N #3 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[rEXP]
+% {\@@_flatten:N, \@@_flatten_aux:w, \@@_flatten_aux:N, \@@_flatten_loop:w}
+% The main function \cs{@@_flatten:N} receives a linked property list and
+% flattens it. The auxiliary \cs{@@_flatten_aux:N} receives a pointer to the
+% first key and flattens the linked property list into a flat property list.
+% This is only restricted-expandable as it involves mapping through all of the
+% property list's entries starting from \meta{key_1}. The looping function
+% \cs{@@_flatten_loop:w} removes \cs{use_none:n} and a backwards pointer~|#2|,
+% leaves the key--value pair for \cs{use:e} to receive, and calls itself
+% again after expanding the next key's token list. Its argument |#3| is
+% empty, except at the end where it is the \cs{use_none:nnnn} appearing in the
+% definition of~\cs{@@_flatten_aux:N}, which ends the loop.
+% \begin{macrocode}
+\cs_new:Npn \@@_flatten:N #1
+ { \exp_after:wN \@@_flatten_aux:w #1 }
+\cs_new:Npn \@@_flatten_aux:w #1 \s_@@ #2 { \@@_flatten_aux:N }
+\cs_new:Npn \@@_flatten_aux:N #1
+ {
+ \s_@@ \@@_chk:w
+ \exp_after:wN \@@_flatten_loop:w #1
+ \use_none:nnnn \@@_pair:wn \s_@@ { }
+ }
+\cs_new:Npn \@@_flatten_loop:w #1#2#3 \@@_pair:wn #4 \s_@@ #5
+ {
+ #3
+ \exp_not:n { \@@_pair:wn #4 \s_@@ {#5} }
+ \exp_after:wN \@@_flatten_loop:w
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_prefix_int, \c_@@_basis_int}
+% Used to assign prefixes for each linked property list. It is converted to
+% base \cs{c_@@_basis_int}, then each digit is converted to a character,
+% starting at |!| (the character after space).
+% \begin{macrocode}
+\int_new:N \g_@@_prefix_int
+\int_const:Nn \c_@@_basis_int { \c_max_char_int - `\! }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_next_prefix:, \@@_to_prefix:n}
+% Store in \cs{l_@@_internal_tl} the conversion of \cs{g_@@_prefix_int} to
+% characters, and increment this integer for use in the next linked property
+% list. No need to optimize since this is only used when declaring the
+% property list the first time.
+% The aim here is to make this string as short as we can, given the
+% range of distinct characters available. This speeds up the work of
+% \cs{cs:w} \ldots{} \cs{cs_end:} that looks up keys in the hash table.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_next_prefix:
+ {
+ \tl_set:Ne \l_@@_internal_tl
+ { \@@_to_prefix:n { \g_@@_prefix_int } }
+ \int_gincr:N \g_@@_prefix_int
+ }
+\cs_new:Npn \@@_to_prefix:n #1
+ {
+ \int_compare:nNnTF {#1} > \c_@@_basis_int
+ {
+ \exp_args:Nf \@@_to_prefix:n
+ { \int_div_truncate:nn {#1} \c_@@_basis_int }
+ \exp_args:Nf \@@_to_prefix:n
+ { \int_mod:nn {#1} \c_@@_basis_int }
+ }
+ { \char_generate:nn { `\! + #1 } { 12 } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_if_flat:NTF, \@@_if_flat_aux:w}
+% We could either test for the presence of \cs{@@_chk:w} (flat
+% property list) or of \cs{@@_flatten:w} (linked property list). We
+% make the second choice; this way props that are accidentally
+% \tn{relax} are treated as they were before. The auxiliary receives
+% \cs{use_i:nn} or \cs{use_ii:nn} as~|#3|.
+% \begin{macrocode}
+\cs_new:Npn \@@_if_flat:NTF #1
+ {
+ \exp_after:wN \@@_if_flat_aux:w #1
+ \s_@@_mark \use_ii:nn
+ \@@_flatten:w \s_@@_mark \use_i:nn \s_@@_stop
+ }
+\cs_new:Npn \@@_if_flat_aux:w
+ #1 \@@_flatten:w #2 \s_@@_mark #3 #4 \s_@@_stop {#3}
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Allocation and initialisation}
%
+% \begin{variable}[tested = m3prop004]{\c_empty_prop}
+% An empty flat prop.
+% \begin{macrocode}
+\tl_const:Nn \c_empty_prop { \s_@@ \@@_chk:w }
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}[tested = m3prop001]{\prop_new:N, \prop_new:c}
-% Property lists are initialized with the value \cs{c_empty_prop}.
+% Flat property lists are initialized with the value \cs{c_empty_prop}.
% \begin{macrocode}
\cs_new_protected:Npn \prop_new:N #1
{
@@ -783,23 +1047,107 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[tested = m3prop001]{\prop_new_linked:N, \prop_new_linked:c}
+% \begin{macro}{\@@_new_linked:N}
+% The auxiliary is used in \cs{prop_make_linked:N}.
+% For linked property lists, get a new prefix in \cs{l_@@_internal_tl}, then
+% use it to set up the internal structure: the last token in~|#1| is usually a
+% pointer to the first key, which is here the end-pointer. That end-pointer
+% has a pointer to the previous key (usually the last key), which is the
+% variable~|#1| itself that begins the doubly-linked list.
+% \begin{macrocode}
+\cs_new_protected:Npn \prop_new_linked:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new_linked:N #1
+ }
+\cs_new_protected:Npn \@@_new_linked:N #1
+ {
+ \@@_next_prefix:
+ \cs_gset_nopar:Npe #1
+ {
+ \@@_flatten:w
+ \exp_not:c { @@ ~ \l_@@_internal_tl }
+ \s_@@ { \l_@@_internal_tl }
+ \exp_not:c { @@ ~ \l_@@_internal_tl }
+ }
+ \cs_gset_nopar:cpe { @@ ~ \l_@@_internal_tl }
+ {
+ \exp_not:N \use_none:n
+ \exp_not:N #1
+ }
+ }
+\cs_generate_variant:Nn \prop_new_linked:N { c }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}[tested = m3prop001]{\prop_clear:N, \prop_clear:c}
% \begin{macro}[tested = m3prop001]{\prop_gclear:N, \prop_gclear:c}
-% The same idea for clearing.
+% \begin{macro}{\@@_clear:NNN, \@@_clear:wNNN, \@@_clear_loop:Nw}
+% Clearing a flat property list is like declaring it anew, simply setting it
+% equal to \cs{c_empty_prop}. For linked property lists we must clear all of
+% the variables storing individual keys, which requires a loop. At each step
+% of the loop, \cs{@@_clear_loop:Nw} receives
+% \cs[index=cs_set_eq:NN]{cs_(g)set_eq:NN}, \cs{use_none:n}, the backwards
+% pointer, an empty~|#4| (except at the end of the loop), and the key--value
+% pair |#5=#6| which we disregard. The looping auxiliary undefines the
+% previous key's token list (this includes the main token list, but that is
+% fine because it is restored at the end) and calls itself after expanding the
+% next key's token list. The loop ends when |#4| is \cs{use_none:nnnn}.
+% After the loop, \cs{@@_clear:wNNN} correctly sets up the main variable~|#6|
+% and the end-pointer~|#1|. Importantly, this is done using
+% \cs[index=cs_set_nopar:Npe]{cs_(g)set_nopar:Npe} and \cs{exp_not:n} because
+% the almost-equivalent \cs{tl_set:Nn} would complain in debug mode about the
+% fact that the main variable is undefined at this stage. Importantly,
+% \cs{@@_clear_entries:NN} is used in the implementation of
+% \cs{prop_set_eq:NN}.
% \begin{macrocode}
-\cs_new_protected:Npn \prop_clear:N #1
- { \prop_set_eq:NN #1 \c_empty_prop }
+\cs_new_protected:Npn \prop_clear:N
+ { \@@_clear:NNN \cs_set_eq:NN \cs_set_nopar:Npe }
\cs_generate_variant:Nn \prop_clear:N { c }
-\cs_new_protected:Npn \prop_gclear:N #1
- { \prop_gset_eq:NN #1 \c_empty_prop }
+\cs_new_protected:Npn \prop_gclear:N
+ { \@@_clear:NNN \cs_gset_eq:NN \cs_gset_nopar:Npe }
\cs_generate_variant:Nn \prop_gclear:N { c }
+\cs_new_protected:Npn \@@_clear:NNN #1#2#3
+ {
+ \@@_if_flat:NTF #3
+ { #1 #3 \c_empty_prop }
+ { \exp_after:wN \@@_clear:wNNN #3 #1 #2 #3 }
+ }
+\cs_new_protected:Npn \@@_clear:wNNN
+ \@@_flatten:w #1 \s_@@ #2#3#4#5#6
+ {
+ \@@_clear_entries:NN #4 #3
+ #5 #6 { \exp_not:n { \@@_flatten:w #1 \s_@@ {#2} #1 } }
+ #5 #1 { \exp_not:n { \use_none:n #6 } }
+ }
+\cs_new_protected:Npn \@@_clear_entries:NN #1#2
+ {
+ \exp_after:wN \@@_clear_loop:Nw \exp_after:wN #1 #2
+ \use_none:nnnn \@@_pair:wn \s_@@ { }
+ }
+\cs_new_protected:Npn \@@_clear_loop:Nw
+ #1#2#3#4 \@@_pair:wn #5 \s_@@ #6
+ {
+ #1 #3 \tex_undefined:D
+ #4
+ \exp_after:wN \@@_clear_loop:Nw
+ \exp_after:wN #1
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
-% \begin{macro}[tested = m3prop001]{\prop_clear_new:N, \prop_clear_new:c}
-% \begin{macro}[tested = m3prop001]{\prop_gclear_new:N, \prop_gclear_new:c}
-% Once again a simple variation of the token list functions.
+% \begin{macro}[tested = m3prop001]
+% {
+% \prop_clear_new:N, \prop_clear_new:c,
+% \prop_gclear_new:N, \prop_gclear_new:c,
+% \prop_clear_new_linked:N, \prop_clear_new_linked:c,
+% \prop_gclear_new_linked:N, \prop_gclear_new_linked:c
+% }
+% A simple variation of the token list functions.
% \begin{macrocode}
\cs_new_protected:Npn \prop_clear_new:N #1
{ \prop_if_exist:NTF #1 { \prop_clear:N #1 } { \prop_new:N #1 } }
@@ -807,26 +1155,176 @@
\cs_new_protected:Npn \prop_gclear_new:N #1
{ \prop_if_exist:NTF #1 { \prop_gclear:N #1 } { \prop_new:N #1 } }
\cs_generate_variant:Nn \prop_gclear_new:N { c }
+\cs_new_protected:Npn \prop_clear_new_linked:N #1
+ { \prop_if_exist:NTF #1 { \prop_clear:N #1 } { \prop_new_linked:N #1 } }
+\cs_generate_variant:Nn \prop_clear_new_linked:N { c }
+\cs_new_protected:Npn \prop_gclear_new_linked:N #1
+ { \prop_if_exist:NTF #1 { \prop_gclear:N #1 } { \prop_new_linked:N #1 } }
+\cs_generate_variant:Nn \prop_gclear_new_linked:N { c }
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}[tested = m3prop001]
% {\prop_set_eq:NN, \prop_set_eq:cN, \prop_set_eq:Nc, \prop_set_eq:cc}
% \begin{macro}[tested = m3prop001]
% {\prop_gset_eq:NN, \prop_gset_eq:cN, \prop_gset_eq:Nc, \prop_gset_eq:cc}
-% These are simply copies from the token list functions.
+% \begin{macro}
+% {
+% \@@_set_eq:NNNN, \@@_set_eq:wNNNN, \@@_set_eq:nNnNN,
+% \@@_set_eq_loop:NNnw, \@@_set_eq_end:w
+% }
+% If both variables are accidentally the same variable (or equal flat property
+% lists, as it turns out) we do nothing, otherwise the following code would
+% lose all entries. If the target variable~|#3| is a flat prop, either copy
+% directly or flatten before copying. If it is a linked prop, we must clear
+% it, then go through the entries in~|#4| to add them to~|#3|.
+% \begin{macrocode}
+\cs_new_protected:Npn \prop_set_eq:NN
+ { \@@_set_eq:NNNN \cs_set_eq:NN \cs_set_nopar:Npe }
+\cs_generate_variant:Nn \prop_set_eq:NN { Nc , cN , cc }
+\cs_new_protected:Npn \prop_gset_eq:NN
+ { \@@_set_eq:NNNN \cs_gset_eq:NN \cs_gset_nopar:Npe }
+\cs_generate_variant:Nn \prop_gset_eq:NN { Nc , cN , cc }
+\cs_new_protected:Npn \@@_set_eq:NNNN #1#2#3#4
+ {
+ \cs_if_eq:NNF #3#4
+ {
+ \@@_if_flat:NTF #3
+ {
+ \@@_if_flat:NTF #4
+ { #1 #3 #4 }
+ { #2 #3 { \@@_flatten:N #4 } }
+ }
+ { \exp_after:wN \@@_set_eq:wNNNN #3 #1#2#3#4 }
+ }
+ }
+\cs_new_protected:Npn \@@_set_eq:wNNNN
+ \@@_flatten:w #1 \s_@@ #2#3#4#5#6#7
+ {
+ \@@_clear_entries:NN #4 #3
+ \exp_args:Nf \@@_set_eq:nNnNN {#7} #1 {#2} #5 #6
+ }
+% \end{macrocode}
+% We have used that |f|-expanding either type of prop gives a flat prop. At
+% this stage \cs{@@_set_eq:nNnNN} receives the second variable as a flat prop,
+% the end-pointer, the prefix, the suitable
+% \cs[index=cs_set_nopar:Npe]{cs_(g)set_nopar:Npe} assignment, and the first
+% variable itself. Remove the leading \cs{s_@@} and \cs{@@_chk:w} with
+% \cs{use_i:nnn}, then start the loop.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_eq:nNnNN #1#2#3#4#5
+ {
+ \use_i:nnn
+ {
+ \@@_set_eq_loop:NNnw #5 #4 {#3}
+ \@@_flatten:w #2 \s_@@ {#3}
+ }
+ #1
+ \use_none:n \@@_pair:wn ? \s_@@
+ }
+% \end{macrocode}
+% The looping function receives the current pointer~|#1| (initially the
+% variable itself), the defining function~|#2| and the prefix~|#3|, then a
+% partial definition~|#4| (which in later stages includes the backwards
+% pointer), followed by the current value as \cs{s_@@} |{#5}|. It seeks the
+% next key~|#7| to construct in \cs{l_@@_internal_tl} the next pointer
+% \cs[no-index]{@@~\meta{prefix}~\meta{next key}} (the
+% argument~|#6| is empty, except at the end of the loop, where it is
+% \cs{use_none:n} in such a way as to delete the \meta{space} and \meta{next
+% key}). Then the token list (current pointer)~|#1| is set-up to contain the
+% partial definition and current value, as well as the newly constructed next
+% pointer. After a line responsible for correctly ending the loop with
+% \cs{@@_set_eq_end:w}, we loop, setting up the next definition, which starts
+% with \cs{use_none:n} and a backwards pointer to~|#1| followed by the
+% \meta{next key}~|#7| and so on.
% \begin{macrocode}
-\cs_new_eq:NN \prop_set_eq:NN \tl_set_eq:NN
-\cs_new_eq:NN \prop_set_eq:Nc \tl_set_eq:Nc
-\cs_new_eq:NN \prop_set_eq:cN \tl_set_eq:cN
-\cs_new_eq:NN \prop_set_eq:cc \tl_set_eq:cc
-\cs_new_eq:NN \prop_gset_eq:NN \tl_gset_eq:NN
-\cs_new_eq:NN \prop_gset_eq:Nc \tl_gset_eq:Nc
-\cs_new_eq:NN \prop_gset_eq:cN \tl_gset_eq:cN
-\cs_new_eq:NN \prop_gset_eq:cc \tl_gset_eq:cc
+\cs_new_protected:Npn \@@_set_eq_loop:NNnw
+ #1#2#3#4 \s_@@ #5#6 \@@_pair:wn #7 \s_@@
+ {
+ \tl_set:Ne \l_@@_internal_tl { \exp_not:c { @@ ~ #3 #6 ~ #7 } }
+ #2 #1 { \exp_not:n { #4 \s_@@ {#5} } \exp_not:o \l_@@_internal_tl }
+ \use_none:n #6 \@@_set_eq_end:w
+ \exp_after:wN \@@_set_eq_loop:NNnw \l_@@_internal_tl #2 {#3}
+ \use_none:n #1 \@@_pair:wn #7 \s_@@
+ }
+% \end{macrocode}
+% The end-code picks up what is needed to correctly assign the last token
+% list (the end pointer), which is simply \cs{use_none:n}
+% \cs[no-index]{@@_\meta{prefix}\meta{space}\meta{key_n}}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_eq_end:w
+ \exp_after:wN \@@_set_eq_loop:NNnw #1#2#3
+ \use_none:n #4#5 \s_@@
+ {
+ \exp_after:wN #2 \l_@@_internal_tl { \exp_not:n { \use_none:n #4 } }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\prop_make_flat:N, \prop_make_flat:c \@@_make_flat:Nn}
+% The only interesting case is when given a linked prop. Clear the
+% linked property list using \cs{@@_clear:wNNN} with local assignments
+% (it does not matter since we are at the outermost group level, and
+% \cs{cs_set_eq:NN} is very slightly faster than its global version.
+% Then store the contents (expanded preventively by \cs{exp_args:NNf})
+% with an assignment \cs{cs_set_nopar:Npe} that does not perform
+% \pkg{l3debug} checks.
+% \begin{macrocode}
+\cs_new_protected:Npn \prop_make_flat:N #1
+ {
+ \int_compare:nNnTF { \tex_currentgrouplevel:D } = 0
+ {
+ \@@_if_flat:NTF #1 { }
+ { \exp_args:NNf \@@_make_flat:Nn #1 {#1} }
+ }
+ {
+ \msg_error:nnee { prop } { inner-make }
+ { \token_to_str:N \prop_make_flat:N } { \token_to_str:N #1 }
+ }
+ }
+\cs_generate_variant:Nn \prop_make_flat:N { c }
+\cs_new_protected:Npn \@@_make_flat:Nn #1#2
+ {
+ \exp_after:wN \@@_clear:wNNN #1 \cs_set_eq:NN \cs_set_nopar:Npe #1
+ \cs_set_nopar:Npe #1 { \exp_not:n {#2} }
+ }
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\prop_make_linked:N, \prop_make_linked:c, \@@_make_linked:Nn}
+% The only interesting case is when given a flat prop. We expand the
+% contents for later use. Then \cs{@@_new_linked:N} disregards that
+% previous value of~|#1| and initializes the linked prop. We can then
+% use an auxiliary \cs{@@_set_eq:wNNNN} underlying
+% \cs{prop_set_eq:NN}, with the prop contents saved as
+% \cs{l_@@_internal_tl}. That step is a bit unsafe, as
+% \cs{l_@@_internal_tl} (really, a flat prop here) is used within
+% \cs{@@_set_eq:wNNNN} itself, but it is in fact expanded early enough
+% to be ok.
+% \begin{macrocode}
+\cs_new_protected:Npn \prop_make_linked:N #1
+ {
+ \int_compare:nNnTF { \tex_currentgrouplevel:D } = 0
+ {
+ \@@_if_flat:NTF #1
+ { \exp_args:NNo \@@_make_linked:Nn #1 {#1} } { }
+ }
+ {
+ \msg_error:nnee { prop } { inner-make }
+ { \token_to_str:N \prop_make_linked:N } { \token_to_str:N #1 }
+ }
+ }
+\cs_generate_variant:Nn \prop_make_linked:N { c }
+\cs_new_protected:Npn \@@_make_linked:Nn #1#2
+ {
+ \@@_new_linked:N #1
+ \tl_set:Nn \l_@@_internal_tl {#2}
+ \exp_after:wN \@@_set_eq:wNNNN #1
+ \cs_set_eq:NN \cs_set_nopar:Npe #1 \l_@@_internal_tl
+ }
+% \end{macrocode}
% \end{macro}
%
% \begin{variable}[tested = m3prop004]{\l_tmpa_prop, \l_tmpb_prop}
@@ -841,156 +1339,223 @@
% \end{variable}
% \end{variable}
%
-% \begin{variable}{\l_@@_internal_prop}
-% Property list used by \cs{prop_concat:NNN},
-% \cs{prop_set_from_keyval:Nn} and others.
-% \begin{macrocode}
-\prop_new:N \l_@@_internal_prop
-% \end{macrocode}
-% \end{variable}
-%
% \begin{macro}
% {
% \prop_concat:NNN, \prop_concat:ccc,
-% \prop_gconcat:NNN, \prop_gconcat:ccc, \@@_concat:NNNN
+% \prop_gconcat:NNN, \prop_gconcat:ccc,
+% \@@_concat:NNNNN, \@@_concat:nNNN
% }
-% Combine two property lists. We cannot use a simple
-% \cs{tl_concat:NNN} because there may be some duplicate keys between
-% the two property lists.
+% The basic strategy is to copy the first variable into the target,
+% then loop through the second variable, calling
+% \cs[index=prop_put:Nnn]{prop_(g)put:Nnn} on each item. To avoid
+% running the \pkg{l3debug} scope checks on each of these steps, we
+% use the auxiliaries that underly \cs{prop_set_eq:NN} and
+% \cs{prop_put:Nnn}, whose syntax is a bit unwieldy.
+% We work directly with the target prop |#3| as a scratch space,
+% because copying over from a temporary variable to |#3| would be slow
+% in the linked case. If |#5| is |#3| itself we have to be careful
+% not to lose the data, and we even take the opportunity to skip the
+% copying step completely. To keep the correct version of the
+% duplicate keys we use the code underlying \cs{prop_put_if_new:Nnn},
+% which involves passing \cs{use_none:nnn} to the auxiliary instead of
+% nothing.
+% There is no need to check for the case where |#3| is equal to~|#4|
+% because in that case \cs[index=prop_set_eq:NN]{prop_(g)set_eq:NN}
+% |#3| |#4| (or rather the underlying auxiliary) is correctly set up
+% to do no needless work.
% \begin{macrocode}
\cs_new_protected:Npn \prop_concat:NNN
- { \@@_concat:NNNN \prop_set_eq:NN }
+ { \@@_concat:NNNNN \cs_set_eq:NN \cs_set_nopar:Npe }
\cs_generate_variant:Nn \prop_concat:NNN { ccc }
\cs_new_protected:Npn \prop_gconcat:NNN
- { \@@_concat:NNNN \prop_gset_eq:NN }
+ { \@@_concat:NNNNN \cs_gset_eq:NN \cs_gset_nopar:Npe }
\cs_generate_variant:Nn \prop_gconcat:NNN { ccc }
-\cs_new_protected:Npn \@@_concat:NNNN #1#2#3#4
+\cs_new_protected:Npn \@@_concat:NNNNN #1#2#3#4#5
{
- \prop_set_eq:NN \l_@@_internal_prop #3
- \prop_map_inline:Nn #4 { \prop_put:Nnn \l_@@_internal_prop {##1} {##2} }
- #1 #2 \l_@@_internal_prop
+ \cs_if_eq:NNTF #3 #5
+ { \@@_concat:nNNN \use_none:nnn #2 #3 #4 }
+ {
+ \@@_set_eq:NNNN #1 #2 #3 #4
+ \@@_concat:nNNN { } #2 #3 #5
+ }
+ }
+\cs_new_protected:Npn \@@_concat:nNNN #1#2#3#4
+ {
+ \cs_gset_eq:NN \@@_tmp:w \@@_pair:wn
+ \cs_gset_protected:Npn \@@_pair:wn ##1 \s_@@
+ { \@@_put:nNNnn {#1} #2 #3 {##1} }
+ \exp_last_unbraced:Nf \use_none:nn #4
+ \cs_gset_eq:NN \@@_pair:wn \@@_tmp:w
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\prop_set_from_keyval:Nn, \prop_set_from_keyval:cn}
-% \begin{macro}{\prop_gset_from_keyval:Nn, \prop_gset_from_keyval:cn}
-% \begin{macro}{\prop_const_from_keyval:Nn, \prop_const_from_keyval:cn}
-% \begin{macro}{\prop_put_from_keyval:Nn, \prop_put_from_keyval:cn}
-% \begin{macro}{\prop_gput_from_keyval:Nn, \prop_gput_from_keyval:cn}
-% \begin{macro}{\@@_missing_eq:n}
-% To avoid tracking throughout the loop the variable name and whether
-% the assignment is local/global, do everything in a scratch variable
-% and empty it afterwards to avoid wasting memory. Loop through items
-% separated by commas, with \cs{prg_do_nothing:} to avoid losing
-% braces. After checking for termination, split the item at the first
-% and then at the second |=| (which ought to be the first of the
-% trailing~|=| that we added). For both splits trim spaces and call a
-% function (first \cs{@@_from_keyval_key:w} then
-% \cs{@@_from_keyval_value:w}), followed by the trimmed material,
-% \cs{s_@@_mark}, the subsequent part of the item, and the trailing |=|'s
-% and \cs{s_@@_stop}. After finding the \meta{key} just store it after
-% \cs{s_@@_stop}. After finding the \meta{value} ignore completely empty
-% items (both trailing~|=| were used as delimiters and all parts are
-% empty); if the remaining part~|#2| consists exactly of the second
-% trailing~|=| (namely there was exactly one |=|~in the item) then
-% output one key--value pair for the property list; otherwise complain
-% about a missing or extra~|=|.
+% \begin{macro}
+% {
+% \prop_put_from_keyval:Nn, \prop_put_from_keyval:cn,
+% \prop_gput_from_keyval:Nn, \prop_gput_from_keyval:cn,
+% \@@_from_keyval:nn, \@@_from_keyval:Nnn,
+% \@@_missing_eq:n
+% }
+% The core is a call to \cs{keyval_parse:nnn}, with an error message
+% \cs{@@_missing_eq:n} for entries without~|=|, and a call to (essentially)
+% \cs[index=prop_put:Nnn]{prop_(g)put:Nnn} for valid key--value pairs.
+% To avoid repeated scope checks (and errors) when \pkg{l3debug} is
+% active, we instead use the auxiliary underlying \cs{prop_put:Nnn}.
+% Because blank keys are valid here, in contrast to \pkg{l3keys}, we set and
+% restore \cs{l__kernel_keyval_allow_blank_keys_bool}.
+% The key--value argument may be quite large so we avoid reading it until it
+% is really necessary.
+% \begin{macrocode}
+\cs_new_protected:Npn \prop_put_from_keyval:Nn #1
+ { \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_set_nopar:Npe #1 } }
+\cs_generate_variant:Nn \prop_put_from_keyval:Nn { c }
+\cs_new_protected:Npn \prop_gput_from_keyval:Nn #1
+ { \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_gset_nopar:Npe #1 } }
+\cs_generate_variant:Nn \prop_gput_from_keyval:Nn { c }
+\cs_new_protected:Npn \@@_from_keyval:nn
+ {
+ \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
+ { \@@_from_keyval:Nnn \c_true_bool }
+ { \@@_from_keyval:Nnn \c_false_bool }
+ }
+\cs_new_protected:Npn \@@_from_keyval:Nnn #1#2#3
+ {
+ \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool \c_true_bool
+ \keyval_parse:nnn \@@_missing_eq:n {#2} {#3}
+ \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool #1
+ }
+\cs_new_protected:Npn \@@_missing_eq:n
+ { \msg_error:nnn { prop } { prop-keyval } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \prop_set_from_keyval:Nn, \prop_set_from_keyval:cn,
+% \prop_gset_from_keyval:Nn, \prop_gset_from_keyval:cn,
+% }
+% Just empty the prop (with the auxiliary underlying
+% \cs{prop_clear:N} to avoid \pkg{l3debug} problems) and push
+% key--value entries using
+% \cs[index=prop_put_from_keyval:Nn]{prop_(g)put_from_keyval:Nn}.
% \begin{macrocode}
\cs_new_protected:Npn \prop_set_from_keyval:Nn #1
{
- \prop_clear:N #1
+ \@@_clear:NNN \cs_set_eq:NN \cs_set_nopar:Npe #1
\prop_put_from_keyval:Nn #1
}
\cs_generate_variant:Nn \prop_set_from_keyval:Nn { c }
\cs_new_protected:Npn \prop_gset_from_keyval:Nn #1
{
- \prop_gclear:N #1
+ \@@_clear:NNN \cs_gset_eq:NN \cs_gset_nopar:Npe #1
\prop_gput_from_keyval:Nn #1
}
\cs_generate_variant:Nn \prop_gset_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_const_from_keyval:Nn #1#2
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \prop_const_from_keyval:Nn, \prop_const_from_keyval:cn,
+% \prop_const_linked_from_keyval:Nn, \prop_const_linked_from_keyval:cn
+% }
+% For both flat and linked constant props, we create |#1| then use the
+% same auxiliary as for \cs{prop_gput_from_keyval:Nn}. It is most
+% natural to use the already packaged \cs{prop_gput:Nnn}, but that
+% would mean doing an assignment on a supposedly constant property
+% list. To avoid errors when \pkg{l3debug} is activated, we use the
+% auxiliary underlying \cs{prop_gput:Nnn}.
+% \begin{macrocode}
+\cs_new_protected:Npn \prop_const_from_keyval:Nn #1
{
- \prop_set_from_keyval:Nn \l_@@_internal_prop {#2}
- \tl_const:Ne #1 { \exp_not:o \l_@@_internal_prop }
- \prop_clear:N \l_@@_internal_prop
+ \prop_new:N #1
+ \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_gset_nopar:Npe #1 }
}
\cs_generate_variant:Nn \prop_const_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_put_from_keyval:Nn
- {
- \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
- { \@@_keyval_parse:NNNn \c_true_bool }
- { \@@_keyval_parse:NNNn \c_false_bool }
- \prop_put:Nnn
- }
-\cs_generate_variant:Nn \prop_put_from_keyval:Nn { c }
-\cs_new_protected:Npn \prop_gput_from_keyval:Nn
- {
- \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool
- { \@@_keyval_parse:NNNn \c_true_bool }
- { \@@_keyval_parse:NNNn \c_false_bool }
- \prop_gput:Nnn
- }
-\cs_generate_variant:Nn \prop_gput_from_keyval:Nn { c }
-\cs_new_protected:Npn \@@_missing_eq:n
- { \msg_error:nnn { prop } { prop-keyval } }
-\cs_new_protected:Npn \@@_keyval_parse:NNNn #1#2#3#4
+\cs_new_protected:Npn \prop_const_linked_from_keyval:Nn #1
{
- \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool \c_true_bool
- \keyval_parse:nnn \@@_missing_eq:n { #2 #3 } {#4}
- \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool #1
+ \prop_new_linked:N #1
+ \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_gset_nopar:Npe #1 }
}
+\cs_generate_variant:Nn \prop_const_linked_from_keyval:Nn { c }
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \subsection{Accessing data in property lists}
%
-% \begin{macro}{\@@_split:NnTF}
-% \begin{macro}{\@@_split_aux:NnTF}
-% \begin{macro}[EXP]{\@@_split_aux:w}
-% This function is used by most of the module, and hence must be fast.
-% It receives a \meta{property list}, a \meta{key}, a \meta{true code}
-% and a \meta{false code}. The aim is to split the \meta{property
-% list} at the given \meta{key} into the \meta{extract_1} before the
-% key--value pair, the \meta{value} associated with the \meta{key} and
-% the \meta{extract_2} after the key--value pair. This is done using
-% a delimited function, whose definition is as follows, where the
-% \meta{key} is turned into a string.
+% Accessing/deleting/adding entries is mostly done by \cs{@@_split:NnTFn}, which
+% must be fast because it is used in many \pkg{l3prop} functions. Its syntax is
+% as follows.
+% \begin{quote}
+% \cs{@@_split:NnTFn} \meta{property list} \Arg{key} \\
+% ~~\Arg{true code} \Arg{false code} \Arg{link code}
+% \end{quote}
+% If the \meta{property list} uses the linked data storage, then it runs
+% the \meta{link code}, otherwise it does as follows.
+%
+% It splits the \meta{property list} at the \meta{key}, giving three
+% token lists: the \meta{entries before} the \meta{key}, the
+% \meta{value} associated with the \meta{key} and the \meta{entries
+% after} the \meta{key}. Both the \meta{entries before} and the
+% \meta{entries after} can be empty or consist of some number of
+% consecutive entries \cs{@@_pair:wn} \meta{key_i} \cs{s_@@}
+% \Arg{value_i}. If the \meta{key} is present in the \meta{property
+% list} then the \meta{true code} is left in the input stream, with
+% |#2|, |#3|, and |#4| replaced by the \meta{entries before},
+% \meta{value}, and \meta{entries after}. If the \meta{key} is not
+% present in the \meta{property list} then the \meta{false code} is left
+% in the input stream. Only the \meta{true code} is used in the
+% replacement text of a macro defined internally, which requires
+% |##|~doubling.
+%
+% \begin{macro}{\@@_split:NnTFn}
+% \begin{macro}{\@@_split_aux:NnTFn}
+% \begin{macro}{\@@_split_aux:w}
+% The aim is to split the \meta{property list} at the given \meta{key}
+% into the \meta{extract_1} before the key--value pair, the
+% \meta{value} associated with the \meta{key} and the \meta{extract_2}
+% after the key--value pair. This is done using a delimited function,
+% whose definition is as follows, where the \meta{key} is turned into
+% a string.
% \begin{quote}
-% \cs{cs_set:Npn} \cs{@@_split_aux:w} |#1| \\
-% \quad \cs{@@_pair:wn} \meta{key} \cs{s_@@} |#2| \\
-% \quad |#3| \cs{s_@@_mark} |#4| |#5| \cs{s_@@_stop} \\
-% \quad |{| |#4| \Arg{true code} \Arg{false code} |}|
+% \cs{cs_set:Npn} \cs{@@_split_aux:w} |#1| \cs{@@_chk:w} |#2| \\
+% \quad \cs{@@_pair:wn} \meta{key} \cs{s_@@} |#3| \\
+% \quad |#4| \cs{s_@@_mark} |#5| |#6| \cs{s_@@_stop} \\
+% \quad |{| |#5| \Arg{true code} |}|
% \end{quote}
%
% If the \meta{key} is present in the property list,
-% \cs{@@_split_aux:w}'s |#1| is the part before the \meta{key}, |#2|
-% is the \meta{value}, |#3| is the part after the \meta{key}, |#4| is
-% \cs{use_i:nn}, and |#5| is additional tokens that we do not care
+% \cs{@@_split_aux:w}'s |#2| is the part before the \meta{key}, |#3|
+% is the \meta{value}, |#4| is the part after the \meta{key}, |#5| is
+% \cs{use_i:nnn}, and |#6| is additional tokens that we do not care
% about. The \meta{true code} is left in the input stream, and can
-% use the parameters |#1|, |#2|, |#3| for the three parts of the
+% use the parameters |#2|, |#3|, |#4| for the three parts of the
% property list as desired. Namely, the original property list is in
-% this case |#1| \cs{@@_pair:wn} \meta{key} \cs{s_@@} |{#2}| |#3|.
+% this case \cs{s_@@} \cs{@@_chk:w} |#2| \cs{@@_pair:wn} \meta{key}
+% \cs{s_@@} |{#3}| |#4|.
%
% If the \meta{key} is not there, then the \meta{function} is
-% \cs{use_ii:nn}, which keeps the \meta{false code}.
+% \cs{use_ii:nnn}, which keeps the \meta{false code}. If the property
+% list uses the doubly-linked list storage, then the argument
+% delimited by \cs{@@_chk:w} includes the whole property list, |#2|,
+% |#3|, |#4| are empty, and |#5| is \cs{use_iii:nnn}. In all three
+% cases, the appopriate code among \meta{true code}, \meta{false
+% code}, and \meta{linked code} is run.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_split:NnTF #1#2
- { \exp_args:NNo \@@_split_aux:NnTF #1 { \tl_to_str:n {#2} } }
-\cs_new_protected:Npn \@@_split_aux:NnTF #1#2#3#4
+\cs_new_protected:Npn \@@_split:NnTFn #1#2
+ { \exp_args:NNo \@@_split_aux:NnTFn #1 { \tl_to_str:n {#2} } }
+\cs_new_protected:Npn \@@_split_aux:NnTFn #1#2#3
{
- \cs_set:Npn \@@_split_aux:w ##1
- \@@_pair:wn #2 \s_@@ ##2 ##3 \s_@@_mark ##4 ##5 \s_@@_stop
- { ##4 {#3} {#4} }
- \exp_after:wN \@@_split_aux:w #1 \s_@@_mark \use_i:nn
- \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_ii:nn \s_@@_stop
+ \cs_set:Npn \@@_split_aux:w ##1 \@@_chk:w ##2
+ \@@_pair:wn #2 \s_@@ ##3 ##4 \s_@@_mark ##5 ##6 \s_@@_stop
+ { ##5 {#3} }
+ \exp_after:wN \@@_split_aux:w #1 \s_@@_mark \use_i:nnn
+ \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_ii:nnn
+ \@@_chk:w
+ \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_iii:nnn
+ \s_@@_stop
}
-\cs_new:Npn \@@_split_aux:w { }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -998,37 +1563,13 @@
%
% \begin{macro}[tested = m3prop002]
% {
-% \prop_remove:Nn, \prop_remove:NV, \prop_remove:Ne,
-% \prop_remove:cn, \prop_remove:cV, \prop_remove:ce
-% }
-% \begin{macro}[tested = m3prop002]
-% {
-% \prop_gremove:Nn, \prop_gremove:NV, \prop_gremove:Ne,
-% \prop_gremove:cn, \prop_gremove:cV, \prop_gremove:ce
+% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN,
+% \prop_get:NoN, \prop_get:NxN,
+% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:ceN,
+% \prop_get:coN, \prop_get:cxN,
+% \prop_get:cnc
% }
-% Deleting from a property starts by splitting the list.
-% If the key is present in the property list, the returned value is ignored.
-% If the key is missing, nothing happens.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_remove:Nn #1#2
- {
- \@@_split:NnTF #1 {#2}
- { \tl_set:Nn #1 { ##1 ##3 } }
- { }
- }
-\cs_new_protected:Npn \prop_gremove:Nn #1#2
- {
- \@@_split:NnTF #1 {#2}
- { \tl_gset:Nn #1 { ##1 ##3 } }
- { }
- }
-\cs_generate_variant:Nn \prop_remove:Nn { NV , Ne , c , cV , ce }
-\cs_generate_variant:Nn \prop_gremove:Nn { NV , Ne , c , cV , ce }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[tested = m3prop002]
+% \begin{macro}[TF, tested = m3prop004]
% {
% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN,
% \prop_get:NoN, \prop_get:NxN,
@@ -1036,64 +1577,75 @@
% \prop_get:coN, \prop_get:cxN,
% \prop_get:cnc
% }
-% Getting an item from a list is very easy: after splitting,
-% if the key is in the property list, just set the token list variable
-% to the return value, otherwise to \cs{q_no_value}.
+% \begin{macro}{\@@_get:NnnTF}
+% \begin{macro}[EXP]{\@@_get_linked:w, \@@_get_linked_aux:w}
+% Here we implement both \cs{prop_get:NnN} and its branching version through
+% \cs{@@_get:NnnTF}. It receives the prop and key, followed by an assignment
+% used when the value is found, \meta{true code} to run after the assignment,
+% and some fall-back \meta{false code} for absent values. It relies on
+% \cs{@@_split:NnTFn}. For a flat prop, the first four arguments of
+% \cs{@@_split:NnTFn} are used, and run either the assignment~|#3{##3}| and
+% \meta{true code}~|#4|, or the \meta{false code}~|#5|.
% \begin{macrocode}
\cs_new_protected:Npn \prop_get:NnN #1#2#3
{
- \@@_split:NnTF #1 {#2}
- { \tl_set:Nn #3 {##2} }
- { \tl_set:Nn #3 { \q_no_value } }
+ \@@_get:NnnTF #1 {#2}
+ { \tl_set:Nn #3 } { } { \tl_set:Nn #3 { \q_no_value } }
}
\cs_generate_variant:Nn \prop_get:NnN { NV , Nv , Ne , c , cV , cv , ce }
\cs_generate_variant:Nn \prop_get:NnN { No , Nx , co , cx }
\cs_generate_variant:Nn \prop_get:NnN { cnc }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[tested = m3prop002]
-% {
-% \prop_pop:NnN, \prop_pop:NVN,
-% \prop_pop:NoN,
-% \prop_pop:cnN, \prop_pop:cVN,
-% \prop_pop:coN,
-% }
-% \begin{macro}[tested = m3prop002]
-% {
-% \prop_gpop:NnN, \prop_gpop:NVN,
-% \prop_gpop:NoN,
-% \prop_gpop:cnN, \prop_gpop:cVN,
-% \prop_gpop:coN,
-% }
-% Popping a value also starts by doing the split.
-% If the key is present, save the value in the token list and update the
-% property list as when deleting.
-% If the key is missing, save \cs{q_no_value} in the token list.
-% \begin{macrocode}
-\cs_new_protected:Npn \prop_pop:NnN #1#2#3
+\prg_new_protected_conditional:Npnn \prop_get:NnN #1#2#3 { T , F , TF }
{
- \@@_split:NnTF #1 {#2}
- {
- \tl_set:Nn #3 {##2}
- \tl_set:Nn #1 { ##1 ##3 }
- }
- { \tl_set:Nn #3 { \q_no_value } }
+ \@@_get:NnnTF #1 {#2}
+ { \tl_set:Nn #3 } \prg_return_true: \prg_return_false:
}
-\cs_new_protected:Npn \prop_gpop:NnN #1#2#3
+\prg_generate_conditional_variant:Nnn \prop_get:NnN
+ { NV , Nv , Ne , c , cV , cv , ce } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \prop_get:NnN
+ { No , Nx , co , cx } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \prop_get:NnN
+ { cnc } { T , F , TF }
+\cs_new_protected:Npn \@@_get:NnnTF #1#2#3#4#5
{
- \@@_split:NnTF #1 {#2}
- {
- \tl_set:Nn #3 {##2}
- \tl_gset:Nn #1 { ##1 ##3 }
- }
- { \tl_set:Nn #3 { \q_no_value } }
+ \@@_split:NnTFn #1 {#2}
+ { #3 {##3} #4 }
+ {#5}
+ { \exp_after:wN \@@_get_linked:w #1 {#2} {#3} {#4} {#5} }
}
-\cs_generate_variant:Nn \prop_pop:NnN { NV , No }
-\cs_generate_variant:Nn \prop_pop:NnN { c , cV , co }
-\cs_generate_variant:Nn \prop_gpop:NnN { NV , No }
-\cs_generate_variant:Nn \prop_gpop:NnN { c , cV , co }
% \end{macrocode}
+% For a linked prop we must work a bit: \cs{@@_get_linked:w} is followed by
+% the expansion of the prop, then by four brace groups: the key~|#4|, the
+% assignment code~|#5|, \meta{true code}~|#6|, and \meta{false code}~|#7|. If
+% the key is present, its value is stored in the token list
+% \cs[no-index]{@@_}|#2~#4|. If that token list exists,
+% \cs{@@_get_linked_aux:w} gets called followed by the expansion of that token
+% list and we grab as~|#2| the value associated to that key, which we feed to
+% the assignment code and follow-up code. If the key is absent the token list
+% can be \tn{undefined} or \tn{relax}. In both cases \cs{@@_get_linked_aux:w}
+% finds an empty brace group as~|#2|, \cs{use_none:n} as~|#4| and the
+% \meta{false code} as~|#5|.
+% Note that we made \cs{@@_get_linked:w} and subsequent auxiliaries
+% expandable, because they are also used in \cs{prop_item:Nn}.
+% \begin{macrocode}
+\cs_new:Npn \@@_get_linked:w
+ \@@_flatten:w #1 \s_@@ #2#3#4#5#6#7
+ {
+ \if_cs_exist:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end:
+ \exp_after:wN \exp_after:wN \exp_after:wN \@@_get_linked_aux:w
+ \cs:w @@ ~ #2 ~ \tl_to_str:n {#4} \exp_after:wN \cs_end:
+ \else:
+ \exp_after:wN \@@_get_linked_aux:w
+ \fi:
+ \s_@@_mark {#5} {#6}
+ \s_@@ { } \s_@@_mark \use_none:n {#7}
+ \s_@@_stop
+ }
+\cs_new:Npn \@@_get_linked_aux:w
+ #1 \s_@@ #2 #3 \s_@@_mark #4 #5 #6 \s_@@_stop { #4 {#2} #5 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
% \end{macro}
% \end{macro}
%
@@ -1103,7 +1655,7 @@
% \prop_item:cn, \prop_item:cV, \prop_item:co, \prop_item:ce
% }
% \begin{macro}[EXP]{\@@_item:nnn}
-% Getting the value corresponding to a key in a property list in an
+% Getting the value corresponding to a key in a flat property list in an
% expandable fashion simply uses \cs{prop_map_tokens:Nn} to go through
% the property list. The auxiliary \cs{@@_item:nnn} receives the
% search string~|#1|, the key~|#2| and the value~|#3| and returns as
@@ -1111,8 +1663,15 @@
% \begin{macrocode}
\cs_new:Npn \prop_item:Nn #1#2
{
- \exp_args:NNo \prop_map_tokens:Nn #1
- { \exp_after:wN \@@_item:nnn \exp_after:wN { \tl_to_str:n {#2} } }
+ \@@_if_flat:NTF #1
+ {
+ \exp_args:NNo \prop_map_tokens:Nn #1
+ {
+ \exp_after:wN \@@_item:nnn
+ \exp_after:wN { \tl_to_str:n {#2} }
+ }
+ }
+ { \exp_after:wN \@@_get_linked:w #1 {#2} \use:n { } { } }
}
\cs_new:Npn \@@_item:nnn #1#2#3
{
@@ -1124,161 +1683,259 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\prop_count:N, \prop_count:c}
-% \begin{macro}[EXP]{\@@_count:nn}
-% Counting the key--value pairs in a property list is done using the
-% same approach as for other count functions: turn each entry into a
-% \texttt{+1} then use integer evaluation to actually do the
-% mathematics.
+% \subsection{Removing data from property lists}
+%
+% \begin{macro}
+% {
+% \@@_pop:NnNNnTF,
+% \@@_pop_linked:wnNNnTF, \@@_pop_linked:NNNn,
+% \@@_pop_linked:w,
+% \@@_pop_linked_prev:w, \@@_pop_linked_next:w
+% }
+% This auxiliary is used by both the \cs[no-index]{prop_pop} family and
+% the \cs[no-index]{prop_remove} family of functions.
+% It receives a \meta{prop} and a \Arg{key}, three assignment functions
+% (\cs{tl_set:Nn} \cs{cs_set_eq:NN} \cs{cs_set_nopar:Npe} or their global
+% versions), then \Arg{code} \Arg{true code} \Arg{false code}.
+%
+% For a flat prop, split it. If the \meta{key} is there, reconstruct the rest
+% of the prop from the two extracts |##2| |##4| and assign using
+% \cs[index=tl_set:Nn]{tl_(g)set:Nn}, then run \meta{code} \Arg{value} with
+% the \meta{value} found, and run the \meta{true code}. If the \meta{key} is
+% absent, run the \meta{false code}.
+%
+% For a linked prop, the removal is done by \cs{@@_pop_linked:wnNNnTF}, which
+% removes the key--value pair from the doubly-linked list and runs its last
+% three arguments \Arg{code} \Arg{true code} \Arg{false code} depending on
+% whether the key--value is found, in the same way as for flat props.
% \begin{macrocode}
-\cs_new:Npn \prop_count:N #1
+\cs_new_protected:Npn \@@_pop:NnNNnTF #1#2#3#4#5#6#7
{
- \int_eval:n
+ \@@_split:NnTFn #1 {#2}
{
- 0
- \prop_map_function:NN #1 \@@_count:nn
+ #4 #1 { \exp_not:n { \s_@@ \@@_chk:w ##2 ##4 } }
+ #5 {##3}
+ #6
+ }
+ {#7}
+ {
+ \exp_after:wN \@@_pop_linked:wnNNnTF #1 {#2}
+ #3 #4 {#5} {#6} {#7}
}
}
-\cs_new:Npn \@@_count:nn #1#2 { + 1 }
-\cs_generate_variant:Nn \prop_count:N { c }
% \end{macrocode}
-% \end{macro}
+% The next auxiliary \cs{@@_pop_linked:wnNNnTF}, together with the |NNNn|
+% auxiliary, checks if the key is present in the \meta{linked prop}, then the
+% corresponding value (if present) is passed as a braced argument to the
+% \meta{code} and the \meta{true code} or \meta{false code} is run as
+% appropriate. Before that, there are also three assignments: the token lists
+% for the previous key and next key are made to point to each other, cf.\
+% \cs{@@_pop_linked:w}, and the token list for the given key is made
+% undefined.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pop_linked:wnNNnTF
+ \@@_flatten:w #1 \s_@@ #2#3#4#5#6#7
+ {
+ \if_cs_exist:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end:
+ \exp_after:wN \@@_pop_linked:NNNn
+ \cs:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end:
+ #5 #6 {#7}
+ \else:
+ \exp_after:wN \use_iii:nnn
+ \fi:
+ \use_i:nn
+ }
+\cs_new_protected:Npn \@@_pop_linked:NNNn #1#2#3#4
+ {
+ \if_meaning:w \scan_stop: #1
+ \exp_after:wN \exp_after:wN \exp_after:wN \use_iii:nnn
+ \else:
+ \exp_after:wN \@@_pop_linked:w #1 #1 #2 #3 {#4}
+ \fi:
+ }
+\cs_new_protected:Npn \@@_pop_linked:w
+ \use_none:n #1#2 \s_@@ #3#4#5#6#7#8
+ {
+ #6 #5 \tex_undefined:D
+ #7 #1
+ {
+ \exp_after:wN \@@_pop_linked_prev:w #1
+ \exp_not:N #4
+ }
+ #7 #4
+ {
+ \exp_not:n { \use_none:n #1 }
+ \exp_not:f { \exp_after:wN \@@_pop_linked_next:w #4 }
+ }
+ #8 {#3}
+ }
+\cs_new:Npn \@@_pop_linked_prev:w #1 \s_@@ #2#3
+ { \exp_not:n { #1 \s_@@ {#2} } }
+\cs_new:Npn \@@_pop_linked_next:w \use_none:n #1 { \exp_stop_f: }
+% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\prop_to_keyval:N}
-% \begin{macro}[EXP]
-% {\@@_to_keyval_exp_after:wN, \@@_to_keyval:nn, \@@_to_keyval:nnw}
-% Each property name and value pair will be returned in the form
-% \verb*| |\marg{name}\verb*|= |\marg{value}. As one of the main use cases for
-% this macro is to pass the \meta{property list} on to a key--value parser, we
-% have to make sure that the behaviour is as good as possible. Using a space
-% before the opening brace we get the correct brace stripping behaviour for
-% most of the key--value parsers available in \LaTeX.
-% Iterate over the
-% \meta{property list} and remove the leading comma afterwards. Only the value
-% has to be protected in \cs{__kernel_exp_not:w} as the property name is
-% always a string. After the loop the leading comma is removed by
-% \cs{use_none:n} and afterwards \cs{__kernel_exp_not:w} eventually finds the
-% opening brace of its argument.
+% \begin{macro}[tested = m3prop002]
+% {
+% \prop_remove:Nn, \prop_remove:NV, \prop_remove:Ne,
+% \prop_remove:cn, \prop_remove:cV, \prop_remove:ce
+% }
+% \begin{macro}[tested = m3prop002]
+% {
+% \prop_gremove:Nn, \prop_gremove:NV, \prop_gremove:Ne,
+% \prop_gremove:cn, \prop_gremove:cV, \prop_gremove:ce
+% }
+% Deleting from a property relies on \cs{@@_pop:NnNNnTF}. The three
+% assignment functions are suitably local or global. The last three arguments
+% are \cs{use_none:n} and two empty brace groups: if the key is found we get
+% \cs{use_none:n} \Arg{key} \meta{empty}, which expands to nothing, and
+% otherwise we just get \meta{empty}. The auxiliary takes care of actually
+% removing the entry from the prop.
% \begin{macrocode}
-\cs_new:Npn \prop_to_keyval:N #1
+\cs_new_protected:Npn \prop_remove:Nn #1#2
{
- \__kernel_exp_not:w
- \prop_if_empty:NTF #1
- { {} }
- {
- \exp_after:wN \exp_after:wN \exp_after:wN
- {
- \tex_expanded:D
- {
- \__kernel_exp_not:w { \use_none:n }
- \prop_map_function:NN #1 \@@_to_keyval:nn
- }
- }
- }
+ \@@_pop:NnNNnTF #1 {#2}
+ \cs_set_eq:NN \cs_set_nopar:Npe
+ \use_none:n { } { }
}
-\cs_new:Npn \@@_to_keyval:nn #1#2
- { , ~ {#1} =~ { \__kernel_exp_not:w {#2} } }
+\cs_new_protected:Npn \prop_gremove:Nn #1#2
+ {
+ \@@_pop:NnNNnTF #1 {#2}
+ \cs_gset_eq:NN \cs_gset_nopar:Npe
+ \use_none:n { } { }
+ }
+\cs_generate_variant:Nn \prop_remove:Nn { NV , Ne , c , cV , ce }
+\cs_generate_variant:Nn \prop_gremove:Nn { NV , Ne , c , cV , ce }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
+% \begin{macro}[tested = m3prop002]
+% {
+% \prop_pop:NnN, \prop_pop:NVN, \prop_pop:NoN,
+% \prop_pop:cnN, \prop_pop:cVN, \prop_pop:coN,
+% \prop_gpop:NnN, \prop_gpop:NVN, \prop_gpop:NoN,
+% \prop_gpop:cnN, \prop_gpop:cVN, \prop_gpop:coN,
+% }
% \begin{macro}[TF, tested = m3prop004]
% {
-% \prop_pop:NnN, \prop_pop:NVN,
-% \prop_pop:cnN, \prop_pop:cVN,
-% \prop_gpop:NnN, \prop_gpop:NVN,
-% \prop_gpop:NoN,
-% \prop_gpop:cnN, \prop_gpop:cVN,
+% \prop_pop:NnN, \prop_pop:NVN, \prop_pop:NoN,
+% \prop_pop:cnN, \prop_pop:cVN, \prop_pop:coN,
+% \prop_gpop:NnN, \prop_gpop:NVN, \prop_gpop:NoN,
+% \prop_gpop:cnN, \prop_gpop:cVN, \prop_gpop:coN,
% }
-% Popping an item from a property list, keeping track of whether
-% the key was present or not, is implemented as a conditional.
-% If the key was missing, neither the property list, nor the token
-% list are altered. Otherwise, \cs{prg_return_true:} is used after
-% the assignments.
+% Popping a value is almost the same, but the value found is kept.
+% For the non-branching version, we additionally set the target token list to
+% \cs{q_no_value}, while for the branching version we must produce
+% \cs{prg_return_true:} or \cs{prg_return_false:}.
% \begin{macrocode}
+\cs_new_protected:Npn \prop_pop:NnN #1#2#3
+ {
+ \@@_pop:NnNNnTF #1 {#2}
+ \cs_set_eq:NN \cs_set_nopar:Npe
+ { \tl_set:Nn #3 } { } { \tl_set:Nn #3 { \q_no_value } }
+ }
+\cs_new_protected:Npn \prop_gpop:NnN #1#2#3
+ {
+ \@@_pop:NnNNnTF #1 {#2}
+ \cs_gset_eq:NN \cs_gset_nopar:Npe
+ { \tl_set:Nn #3 } { } { \tl_set:Nn #3 { \q_no_value } }
+ }
+\cs_generate_variant:Nn \prop_pop:NnN { NV , No }
+\cs_generate_variant:Nn \prop_pop:NnN { c , cV , co }
+\cs_generate_variant:Nn \prop_gpop:NnN { NV , No }
+\cs_generate_variant:Nn \prop_gpop:NnN { c , cV , co }
\prg_new_protected_conditional:Npnn \prop_pop:NnN #1#2#3 { T , F , TF }
{
- \@@_split:NnTF #1 {#2}
- {
- \tl_set:Nn #3 {##2}
- \tl_set:Nn #1 { ##1 ##3 }
- \prg_return_true:
- }
- { \prg_return_false: }
+ \@@_pop:NnNNnTF #1 {#2}
+ \cs_set_eq:NN \cs_set_nopar:Npe
+ { \tl_set:Nn #3 } \prg_return_true: \prg_return_false:
}
\prg_new_protected_conditional:Npnn \prop_gpop:NnN #1#2#3 { T , F , TF }
{
- \@@_split:NnTF #1 {#2}
- {
- \tl_set:Nn #3 {##2}
- \tl_gset:Nn #1 { ##1 ##3 }
- \prg_return_true:
- }
- { \prg_return_false: }
+ \@@_pop:NnNNnTF #1 {#2}
+ \cs_gset_eq:NN \cs_gset_nopar:Npe
+ { \tl_set:Nn #3 } \prg_return_true: \prg_return_false:
}
-\prg_generate_conditional_variant:Nnn \prop_pop:NnN { NV , c , cV } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \prop_gpop:NnN { NV , c , cV } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \prop_pop:NnN
+ { NV , No , c , cV , co } { T , F , TF }
+\prg_generate_conditional_variant:Nnn \prop_gpop:NnN
+ { NV , No , c , cV , co } { T , F , TF }
% \end{macrocode}
% \end{macro}
+% \end{macro}
+%
+% \subsection{Adding data to property lists}
%
% \begin{macro}[tested = m3prop002]
% {
% \prop_put:Nnn, \prop_put:NnV, \prop_put:Nnv, \prop_put:Nne,
% \prop_put:NVn, \prop_put:NVV, \prop_put:NVv, \prop_put:NVe,
-% \prop_put:Nvn, \prop_put:NvV, \prop_put:Nvv, \prop_put:Nve,
+% \prop_put:Nvn, \prop_put:NvV, \prop_put:Nvv, \prop_put:Nve,
% \prop_put:Nen, \prop_put:NeV, \prop_put:Nev, \prop_put:Nee,
-% \prop_put:Nno, \prop_put:Nnx, \prop_put:NVx,
-% \prop_put:Non, \prop_put:Noo, \prop_put:NxV, \prop_put:Nxx,
+% \prop_put:Nno, \prop_put:Non, \prop_put:Noo,
+% \prop_put:Nnx, \prop_put:NVx, \prop_put:NxV, \prop_put:Nxx,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cnv, \prop_put:cne,
-% \prop_put:cno, \prop_put:cnx,
% \prop_put:cVn, \prop_put:cVV, \prop_put:cVv, \prop_put:cVe,
-% \prop_put:cvn, \prop_put:cvV, \prop_put:cvv, \prop_put:cve,
+% \prop_put:cvn, \prop_put:cvV, \prop_put:cvv, \prop_put:cve,
% \prop_put:cen, \prop_put:ceV, \prop_put:cev, \prop_put:cee,
-% \prop_put:con, \prop_put:coo, \prop_put:cxV, \prop_put:cxx
+% \prop_put:cno, \prop_put:con, \prop_put:coo,
+% \prop_put:cnx, \prop_put:cVx, \prop_put:cxV, \prop_put:cxx
% }
% \begin{macro}[tested = m3prop002]
% {
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nnv, \prop_gput:Nne,
% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVv, \prop_gput:NVe,
-% \prop_gput:Nvn, \prop_gput:NvV, \prop_gput:Nvv, \prop_gput:Nve,
+% \prop_gput:Nvn, \prop_gput:NvV, \prop_gput:Nvv, \prop_gput:Nve,
% \prop_gput:Nen, \prop_gput:NeV, \prop_gput:Nev, \prop_gput:Nee,
% \prop_gput:Nno, \prop_gput:Non, \prop_gput:Noo,
-% \prop_gput:Nnx, \prop_gput:NVx, \prop_gput:Nxn, \prop_gput:Nxx,
+% \prop_gput:Nnx, \prop_gput:NVx, \prop_gput:NxV, \prop_gput:Nxx,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cnv, \prop_gput:cne,
-% \prop_gput:cno, \prop_gput:cnx,
% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVv, \prop_gput:cVe,
-% \prop_gput:cvn, \prop_gput:cvV, \prop_gput:cvv, \prop_gput:cve,
+% \prop_gput:cvn, \prop_gput:cvV, \prop_gput:cvv, \prop_gput:cve,
% \prop_gput:cen, \prop_gput:ceV, \prop_gput:cev, \prop_gput:cee,
-% \prop_gput:cno, \prop_gput:con, \prop_gput:cxn, \prop_gput:cxx
+% \prop_gput:cno, \prop_gput:con, \prop_gput:coo,
+% \prop_gput:cnx, \prop_gput:cVx, \prop_gput:cxV, \prop_gput:cxx
+% }
+% \begin{macro}[tested = m3prop002]
+% {
+% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
+% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV,
+% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
+% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
% }
-% \begin{macro}{\@@_put:NNnn}
-% Since the branches of \cs{@@_split:NnTF} are used as the replacement
-% text of an internal macro, and since the \meta{key} and new
-% \meta{value} may contain arbitrary tokens, it is not safe to include
-% them in the argument of \cs{@@_split:NnTF}. We thus start by
-% storing in \cs{l_@@_internal_tl} tokens which (after
-% \texttt{e}-expansion) encode the key--value pair. This variable can
-% safely be used in \cs{@@_split:NnTF}. If the \meta{key} was absent,
-% append the new key--value to the list.
-% Otherwise concatenate the extracts |##1|
-% and |##3| with the new key--value pair \cs{l_@@_internal_tl}. The
-% updated entry is placed at the same spot as the original \meta{key}
-% in the property list, preserving the order of entries.
+% \begin{macro}[tested = m3prop002]
+% {
+% \@@_put:NNNnn, \@@_put_linked:wnNN,
+% \@@_put_linked:NNNN, \@@_put_linked_old:w,
+% \@@_put_linked_new:w
+% }
+% All of the \cs[no-index]{prop_(g)put(_if_new):Nnn} functions are
+% based on the same auxiliary, which receives \meta{code} and an
+% \enquote{assignment}, followed by \meta{prop} \Arg{key} \Arg{new
+% value}. The
+% assignment \cs[index=cs_set_nopar:Npe]{cs_(g)set_nopar:Npe} is the
+% primitive assignment without any checking: in the case of linked
+% props it is applied to individual
+% pieces of the linked prop, which are typically not yet defined.
+% Debugging the scope of the variable is done at a higher level by
+% letting \pkg{l3debug} change \cs{prop_put:Nnn} and friends. This
+% allows other \pkg{l3prop} commands to directly call the underlying
+% auxiliary to skip this checking step and avoid getting multiple
+% error messages for the same error.
+% The \meta{code} (empty for |put| and \cs{use_none:nnn} for
+% |put_if_new|) is placed before the assignment in cases where the key
+% is already present, in order to suppress the assignment in the
+% |put_if_new| case.
% \begin{macrocode}
-\cs_new_protected:Npn \prop_put:Nnn { \@@_put:NNnn \__kernel_tl_set:Nx }
-\cs_new_protected:Npn \prop_gput:Nnn { \@@_put:NNnn \__kernel_tl_gset:Nx }
-\cs_new_protected:Npn \@@_put:NNnn #1#2#3#4
- {
- \tl_set:Nn \l_@@_internal_tl
- {
- \exp_not:N \@@_pair:wn \tl_to_str:n {#3}
- \s_@@ { \exp_not:n {#4} }
- }
- \@@_split:NnTF #2 {#3}
- { #1 #2 { \exp_not:n {##1} \l_@@_internal_tl \exp_not:n {##3} } }
- { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } }
- }
+\cs_new_protected:Npn \prop_put:Nnn
+ { \@@_put:nNNnn { } \cs_set_nopar:Npe }
+\cs_new_protected:Npn \prop_gput:Nnn
+ { \@@_put:nNNnn { } \cs_gset_nopar:Npe }
+\cs_new_protected:Npn \prop_put_if_new:Nnn
+ { \@@_put:nNNnn \use_none:nnn \cs_set_nopar:Npe }
+\cs_new_protected:Npn \prop_gput_if_new:Nnn
+ { \@@_put:nNNnn \use_none:nnn \cs_gset_nopar:Npe }
\cs_generate_variant:Nn \prop_put:Nnn
{
NnV , Nnv , Nne , NV , NVV , NVv , NVe ,
@@ -1307,50 +1964,104 @@
}
\cs_generate_variant:Nn \prop_gput:Nnn
{ cno , co , coo , cnx , cVx , cxV , cxx }
+\cs_generate_variant:Nn \prop_put_if_new:Nnn
+ { NnV , NV , cnV , cV }
+\cs_generate_variant:Nn \prop_gput_if_new:Nnn
+ { NnV , NV , cnV , cV }
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[tested = m3prop002]
-% {
-% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
-% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV
-% }
-% \begin{macro}[tested = m3prop002]
-% {
-% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
-% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
-% }
-% \begin{macro}{\@@_put_if_new:NNnn}
-% Adding conditionally also splits. If the key is already present,
-% the three brace groups given by \cs{@@_split:NnTF} are removed.
-% If the key is new, then the value is added, being careful to
-% convert the key to a string using \cs{tl_to_str:n}.
+% Since the true branch of \cs{@@_split:NnTFn} is used as the
+% replacement text of an internal macro, and since the \meta{key} and
+% new \meta{value} may contain arbitrary tokens, it is not safe to
+% include them in the argument of \cs{@@_split:NnTFn}. We thus start
+% by storing in \cs{l_@@_internal_tl} tokens which (after
+% \texttt{x}-expansion) encode the key--value pair. This variable can
+% safely be used in \cs{@@_split:NnTFn}. For a flat prop, if the
+% \meta{key} was absent, append the new key--value to the list;
+% otherwise concatenate the extracts |##2| and |##4| with the new
+% key--value pair \cs{l_@@_internal_tl}. The updated entry is placed
+% at the same spot as the original \meta{key} in the property list,
+% preserving the order of entries. For a linked prop, call
+% \cs{@@_put_linked:wnNN}, which constructs the control sequence in
+% which we will place the new value. If it matches \cs{scan_stop:}
+% then the key was not yet there and we add it using
+% \cs{@@_put_linked_new:w}, otherwise it was already there and we use
+% \cs{@@_put_linked_old:w}.
% \begin{macrocode}
-\cs_new_protected:Npn \prop_put_if_new:Nnn
- { \@@_put_if_new:NNnn \__kernel_tl_set:Nx }
-\cs_new_protected:Npn \prop_gput_if_new:Nnn
- { \@@_put_if_new:NNnn \__kernel_tl_gset:Nx }
-\cs_new_protected:Npn \@@_put_if_new:NNnn #1#2#3#4
+\cs_new_protected:Npn \@@_put:nNNnn #1#2#3#4#5
{
\tl_set:Nn \l_@@_internal_tl
{
- \exp_not:N \@@_pair:wn \tl_to_str:n {#3}
- \s_@@ \exp_not:n { {#4} }
+ \exp_not:N \@@_pair:wn \tl_to_str:n {#4}
+ \s_@@ { \exp_not:n {#5} }
+ }
+ \@@_split:NnTFn #3 {#4}
+ {
+ #1 #2 #3
+ {
+ \s_@@ \@@_chk:w \exp_not:n {##2}
+ \l_@@_internal_tl \exp_not:n {##4}
+ }
+ }
+ { #2 #3 { \exp_not:o {#3} \l_@@_internal_tl } }
+ { \exp_after:wN \@@_put_linked:wnnN #3 {#4} {#1} #2 }
+ }
+\cs_new_protected:Npn \@@_put_linked:wnnN
+ \@@_flatten:w #1 \s_@@ #2#3#4
+ {
+ \exp_after:wN \@@_put_linked:NNnN
+ \cs:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end:
+ #1
+ }
+\cs_new_protected:Npn \@@_put_linked:NNnN #1#2#3#4
+ {
+ \if_meaning:w \scan_stop: #1
+ \exp_after:wN \@@_put_linked_new:w #2 #1 #2 #4
+ \else:
+ \exp_after:wN \@@_put_linked_old:w #1 { #3 #4 #1 }
+ \fi:
+ }
+% \end{macrocode}
+% To add a new entry, \cs{@@_put_linked_new:w} receives the expansion
+% of the end-pointer, namely \cs{use_none:n} \meta{last key pointer},
+% followed by the new key pointer~|#2|, the end pointer~|#3|, and an
+% assignment function~|#4|. Set up the doubly-linked list in the
+% order |#1|, |#2|, |#3|, placing the key--value pair
+% \cs{l_@@_internal_tl} in~|#2|. To replace an old entry,
+% \cs{@@_put_linked_old:w} receives the expansion of that entry, and
+% it reassigns it (|#5|) using the assignment~|#6|, by simply
+% replacing the payload |#2| \cs{s_@@} |#3| by \cs{l_@@_internal_tl}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_put_linked_new:w
+ \use_none:n #1#2#3#4
+ {
+ #4 #1
+ {
+ \exp_after:wN \@@_pop_linked_prev:w #1
+ \exp_not:N #2
+ }
+ #4 #2
+ {
+ \exp_not:n { \use_none:n #1 }
+ \l_@@_internal_tl
+ \exp_not:N #3
+ }
+ #4 #3 { \exp_not:n { \use_none:n #2 } }
+ }
+\cs_new_protected:Npn \@@_put_linked_old:w
+ \use_none:n #1#2 \s_@@ #3#4#5
+ {
+ #5
+ {
+ \exp_not:n { \use_none:n #1 }
+ \l_@@_internal_tl
+ \exp_not:N #4
}
- \@@_split:NnTF #2 {#3}
- { }
- { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } }
}
-\cs_generate_variant:Nn \prop_put_if_new:Nnn
- { NnV , NV , cnV , cV }
-\cs_generate_variant:Nn \prop_gput_if_new:Nnn
- { NnV , NV , cnV , cV }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \subsection{Property list conditionals}
%
@@ -1365,46 +2076,82 @@
% \end{macro}
%
% \begin{macro}[pTF, tested = m3prop003]{\prop_if_empty:N, \prop_if_empty:c}
-% Same test as for token lists.
+% \begin{macro}{\@@_if_empty_return:w}
+% A flat property list is empty if it matches \cs{c_empty_prop}. A linked
+% property list is empty if its second token (the end pointer) and last token
+% (the first key pointer) are equal. There cannot be false positives because
+% the end pointer takes the form \cs{use_none:n} \meta{pointer} while the
+% other pointers have more elaborate structure. The subtle code branch here
+% is when a non-empty flat property list is given: then \cs{@@_if_empty:w}
+% reads the whole property list as~|#1| and |#2|, |#3|, |#4| are |2|, |3|,
+% |4|, respectively.
% \begin{macrocode}
\prg_new_conditional:Npnn \prop_if_empty:N #1 { p , T , F , TF }
{
- \tl_if_eq:NNTF #1 \c_empty_prop
- \prg_return_true: \prg_return_false:
+ \if_meaning:w #1 \c_empty_prop
+ \prg_return_true:
+ \else:
+ \exp_after:wN \@@_if_empty_return:w #1
+ \@@_flatten:w 2 \s_@@ 34 \s_@@_stop
+ \fi:
+ }
+\cs_new:Npn \@@_if_empty_return:w
+ #1 \@@_flatten:w #2 \s_@@ #3#4#5 \s_@@_stop
+ {
+ \if_meaning:w #2 #4
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
}
\prg_generate_conditional_variant:Nnn \prop_if_empty:N
{ c } { p , T , F , TF }
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}[pTF, tested = m3prop003]
% {
% \prop_if_in:Nn, \prop_if_in:NV, \prop_if_in:Ne, \prop_if_in:No,
% \prop_if_in:cn, \prop_if_in:cV, \prop_if_in:ce, \prop_if_in:co
% }
-% \begin{macro}[EXP]{\@@_if_in:nnn}
-% Testing expandably if a key is in a property list
-% requires to go through the key--value pairs one by one.
-% This is rather slow, and a faster test would be
+% \begin{macro}[EXP]{\@@_if_in_flat:nnn}
+% For a linked prop, use \cs{@@_get_linked:w} to look up whether the control
+% sequence constructed from the prefix and the sought-after key exists; this
+% auxiliary calls \cs{use_none:n} \Arg{value} \cs{prg_return_true:} if the key
+% is found, and otherwise \cs{prg_return_false:}. For a flat prop, testing
+% expandably if a key is there requires to go through the key--value pairs one
+% by one. This is rather slow, and a faster test would be
% \begin{verbatim}
% \prg_new_protected_conditional:Npnn \prop_if_in:Nn #1 #2
% {
-% \@@_split:NnTF #1 {#2}
+% \@@_split:NnTFn #1 {#2}
% { \prg_return_true: }
% { \prg_return_false: }
+% { ... }
% }
% \end{verbatim}
-% but \cs{@@_split:NnTF} is non-expandable.
+% but \cs{@@_split:NnTFn} is non-expandable.
% Instead, we use \cs{prop_map_tokens:Nn} to compare the search key to
% each key in turn using \cs{str_if_eq:ee}, which is expandable.
% \begin{macrocode}
\prg_new_conditional:Npnn \prop_if_in:Nn #1#2 { p , T , F , TF }
{
- \exp_args:NNo \prop_map_tokens:Nn #1
- { \exp_after:wN \@@_if_in:nnn \exp_after:wN { \tl_to_str:n {#2} } }
- \prg_return_false:
+ \@@_if_flat:NTF #1
+ {
+ \exp_after:wN \prop_map_tokens:Nn \exp_after:wN #1
+ {
+ \exp_after:wN \@@_if_in_flat:nnn
+ \exp_after:wN { \tl_to_str:n {#2} }
+ }
+ \prg_return_false:
+ }
+ {
+ \exp_after:wN \@@_get_linked:w #1 {#2}
+ \use_none:n \prg_return_true: \prg_return_false:
+ }
}
-\cs_new:Npn \@@_if_in:nnn #1#2#3
+\cs_new:Npn \@@_if_in_flat:nnn #1#2#3
{
\str_if_eq:eeT {#1} {#2}
{ \prop_map_break:n { \use_i:nn \prg_return_true: } }
@@ -1415,38 +2162,6 @@
% \end{macro}
% \end{macro}
%
-% \subsection{Recovering values from property lists with branching}
-%
-% \begin{macro}[TF, tested = m3prop004]
-% {
-% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN,
-% \prop_get:NoN, \prop_get:NxN,
-% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:ceN,
-% \prop_get:coN, \prop_get:cxN,
-% \prop_get:cnc
-% }
-% Getting the value corresponding to a key, keeping track of whether
-% the key was present or not, is implemented as a conditional (with
-% side effects). If the key was absent, the token list is not altered.
-% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \prop_get:NnN #1#2#3 { T , F , TF }
- {
- \@@_split:NnTF #1 {#2}
- {
- \tl_set:Nn #3 {##2}
- \prg_return_true:
- }
- { \prg_return_false: }
- }
-\prg_generate_conditional_variant:Nnn \prop_get:NnN
- { NV , Nv , Ne , c , cV , cv , ce } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \prop_get:NnN
- { No , Nx , co , cx } { T , F , TF }
-\prg_generate_conditional_variant:Nnn \prop_get:NnN
- { cnc } { T , F , TF }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Mapping over property lists}
%
% \begin{macro}[tested = m3prop003]
@@ -1455,6 +2170,9 @@
% \prop_map_function:cN, \prop_map_function:cc
% }
% \begin{macro}{\@@_map_function:Nw}
+% We first |f|-expand to flatten~|#1| in case it was a linked list.
+% The \cs{use_i:nnn} removes the leading \cs{s_@@} \cs{@@_chk:w} of
+% the flattened prop.
% The even-numbered arguments of \cs{@@_map_function:Nw} are keys,
% hence have string catcodes, except at the end where they are
% \cs{fi:} \cs{prop_map_break:}. The \cs{fi:} ends the \cs{if_false:}
@@ -1463,10 +2181,8 @@
% \begin{macrocode}
\cs_new:Npn \prop_map_function:NN #1#2
{
- \exp_after:wN \use_i_ii:nnn
- \exp_after:wN \@@_map_function:Nw
- \exp_after:wN #2
- #1
+ \exp_last_unbraced:Nnf
+ \use_i:nnn { \@@_map_function:Nw #2 } #1
\@@_pair:wn \fi: \prop_map_break: \s_@@ { }
\@@_pair:wn \fi: \prop_map_break: \s_@@ { }
\@@_pair:wn \fi: \prop_map_break: \s_@@ { }
@@ -1506,7 +2222,7 @@
{ @@_map_ \int_use:N \g__kernel_prg_map_int :wn } \@@_pair:wn
\int_gincr:N \g__kernel_prg_map_int
\cs_gset_protected:Npn \@@_pair:wn ##1 \s_@@ ##2 {#2}
- #1
+ \exp_last_unbraced:Nf \use_none:nn #1
\prg_break_point:Nn \prop_map_break:
{
\int_gdecr:N \g__kernel_prg_map_int
@@ -1520,8 +2236,8 @@
%
% \begin{macro}[rEXP]{\prop_map_tokens:Nn, \prop_map_tokens:cn}
% \begin{macro}{\@@_map_tokens:nw}
-% The mapping is very similar to \cs{prop_map_function:NN}. The
-% \cs{use_i:nn} removes the leading \cs{s_@@}. The odd construction
+% The mapping is very similar to \cs{prop_map_function:NN}.
+% The odd construction
% |\use:n {#1}| allows |#1| to contain any token without interfering
% with \cs{prop_map_break:}. The loop stops when the \meta{key}
% between \cs{@@_pair:wn} and \cs{s_@@} is \cs{fi:}
@@ -1529,8 +2245,8 @@
% \begin{macrocode}
\cs_new:Npn \prop_map_tokens:Nn #1#2
{
- \exp_last_unbraced:Nno
- \use_i:nn { \@@_map_tokens:nw {#2} } #1
+ \exp_last_unbraced:Nnf
+ \use_i:nnn { \@@_map_tokens:nw {#2} } #1
\@@_pair:wn \fi: \prop_map_break: \s_@@ { }
\@@_pair:wn \fi: \prop_map_break: \s_@@ { }
\@@_pair:wn \fi: \prop_map_break: \s_@@ { }
@@ -1567,16 +2283,98 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Uses of mapping over property lists}
+%
+% \begin{macro}[EXP]{\prop_count:N, \prop_count:c}
+% \begin{macro}[EXP]{\@@_count:nn}
+% Counting the key--value pairs in a property list is done using the
+% same approach as for other count functions: turn each entry into a
+% \texttt{+1} then use integer evaluation to actually do the
+% mathematics.
+% \begin{macrocode}
+\cs_new:Npn \prop_count:N #1
+ {
+ \int_eval:n
+ {
+ 0
+ \prop_map_function:NN #1 \@@_count:nn
+ }
+ }
+\cs_new:Npn \@@_count:nn #1#2 { + 1 }
+\cs_generate_variant:Nn \prop_count:N { c }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\prop_to_keyval:N}
+% \begin{macro}[EXP]
+% {\@@_to_keyval_exp_after:wN, \@@_to_keyval:nn, \@@_to_keyval:nnw}
+% Each property name and value pair will be returned in the form
+% \verb*| |\marg{name}\verb*|= |\marg{value}. As one of the main use cases for
+% this macro is to pass the \meta{property list} on to a key--value parser, we
+% have to make sure that the behaviour is as good as possible. Using a space
+% before the opening brace we get the correct brace stripping behaviour for
+% most of the key--value parsers available in \LaTeX{}.
+% Iterate over the
+% \meta{property list} and remove the leading comma afterwards. Only the value
+% has to be protected in \cs{__kernel_exp_not:w} as the property name is
+% always a string. After the loop the leading comma is removed by
+% \cs{use_none:n} and afterwards \cs{__kernel_exp_not:w} eventually finds the
+% opening brace of its argument.
+% \begin{macrocode}
+\cs_new:Npn \prop_to_keyval:N #1
+ {
+ \__kernel_exp_not:w
+ \prop_if_empty:NTF #1
+ { {} }
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ {
+ \tex_expanded:D
+ {
+ \exp_not:N \use_none:n
+ \prop_map_function:NN #1 \@@_to_keyval:nn
+ }
+ }
+ }
+ }
+\cs_new:Npn \@@_to_keyval:nn #1#2
+ { , ~ {#1} =~ { \__kernel_exp_not:w {#2} } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Viewing property lists}
%
% \begin{macro}[tested = m3show001]
% {\prop_show:N, \prop_show:c, \prop_log:N, \prop_log:c}
-% \begin{macro}{\@@_show:NN}
-% \begin{macro}[rEXP]{\@@_show_validate:w}
-% Apply the general \cs{__kernel_chk_tl_type:NnnT}.
-% Contrarily to sequences and comma lists,
-% we use \cs{msg_show_item:nn} to format both the key and the value
-% for each pair.
+% \begin{macro}{\@@_show:NN, \@@_show_finally:NNn, \@@_show_prepare:w, \@@_show_loop:NNw, \@@_show_bad_name:NNN, \@@_show_end:NNN, \@@_show_loop_key:wNNN}
+% \begin{macro}[rEXP]{\@@_show_flat:w, \@@_show_linked:w}
+% Experience shows one source of problems is very hard to debug: when
+% a data structure such as a |seq| or~|prop| gets corrupted. In the
+% past, \cs{prop_show:N} would in some cases happily show items of
+% such a |prop|, even though other more demanding \pkg{l3prop}
+% functions would choke. It is thus best to make \cs{prop_show:N}
+% check very thoroughly the structure and flag issues, even though
+% that is very painful for linked props. Throughout the code below,
+% we strive to remain as safe as possible, but in the explanations we
+% only state what the arguments are when the prop is correctly formed,
+% rather than saying at every step that various arguments can be
+% arbitrary junk, made safe by using \cs{tl_to_str:n} generously.
+%
+% The general \cs{__kernel_chk_tl_type:NnnT} checks that its first
+% argument is a token list, and if it is, then it \texttt{e}-expands
+% its second argument and compares with the contents of its first
+% argument. Thus, within this \texttt{e}-expansion it is safe to use
+% \cs{@@_if_flat:NTF} to check if the prop is flat or linked. In the
+% flat case we simply reconstruct the expected structure using
+% \cs{@@_show_flat:w}, which loops through the prop and correctly
+% turns all keys to strings for instance. In the linked case, we use
+% \cs{@@_show_linked:w}, which ensures the form \cs{@@_flatten:w}
+% \cs[no-index]{@@~\meta{prefix}} \cs{s_@@} \Arg{prefix} \meta{rest},
+% where \meta{prefix} is made into a string and \meta{rest} cannot be
+% a brace group or multiple tokens since \cs{@@_show_linked:w} would
+% in such cases give a different result from the original token list.
% \begin{macrocode}
\cs_new_protected:Npn \prop_show:N { \@@_show:NN \msg_show:nneeee }
\cs_generate_variant:Nn \prop_show:N { c }
@@ -1586,22 +2384,168 @@
{
\__kernel_chk_tl_type:NnnT #2 { prop }
{
- \s_@@
- \exp_after:wN \use_i:nn \exp_after:wN \@@_show_validate:w #2
- \@@_pair:wn \q_recursion_tail \s_@@ { } \q_recursion_stop
+ \@@_if_flat:NTF #2
+ {
+ \s_@@ \@@_chk:w
+ \exp_after:wN \@@_show_flat:w #2
+ \s_@@ { }
+ \@@_pair:wn \q_@@_recursion_tail \s_@@ { }
+ \q_@@_recursion_stop
+ }
+ { \exp_after:wN \@@_show_linked:w #2 \s_@@ ! ? \s_@@_stop }
}
{
- #1 { prop } { show }
- { \token_to_str:N #2 }
- { \prop_map_function:NN #2 \msg_show_item:nn }
- { } { }
+ \@@_if_flat:NTF #2
+ { \@@_show_finally:NNn #1 #2 { flat } }
+ {
+ \tl_set:Nn \l_@@_internal_tl { #1 #2 }
+ \exp_after:wN \@@_show_prepare:w #2 #2
+ }
}
}
-\cs_new:Npn \@@_show_validate:w #1 \@@_pair:wn #2 \s_@@ #3
+\cs_new:Npn \@@_show_flat:w #1 \@@_pair:wn #2 \s_@@ #3
{
- \quark_if_recursion_tail_stop:n {#2}
+ \@@_if_recursion_tail_stop:n {#2}
\exp_not:N \@@_pair:wn \tl_to_str:n {#2} \s_@@ \exp_not:n { {#3} }
- \@@_show_validate:w
+ \@@_show_flat:w
+ }
+\cs_new:Npn \@@_show_linked:w #1 \s_@@ #2#3#4 \s_@@_stop
+ {
+ \exp_not:N \@@_flatten:w
+ \exp_not:c { @@ ~ \tl_to_str:n {#2} }
+ \s_@@ { \tl_to_str:n {#2} }
+ \exp_not:n {#3}
+ }
+% \end{macrocode}
+% For flat props we are done by using \cs{msg_show:nneeee} or
+% \cs{msg_log:nneeee}. The auxiliary \cs{@@_show_finally:NNn} is
+% eventually also used in the linked case after some more tests. To
+% avoid having to bring along the message function and the property
+% list, we store them into \cs{l_@@_internal_tl}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_finally:NNn #1#2#3
+ {
+ #1 { prop } { show }
+ { \token_to_str:N #2 }
+ { \prop_map_function:NN #2 \msg_show_item:nn }
+ {#3} { }
+ }
+% \end{macrocode}
+% For linked props, we now know they have a reasonable form so that we
+% are calling \cs{@@_show_prepare:w} \cs{@@_flatten:w}
+% \cs[no-index]{@@~\meta{prefix}} \cs{s_@@} \Arg{prefix} \meta{token}
+% \meta{property list}, and the task is to loop through the linked
+% list and check integrity. We first set things up: the auxiliary
+% \cs{@@_tmp:w} will be in charge of checking that various tokens
+% start with \cs[no-index]{@@~\meta{prefix}} (in the sense of string
+% representations), and calling one of \cs{@@_show_loop_key:wNNN},
+% \cs{@@_show_end:NNN}, \cs{@@_show_bad_name:NNN}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_prepare:w
+ \@@_flatten:w #1 \s_@@ #2#3#4
+ {
+ \use:e
+ {
+ \cs_set_nopar:Npn \exp_not:N \@@_tmp:w
+ ##1 \token_to_str:N #1 ##2 \s_@@_mark ##3 \s_@@_stop
+ {
+ \exp_not:N \tl_if_empty:nTF {##1}
+ {
+ \exp_not:N \tl_if_head_is_space:nTF {##2}
+ { \exp_not:N \exp_args:Nf \@@_show_loop_key:wNNN }
+ { \exp_not:N \tl_if_empty:nTF }
+ {##2}
+ }
+ { \exp_not:N \use_ii:nn }
+ \@@_show_end:NNN
+ \@@_show_bad_name:NNN
+ }
+ }
+ \exp_last_unbraced:NNNo \@@_show_loop:NNw #1 #4 #4
+ }
+% \end{macrocode}
+% The loop will consist of calls to \cs{@@_show_loop:NNw}
+% \cs[no-index]{@@~\meta{prefix}} \meta{token} \meta{expansion}, where
+% \meta{token} is one of the items in the list, specifically the key
+% container for \meta{key$_{i-1}$} (starting at $i=1$ with the
+% property list variable itself), and \meta{expansion} stands for the
+% expansion of that token, which has already been checked, and takes
+% the form \meta{junk} \cs{s_@@} \Arg{value}
+% \cs[no-index]{@@~\meta{prefix}~\meta{key_i}}. Thus, the loop
+% auxiliary receives the prefix command as |#1|, and the $(i-1)$-th
+% and $i$-th key containers as |#2| and~|#5|. Then \cs{@@_tmp:w}
+% checks that the name of the $i$-th key container is valid.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_loop:NNw #1#2 #3 \s_@@ #4#5
+ {
+ \exp_last_two_unbraced:Noo \@@_tmp:w
+ { \token_to_str:N #5 \s_@@_mark }
+ { \token_to_str:N #1 \s_@@_mark \s_@@_stop }
+ #1 #2 #5
+ }
+% \end{macrocode}
+% If the $i$-th key container has the wrong name we get
+% \cs{@@_show_bad_name:NNN} \cs[no-index]{@@~\meta{prefix}}
+% \meta{previous container} \meta{current container with bad name}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_bad_name:NNN #1#2#3
+ {
+ \msg_error:nneeee { prop } { bad-link }
+ { \tl_tail:N \l_@@_internal_tl }
+ { \token_to_str:N #2 }
+ { \token_to_str:N #3 }
+ { \token_to_str:N #1 }
+ }
+% \end{macrocode}
+% If the $i$-th key container has the name
+% \cs[no-index]{@@~\meta{prefix}} (without space), it is the trailing
+% one. We check that it is the right kind of macro to be a token
+% list, and that it has the right contents \cs{use_none:n}
+% \meta{previous container}. If so, we are done checking everything,
+% and we display the property list using the message function and
+% property list name stored in \cs{l_@@_internal_tl}. Note that we
+% also use this \cs{l_@@_internal_tl} in the type argument of
+% \cs{__kernel_chk_tl_type:NnnT}, to build up the name
+% \enquote{\meta{property list} prop entry} used in error messages.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_end:NNN #1#2#3
+ {
+ \__kernel_chk_tl_type:NnnT #3
+ { \tl_tail:N \l_@@_internal_tl prop~entry }
+ { \exp_not:n { \use_none:n #2 } }
+ {
+ \exp_after:wN \@@_show_finally:NNn
+ \l_@@_internal_tl { linked }
+ }
+ }
+% \end{macrocode}
+% If the $i$-th container has a name \cs[no-index]{@@~\meta{prefix}
+% \meta{key}} (with a space before the key), then we have a call to
+% \cs{@@_show_loop_key:wNNN} \Arg{key} \meta{junk_1} \meta{junk_2}
+% \cs[no-index]{@@~\meta{prefix}} \meta{previous container}
+% \meta{current container}. (with an \texttt{f}-expansion to eliminate
+% the space). The first argument is the \meta{key} without a leading
+% space, thanks to a judicious \texttt{f}-expansion earlier on. We
+% check that the \meta{current container} is a token list with the
+% expected structure \cs{use_none:n} \meta{previous container}
+% \cs{@@_pair:wn} \meta{string} \cs{s_@@} \Arg{anything} \meta{single
+% token}. The auxiliary \cs{@@_show_flat:w} is reused to produce the
+% \cs{@@_pair:wn} part, and the last token is produced by
+% \cs{tl_item:Nn} (we don't waste a specialized auxiliary to speed
+% that up). If the check succeed, move on to the next item.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_show_loop_key:wNNN #1#2#3#4#5#6
+ {
+ \__kernel_chk_tl_type:NnnT #6
+ { \tl_tail:N \l_@@_internal_tl prop~entry }
+ {
+ \exp_not:n { \use_none:n #5 }
+ \exp_after:wN \@@_show_flat:w #6 \s_@@ { }
+ \@@_pair:wn \q_@@_recursion_tail \s_@@ { }
+ \q_@@_recursion_stop
+ \tl_item:Nn #6 { -1 }
+ }
+ { \exp_last_unbraced:NNNo \@@_show_loop:NNw #4 #6 #6 }
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index 281b8453ad..3aeff3f8de 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index 952c115d29..d59d61ddb6 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 45e5028d1b..c68a7a86af 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 319cf75b6e..e18ea29c9b 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index a85bb213b2..0e9e70bbdb 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index 39b6a43d28..dc87dbb621 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index 80b26ea9bc..8be8e8ff09 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index dda0393c17..c40939a7a3 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index 0bce9ea22a..e8db43bb3e 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 1d628ed6a8..d62bd9a80b 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index da4ee7e729..736d53b4c0 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index 10e68fe763..ec9368ae18 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-map.dtx b/macros/latex/contrib/l3kernel/l3text-map.dtx
index b1787a2f73..c8e5db95dc 100644
--- a/macros/latex/contrib/l3kernel/l3text-map.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-map.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 2e57a3c3d3..a797b3a609 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index 0631cc4695..7ef37636f3 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -196,10 +196,7 @@
% codepoint is uppercased, irrespective of the general code of the character.
%
% \begin{function}[added = 2022-07-04]
-% {
-% \text_declare_case_equivalent:Nn ,
-% \text_declare_case_equivalent:cn
-% }
+% {\text_declare_case_equivalent:Nn}
% \begin{syntax}
% \cs{text_declare_case_equivalent:Nn} \meta{cmd} \Arg{replacement}
% \end{syntax}
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index 4c85ed51d9..9ff2ec04e7 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -196,18 +196,15 @@
% \end{variable}
%
% \begin{variable}
-% {\l_@@_analysis_token, \l_@@_analysis_char_token, \l_@@_analysis_next_token}
+% {\l_@@_analysis_token, \l_@@_analysis_char_token}
% The tokens in the token list are probed with the \TeX{} primitive
% \tn{futurelet}. We use \cs{l_@@_analysis_token} in that
% construction. In some cases, we convert the following token to a
% string before probing it: then the token variable used is
-% \cs{l_@@_analysis_char_token}. When getting tokens from the input
-% stream we may need to look two tokens ahead, for which we use
-% \cs{l_@@_analysis_next_token}.
+% \cs{l_@@_analysis_char_token}.
% \begin{macrocode}
\cs_new_eq:NN \l_@@_analysis_token ?
\cs_new_eq:NN \l_@@_analysis_char_token ?
-\cs_new_eq:NN \l_@@_analysis_next_token ?
% \end{macrocode}
% \end{variable}
%
@@ -1223,13 +1220,12 @@
% \@@_peek_analysis_nonexp:N, \@@_peek_analysis_cs:N,
% \@@_peek_analysis_char:N, \@@_peek_analysis_char:w,
% \@@_peek_analysis_special:, \@@_peek_analysis_retest:,
-% \@@_peek_analysis_next:, \@@_peek_analysis_nextii:,
% \@@_peek_analysis_str:,
% \@@_peek_analysis_str:w, \@@_peek_analysis_str:n,
% \@@_peek_analysis_active_str:n, \@@_peek_analysis_explicit:n,
% \@@_peek_analysis_escape:, \@@_peek_analysis_collect:w,
% \@@_peek_analysis_collect:n, \@@_peek_analysis_collect_loop:,
-% \@@_peek_analysis_collect_test:, \@@_peek_analysis_collect_end:NNN
+% \@@_peek_analysis_collect_test:, \@@_peek_analysis_collect_end:NNNN
% }
% Save the user's code in a control sequence that is suitable for
% nested maps. We may wish to pass to this function an \tn{outer}
@@ -1254,7 +1250,10 @@
#1
\@@_peek_analysis_loop:NNn
\prg_break_point:Nn \peek_analysis_map_break:
- { \group_align_safe_end: }
+ {
+ \int_gdecr:N \g__kernel_prg_map_int
+ \group_align_safe_end:
+ }
}
\@@_peek_analysis_loop:NNn ? ? ?
}
@@ -1460,7 +1459,7 @@
\if_meaning:w \l_@@_analysis_token \scan_stop:
\exp_after:wN \@@_peek_analysis_normal:N
\else:
- \exp_after:wN \@@_peek_analysis_next:
+ \exp_after:wN \@@_peek_analysis_str:
\fi:
}
% \end{macrocode}
@@ -1469,41 +1468,22 @@
% begin-group or end-group token (catcode $1$ or~$2$), and we excluded
% a few cases that would be difficult later (empty control sequence,
% active character with the same character code as its meaning or as
-% the escape character). Now look at the \meta{next token} following
-% it using a combination of \tn{afterassignment} and \tn{futurelet}.
-% (In fact look twice to reset an internal \TeX{} flag in case the
-% \meta{next token} had been hit with \cs{exp_not:N}.)
-% The syntax of this primitive is \tn{futurelet} \meta{peek token}
-% \meta{first token} \meta{next token}, and it sets \meta{peek token}
-% equal to \meta{next token}. Traditionally, one takes \meta{first
-% token} to be some macro that regains control of the code and, e.g.,
-% analyses \meta{peek token}. Here, both \meta{first token} and
-% \meta{next token} are mostly unknown tokens in the input stream (but
-% we know the \meta{first token} has catcode $1$, $2$ or $10$), where
-% \meta{first token} was already stored as \cs{l_peek_token}, and we
-% regain control using \tn{afterassignment}, which inserts its
-% argument after the assignment, hence after \meta{peek token} but
-% before \meta{first token}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_peek_analysis_next:
- {
- \tl_if_empty:oT { \tex_the:D \tex_everyeof:D }
- { \tex_everyeof:D { \scan_stop: } }
- \tex_afterassignment:D \@@_peek_analysis_nextii:
- \tex_futurelet:D \l_@@_analysis_next_token
- }
-\cs_new_protected:Npn \@@_peek_analysis_nextii:
- {
- \tex_afterassignment:D \@@_peek_analysis_str:
- \tex_futurelet:D \l_@@_analysis_next_token
- }
-% \end{macrocode}
-% We then hit the \meta{first token} with \cs{token_to_str:N} and grab
-% characters until finding \cs{l_@@_analysis_next_token}. More
+% the escape character). The idea is to apply \cs{token_to_str:N} to
+% the \meta{token} then grab characters (of category code~$12$ except
+% for spaces that have category code~$10$) to reconstruct it. In
+% earlier versions of the code we would peek at the \meta{next token}
+% that lies after \meta{token} in the input stream, which would help
+% us be more accurate in reconstructing the \meta{token} case in edge
+% cases (mentioned below), but this had the side-effect of tokenizing
+% the input stream (turning characters into tokens) farther ahead than
+% needed.
+%
+% We hit the \meta{token} with \cs{token_to_str:N} and start grabbing
+% characters. More
% precisely, by looking at the first character in the string
-% representation of the \meta{first token} we distinguish three cases:
+% representation of the \meta{token} we distinguish three cases:
% a stringified control sequence starts with the escape character; for
-% an explicit character we find that same character; for an explicit
+% an explicit character we find that same character; for an active
% character we find anything else (we made sure to exclude the case of
% an active character whose string representation coincides with the
% other two cases).
@@ -1591,14 +1571,11 @@
% know that until we had run all the various tests including
% stringifying the token. We are thus left with the hard work of
% picking up one by one the characters in the csname (being careful
-% about spaces), until finding a token that matches the \meta{next
-% token} picked up earlier (which was not stringified), such that the
-% control sequence that we found so far indeed has the expected
-% meaning \cs{l_peek_token}. This comparison with \cs{l_peek_token}
-% catches a reasonably common case like \cs{c_group_begin_token} |_|
-% in which the trailing |_| has category code other: without
-% comparison of the constructed csname with \cs{l_peek_token}
-% collection would stop at \cs[no-index]{c}, which is wrong.
+% about spaces), until the constructed csname has the expected
+% meaning. This fails if someone defines a token like
+% \cs[no-index]{bgroup@my} whose string representation starts the same
+% as another token with the same meaning being an implicit character
+% token of category code $1$, $2$, or $10$.
% \begin{macrocode}
\cs_new_protected:Npn \@@_peek_analysis_escape:
{
@@ -1615,25 +1592,27 @@
}
\cs_new_protected:Npn \@@_peek_analysis_collect_loop:
{
- \tex_futurelet:D \l_@@_analysis_token
- \@@_peek_analysis_collect_test:
- }
-\cs_new_protected:Npn \@@_peek_analysis_collect_test:
- {
- \if_meaning:w \l_@@_analysis_token \l_@@_analysis_next_token
- \exp_after:wN \if_meaning:w \cs:w \l_@@_internal_a_tl \cs_end: \l_peek_token
- \@@_peek_analysis_collect_end:NNN
+ \exp_after:wN \if_meaning:w
+ \cs:w
+ \if_cs_exist:w \l_@@_internal_a_tl \cs_end:
+ \l_@@_internal_a_tl
+ \else:
+ c_one % anything short
\fi:
+ \cs_end:
+ \l_peek_token
+ \@@_peek_analysis_collect_end:NNNN
\fi:
- \@@_peek_analysis_collect:w
+ \tex_futurelet:D \l_@@_analysis_token
+ \@@_peek_analysis_collect:w
}
% \end{macrocode}
% End by calling the user code with suitable arguments (here |#1|,
% |#2| are \cs{fi:}), which closes the group begun early on.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_peek_analysis_collect_end:NNN #1#2#3
+\cs_new_protected:Npn \@@_peek_analysis_collect_end:NNNN #1#2#3#4
{
- #1 #2
+ #1
\tl_put_right:Ne \l_@@_peek_code_tl
{
{ \exp_not:N \exp_not:n { \exp_not:c { \l_@@_internal_a_tl } } }
diff --git a/macros/latex/contrib/l3kernel/l3tl-build.dtx b/macros/latex/contrib/l3kernel/l3tl-build.dtx
index 66b5a2d03e..7971301ef3 100644
--- a/macros/latex/contrib/l3kernel/l3tl-build.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-build.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index 5429f19c54..1043feaad9 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index add3e80eff..fe8d1a780e 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -102,7 +102,8 @@
% \end{syntax}
% Sets the behaviour of the \meta{char} in situations where it is
% active (category code $13$) to be equivalent to that of the
-% \meta{function}. The category code of the \meta{char} is
+% definition of the \meta{function} at the time \cs{char_set_active_eq:NN}
+% is used. The category code of the \meta{char} is
% \emph{unchanged} by this process. The \meta{function} may itself
% be an active character.
% \end{function}
@@ -118,7 +119,8 @@
% Sets the behaviour of the \meta{char} which has character
% code as given by the \meta{integer expression} in situations
% where it is active (category code $13$) to be equivalent to that of the
-% \meta{function}. The category code of the \meta{char} is
+% \meta{function} at the time \cs{char_set_active_eq:nN}
+% is used. The category code of the \meta{char} is
% \emph{unchanged} by this process. The \meta{function} may itself
% be an active character.
% \end{function}
@@ -424,6 +426,11 @@
% These are implicit tokens which have the category code described
% by their name. They are used internally for test purposes but
% are also available to the programmer for other uses.
+% \begin{texnote}
+% The tokens \cs{c_group_begin_token}, \cs{c_group_end_token}, and
+% \cs{c_space_token} are \pkg{expl3} counterparts of \LaTeXe{}'s
+% \tn{bgroup}, \tn{egroup}, and \cs{@sptoken}.
+% \end{texnote}
% \end{variable}
%
% \begin{variable}
@@ -786,11 +793,11 @@
% There is often a need to look ahead at the next token in the input
% stream while leaving it in place. This is handled using the
% \enquote{peek} functions. The generic \cs{peek_after:Nw} is provided
-% along with a family of predefined tests for common cases. As peeking
-% ahead does \emph{not} skip spaces the predefined tests include both a
-% space-respecting and space-skipping version. In addition, using
-% \cs{peek_analysis_map_inline:n}, one can map through the following
-% tokens in the input stream and repeatedly perform some tests.
+% along with a family of predefined tests for common cases. Peeking
+% ahead does \emph{not} skip spaces: rather, \cs{peek_remove_spaces:n}.
+% should be used. In addition, using \cs{peek_analysis_map_inline:n},
+% one can map through the following tokens in the input stream and
+% repeatedly perform some tests.
%
% \begin{function}{\peek_after:Nw}
% \begin{syntax}
@@ -957,7 +964,7 @@
% (as appropriate to the result of the test).
% \end{function}
%
-% \begin{function}[added = 2020-12-03, updated = 2022-10-03]
+% \begin{function}[added = 2020-12-03, updated = 2024-02-07]
% {\peek_analysis_map_inline:n}
% \begin{syntax}
% \cs{peek_analysis_map_inline:n} \Arg{inline function}
@@ -998,6 +1005,12 @@
% effect after the loop. Within the code, \cs{l_peek_token} is set
% equal (as a token, not a token list) to the token under
% consideration.
+% \begin{texnote}
+% In case the input stream has not yet been tokenized (converted
+% from characters to tokens), characters are tokenized one by one as
+% needed by \cs{peek_analysis_map_inline:n} using the current
+% category code regime.
+% \end{texnote}
% \end{function}
%
% \begin{function}[added = 2020-12-03]
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index ce11f62ae2..de3b6067ba 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-01-22}
+% \date{Released 2024-02-13}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index d74db5c796..09f28f0667 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex
index 5ccc140197..1e396b15fb 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/contrib/l3kernel/source3body.tex
@@ -272,7 +272,11 @@ following argument specifiers:
dependent and their name can change without warning, thus their
use is \emph{strongly discouraged} in package code: programmers
should instead use the interfaces documented in
- \href{interface3.pdf}{interface3.pdf}.
+ \ifinterface
+ this documentation.
+ \else
+ \href{interface3.pdf}{interface3.pdf}.
+ \fi
\end{description}
Notice that the argument specifier describes how the argument is
processed prior to being passed to the underlying function. For example,
@@ -607,8 +611,7 @@ used on top of \LaTeXe{} if \tn{outer} tokens are used in the arguments.
\DocInput{l3color.dtx}
\DocInput{l3pdf.dtx}
-\part{Removals}
-
+% implementation part only
\ExplSyntaxOn
\clist_gput_right:Nn \g_docinput_clist { l3deprecation.dtx }
\clist_gput_right:Nn \g_docinput_clist { l3debug.dtx }
diff --git a/macros/latex/contrib/l3packages/CHANGELOG.md b/macros/latex/contrib/l3packages/CHANGELOG.md
index 05001a0e8f..abef360b7a 100644
--- a/macros/latex/contrib/l3packages/CHANGELOG.md
+++ b/macros/latex/contrib/l3packages/CHANGELOG.md
@@ -7,6 +7,15 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2024-02-13]
+
+### Changed
+- Preparation for move of `xtemplate` concepts to the kernel
+
+### Removed
+- `\IfInstanceExist(TF)`
+- `xfrac`: moved to https://github.com/latex3/xfrac
+
## [2023-10-10]
### Changed
@@ -65,7 +74,7 @@ this project uses date-based 'snapshot' version identifiers.
## [2022-05-30]
-## Added
+### Added
- `\SetTemplateKeys` for _ad hoc_ adjustment of template values
### Changed
@@ -99,19 +108,16 @@ this project uses date-based 'snapshot' version identifiers.
## [2021-06-18]
### Fixed
-
- Correct internal changes to message naming
## [2021-06-01]
### Fixed
-
- Restore one parameter in `xfrac`
## [2021-05-27]
### Changed
-
- Internal changes to message naming
## [2021-05-07]
@@ -237,7 +243,8 @@ this project uses date-based 'snapshot' version identifiers.
- Switch to ISO date format
- Improve cross-module use of internal functions
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-10-10...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2024-02-13...HEAD
+[2024-02-13]: https://github.com/latex3/latex3/compare/2023-10-10...2024-02-13
[2023-10-10]: https://github.com/latex3/latex3/compare/2023-08-29...2023-10-10
[2023-08-29]: https://github.com/latex3/latex3/compare/2023-02-02...2023-08-29
[2023-02-02]: https://github.com/latex3/latex3/compare/2023-02-01...2023-02-02
diff --git a/macros/latex/contrib/l3packages/README.md b/macros/latex/contrib/l3packages/README.md
index d3ecea7028..2579ee6e96 100644
--- a/macros/latex/contrib/l3packages/README.md
+++ b/macros/latex/contrib/l3packages/README.md
@@ -1,99 +1,37 @@
-LaTeX3 High-Level Concepts
-==========================
+# `l3packages`: Higher-level LaTeX3 Concepts (Deprecated)
-Release 2023-10-10
+Release 2024-02-13
-Overview
---------
+## Overview
-The `l3packages` collection contains implementations for aspects of the
-LaTeX3 kernel, dealing with higher-level ideas such as the Designer Interface.
-The packages here are considered broadly stable (The LaTeX Project does not
-expect the interfaces to alter radically). These packages are build on LaTeX2e
-conventions at the interface level, and so may not migrate in the current form
-to a stand-alone LaTeX3 format.
+The `l3packages` collection dealing with higher-level ideas such as the
+Designer Interface, as part of 'LaTeX3' developments. The packages here have
+over time migrated into the LaTeX kernel: the material here is retained to
+support older files.
-All of the material in the collection requires the LaTeX3 base layer package
-[`l3kernel`](http://ctan.org/pkg/l3kernel). The two packages must be installed
-in matching versions: if you update `l3packages`, make sure that `l3kernel` is
-updated at the same time.
+The appropriate LaTeX kernel releases incorporating the ideas from the packages
+here are
-Currently included in the CTAN release of `l3packages` are the following
-bundles:
-* `l3keys2e` (deprecated in favor of updated LaTeX kernel methods)
-* `xfp` (from 2022-06-01 part of the LaTeX format)
-* `xfrac`
-* `xparse` (deprecated in favor of elements move to the LaTeX kernel)
-* `xtemplate`
+- `l3keys2e` 2022-06-01
+- `xfp` 2022-06-01
+- `xparse` 2020-10-01
+- `xtemplate` 2024-06-01
-`l3keys2e` (deprecated)
-----------
+## Issues
-The `l3keys2e` package allows keys defined using `l3keys` to be used as package
-and class options with LaTeX2e. This is tied to the method the existing kernel
-uses for processing options, and so it is likely that a stand-alone LaTeX3
-kernel will use a very different approach.
-
-`xfp` (deprecated)
------
-
-The `xfp` package provides a document-level interface for the LaTeX3
-FPU. As such, it is a wrapper around the core `\fp_eval:n` function
-but does not require code syntax. It provides the expandable command
-`\fpeval`, which can be used inside for example `\edef` or contexts
-where TeX requires a number.
-
-From 2022-06-01 release of LaTeX this will be included in the format
-so that the package doesn't need loading any longer.
-
-`xfrac`
--------
-
-The `xfrac` package uses the interface defined by `xtemplate` to provide
-flexible split-level fractions _via_ the `\sfrac` macro. This is both a
-demonstration of the power of the template concept and also a useful addition
-to the available functionality in LaTeX2e.
-
-`xparse` (deprecated)
--------
-
-The `xparse` package provides a high-level interface for declaring document
-commands, e.g., a uniform way to define commands taking optional arguments,
-optional stars (and others), mandatory arguments and more.
-
-The development of `xparse` moved to the
-[LaTeX2e repository](https://github.com/latex3/latex2e) as `ltcmd`, which is
-preloaded in the LaTeX format, and the code for `xparse` in this repository
-contains only the deprecated argument types `G`, `l`, and `u`.
-
-`xtemplate`
------------
-
-The `xtemplate` package provides an interface for defining generic
-functions using a key=val syntax. This is designed to be
-"self-documenting", with the key definitions providing information
-on how they are to be used.
-
-
-Issues
-------
-
-The issue tracker for LaTeX3 is currently located
+The issue tracker for LaTeX is currently located
[on GitHub](https://github.com/latex3/latex3/issues).
+## Development team
-The LaTeX Project
-------------------
+This code is developed by [The LaTeX Project](https://latex-project.org).
-Development of LaTeX3 is carried out by
-[The LaTeX Project](https://www.latex-project.org/latex3/).
+## License
-The development team can be contacted
-by e-mail: <latex-team@latex-project.org>; for general LaTeX3 discussion
-the [LaTeX-L list](#Discussion) should be used.
+Released under the LaTeX Project Public License v1.3c or later. See https://www.latex-project.org/lppl.txt
-----
-<p>Copyright (C) 1998-2012,2015-2023 The LaTeX Project <br />
-<a href="http://latex-project.org/">http://latex-project.org/</a> <br />
+<p>Copyright (C) 2024 The LaTeX Project <br />
+<a href="https://latex-project.org/">https://latex-project.org/</a> <br />
All rights reserved.</p>
diff --git a/macros/latex/contrib/l3packages/l3keys2e.dtx b/macros/latex/contrib/l3packages/l3keys2e.dtx
index 376cb136ac..f5c494120a 100644
--- a/macros/latex/contrib/l3packages/l3keys2e.dtx
+++ b/macros/latex/contrib/l3packages/l3keys2e.dtx
@@ -2,7 +2,7 @@
%
%% File: l3keys2e.dtx
%
-% Copyright (C) 2009,2011-2023 The LaTeX Project
+% Copyright (C) 2009-2024 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
@@ -49,7 +49,7 @@
% \fi
%
% \title{^^A
-% The \textsf{l3keys2e} package\\
+% The \pkg{l3keys2e} package\\
% \LaTeXe{} option processing using \LaTeX3 keys^^A
% }
%
@@ -62,7 +62,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -154,7 +154,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2023-10-10}{}
+\ProvidesExplPackage{l3keys2e}{2024-02-13}{}
{LaTeX2e option processing using LaTeX3 keys}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/l3keys2e.ins b/macros/latex/contrib/l3packages/l3keys2e.ins
index 667debde59..c4d1545e13 100644
--- a/macros/latex/contrib/l3packages/l3keys2e.ins
+++ b/macros/latex/contrib/l3packages/l3keys2e.ins
@@ -2,7 +2,7 @@
File: l3keys2e.ins
-Copyright (C) 2009,2011,2012,2016,2017,2019-2023 The LaTeX Project
+Copyright (C) 2009,2011,2012,2016,2017,2019-2024 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
@@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN.
\preamble
-Copyright (C) 2009-2023 The LaTeX Project
+Copyright (C) 2009-2024 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
diff --git a/macros/latex/contrib/l3packages/l3keys2e.pdf b/macros/latex/contrib/l3packages/l3keys2e.pdf
index cfef37deff..a6e0bd9e41 100644
--- a/macros/latex/contrib/l3packages/l3keys2e.pdf
+++ b/macros/latex/contrib/l3packages/l3keys2e.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xfp.dtx b/macros/latex/contrib/l3packages/xfp.dtx
index 2c3a5bf732..d695d44bb1 100644
--- a/macros/latex/contrib/l3packages/xfp.dtx
+++ b/macros/latex/contrib/l3packages/xfp.dtx
@@ -2,7 +2,7 @@
%
%% File: xfp.dtx
%
-% Copyright (C) 2017-2023 The LaTeX Project
+% Copyright (C) 2017-2024 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,7 +51,7 @@
% \providecommand\nan{\texttt{NaN}}
%
% \title{^^A
-% The \textsf{xfp} package\\Floating Point Unit^^A
+% The \pkg{xfp} package\\ Floating Point Unit^^A
% }
%
% \author{^^A
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -171,7 +171,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfp}{2023-10-10}{}
+\ProvidesExplPackage{xfp}{2024-02-13}{}
{L3 Floating point unit}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xfp.ins b/macros/latex/contrib/l3packages/xfp.ins
index 266bfa1661..d7d1ff046a 100644
--- a/macros/latex/contrib/l3packages/xfp.ins
+++ b/macros/latex/contrib/l3packages/xfp.ins
@@ -2,7 +2,7 @@
File: xfp.ins
-Copyright (C) 2017,2019-2023 The LaTeX Project
+Copyright (C) 2017,2019-2024 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
@@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN.
\preamble
-Copyright (C) 2017-2023 The LaTeX Project
+Copyright (C) 2017-2024 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
diff --git a/macros/latex/contrib/l3packages/xfp.pdf b/macros/latex/contrib/l3packages/xfp.pdf
index aa5b6c0293..b45cdd5b15 100644
--- a/macros/latex/contrib/l3packages/xfp.pdf
+++ b/macros/latex/contrib/l3packages/xfp.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xfrac.dtx b/macros/latex/contrib/l3packages/xfrac.dtx
deleted file mode 100644
index 6bce5f93ee..0000000000
--- a/macros/latex/contrib/l3packages/xfrac.dtx
+++ /dev/null
@@ -1,1141 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: xfrac.dtx
-%
-% Copyright (C) 2004,2008-2010 Morten Hoegholm
-% (C) 2011,2012,2014-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
-%
-% This file is part of the "l3packages bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver|package>
-% The version of expl3 required is tested as early as possible, as
-% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2018/02/21]
-%<package>\@ifpackagelater{expl3}{2018/02/21}
-%<package> {}
-%<package> {%
-%<package> \PackageError{xfrac}{Support package l3kernel too old}
-%<package> {%
-%<package> Please install an up to date version of l3kernel\MessageBreak
-%<package> using your TeX package manager or from CTAN.\MessageBreak
-%<package> \MessageBreak
-%<package> Loading xfrac will abort!%
-%<package> }%
-%<package> \endinput
-%<package> }
-\RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate}
-%</driver|package>
-%<*driver>
-\documentclass[full]{l3doc}
-\usepackage{nicefrac,xfrac} ^^A Need nicefrac for demo purposes
-\providecommand*\key[1]{\textbf{#1}}
-\newcommand*\switch[2]{{\fontfamily{#1}\selectfont #2}}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \textsf{xfrac} package\\ Split-level fractions^^A
-% }
-%
-% \author{^^A
-% The \LaTeX{} Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2023-10-10}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% The \pkg{xfrac} package defines a document command \cs{sfrac}
-% with the following syntax:
-% \begin{quote}
-% \cs{sfrac}\oarg{instance}\marg{num}\oarg{sep}\marg{denom}
-% \end{quote}
-% Let's show a few examples:
-% \begin{verbatim}
-% \sfrac{1}{2}, $\sfrac{1}{2}$,
-% $\mathbf{3\times\sfrac{1}{2}}$
-% \quad \fontfamily{ppl}\selectfont Palatino: \sfrac{1}{2}
-% \quad \fontfamily{ptm}\selectfont Times: \sfrac{1}{2}
-% \end{verbatim}
-% \begin{quote}
-% \sfrac{1}{2}, $\sfrac{1}{2}$, $\mathbf{3\times\sfrac{1}{2}}$
-% \quad \fontfamily{ppl}\selectfont Palatino: \sfrac{1}{2}
-% \quad \fontfamily{ptm}\selectfont Times: \sfrac{1}{2}
-% \end{quote}
-% You'll notice something interesting: not only does the \cs{sfrac}
-% command work as it should in math mode, it also gets the job done
-% for other fonts as well.
-%
-% \section{A Bit of History}
-%
-% \subsection{The Past}
-%
-% One of the first exercises in \emph{The \TeX{}Book} is to design a
-% macro for split level fractions. The solution presented is fairly
-% simple, using a \emph{virgule} (a slash) for separating the two
-% components. It looks okay because the text font and math font of
-% Computer Modern look almost identical.
-%
-% The proper symbol to use instead of the virgule is a \emph{solidus}
-% which does not exist in Computer Modern. It is however available in
-% the European Computer Modern fonts, but I'll get back to that.
-%
-% \subsection{The Present}
-%
-% The most common way to produce split level fractions within \LaTeXe{}
-% is by means of the \pkg{nicefrac} package. Part of the reason it
-% has found widespread use is due to the strange design of the
-% built-in text fractions of the EC fonts, which look like this:
-% \textonehalf{}. The package is very simple to use but there are a few
-% issues:
-% \begin{itemize}
-% \item It uses the virgule instead of the solidus.
-% \item Font size of numerator and denominator is bigger than in the
-% built-in symbol. Compare Palatino: \switch{ppl}{\nicefrac{1}{2}}
-% \emph{vs.}~\switch{ppl}{\textonehalf}.
-% \item It doesn't correct for fonts using text figures such as in the
-% \pkg{eco} package. Compare \switch{cmor}{\nicefrac{1}{2}} and
-% \switch{cmor}{\nicefrac{8}{9}}.
-% \item In math mode, it doesn't always pick up the correct math
-% alphabet.
-% \end{itemize}
-% In short: \pkg{nicefrac} doesn't attempt to be the answer to
-% everything and so this is not a criticism of the package. It works
-% quite well for Computer Modern which was pretty much what was widely
-% available at the time it was developed. Users these days, however,
-% have a choice of many fonts when they write their documents.
-%
-% \subsection{The Future}
-%
-% Fonts are wildly different; one macro that works fine for Computer
-% Modern obviously doesn't work well at all in Palatino. For one we
-% have to make the separator symbol configurable, and we need to
-% take care of several details as well: font scaling of the
-% numerator/denominator pair (ND), font selection of ND, \emph{etc.} If we
-% are to have a single package for this in the future we have to define a
-% totally generic interface for the fraction commands and then adjust
-% parameters depending on the current font. What you see in this
-% prototype implementation of \pkg{xfrac} is just that.
-%
-% \section{Advanced User Interface}
-%
-% \subsection{Text mode}
-%
-% The usual problem in text mode has a name: Computer Modern. The
-% solidi of all the Computer Modern fonts leave a lot to be desired,
-% although things are potentially looking better as the Latin Modern
-% fonts are becoming more stable and widespread. As long as the
-% default fonts are Computer Modern variants we must however work
-% around this. One idea that comes to mind is to see what happens
-% when you use a solidus from another font instead. Let's try with
-% Times:
-% \begin{quote}
-% \DeclareInstance{xfrac}{cmr2}{text}
-% {slash-symbol-font = ptm}
-% \enquote{You take \sfrac[cmr2]{1}{2} cup of sugar, \ldots}
-% \end{quote}
-% That looks quite good actually, so it was probably very difficult
-% to obtain that result. Nope, it was extremely easy---if you happen
-% to know about \emph{instances}:
-% \begin{verbatim}
-% \DeclareInstance{xfrac}{cmr}{text}
-% {slash-symbol-font = ptm}
-% \end{verbatim}
-% So we define an instance with the name |cmr| from the template
-% |text| which in turn is of object type |xfrac|. You'll notice
-% the |cmr| is also the name of the font family for Computer Modern
-% Roman and the reasoning behind is that every font family should
-% have it's own settings, and if a document command is to work well
-% in that scheme, letting it use the name of the current font family
-% seems like a good idea. Thus the \cs{sfrac} command checks to see
-% whether an instance with same name as the current font family
-% exists and uses it if the test is true; otherwise the default
-% setting is used. Here we defined the instance to be used for the
-% font family |cmr| and just told it to use the Times font for
-% typesetting the slash symbol which turns out to be a solidus by
-% default.
-%
-% The option \texttt{cm-recommended} which is loaded by default uses
-% the Times solidus for Computer Modern Roman and Computer Modern
-% Sans Serif and the Palatino solidus for Computer Modern Typewriter
-% Type. This looks quite good. Should you however not want this you
-% can use the option \texttt{cm-standard} which produces somewhat
-% acceptable results using Computer Modern exclusively.
-%
-% So what about old style figures? If you use the \pkg{eco}
-% package you might define an instance similar to this (`cmor' is
-% the name of the roman font activated by \pkg{eco}):
-% \DeclareInstance{xfrac}{cmor}{text}
-% {
-% slash-symbol-font = ptm,
-% numerator-font = cmr,
-% denominator-font = cmr
-% }
-% \begin{verbatim}
-% \DeclareInstance{xfrac}{cmor}{text}
-% {
-% slash-symbol-font = ptm,
-% numerator-font = cmr,
-% denominator-font = cmr
-% }
-% \end{verbatim}
-% We also use regular Computer Modern Roman for typesetting ND, so
-% we end up with \switch{cmor}{\sfrac{1}{2}} and
-% \switch{cmor}{\sfrac{8}{9}} instead of
-% \switch{cmor}{\nicefrac{1}{2}} and \switch{cmor}{\nicefrac{8}{9}}.
-% Much better.
-%
-% There are also situations where other tricks are useful. If you
-% don't have the inferior and superior figures available in a font,
-% or the font doesn't have a wider design for small font sizes, you
-% can cheat by manually scaling the ND-pair. I got nice results for
-% Adobe's Stempel Garamond (with small caps and old style figures)
-% with the following setup:
-% \begin{verbatim}
-% \DeclareInstance{xfrac}{pegj}{text}
-% {
-% numerator-font = pegx,
-% denominator-font = pegx,
-% scale-factor = 0.9,
-% h-scale = 1.1
-% }
-% \end{verbatim}
-% We use the font family |pegx| (Stempel Garamond with real small
-% caps) for typesetting the ND-pair. Additionally the key
-% \key{scale-factor} specifies that the font size used for the
-% ND-pair should be $0.9$ of the height of the solidus, and the key
-% \key{h-scale} specifies that the ND-pair should be scaled an extra
-% 10\,\% horizontally.
-%
-% Should you be so fortunate the have a font with inferior and
-% superior figures like in the Monotype Janson example from Philipp
-% Lehman's excellent \emph{The Font Installation Guide}. In that
-% example Philipp defines the font families |mjn0| for the inferior
-% figures and |mjn1| for the superior. Thus to get the \cs{sfrac}
-% command to use them on the fly for the font family |mjnj| (Janson,
-% old style figures) we would say
-% \begin{verbatim}
-% \DeclareInstance{xfrac}{mjnj}{text}
-% {
-% numerator-font = mjn1,
-% denominator-font = mjn0,
-% scaling = false,
-% numerator-bot-sep = 0 pt,
-% denominator-bot-sep = 0 pt
-% }
-% \end{verbatim}
-% I think this example is a very clean way to do it. An alternative
-% approach could be to use the keys \key{numerator-format} and
-% \key{denominator-format} to process the arguments and let them
-% determine what to do.
-%
-% \subsection{Math Mode}
-%
-% In math mode the choices are a lot fewer because first of all
-% \TeX{} comes with a built-in limitation of $16$ math families.
-% Additionally we will not need a solidus for typesetting split
-% fractions in math, as tradition is to use a virgule instead. We
-% define the basic |mathdefault| instance to simply use the math
-% family in use when the instance is run. So if we're in normal math
-% like |$\sfrac{7}{9}$| we simply get family~$-1$. If we're inside a
-% \cs{mathbf} we're in family~$4$ (in the standard setup at least),
-% and so the fraction is typeset with the same math family. Simple,
-% isn't?
-%
-% You can also declare instances for the math families, but I really
-% don't see why you would. If you do then name them according to the
-% scheme \texttt{mathfam\meta{N}}, where \meta{N} is the family number, and
-% only do it if you \emph{really} know how to set up math fonts.
-% That is, if \cs{DeclareMathAlphabet} is unbeknownst to you, then
-% just don't go there.
-%
-% Another example: If we want \cs{sfrac} to produce split fractions
-% without doing anything at all, we can choose the collection
-% |plainmath|, which is defined as
-% \begin{verbatim}
-% \DeclareCollectionInstance{plainmath}{xfrac}{mathdefault}{math}
-% {
-% denominator-bot-sep = 0 pt,
-% numerator-bot-sep = 0 pt,
-% numerator-top-sep = \c_max_dim,
-% scaling = false,
-% slash-right-mkern = 0 mu,
-% slash-left-mkern = 0 mu
-% }
-% \end{verbatim}
-% This creates an alternative version of the instance |mathdefault|
-% with settings as specified by the keys. In the default math setup
-% \key{numerator-top-sep} is set to 0~pt, and here we set
-% \key{numerator-bot-sep} to 0~pt as well, so in order to avoid
-% over-specification (and an error message) we must set
-% \key{numerator-top-sep} to \cs{c_max_dim}. We activate (obeying
-% normal scoping rules) it with:
-% \begin{verbatim}
-% \UseCollection{xfrac}{plainmath}
-% \end{verbatim}
-% Then |$\sfrac{8}{13}$| produces^^A
-% \begingroup
-% \UseCollection{xfrac}{plainmath}
-% $\sfrac{8}{13}$ and just typing |$8/13$| gives the same result:
-% $8/13$.
-% \endgroup
-%
-% \section{The Template Interface}
-%
-% \begin{TemplateInterfaceDescription}{xfrac}
-%
-% \TemplateArgument{1}{The numerator}
-%
-% \TemplateArgument{2}{The separator}
-%
-% \TemplateArgument{3}{The denominator}
-%
-% \TemplateSemantics
-%
-% Typesets arguments 1 and 3 separated by argument 2, which in text
-% mode by default is a \emph{solidus}. This is taken from
-% \pkg{textcomp} where it is denoted \cs{textfractionsolidus}.
-% This is the character used for the ready made split level
-% fractions such as \textonehalf{}---except in the (European) Computer
-% Modern fonts. In math mode a \emph{virgule} is used instead as
-% this is more appropriate and it is always available in the math
-% fonts. The solidus is a text symbol only.
-%
-% \end{TemplateInterfaceDescription}
-%
-% \begin{TemplateDescription}{xfrac}{text}
-%
-% \TemplateKey{numerator-font}{tokenlist}
-% {Font family specification to use for the numerator.}
-% {\cs{f@family}}
-%
-% \TemplateKey{numerator-format}{function 1 arg}
-% {Action to be taken on the numerator.}
-% {Process argument unchanged}
-%
-% \TemplateKey{slash-symbol}{tokenlist}
-% {The separator symbol. If not specified the default value will be
-% used instead.}
-% {Solidus (\cs{textfractionsolidus})}
-%
-% \TemplateKey{slash-symbol-font}{tokenlist}
-% {Font family specification to use for the separator symbol.}
-% {\cs{f@family}}
-%
-% \TemplateKey{slash-symbol-format}{function 1 arg}
-% {Action to be taken on the separator symbol.}
-% {Process argument unchanged}
-%
-% \TemplateKey{denominator-font}{tokenlist}
-% {Font family specification to use for the denominator.}
-% {\cs{f@family}}
-%
-% \TemplateKey{denominator-format}{function 1 arg}
-% {Action to be taken on the denominator.}
-% {Process argument unchanged}
-%
-% \TemplateKey{h-scale}{real}
-% {Factor by which the numerator and denominator should be
-% horizontally scaled. It should only be used if the real superior
-% and inferior fonts are not available. For instance Stempel
-% Garamond looks excellent if scaled 10\,\% extra horizontally, \emph{i.e.},
-% by a factor of 1.1.}
-% {1}
-%
-% \TemplateKey{v-scale}{real}
-% {Same as \key{h-scale} only vertically. Probably not of much use
-% but added for completeness.}
-% {1}
-%
-% \TemplateKey{scale-factor}{real}
-% {Fraction of the size of \key{slash-symbol}. Used for setting the
-% font size of numerator and denominator. Usually a value of app.\
-% \sfrac{5}{6} produces fine results. It should only be used if the
-% real superior and inferior fonts are not available. As an example
-% Stempel Garamond looks better if the factor is 0.9.}
-% {0.83333}
-%
-% \TemplateKey{scale-relative}{choice}
-% {If set to |true| the font size of the numerator and denominator
-% is scaled with respect to the height of the \key{slash-symbol}. If
-% set to |false| the font is scaled with respect to the total height
-% of the \key{slash-symbol}.}
-% {true}
-%
-% \TemplateKey{scaling}{choice}
-% {If set to |true| the fonts are allowed to scale. If set to
-% |false| they are not. See the `Janson' example for an application.}
-% {true}
-%
-% \TemplateKey{numerator-top-sep}{length}
-% {Dimension specifying the space between the top of the
-% \key{slash-symbol} and the top of the numerator. If not specified,
-% the depth of the solidus will be used, because this value will
-% make the fraction look even.}
-% {Unspecified}
-%
-% \TemplateKey{numerator-bot-sep}{length}
-% {Dimension specifying the lift of the numerator from the
-% baseline.}
-% {Unspecified}
-%
-% \TemplateKey{denominator-bot-sep}{length}
-% {Dimension specifying the lift of the denominator from the
-% baseline.}
-% {Unspecified}
-%
-% \TemplateKey{slash-right-kern}{length}
-% {Dimension specifying the kerning between the \key{slash-symbol}
-% and the numerator.}
-% {\texttt{0pt}}
-%
-% \TemplateKey{slash-left-kern}{length}
-% {Dimension specifying the kerning between the \key{slash-symbol}
-% and the denominator.}
-% {\texttt{0pt}}
-%
-% \TemplateKey{math-mode}{choice}
-% {Are we in math mode or not?}
-% {false}
-%
-% \TemplateKey{phantom}{tokenlist}
-% {A character that suits the common cases. As we would mostly want
-% to use numbers in text mode we choose a \enquote{tall} number, while in
-% math it is somewhat different.}
-% {8}
-%
-% \TemplateSemantics
-%
-% This template is also the foundation for the \enquote{math} template. The
-% keys \key{slash-right-mkern} and \key{slash-left-mkern} can only
-% be used in math mode and are not shown here.
-%
-% \end{TemplateDescription}
-%
-% \begin{TemplateDescription}{xfrac}{math}
-%
-% \TemplateKey{numerator-font}{tokenlist}
-% {Font family specification to use for the numerator.}
-% {\cs{number}\cs{fam}}
-%
-% \TemplateKey{slash-symbol}{tokenlist}
-% {The separator symbol. If not specified the default value will be
-% used instead.}
-% {Virgule ($/$)}
-%
-% \TemplateKey{slash-symbol-font}{tokenlist}
-% {Font family specification to use for the separator symbol.}
-% {\cs{number}\cs{fam}}
-%
-% \TemplateKey{denominator-font}{tokenlist}
-% {Font family specification to use for the denominator.}
-% {\cs{number}\cs{fam}}
-%
-% \TemplateKey{scale-factor}{real}
-% {Fraction of the size of \key{slash-symbol}. In math mode we
-% cannot rely on the fonts to be able to scale, but giving a default
-% scale of 0.7 fits into the regular size changing scheme---the
-% default scheme has values $(D,T,S,SS)=(1,1,0.7,0.5)$ whereas we
-% with a default \key{scale-factor} of 0.7 get $(1,1,0.7,0.49)$.
-% That's close enough.}
-% {0.7}
-%
-% \TemplateKey{scale-relative}{choice}
-% {If set to |true| the font size of the numerator and denominator
-% is scaled with respect to the height of the \key{slash-symbol}. If
-% set to |false| the font is scaled with respect to the total height
-% of the \key{slash-symbol}.}
-% {false}
-%
-% \TemplateKey{scaling}{choice}
-% {If set to |true| the fonts are allowed to scale. If set to
-% |false| they are not. See the |plainmath| example for an application.}
-% {true}
-%
-% \TemplateKey{numerator-top-sep}{length}
-% {Dimension specifying the space between the top of the
-% \key{slash-symbol} and the top of the numerator. If not specified,
-% the depth of the virgule will be used, because this value will
-% make the fraction look even.}
-% {\texttt{0pt}}
-%
-% \TemplateKey{denominator-bot-sep}{length}
-% {Dimension specifying the lift of the denominator from the
-% baseline.}
-% {\texttt{0pt}}
-%
-% \TemplateKey{slash-right-mkern}{muskip}
-% {Same as \key{slash-right-kern} but for math mode only and should
-% be specified in \texttt{mu} units.}
-% {\texttt{-2mu}}
-%
-% \TemplateKey{slash-left-mkern}{muskip}
-% {Same as \key{slash-left-kern} but for math mode only and should
-% be specified in \texttt{mu} units.}
-% {\texttt{-1mu}}
-%
-% \TemplateKey{math-mode}{choice}
-% {Are we in math mode or not?}
-% {true}
-%
-% \TemplateKey{phantom}{tokenlist}
-% {A character that suits the common cases. In math we have a high
-% risk of using a parenthesis, so we choose that. Text mode is
-% another story.}
-% {(^^A)
-% }
-%
-% \TemplateSemantics
-%
-% This template is a restricted version of the |text| template. Only
-% the keys that are different from the |text| template are shown
-% here. Also bear in mind that the attributes \key{slash-left-kern}
-% and \key{slash-right-kern} have no meaning in this template.
-%
-% \end{TemplateDescription}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{xfrac} implementation}
-%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=xfrac>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2023-10-10}{}
- {L3 Experimental split-level fractions}
-% \end{macrocode}
-%
-% \begin{variable}{\l_@@_cm_std_bool}
-% There is one option to support.
-% \begin{macrocode}
-\keys_define:nn { xfrac }
- {
- cm-recommended .choice:,
- cm-recommended /
- false .code:n =
- { \bool_set_true:N \l_@@_cm_std_bool },
- cm-recommended /
- true .code:n =
- { \bool_set_false:N \l_@@_cm_std_bool },
- cm-recommended .default:n = { true },
- cm-standard .bool_set:N = \l_@@_cm_std_bool
- }
-\ProcessKeysOptions { xfrac }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_slash_box}
-% \begin{variable}{\l_@@_tmp_box}
-% In keeping with the \LaTeX3 philosophy, rather than use generic
-% scratch boxes and get confused, \pkg{xfrac} reserves its own named
-% working space.
-% \begin{macrocode}
-\box_new:N \l_@@_slash_box
-\box_new:N \l_@@_tmp_box
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-%
-% \begin{macro}{\@@_tmp:w}
-% Used for the raised boxes: weird as it does not take an argument
-% but the \cs{raisebox} does.
-% \begin{macrocode}
-\cs_new:Npn \@@_tmp:w { }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Initialisation of variables}
-%
-% Variables used in templates have to be set up: there is not
-% much to say about these, other than that they must exist.
-%
-% \begin{variable}{\l_@@_denominator_bot_sep_dim}
-% \begin{variable}{\l_@@_numerator_bot_sep_dim}
-% \begin{variable}{\l_@@_numerator_top_sep_dim}
-% \begin{variable}{\l_@@_slash_left_sep_dim}
-% \begin{variable}{\l_@@_slash_right_sep_dim}
-% Fixed lengths.
-% \begin{macrocode}
-\dim_new:N \l_@@_denominator_bot_sep_dim
-\dim_new:N \l_@@_numerator_bot_sep_dim
-\dim_new:N \l_@@_numerator_top_sep_dim
-\dim_new:N \l_@@_slash_left_sep_dim
-\dim_new:N \l_@@_slash_right_sep_dim
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_slash_left_muskip}
-% \begin{variable}{\l_@@_slash_right_muskip}
-% Math mode skips.
-% \begin{macrocode}
-\muskip_new:N \l_@@_slash_left_muskip
-\muskip_new:N \l_@@_slash_right_muskip
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_hscale_fp}
-% \begin{variable}{\l_@@_scale_factor_fp}
-% \begin{variable}{\l_@@_vscale_fp}
-% Floating point values.
-% \begin{macrocode}
-\fp_new:N \l_@@_hscale_fp
-\fp_new:N \l_@@_scale_factor_fp
-\fp_new:N \l_@@_vscale_fp
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_denominator_font_tl}
-% \begin{variable}{\l_@@_numerator_font_tl}
-% \begin{variable}{\l_@@_phantom_tl }
-% \begin{variable}{\l_@@_slash_symbol_tl}
-% \begin{variable}{\l_@@_slash_symbol_font_tl}
-% Token lists, which include floating-point numbers and math(s)
-% skips.
-% \begin{macrocode}
-\tl_new:N \l_@@_denominator_font_tl
-\tl_new:N \l_@@_numerator_font_tl
-\tl_new:N \l_@@_phantom_tl
-\tl_new:N \l_@@_slash_symbol_tl
-\tl_new:N \l_@@_slash_symbol_font_tl
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{macro}{\@@_fontscale:}
-% \begin{macro}{\@@_math:n}
-% \begin{macro}{\@@_denominator_font_change:}
-% \begin{macro}{\@@_denominator_format:n}
-% \begin{macro}{\@@_numerator_font_change:}
-% \begin{macro}{\@@_numerator_format:n}
-% \begin{macro}{\@@_relscale:}
-% \begin{macro}{\@@_slash_symbol_font_change:}
-% \begin{macro}{\@@_slash_symbol_format:n}
-% \begin{macro}{\@@_text_or_math:n}
-% Functions, either things which are calculated \enquote{on the fly}
-% (no argument required) or are functions taking one argument in the
-% code.
-% \begin{macrocode}
-\cs_new:Npn \@@_fontscale: { }
-\cs_new:Npn \@@_math:n #1 { }
-\cs_new:Npn \@@_denominator_font_change: { }
-\cs_new:Npn \@@_denominator_format:n #1 { }
-\cs_new:Npn \@@_numerator_font_change: { }
-\cs_new:Npn \@@_numerator_format:n #1 { }
-\cs_new:Npn \@@_relscale: { }
-\cs_new:Npn \@@_slash_symbol_font_change: { }
-\cs_new:Npn \@@_slash_symbol_format:n #1 { }
-\cs_new:Npn \@@_text_or_math:n #1 { }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{The template}
-%
-% There is only one object type in \pkg{xfrac}, rather unimaginatively
-% named \texttt{xfrac}.
-% \begin{macrocode}
-\DeclareObjectType { xfrac } { 3 }
-% \end{macrocode}
-%
-% A single template interface is used for both text and math(s), which
-% does make a few things a little complex later.
-% \begin{macrocode}
-\DeclareTemplateInterface { xfrac } { text } { 3 }
- {
- denominator-bot-sep : length = \c_max_dim ,
- denominator-font : tokenlist = \f@family ,
- denominator-format : function 1 = #1 ,
- h-scale : real = 1 ,
- math-mode : choice { false , true }
- = false ,
- numerator-font : tokenlist = \f@family ,
- numerator-format : function 1 = #1 ,
- numerator-bot-sep : length = \c_max_dim ,
- numerator-top-sep : length = \c_max_dim ,
- phantom : tokenlist = 8 ,
- scale-factor : real = 0.83333 ,
- scale-relative : choice { false , true }
- = true ,
- scaling : choice { false , true }
- = true ,
- slash-left-kern : length = 0 pt ,
- slash-left-mkern : muskip = -2 mu ,
- slash-right-kern : length = 0 pt ,
- slash-right-mkern : muskip = -1 mu ,
- slash-symbol : tokenlist = \textfractionsolidus ,
- slash-symbol-font : tokenlist = \f@family ,
- slash-symbol-format : function 1 = #1 ,
- v-scale : real = 1 ,
- }
-% \end{macrocode}
-% Most of the variable binding is quite simple: of course, the choices
-% are a little more complicated. That is particularly true where
-% these have to set up \enquote{on the fly} functions.
-% \begin{macrocode}
-\DeclareTemplateCode { xfrac } { text } { 3 }
- {
- denominator-bot-sep = \l_@@_denominator_bot_sep_dim ,
- denominator-font = \l_@@_denominator_font_tl ,
- denominator-format = \@@_denominator_format:n ,
- h-scale = \l_@@_hscale_fp ,
- math-mode =
- {
- false = \cs_set_eq:NN \@@_math:n \use:n,
- true = \cs_set_eq:NN \@@_math:n \ensuremath
- },
- numerator-font = \l_@@_numerator_font_tl ,
- numerator-format = \@@_numerator_format:n ,
- numerator-bot-sep = \l_@@_numerator_bot_sep_dim ,
- numerator-top-sep = \l_@@_numerator_top_sep_dim ,
- phantom = \l_@@_phantom_tl ,
- scale-factor = \l_@@_scale_factor_fp ,
- scale-relative =
- {
- false =
- \cs_set:Npn \@@_relscale:
- {
- \dim_eval:n
- { \box_ht:N \l_@@_tmp_box + \box_dp:N \l_@@_tmp_box }
- },
- true =
- \cs_set:Npn \@@_relscale:
- { \dim_eval:n { \box_ht:N \l_@@_slash_box } }
- },
- scaling =
- {
- false = \cs_set_eq:NN \@@_fontscale: \prg_do_nothing:,
- true =
- \cs_set:Npn \@@_fontscale:
- {
- \fontsize
- { \fp_to_dim:n { \l_@@_scale_factor_fp * \@@_relscale: } }
- { \c_zero_dim }
- \selectfont
- }
- },
- slash-left-kern = \l_@@_slash_left_sep_dim ,
- slash-left-mkern = \l_@@_slash_left_muskip ,
- slash-right-kern = \l_@@_slash_right_sep_dim ,
- slash-right-mkern = \l_@@_slash_right_muskip ,
- slash-symbol = \l_@@_slash_symbol_tl ,
- slash-symbol-font = \l_@@_slash_symbol_font_tl ,
- slash-symbol-format = \@@_slash_symbol_format:n ,
- v-scale = \l_@@_vscale_fp
- }
-% \end{macrocode}
-% The implementation part starts with applying all of the settings
-% from above. The first part of the set up is then to determine
-% whether the surroundings are text or math(s), and react accordingly.
-% \begin{macrocode}
- {
- \mode_if_math:TF
- {
- \cs_set_eq:NN \@@_text_or_math:n \text
- \cs_set:Npe \@@_denominator_font_change:
- { \tex_fam:D \l_@@_denominator_font_tl }
- \cs_set:Npe \@@_numerator_font_change:
- { \tex_fam:D \l_@@_numerator_font_tl }
- \cs_set:Npe \@@_slash_symbol_font_change:
- { \tex_fam:D \l_@@_slash_symbol_font_tl }
- }
- {
- \cs_set_eq:NN \@@_text_or_math:n \mbox
- \cs_set:Npn \@@_denominator_font_change:
- {
- \fontfamily { \l_@@_denominator_font_tl }
- \selectfont
- }
- \cs_set:Npn \@@_numerator_font_change:
- {
- \fontfamily { \l_@@_numerator_font_tl }
- \selectfont
- }
- \cs_set:Npn \@@_slash_symbol_font_change:
- {
- \fontfamily { \l_@@_slash_symbol_font_tl }
- \selectfont
- }
- }
-% \end{macrocode}
-% Everything is now either inside \cs{text} or an \cs{mbox}, depending
-% upon the surroundings. First, there are some boxes to set up.
-% \begin{macrocode}
- \@@_text_or_math:n
- {
- \m@th
- \hbox_set:Nn \l_@@_tmp_box
- { \@@_math:n { \vphantom { ( ) } } }
- \hbox_set:Nn \l_@@_slash_box
- {
- \@@_math:n
- {
- \@@_slash_symbol_format:n
- {
- \@@_math:n
- {
- \@@_slash_symbol_font_change:
- \IfNoValueTF {#2}
- { \l_@@_slash_symbol_tl } {#2}
- }
- }
- }
- }
-% \end{macrocode}
-% Check on the numerator separator dimensions. The code starts with the
-% assumption that neither has been given, as this can then be used to
-% set up a default, which is also used when both values are set
-% erroneously.
-% \begin{macrocode}
- \cs_set:Npn \@@_tmp:w
- {
- \raisebox
- {
- \dim_eval:n
- {
- \box_ht:N \l_@@_slash_box
- - \box_dp:N \l_@@_slash_box
- - \height
- }
- }
- }
- \dim_compare:nNnTF
- { \l_@@_numerator_top_sep_dim } = { \c_max_dim }
- {
- \dim_compare:nNnF
- { \l_@@_numerator_bot_sep_dim } = { \c_max_dim }
- {
- \cs_set:Npn \@@_tmp:w
- {
- \raisebox
- { \dim_use:N \l_@@_numerator_bot_sep_dim }
- }
- }
- }
- {
- \dim_compare:nNnTF
- { \l_@@_numerator_bot_sep_dim } = { \c_max_dim }
- {
- \cs_set:Npn \@@_tmp:w
- {
- \raisebox
- {
- \dim_eval:n
- {
- \box_ht:N \l_@@_slash_box
- - \dim_use:N \l_@@_numerator_top_sep_dim
- - \height
- }
- }
- }
- }
- {
- \msg_error:nn { xfrac }
- { over-specified-numerator-sep }
- }
- }
-% \end{macrocode}
-% Typeset the numerator.
-% \begin{macrocode}
- \@@_tmp:w
- {
- \@@_fontscale:
- \@@_numerator_format:n
- {
- \scalebox
- { \fp_use:N \l_@@_hscale_fp }
- [ \fp_use:N \l_@@_vscale_fp ]
- {
- \@@_math:n
- {
- \@@_numerator_font_change:
- {
- \vphantom { \l_@@_phantom_tl }
- #1
- }
- }
- }
- }
- }
- \@@_math:n
- { % THIS IS JUST WRONG!
- \mode_if_math:TF
- { \tex_mskip:D \l_@@_slash_right_muskip }
- { \tex_hskip:D \l_@@_slash_right_sep_dim }
- }
-% \end{macrocode}
-% Typeset the separator.
-% \begin{macrocode}
- \box_use:N \l_@@_slash_box
- \@@_math:n
- {
- \mode_if_math:TF
- { \tex_mskip:D \l_@@_slash_left_muskip }
- { \tex_hskip:D \l_@@_slash_left_sep_dim }
- }
-% \end{macrocode}
-% Typeset the denominator.
-% \begin{macrocode}
- \dim_compare:nNnTF
- { \l_@@_denominator_bot_sep_dim } = { \c_max_dim }
- {
- \cs_set:Npn \@@_tmp:w
- { \raisebox { - \box_dp:N \l_@@_slash_box } }
- }
- {
- \cs_set:Npn \@@_tmp:w
- {
- \raisebox
- { \dim_use:N \l_@@_denominator_bot_sep_dim }
- }
- }
- \@@_tmp:w
- {
- \@@_fontscale:
- \@@_denominator_format:n
- {
- \scalebox
- { \fp_use:N \l_@@_hscale_fp }
- [ \fp_use:N \l_@@_vscale_fp ]
- {
- \@@_math:n
- {
- \@@_denominator_font_change:
- {
- \vphantom { \l_@@_phantom_tl }
- #3
- }
- }
- }
- }
- }
- }
- }
-% \end{macrocode}
-%
-% Since math(s) and text mode are wildly different entities we define a
-% separate template for each. You already saw the \enquote{text}
-% template, and here is the \enquote{math} template.
-% \begin{macrocode}
-\DeclareRestrictedTemplate { xfrac } { text } { math }
- {
- numerator-font = \number \fam ,
- slash-symbol = / ,
- slash-symbol-font = \number \fam ,
- denominator-font = \number \fam ,
- scale-factor = 0.7 ,
- scale-relative = false ,
- scaling = true ,
- denominator-bot-sep = 0 pt ,
- math-mode = true ,
- phantom = ( % )
- }
-% \end{macrocode}
-%
-%\subsection{The standard instances}
-%
-% For the default instances we just use the relevant templates with
-% the default settings.
-%
-% The default \enquote{text} instance.
-% \begin{macrocode}
-\DeclareInstance { xfrac } { default } { text } { }
-% \end{macrocode}
-%
-% The default \enquote{math(s)} instance. We annot set the
-% |numerator-top-sep| in the restricted template above as it clashes
-% with the requirements of the |plainmath| collection which comes next.
-% \begin{macrocode}
-\DeclareInstance { xfrac } { mathdefault } { math }
- { numerator-top-sep = 0pt }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareCollectionInstance { plainmath } { xfrac } { mathdefault } { math }
- {
- numerator-bot-sep = 0 pt ,
- numerator-top-sep = \c_max_dim ,
- scale-factor = 1 ,
- scale-relative = false ,
- scaling = true ,
- slash-right-mkern = 0 mu ,
- slash-left-mkern = 0 mu
- }
-% \end{macrocode}
-%
-% Default Computer Modern setup. Far from optimal, but better than
-% nothing.
-% \begin{macrocode}
-\DeclareInstance { xfrac } { cmr } { text }
- {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.2 ex ,
- slash-left-kern = -0.1 em ,
- slash-right-kern = -0.1 em
- }
-\DeclareInstance { xfrac } { cmss } { text }
- {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.2 ex ,
- slash-left-kern = -0.1 em ,
- slash-right-kern = -0.1 em
- }
-\DeclareInstance { xfrac } { cmtt } { text }
- {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.2 ex ,
- slash-left-kern = -0.1 em ,
- slash-right-kern = -0.1 em
- }
-% \end{macrocode}
-%
-% We can do better for the Computer Modern fonts. For cmr and cmss
-% we choose Times, and for cmtt use Palatino.
-% \begin{macrocode}
-\bool_if:NF \l_@@_cm_std_bool
- {
- \DeclareInstance { xfrac } { cmr } { text }
- { slash-symbol-font = ptm }
- \DeclareInstance { xfrac } { cmss } { text }
- { slash-symbol-font = ptm }
- \DeclareInstance { xfrac } { cmtt } { text }
- { slash-symbol-font = ppl }
- }
-% \end{macrocode}
-%
-% Things works slightly better with Latin Modern.
-% \begin{macrocode}
-\DeclareInstance { xfrac } { lmr } { text }
- {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0.1 ex ,
- slash-left-kern = -0.15 em ,
- slash-right-kern = -0.15 em
- }
-\DeclareInstance { xfrac } { lmss } { text }
- {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0 pt ,
- slash-left-kern = -0.15 em ,
- slash-right-kern = -0.15 em
- }
-\DeclareInstance { xfrac } { lmtt } { text }
- {
- denominator-bot-sep = 0 pt ,
- numerator-top-sep = 0 pt ,
- slash-left-kern = -0.15 em ,
- slash-right-kern = -0.15 em
- }
-% \end{macrocode}
-%
-% \subsection{The user command}
-%
-% \begin{macro}{\sfrac}
-% Currently there is just a single user command. \cs{sfrac} takes
-% two mandatory arguments: numerator and denominator. It can take an
-% optional argument between the mandatory specifying the separator
-% like this:
-% \begin{verbatim}
-% \sfrac{7}[/]{12}
-% \end{verbatim}
-% It also has an optional argument that comes before the first
-% mandatory argument. If used it will use that instance instead of
-% the auto-detected one, so a user who has defined the instance
-% \enquote{cmr2} may use
-% \begin{verbatim}
-% \sfrac[cmr2]{7}{12}
-% \end{verbatim}
-% and get the settings from \enquote{cmr2} instead of the settings of
-% the current font family.
-% \begin{macrocode}
-\NewDocumentCommand \sfrac { o m o m }
- {
- \mode_if_math:TF
- {
- \IfInstanceExistTF { xfrac } { mathfam \number \fam }
- { \UseInstance { xfrac } { mathfam \number \fam } }
- { \UseInstance { xfrac } { mathdefault } }
- {#2} {#3} {#4}
- }
- {
- \IfInstanceExistTF { xfrac } {#1}
- { \UseInstance { xfrac } {#1} }
- {
- \IfInstanceExistTF { xfrac } { \f@family }
- { \UseInstance { xfrac } { \f@family } }
- { \UseInstance { xfrac } { default } }
- }
- {#2} {#3} {#4}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Messages}
-%
-% Just the one.
-% \begin{macrocode}
-\msg_new:nnnn { xfrac } { over-specified-numerator-sep }
- { You~have~specified~both~"numerator-top-sep"~and~"numerator-bot-sep". }
- { I~will~pretend~that~you~didn't~specify~either~of~them. }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex
diff --git a/macros/latex/contrib/l3packages/xfrac.ins b/macros/latex/contrib/l3packages/xfrac.ins
deleted file mode 100644
index 511e68c3c3..0000000000
--- a/macros/latex/contrib/l3packages/xfrac.ins
+++ /dev/null
@@ -1,49 +0,0 @@
-\iffalse meta-comment
-
-File: xfrac.ins
-
-Copyright (C) 2004,2008-2010 Morten Hoegholm
- (C) 2011,2012,2016,2017,2019-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
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3packages bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-The released version of this bundle is available from CTAN.
-
-\fi
-
-\input docstrip %
-\askforoverwritefalse
-
-\preamble
-
-Copyright (C) 2004,2008-2010 Morten Hoegholm
- (C) 2011-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:
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3packages bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-
-\keepsilent
-
-\generate{\file{xfrac.sty} {\from{xfrac.dtx} {package}}}
-
-\endbatchfile
diff --git a/macros/latex/contrib/l3packages/xfrac.pdf b/macros/latex/contrib/l3packages/xfrac.pdf
deleted file mode 100644
index 61a472a901..0000000000
--- a/macros/latex/contrib/l3packages/xfrac.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xparse.dtx b/macros/latex/contrib/l3packages/xparse.dtx
index ba98987d7f..e701edada3 100644
--- a/macros/latex/contrib/l3packages/xparse.dtx
+++ b/macros/latex/contrib/l3packages/xparse.dtx
@@ -4,7 +4,7 @@
%
% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
% (C) 2004-2008 Frank Mittelbach, The LaTeX Project
-% (C) 2009-2023 The LaTeX Project
+% (C) 2009-2024 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
@@ -55,7 +55,7 @@
% \begin{itemize}\def\makelabel##1{\hss\llap{\bfseries##1}}}{\end{itemize}}
%
% \title{^^A
-% The \textsf{xparse} package\\ Document command parser^^A
+% The \pkg{xparse} package\\ Document command parser^^A
% }
%
% \author{^^A
@@ -67,7 +67,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -1064,7 +1064,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xparse}{2023-10-10}{}
+\ProvidesExplPackage{xparse}{2024-02-13}{}
{L3 Experimental document command parser}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xparse.ins b/macros/latex/contrib/l3packages/xparse.ins
index d7973d49f7..9177c53dbc 100644
--- a/macros/latex/contrib/l3packages/xparse.ins
+++ b/macros/latex/contrib/l3packages/xparse.ins
@@ -2,7 +2,7 @@
File: xparse.ins
-Copyright (C) 2000-2012,2016,2017,2019-2023 The LaTeX Project
+Copyright (C) 2000-2012,2016,2017,2019-2024 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
@@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN.
\preamble
-Copyright (C) 2009-2023 The LaTeX Project
+Copyright (C) 2009-2024 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
diff --git a/macros/latex/contrib/l3packages/xparse.pdf b/macros/latex/contrib/l3packages/xparse.pdf
index 483370f2fc..183ebaaa78 100644
--- a/macros/latex/contrib/l3packages/xparse.pdf
+++ b/macros/latex/contrib/l3packages/xparse.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty b/macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty
new file mode 100644
index 0000000000..a0a91afd81
--- /dev/null
+++ b/macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty
@@ -0,0 +1,1371 @@
+%%
+%% This is file `xtemplate-2023-10-10.sty', generated from
+%% xtemplate.dtx (with options: `package' on 2023-11-14)
+%% then adapted and frozen for compatibility. Development of
+%% xtemplate.dtx will continue in the LaTeX2e kernel as lttemplates.dtx.
+%%
+%% Copyright (C) 2011-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:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This file is part of the "l3packages bundle" (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%%
+%% File: xtemplate.dtx
+\RequirePackage{expl3}[2018/02/21]
+\@ifpackagelater{expl3}{2018/02/21}
+ {}
+ {%
+ \PackageError{xtemplate}{Support package l3kernel too old}
+ {%
+ Please install an up to date version of l3kernel\MessageBreak
+ using your TeX package manager or from CTAN.\MessageBreak
+ \MessageBreak
+ Loading xtemplate will abort!%
+ }%
+ \endinput
+ }
+\ProvidesExplPackage{xtemplate}{2023-10-10}{}
+ {L3 Experimental prototype document functions}
+\tl_const:Nn \c__xtemplate_code_root_tl { template~code~>~ }
+\tl_const:Nn \c__xtemplate_defaults_root_tl { template~defaults~>~ }
+\tl_const:Nn \c__xtemplate_instances_root_tl { template~instance~>~ }
+\tl_const:Nn \c__xtemplate_keytypes_root_tl { template~key~types~>~ }
+\tl_const:Nn \c__xtemplate_key_order_root_tl { template~key~order~>~ }
+\tl_const:Nn \c__xtemplate_restrict_root_tl { template~restrictions~>~ }
+\tl_const:Nn \c__xtemplate_values_root_tl { template~values~>~ }
+\tl_const:Nn \c__xtemplate_vars_root_tl { template~vars~>~ }
+\seq_const_from_clist:Nn \c__xtemplate_keytypes_arg_seq
+ { choice , function , instance }
+\prop_new:N \g__xtemplate_object_type_prop
+\tl_new:N \l__xtemplate_assignments_tl
+\tl_new:N \l__xtemplate_collection_tl
+\prop_new:N \l__xtemplate_collections_prop
+\tl_new:N \l__xtemplate_default_tl
+\bool_new:N \l__xtemplate_error_bool
+\bool_new:N \l__xtemplate_global_bool
+\bool_new:N \l__xtemplate_restrict_bool
+\clist_new:N \l__xtemplate_restrict_clist
+\tl_new:N \l__xtemplate_key_name_tl
+\tl_new:N \l__xtemplate_keytype_tl
+\tl_new:N \l__xtemplate_keytype_arg_tl
+\tl_new:N \l__xtemplate_value_tl
+\tl_new:N \l__xtemplate_var_tl
+\prop_new:N \l__xtemplate_keytypes_prop
+\seq_new:N \l__xtemplate_key_order_seq
+\prop_new:N \l__xtemplate_values_prop
+\prop_new:N \l__xtemplate_vars_prop
+\clist_new:N \l__xtemplate_tmp_clist
+\dim_new:N \l__xtemplate_tmp_dim
+\int_new:N \l__xtemplate_tmp_int
+\muskip_new:N \l__xtemplate_tmp_muskip
+\skip_new:N \l__xtemplate_tmp_skip
+\tl_new:N \l__xtemplate_tmp_tl
+\scan_new:N \s__xtemplate_mark
+\scan_new:N \s__xtemplate_stop
+\quark_new:N \q__xtemplate_nil
+\__kernel_quark_new_conditional:Nn \__xtemplate_quark_if_nil:N { F }
+\cs_generate_variant:Nn \prop_get:NnNTF { No }
+\cs_generate_variant:Nn \prop_get:NnNT { No }
+\cs_generate_variant:Nn \prop_get:NnNF { No }
+\cs_new_protected:Npn \__xtemplate_execute_if_arg_agree:nnT #1#2#3
+ {
+ \prop_get:NnN \g__xtemplate_object_type_prop {#1} \l__xtemplate_tmp_tl
+ \int_compare:nNnTF {#2} = \l__xtemplate_tmp_tl
+ {#3}
+ {
+ \msg_error:nneee { xtemplate }
+ { argument-number-mismatch } {#1} { \l__xtemplate_tmp_tl } {#2}
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_execute_if_code_exist:nnT #1#2#3
+ {
+ \cs_if_exist:cTF { \c__xtemplate_code_root_tl #1 / #2 }
+ {#3}
+ {
+ \msg_error:nnee { xtemplate } { no-template-code }
+ {#1} {#2}
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_execute_if_keytype_exist:nT #1#2
+ {
+ \cs_if_exist:cTF { __xtemplate_store_value_ #1 :n }
+ {#2}
+ { \msg_error:nne { xtemplate } { unknown-keytype } {#1} }
+ }
+\cs_generate_variant:Nn \__xtemplate_execute_if_keytype_exist:nT { o }
+\cs_new_protected:Npn \__xtemplate_execute_if_type_exist:nT #1#2
+ {
+ \prop_if_in:NnTF \g__xtemplate_object_type_prop {#1}
+ {#2}
+ { \msg_error:nne { xtemplate } { unknown-object-type } {#1} }
+ }
+\cs_new_protected:Npn \__xtemplate_if_keys_exist:nnT #1#2#3
+ {
+ \cs_if_exist:cTF { \c__xtemplate_keytypes_root_tl #1 / #2 }
+ {#3}
+ {
+ \msg_error:nnee { xtemplate } { unknown-template }
+ {#1} {#2}
+ }
+ }
+\prg_new_conditional:Npnn \__xtemplate_if_key_value:n #1 { T , F , TF }
+ {
+ \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \__xtemplate_if_key_value:nT { o }
+\cs_generate_variant:Nn \__xtemplate_if_key_value:nF { o }
+\cs_generate_variant:Nn \__xtemplate_if_key_value:nTF { o }
+\prg_new_conditional:Npnn \__xtemplate_if_instance_exist:nnn #1#2#3
+ { T, F, TF }
+ {
+ \cs_if_exist:cTF { \c__xtemplate_instances_root_tl #1 / #2 / #3 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_new_conditional:Npnn \__xtemplate_if_use_template:n #1 { TF }
+ {
+ \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop }
+ { \prg_return_true: }
+ { \prg_return_false: }
+}
+\cs_new_protected:Npn \__xtemplate_store_defaults:n #1
+ {
+ \prop_gclear_new:c { \c__xtemplate_defaults_root_tl #1 }
+ \prop_gset_eq:cN { \c__xtemplate_defaults_root_tl #1 }
+ \l__xtemplate_values_prop
+ }
+\cs_new_protected:Npn \__xtemplate_store_keytypes:n #1
+ {
+ \prop_gclear_new:c { \c__xtemplate_keytypes_root_tl #1 }
+ \prop_gset_eq:cN { \c__xtemplate_keytypes_root_tl #1 }
+ \l__xtemplate_keytypes_prop
+ \seq_gclear_new:c { \c__xtemplate_key_order_root_tl #1 }
+ \seq_gset_eq:cN { \c__xtemplate_key_order_root_tl #1 }
+ \l__xtemplate_key_order_seq
+ }
+\cs_new_protected:Npn \__xtemplate_store_values:n #1
+ {
+ \prop_clear_new:c { \c__xtemplate_values_root_tl #1 }
+ \prop_set_eq:cN { \c__xtemplate_values_root_tl #1 }
+ \l__xtemplate_values_prop
+ }
+\cs_new_protected:Npn \__xtemplate_store_restrictions:n #1
+ {
+ \clist_gclear_new:c { \c__xtemplate_restrict_root_tl #1 }
+ \clist_gset_eq:cN { \c__xtemplate_restrict_root_tl #1 }
+ \l__xtemplate_restrict_clist
+ }
+\cs_new_protected:Npn \__xtemplate_store_vars:n #1
+ {
+ \prop_gclear_new:c { \c__xtemplate_vars_root_tl #1 }
+ \prop_gset_eq:cN { \c__xtemplate_vars_root_tl #1 }
+ \l__xtemplate_vars_prop
+ }
+\cs_new_protected:Npn \__xtemplate_recover_defaults:n #1
+ {
+ \prop_if_exist:cTF
+ { \c__xtemplate_defaults_root_tl #1 }
+ {
+ \prop_set_eq:Nc \l__xtemplate_values_prop
+ { \c__xtemplate_defaults_root_tl #1 }
+ }
+ { \prop_clear:N \l__xtemplate_values_prop }
+ }
+\cs_new_protected:Npn \__xtemplate_recover_keytypes:n #1
+ {
+ \prop_if_exist:cTF
+ { \c__xtemplate_keytypes_root_tl #1 }
+ {
+ \prop_set_eq:Nc \l__xtemplate_keytypes_prop
+ { \c__xtemplate_keytypes_root_tl #1 }
+ }
+ { \prop_clear:N \l__xtemplate_keytypes_prop }
+ \seq_if_exist:cTF { \c__xtemplate_key_order_root_tl #1 }
+ {
+ \seq_set_eq:Nc \l__xtemplate_key_order_seq
+ { \c__xtemplate_key_order_root_tl #1 }
+ }
+ { \seq_clear:N \l__xtemplate_key_order_seq }
+ }
+\cs_new_protected:Npn \__xtemplate_recover_restrictions:n #1
+ {
+ \clist_if_exist:cTF
+ { \c__xtemplate_restrict_root_tl #1 }
+ {
+ \clist_set_eq:Nc \l__xtemplate_restrict_clist
+ { \c__xtemplate_restrict_root_tl #1 }
+ }
+ { \clist_clear:N \l__xtemplate_restrict_clist }
+ }
+\cs_new_protected:Npn \__xtemplate_recover_values:n #1
+ {
+ \prop_if_exist:cTF
+ { \c__xtemplate_values_root_tl #1 }
+ {
+ \prop_set_eq:Nc \l__xtemplate_values_prop
+ { \c__xtemplate_values_root_tl #1 }
+ }
+ { \prop_clear:N \l__xtemplate_values_prop }
+ }
+\cs_new_protected:Npn \__xtemplate_recover_vars:n #1
+ {
+ \prop_if_exist:cTF
+ { \c__xtemplate_vars_root_tl #1 }
+ {
+ \prop_set_eq:Nc \l__xtemplate_vars_prop
+ { \c__xtemplate_vars_root_tl #1 }
+ }
+ { \prop_clear:N \l__xtemplate_vars_prop }
+ }
+\cs_new_protected:Npn \__xtemplate_declare_object_type:nn #1#2
+ {
+ \int_set:Nn \l__xtemplate_tmp_int {#2}
+ \int_compare:nTF { 0 <= \l__xtemplate_tmp_int <= 9 }
+ {
+ \msg_info:nnnV { xtemplate } { declare-object-type }
+ {#1} \l__xtemplate_tmp_int
+ \prop_gput:NnV \g__xtemplate_object_type_prop {#1}
+ \l__xtemplate_tmp_int
+ }
+ {
+ \msg_error:nnee { xtemplate } { bad-number-of-arguments }
+ {#1} { \exp_not:V \l__xtemplate_tmp_int }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_declare_template_keys:nnnn #1#2#3#4
+ {
+ \__xtemplate_execute_if_type_exist:nT {#1}
+ {
+ \__xtemplate_execute_if_arg_agree:nnT {#1} {#3}
+ {
+ \prop_clear:N \l__xtemplate_values_prop
+ \prop_clear:N \l__xtemplate_keytypes_prop
+ \seq_clear:N \l__xtemplate_key_order_seq
+ \keyval_parse:NNn
+ \__xtemplate_parse_keys_elt:n \__xtemplate_parse_keys_elt:nn {#4}
+ \__xtemplate_store_defaults:n { #1 / #2 }
+ \__xtemplate_store_keytypes:n { #1 / #2 }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_keys_elt:n #1
+ {
+ \__xtemplate_split_keytype:n {#1}
+ \bool_if:NF \l__xtemplate_error_bool
+ {
+ \__xtemplate_execute_if_keytype_exist:oT \l__xtemplate_keytype_tl
+ {
+ \seq_map_function:NN \c__xtemplate_keytypes_arg_seq
+ \__xtemplate_parse_keys_elt_aux:n
+ \bool_if:NF \l__xtemplate_error_bool
+ {
+ \seq_if_in:NoTF \l__xtemplate_key_order_seq
+ \l__xtemplate_key_name_tl
+ {
+ \msg_error:nne { xtemplate }
+ { duplicate-key-interface }
+ { \l__xtemplate_key_name_tl }
+ }
+ { \__xtemplate_parse_keys_elt_aux: }
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_keys_elt_aux:n #1
+ {
+ \str_if_eq:onT \l__xtemplate_keytype_tl {#1}
+ {
+ \tl_if_empty:NT \l__xtemplate_keytype_arg_tl
+ {
+ \msg_error:nne { xtemplate }
+ { keytype-requires-argument } {#1}
+ \bool_set_true:N \l__xtemplate_error_bool
+ \seq_map_break:
+ }
+ }
+ }
+\cs_new:Npn \__xtemplate_parse_keys_elt_aux:
+ {
+ \tl_set:Ne \l__xtemplate_tmp_tl
+ {
+ \l__xtemplate_keytype_tl
+ \tl_if_empty:NF \l__xtemplate_keytype_arg_tl
+ { { \l__xtemplate_keytype_arg_tl } }
+ }
+ \prop_put:Noo \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ \seq_put_right:No \l__xtemplate_key_order_seq \l__xtemplate_key_name_tl
+ \str_if_eq:onT \l__xtemplate_keytype_tl { choice }
+ {
+ \exp_args:No \clist_if_in:nnT \l__xtemplate_keytype_arg_tl { unknown }
+ { \msg_error:nn { xtemplate } { choice-unknown-reserved } }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_keys_elt:nn #1#2
+ {
+ \__xtemplate_parse_keys_elt:n {#1}
+ \use:c { __xtemplate_store_value_ \l__xtemplate_keytype_tl :n } {#2}
+ }
+\cs_new_protected:Npe \__xtemplate_split_keytype:n #1
+ {
+ \exp_not:N \bool_set_false:N \exp_not:N \l__xtemplate_error_bool
+ \tl_set:Nn \exp_not:N \l__xtemplate_tmp_tl {#1}
+ \tl_replace_all:Nnn \exp_not:N \l__xtemplate_tmp_tl { : } { \token_to_str:N : }
+ \tl_if_in:onTF \exp_not:N \l__xtemplate_tmp_tl { \token_to_str:N : }
+ {
+ \exp_not:n
+ {
+ \tl_clear:N \l__xtemplate_key_name_tl
+ \exp_after:wN \__xtemplate_split_keytype_aux:w
+ \l__xtemplate_tmp_tl \s__xtemplate_stop
+ }
+ }
+ {
+ \exp_not:N \bool_set_true:N \exp_not:N \l__xtemplate_error_bool
+ \msg_error:nne { xtemplate } { missing-keytype } {#1}
+ }
+ }
+\use:e
+ {
+ \cs_new_protected:Npn \exp_not:N \__xtemplate_split_keytype_aux:w
+ #1 \token_to_str:N : #2 \s__xtemplate_stop
+ {
+ \tl_put_right:Ne \exp_not:N \l__xtemplate_key_name_tl
+ {
+ \exp_not:N \tl_trim_spaces:e
+ { \exp_not:N \tl_to_str:n {#1} }
+ }
+ \tl_if_in:nnTF {#2} { \token_to_str:N : }
+ {
+ \tl_put_right:Nn \exp_not:N \l__xtemplate_key_name_tl
+ { \token_to_str:N : }
+ \exp_not:N \__xtemplate_split_keytype_aux:w #2 \s__xtemplate_stop
+ }
+ {
+ \exp_not:N \tl_if_empty:NTF \exp_not:N \l__xtemplate_key_name_tl
+ {
+ \msg_error:nne { xtemplate } { empty-key-name }
+ { \token_to_str:N : #2 }
+ }
+ { \exp_not:N \__xtemplate_split_keytype_arg:n {#2} }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_split_keytype_arg:n #1
+ {
+ \tl_set:Ne \l__xtemplate_keytype_tl { \tl_trim_spaces:n {#1} }
+ \tl_clear:N \l__xtemplate_keytype_arg_tl
+ \cs_set_protected:Npn \__xtemplate_split_keytype_arg_aux:n ##1
+ {
+ \tl_if_in:nnT {#1} {##1}
+ {
+ \cs_set:Npn \__xtemplate_split_keytype_arg_aux:w
+ ####1 ##1 ####2 \s__xtemplate_stop
+ {
+ \tl_if_blank:nT {####1}
+ {
+ \tl_set:Ne \l__xtemplate_keytype_tl
+ { \tl_trim_spaces:n {##1} }
+ \tl_if_blank:nF {####2}
+ {
+ \tl_set:Ne \l__xtemplate_keytype_arg_tl
+ { \use:n ####2 }
+ }
+ \seq_map_break:
+ }
+ }
+ \__xtemplate_split_keytype_arg_aux:w #1 \s__xtemplate_stop
+ }
+ }
+ \seq_map_function:NN \c__xtemplate_keytypes_arg_seq
+ \__xtemplate_split_keytype_arg_aux:n
+ }
+\cs_generate_variant:Nn \__xtemplate_split_keytype_arg:n { o }
+\cs_new:Npn \__xtemplate_split_keytype_arg_aux:n #1 { }
+\cs_new:Npn \__xtemplate_split_keytype_arg_aux:w #1 \s__xtemplate_stop { }
+\cs_new_protected:Npn \__xtemplate_store_value_boolean:n #1
+ { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1} }
+\cs_new_protected:Npn \__xtemplate_store_value:n #1
+ { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1} }
+\cs_new_eq:NN \__xtemplate_store_value_choice:n \__xtemplate_store_value:n
+\cs_new_eq:NN \__xtemplate_store_value_function:n \__xtemplate_store_value:n
+\cs_new_eq:NN \__xtemplate_store_value_instance:n \__xtemplate_store_value:n
+\cs_new_protected:Npn \__xtemplate_store_value_aux:Nn #1#2
+ { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#2} }
+\cs_new_protected:Npn \__xtemplate_store_value_integer:n
+ { \__xtemplate_store_value_aux:Nn \int_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_length:n
+ { \__xtemplate_store_value_aux:Nn \dim_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_muskip:n
+ { \__xtemplate_store_value_aux:Nn \muskip_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_real:n
+ { \__xtemplate_store_value_aux:Nn \fp_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_skip:n
+ { \__xtemplate_store_value_aux:Nn \skip_eval:n }
+\cs_new_protected:Npn \__xtemplate_store_value_tokenlist:n
+ { \__xtemplate_store_value_aux:Nn \use:n }
+\cs_new_eq:NN \__xtemplate_store_value_commalist:n \__xtemplate_store_value_tokenlist:n
+\cs_new_protected:Npn \__xtemplate_declare_template_code:nnnnn #1#2#3#4#5
+ {
+ \__xtemplate_execute_if_type_exist:nT {#1}
+ {
+ \__xtemplate_execute_if_arg_agree:nnT {#1}{#3}
+ {
+ \__xtemplate_if_keys_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_store_key_implementation:nnn {#1} {#2} {#4}
+ \regex_match:nnTF { \c { AssignTemplateKeys } } {#5}
+ { \__xtemplate_declare_template_code:nnn { #1 / #2 } {#3} {#5} }
+ {
+ \__xtemplate_declare_template_code:nnn
+ { #1 / #2 } {#3} { \AssignTemplateKeys #5 }
+ }
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_declare_template_code:nnn #1#2#3
+ {
+ \cs_generate_from_arg_count:cNnn
+ { \c__xtemplate_code_root_tl #1 }
+ \cs_gset_protected:Npn {#2} {#3}
+ }
+\cs_new_protected:Npn \__xtemplate_store_key_implementation:nnn #1#2#3
+ {
+ \__xtemplate_recover_defaults:n { #1 / #2 }
+ \__xtemplate_recover_restrictions:n { #1 / #2 }
+ \__xtemplate_recover_keytypes:n { #1 / #2 }
+ \prop_clear:N \l__xtemplate_vars_prop
+ \keyval_parse:nnn
+ { \__xtemplate_parse_vars_elt:n } { \__xtemplate_parse_vars_elt:nnn { #1 / #2 } } {#3}
+ \__xtemplate_store_vars:n { #1 / #2 }
+ \__xtemplate_store_restrictions:n { #1 / #2 }
+ \prop_map_inline:Nn \l__xtemplate_keytypes_prop
+ {
+ \msg_error:nneee { xtemplate } { key-not-implemented }
+ {##1} {#2} {#1}
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_vars_elt:n #1
+ { \msg_error:nne { xtemplate } { key-no-variable } {#1} }
+\cs_new_protected:Npn \__xtemplate_parse_vars_elt:nnn #1#2#3
+ {
+ \tl_set:Ne \l__xtemplate_key_name_tl
+ { \tl_trim_spaces:e { \tl_to_str:n {#2} } }
+ \prop_get:NoNTF
+ \l__xtemplate_keytypes_prop
+ \l__xtemplate_key_name_tl
+ \l__xtemplate_keytype_tl
+ {
+ \__xtemplate_split_keytype_arg:o \l__xtemplate_keytype_tl
+ \__xtemplate_parse_vars_elt_aux:nn {#1} {#3}
+ \prop_remove:NV \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl
+ }
+ { \msg_error:nne { xtemplate } { unknown-key } {#2} }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_vars_elt_aux:nn #1#2
+ {
+ \__xtemplate_parse_vars_elt_aux:nw {#1} #2 global global \s__xtemplate_stop
+ }
+\cs_new_protected:Npn \__xtemplate_parse_vars_elt_aux:nw
+ #1#2 global #3 global #4 \s__xtemplate_stop
+ {
+ \tl_if_blank:nTF {#4}
+ { \__xtemplate_parse_vars_elt_aux:nnn {#1} { } {#2} }
+ {
+ \tl_if_blank:nTF {#2}
+ {
+ \exp_args:Nnne \__xtemplate_parse_vars_elt_aux:nnn
+ {#1} { global } { \tl_trim_spaces:n {#3} }
+ }
+ { \msg_error:nnn { xtemplate } { bad-variable } { #2 global #3 } }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_vars_elt_aux:nnn #1#2#3
+ {
+ \str_case:VnF \l__xtemplate_keytype_tl
+ {
+ { choice } { \__xtemplate_implement_choices:nn {#1} {#3} }
+ { function }
+ {
+ \cs_if_exist:NF #3
+ { \cs_new:Npn #3 { } }
+ \__xtemplate_parse_vars_elt_key:nn {#1}
+ {
+ .code:n =
+ {
+ \cs_generate_from_arg_count:NNnn
+ \exp_not:N #3
+ \exp_not:c
+ { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn }
+ { \exp_not:o \l__xtemplate_keytype_arg_tl }
+ {##1}
+ }
+ }
+ \prop_put:Non \l__xtemplate_vars_prop
+ \l__xtemplate_key_name_tl {#2#3}
+ }
+ { instance }
+ {
+ \__xtemplate_parse_vars_elt_key:nn {#1}
+ {
+ .code:n =
+ {
+ \exp_not:c
+ { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn }
+ \exp_not:N #3 { \UseInstance {##1} }
+ }
+ }
+ \prop_put:Non \l__xtemplate_vars_prop
+ \l__xtemplate_key_name_tl {#2#3}
+ }
+ }
+ {
+ \tl_if_single:nTF {#3}
+ {
+ \cs_if_exist:NF #3
+ { \use:c { \__xtemplate_map_var_type: _new:N } #3 }
+ \__xtemplate_parse_vars_elt_key:nn {#1}
+ {
+ . \__xtemplate_map_var_type:
+ _ \str_if_eq:nnT {#1} { global } { g } set:N
+ = \exp_not:N #3
+ }
+ \prop_put:Non \l__xtemplate_vars_prop
+ \l__xtemplate_key_name_tl {#2#3}
+ }
+ { \msg_error:nne { xtemplate } { bad-variable } { #2#3 } }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_vars_elt_key:nn #1#2
+ {
+ \keys_define:ne { template / #1 }
+ { \l__xtemplate_key_name_tl #2 }
+ }
+\cs_new:Npn \__xtemplate_map_var_type:
+ {
+ \str_case:on \l__xtemplate_keytype_tl
+ {
+ { boolean } { bool }
+ { commalist } { clist }
+ { integer } { int }
+ { length } { dim }
+ { muskip } { muskip }
+ { real } { fp }
+ { skip } { skip }
+ { tokenlist } { tl }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_implement_choices:nn #1#2
+ {
+ \clist_set:No \l__xtemplate_tmp_clist { \l__xtemplate_keytype_arg_tl }
+ \prop_put:Non \l__xtemplate_vars_prop \l__xtemplate_key_name_tl { }
+ \keys_define:ne { template / #1 } { \l__xtemplate_key_name_tl .choice: }
+ \keyval_parse:nnn
+ { \__xtemplate_implement_choice_elt:n }
+ { \__xtemplate_implement_choice_elt:nnn {#1} }
+ {#2}
+ \prop_get:NoNT \l__xtemplate_values_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ { \__xtemplate_implement_choices_default: }
+ \clist_if_empty:NF \l__xtemplate_tmp_clist
+ {
+ \clist_map_inline:Nn \l__xtemplate_tmp_clist
+ {
+ \msg_error:nne { xtemplate } { choice-not-implemented }
+ {##1}
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_implement_choices_default:
+ {
+ \tl_set:Ne \l__xtemplate_tmp_tl
+ { \l__xtemplate_key_name_tl \c_space_tl \l__xtemplate_tmp_tl }
+ \prop_if_in:NoF \l__xtemplate_vars_prop \l__xtemplate_tmp_tl
+ {
+ \tl_set:Ne \l__xtemplate_tmp_tl
+ { \l__xtemplate_key_name_tl \c_space_tl \l__xtemplate_tmp_tl }
+ \prop_if_in:NoF \l__xtemplate_vars_prop \l__xtemplate_tmp_tl
+ {
+ \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl
+ \prop_get:NoN \l__xtemplate_values_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ \msg_error:nneee { xtemplate } { unknown-default-choice }
+ { \l__xtemplate_key_name_tl } { \l__xtemplate_key_name_tl }
+ { \l__xtemplate_keytype_arg_tl }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_implement_choice_elt:nnn #1#2#3
+ {
+ \clist_if_empty:NTF \l__xtemplate_tmp_clist
+ {
+ \str_if_eq:nnTF {#2} { unknown }
+ { \__xtemplate_implement_choice_elt_aux:nnn {#1} {#2} {#3} }
+ {
+ \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl
+ \msg_error:nneee { xtemplate } { unknown-choice }
+ { \l__xtemplate_key_name_tl } {#2}
+ { \l__xtemplate_keytype_arg_tl }
+ }
+ }
+ {
+ \clist_if_in:NnTF \l__xtemplate_tmp_clist {#2}
+ {
+ \clist_remove_all:Nn \l__xtemplate_tmp_clist {#2}
+ \__xtemplate_implement_choice_elt_aux:nnn {#1} {#2} {#3}
+ }
+ {
+ \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl
+ \msg_error:nneee { xtemplate } { unknown-choice }
+ { \l__xtemplate_key_name_tl } {#2}
+ { \l__xtemplate_keytype_arg_tl }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_implement_choice_elt_aux:nnn #1#2#3
+ {
+ \keys_define:ne { template / #1 }
+ { \l__xtemplate_key_name_tl / #2 .code:n = { \exp_not:n {#3} } }
+ \tl_set:Ne \l__xtemplate_tmp_tl
+ { \l__xtemplate_key_name_tl \c_space_tl #2 }
+ \prop_put:Non \l__xtemplate_vars_prop \l__xtemplate_tmp_tl {#3}
+ }
+\cs_new_protected:Npn \__xtemplate_implement_choice_elt:n #1
+ {
+ \msg_error:nneee { xtemplate } { choice-requires-code }
+ { \l__xtemplate_key_name_tl } {#1}
+ }
+\cs_new_protected:Npn \__xtemplate_declare_restricted:nnnn #1#2#3#4
+ {
+ \__xtemplate_if_keys_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_set_template_eq:nn { #1 / #3 } { #1 / #2 }
+ \bool_set_true:N \l__xtemplate_restrict_bool
+ \__xtemplate_edit_defaults_aux:nnn {#1} {#3} {#4}
+ \bool_set_false:N \l__xtemplate_restrict_bool
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_edit_defaults:nnn
+ {
+ \bool_set_false:N \l__xtemplate_restrict_bool
+ \__xtemplate_edit_defaults_aux:nnn
+ }
+\cs_new_protected:Npn \__xtemplate_edit_defaults_aux:nnn #1#2#3
+ {
+ \__xtemplate_if_keys_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_recover_defaults:n { #1 / #2 }
+ \__xtemplate_recover_restrictions:n { #1 / #2 }
+ \__xtemplate_parse_values:nn { #1 / #2 } {#3}
+ \__xtemplate_store_defaults:n { #1 / #2 }
+ \__xtemplate_store_restrictions:n { #1 / #2 }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_values:nn #1#2
+ {
+ \clist_clear:N \l__xtemplate_restrict_clist
+ \__xtemplate_parse_values_aux:nn {#1} {#2}
+ }
+\cs_new_protected:Npn \__xtemplate_parse_values_aux:nn #1#2
+ {
+ \__xtemplate_recover_keytypes:n {#1}
+ \keyval_parse:NNn
+ \__xtemplate_parse_values_elt:n \__xtemplate_parse_values_elt:nn {#2}
+ }
+\cs_new_protected:Npn \__xtemplate_parse_values_elt:n #1
+ {
+ \bool_set_true:N \l__xtemplate_error_bool
+ \msg_error:nne { xtemplate } { key-no-value } {#1}
+ }
+\cs_new_protected:Npn \__xtemplate_parse_values_elt:nn #1#2
+ {
+ \tl_set:Ne \l__xtemplate_key_name_tl
+ { \tl_trim_spaces:e { \tl_to_str:n {#1} } }
+ \prop_get:NoNTF \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ {
+ \bool_if:NTF \l__xtemplate_restrict_bool
+ {
+ \clist_if_in:NoF \l__xtemplate_restrict_clist
+ \l__xtemplate_key_name_tl
+ { \__xtemplate_parse_values_elt_aux:n {#2} }
+ }
+ { \__xtemplate_parse_values_elt_aux:n {#2} }
+ }
+ {
+ \msg_error:nne { xtemplate } { unknown-key }
+ { \l__xtemplate_key_name_tl }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_parse_values_elt_aux:n #1
+ {
+ \clist_put_right:No \l__xtemplate_restrict_clist \l__xtemplate_key_name_tl
+ \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl
+ \use:c { __xtemplate_store_value_ \l__xtemplate_keytype_tl :n } {#1}
+ }
+\cs_new_protected:Npn \__xtemplate_set_template_eq:nn #1#2
+ {
+ \__xtemplate_recover_defaults:n {#2}
+ \__xtemplate_store_defaults:n {#1}
+ \__xtemplate_recover_keytypes:n {#2}
+ \__xtemplate_store_keytypes:n {#1}
+ \__xtemplate_recover_vars:n {#2}
+ \__xtemplate_store_vars:n {#1}
+ \cs_gset_eq:cc { \c__xtemplate_code_root_tl #1 }
+ { \c__xtemplate_code_root_tl #2 }
+ }
+\cs_new_protected:Npn \__xtemplate_declare_instance:nnnnn #1#2#3#4#5
+ {
+ \__xtemplate_execute_if_code_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_recover_defaults:n { #1 / #2 }
+ \__xtemplate_recover_restrictions:n { #1 / #2 }
+ \__xtemplate_recover_vars:n { #1 / #2 }
+ \__xtemplate_declare_instance_aux:nnnnn {#1} {#2} {#3} {#4} {#5}
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_declare_instance_aux:nnnnn #1#2#3#4#5
+ {
+ \bool_set_false:N \l__xtemplate_error_bool
+ \__xtemplate_parse_values_aux:nn { #1 / #2 } {#5}
+ \bool_if:NF \l__xtemplate_error_bool
+ {
+ \prop_put:Nnn \l__xtemplate_values_prop { from~template } {#2}
+ \__xtemplate_store_values:n { #1 / #3 / #4 }
+ \__xtemplate_convert_to_assignments:
+ \cs_set_protected:cpe { \c__xtemplate_instances_root_tl #1 / #3 / #4 }
+ {
+ \exp_not:N \__xtemplate_assignments_push:n
+ { \exp_not:o \l__xtemplate_assignments_tl }
+ \exp_not:c { \c__xtemplate_code_root_tl #1 / #2 }
+ }
+ \__xtemplate_if_instance_exist:nnnF {#1} { } {#4}
+ {
+ \cs_set_eq:cc
+ { \c__xtemplate_instances_root_tl #1 / / #4 }
+ { \c__xtemplate_instances_root_tl #1 / #3 / #4 }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_copy_instance:nnnn #1#2#3#4
+ {
+ \__xtemplate_if_instance_exist:nnnTF {#1} {#2} {#3}
+ {
+ \__xtemplate_recover_values:n { #1 / #2 / #3 }
+ \__xtemplate_store_values:n { #1 / #2 / #4 }
+ \cs_set_eq:cc { \c__xtemplate_instances_root_tl #1 / #2 / #4 }
+ { \c__xtemplate_instances_root_tl #1 / #2 / #3 }
+ }
+ {
+ \msg_error:nnee { xtemplate } { unknown-instance }
+ {#1} {#3}
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_edit_instance:nnnn #1#2#3#4
+ {
+ \__xtemplate_if_instance_exist:nnnTF {#1} {#2} {#3}
+ {
+ \__xtemplate_recover_values:n { #1 / #2 / #3 }
+ \prop_get:NnN \l__xtemplate_values_prop { from~template }
+ \l__xtemplate_tmp_tl
+ \__xtemplate_edit_instance_aux:nonnn {#1} \l__xtemplate_tmp_tl
+ {#2} {#3} {#4}
+ }
+ {
+ \msg_error:nnee { xtemplate } { unknown-instance }
+ {#1} {#3}
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_edit_instance_aux:nnnnn #1#2
+ {
+ \__xtemplate_recover_vars:n { #1 / #2 }
+ \__xtemplate_declare_instance_aux:nnnnn {#1} {#2}
+ }
+\cs_generate_variant:Nn \__xtemplate_edit_instance_aux:nnnnn { no }
+\cs_new_protected:Npn \__xtemplate_convert_to_assignments:
+ {
+ \tl_clear:N \l__xtemplate_assignments_tl
+ \seq_map_function:NN \l__xtemplate_key_order_seq
+ \__xtemplate_convert_to_assignments_aux:n
+ }
+\cs_new_protected:Npn \__xtemplate_convert_to_assignments_aux:n #1
+ {
+ \prop_get:NnN \l__xtemplate_keytypes_prop {#1} \l__xtemplate_tmp_tl
+ \__xtemplate_convert_to_assignments_aux:no {#1} \l__xtemplate_tmp_tl
+ }
+\cs_new_protected:Npn \__xtemplate_convert_to_assignments_aux:nn #1#2
+ {
+ \prop_get:NnNT \l__xtemplate_values_prop {#1} \l__xtemplate_value_tl
+ {
+ \prop_get:NnNTF \l__xtemplate_vars_prop {#1} \l__xtemplate_var_tl
+ {
+ \__xtemplate_split_keytype_arg:n {#2}
+ \str_if_eq:onF \l__xtemplate_keytype_tl { choice }
+ {
+ \str_if_eq:onF \l__xtemplate_keytype_tl { code }
+ { \__xtemplate_find_global: }
+ }
+ \tl_set:Nn \l__xtemplate_key_name_tl {#1}
+ \use:c { __xtemplate_assign_ \l__xtemplate_keytype_tl : }
+ }
+ { \msg_error:nne { xtemplate } { unknown-attribute } {#1} }
+ }
+ }
+\cs_generate_variant:Nn \__xtemplate_convert_to_assignments_aux:nn { no }
+\cs_new_protected:Npn \__xtemplate_find_global:
+ {
+ \bool_set_false:N \l__xtemplate_global_bool
+ \tl_if_in:onT \l__xtemplate_var_tl { global }
+ {
+ \exp_after:wN \__xtemplate_find_global_aux:w \l__xtemplate_var_tl \s__xtemplate_stop
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_find_global_aux:w #1 global #2 \s__xtemplate_stop
+ {
+ \tl_set:Nn \l__xtemplate_var_tl {#2}
+ \bool_set_true:N \l__xtemplate_global_bool
+ }
+\cs_new_protected:Npn \__xtemplate_use_template:nnn #1#2#3
+ {
+ \__xtemplate_execute_if_code_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_recover_defaults:n { #1 / #2 }
+ \__xtemplate_recover_vars:n { #1 / #2 }
+ \__xtemplate_parse_values:nn { #1 / #2 } {#3}
+ \__xtemplate_convert_to_assignments:
+ \use:c { \c__xtemplate_code_root_tl #1 / #2 }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_boolean:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_boolean_aux:n { bool_gset } }
+ { \__xtemplate_assign_boolean_aux:n { bool_set } }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_boolean_aux:n #1
+ {
+ \__xtemplate_if_key_value:oTF \l__xtemplate_value_tl
+ {
+ \__xtemplate_key_to_value:
+ \tl_put_right:Ne \l__xtemplate_assignments_tl
+ {
+ \exp_not:c { #1 _eq:NN }
+ \exp_not:o \l__xtemplate_var_tl
+ \exp_not:o \l__xtemplate_value_tl
+ }
+ }
+ {
+ \tl_put_right:Ne \l__xtemplate_assignments_tl
+ {
+ \exp_not:c { #1 _ \l__xtemplate_value_tl :N }
+ \exp_not:o \l__xtemplate_var_tl
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_choice:
+ {
+ \__xtemplate_assign_choice_aux:eF
+ { \l__xtemplate_key_name_tl \c_space_tl \l__xtemplate_value_tl }
+ {
+ \__xtemplate_assign_choice_aux:eF
+ { \l__xtemplate_key_name_tl \c_space_tl unknown }
+ {
+ \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl
+ \l__xtemplate_tmp_tl
+ \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl
+ \msg_error:nneee { xtemplate } { unknown-choice }
+ { \l__xtemplate_key_name_tl } { \l__xtemplate_value_tl }
+ { \l__xtemplate_keytype_arg_tl }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_choice_aux:nF #1
+ {
+ \prop_get:NnNTF
+ \l__xtemplate_vars_prop
+ {#1}
+ \l__xtemplate_tmp_tl
+ { \tl_put_right:No \l__xtemplate_assignments_tl \l__xtemplate_tmp_tl }
+ }
+\cs_generate_variant:Nn \__xtemplate_assign_choice_aux:nF { e }
+\cs_new_protected:Npn \__xtemplate_assign_function:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_function_aux:N \cs_gset:Npn }
+ { \__xtemplate_assign_function_aux:N \cs_set:Npn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_function_aux:N #1
+ {
+ \tl_put_right:Ne \l__xtemplate_assignments_tl
+ {
+ \cs_generate_from_arg_count:NNnn
+ \exp_not:o \l__xtemplate_var_tl
+ \exp_not:N #1
+ { \exp_not:o \l__xtemplate_keytype_arg_tl }
+ { \exp_not:o \l__xtemplate_value_tl }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_instance:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_instance_aux:N \cs_gset_protected:Npn }
+ { \__xtemplate_assign_instance_aux:N \cs_set_protected:Npn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_instance_aux:N #1
+ {
+ \tl_put_right:Ne \l__xtemplate_assignments_tl
+ {
+ \exp_not:N #1 \exp_not:o \l__xtemplate_var_tl
+ {
+ \__xtemplate_use_instance:nn
+ { \exp_not:o \l__xtemplate_keytype_arg_tl }
+ { \exp_not:o \l__xtemplate_value_tl }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_integer:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_variable:N \int_gset:Nn }
+ { \__xtemplate_assign_variable:N \int_set:Nn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_length:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_variable:N \dim_gset:Nn }
+ { \__xtemplate_assign_variable:N \dim_set:Nn }
+}
+\cs_new_protected:Npn \__xtemplate_assign_muskip:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_variable:N \muskip_gset:Nn }
+ { \__xtemplate_assign_variable:N \muskip_set:Nn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_real:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_variable:N \fp_gset:Nn }
+ { \__xtemplate_assign_variable:N \fp_set:Nn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_skip:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_variable:N \skip_gset:Nn }
+ { \__xtemplate_assign_variable:N \skip_set:Nn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_tokenlist:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_tokenlist_aux:NN \tl_gset:NV \tl_gset:Nn }
+ { \__xtemplate_assign_tokenlist_aux:NN \tl_set:NV \tl_set:Nn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_tokenlist_aux:NN #1#2
+ {
+ \__xtemplate_if_key_value:oTF \l__xtemplate_value_tl
+ {
+ \__xtemplate_key_to_value:
+ \tl_put_right:Ne \l__xtemplate_assignments_tl
+ {
+ #1 \exp_not:o \l__xtemplate_var_tl
+ \exp_not:o \l__xtemplate_value_tl
+ }
+ }
+ {
+ \tl_put_right:Ne \l__xtemplate_assignments_tl
+ {
+ #2 \exp_not:o \l__xtemplate_var_tl
+ { \exp_not:o \l__xtemplate_value_tl }
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_commalist:
+ {
+ \bool_if:NTF \l__xtemplate_global_bool
+ { \__xtemplate_assign_tokenlist_aux:NN \clist_gset:NV \clist_gset:Nn }
+ { \__xtemplate_assign_tokenlist_aux:NN \clist_set:NV \clist_set:Nn }
+ }
+\cs_new_protected:Npn \__xtemplate_assign_variable:N #1
+ {
+ \__xtemplate_if_key_value:oT \l__xtemplate_value_tl
+ { \__xtemplate_key_to_value: }
+ \tl_put_right:Ne \l__xtemplate_assignments_tl
+ {
+ #1 \exp_not:o \l__xtemplate_var_tl
+ { \exp_not:o \l__xtemplate_value_tl }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_key_to_value:
+ { \exp_after:wN \__xtemplate_key_to_value_auxi:w \l__xtemplate_value_tl }
+\cs_new_protected:Npn \__xtemplate_key_to_value_auxi:w \KeyValue #1
+ {
+ \tl_set:Ne \l__xtemplate_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } }
+ \prop_get:NoNTF
+ \l__xtemplate_vars_prop
+ \l__xtemplate_tmp_tl
+ \l__xtemplate_value_tl
+ {
+ \exp_after:wN \__xtemplate_key_to_value_auxii:w \l__xtemplate_value_tl
+ \s__xtemplate_mark global \q__xtemplate_nil \s__xtemplate_stop
+ }
+ {
+ \msg_error:nne { xtemplate } { unknown-attribute }
+ { \l__xtemplate_tmp_tl }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_key_to_value_auxii:w #1 global #2#3 \s__xtemplate_stop
+ {
+ \__xtemplate_quark_if_nil:NF #2
+ { \tl_set:Nn \l__xtemplate_value_tl {#2} }
+ }
+\cs_new_protected:Npn \__xtemplate_use_instance:nn #1#2
+ {
+ \__xtemplate_if_use_template:nTF {#2}
+ { \__xtemplate_use_instance_aux:nNnnn {#1} #2 }
+ { \__xtemplate_use_instance_aux:nn {#1} {#2} }
+ }
+\cs_new_protected:Npn \__xtemplate_use_instance_aux:nNnnn #1#2#3#4#5
+ {
+ \str_if_eq:nnTF {#1} {#3}
+ { \__xtemplate_use_template:nnn {#3} {#4} {#5} }
+ { \msg_error:nnee { xtemplate } { type-mismatch } {#1} {#3} }
+}
+\cs_new_protected:Npn \__xtemplate_use_instance_aux:nn #1#2
+ {
+ \__xtemplate_get_collection:n {#1}
+ \__xtemplate_if_instance_exist:nnnTF
+ {#1} { \l__xtemplate_collection_tl } {#2}
+ {
+ \use:c
+ {
+ \c__xtemplate_instances_root_tl #1 /
+ \l__xtemplate_collection_tl / #2
+ }
+ }
+ {
+ \__xtemplate_if_instance_exist:nnnTF {#1} { } {#2}
+ { \use:c { \c__xtemplate_instances_root_tl #1 / / #2 } }
+ {
+ \msg_error:nnee { xtemplate } { unknown-instance }
+ {#1} {#2}
+ }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_use_collection:nn #1#2
+ { \prop_put:Nnn \l__xtemplate_collections_prop {#1} {#2} }
+\cs_new_protected:Npn \__xtemplate_get_collection:n #1
+ {
+ \prop_get:NnNF \l__xtemplate_collections_prop {#1}
+ \l__xtemplate_collection_tl
+ { \tl_clear:N \l__xtemplate_collection_tl }
+ }
+\cs_new:Npn \__xtemplate_assignments_pop: { \l__xtemplate_assignments_tl }
+\cs_new_protected:Npn \__xtemplate_assignments_push:n #1
+ { \tl_set:Nn \l__xtemplate_assignments_tl {#1} }
+\cs_new_protected:Npn \__xtemplate_show_code:nn #1#2
+ { \cs_show:c { \c__xtemplate_code_root_tl #1 / #2 } }
+\cs_new_protected:Npn \__xtemplate_show_defaults:nn #1#2
+ {
+ \__xtemplate_if_keys_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_recover_defaults:n { #1 / #2 }
+ \__xtemplate_show:Nnnn \l__xtemplate_values_prop
+ {#1} {#2} { default~values }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_show_keytypes:nn #1#2
+ {
+ \__xtemplate_if_keys_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_recover_keytypes:n { #1 / #2 }
+ \__xtemplate_show:Nnnn \l__xtemplate_keytypes_prop
+ {#1} {#2} { interface }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_show_vars:nn #1#2
+ {
+ \__xtemplate_execute_if_code_exist:nnT {#1} {#2}
+ {
+ \__xtemplate_recover_vars:n { #1 / #2 }
+ \__xtemplate_show:Nnnn \l__xtemplate_vars_prop
+ {#1} {#2} { variable~mapping }
+ }
+ }
+\cs_new_protected:Npn \__xtemplate_show:Nnnn #1#2#3#4
+ {
+ \msg_show:nneeee { xtemplate } { show-attribute }
+ { \tl_to_str:n {#2} }
+ { \tl_to_str:n {#3} }
+ { \tl_to_str:n {#4} }
+ { \prop_map_function:NN #1 \msg_show_item_unbraced:nn }
+ }
+\cs_new_protected:Npn \__xtemplate_show_values:nnn #1#2#3
+ {
+ \__xtemplate_if_instance_exist:nnnT {#1} {#2} {#3}
+ {
+ \__xtemplate_recover_values:n { #1 / #2 / #3 }
+ \msg_show:nneeee { xtemplate } { show-values }
+ { \tl_to_str:n {#1} }
+ { \tl_to_str:n {#2} }
+ { \tl_to_str:n {#3} }
+ {
+ \prop_map_function:NN \l__xtemplate_values_prop
+ \msg_show_item_unbraced:nn
+ }
+ }
+ }
+\msg_new:nnnn { xtemplate } { argument-number-mismatch }
+ { Object~type~'#1'~takes~#2~argument(s). }
+ {
+ Objects~of~type~'#1'~require~#2~argument(s).\\
+ You~have~tried~to~make~a~template~for~'#1'~
+ with~#3~argument(s),~which~is~not~possible:~
+ the~number~of~arguments~must~agree.
+ }
+\msg_new:nnnn { xtemplate } { bad-number-of-arguments }
+ { Bad~number~of~arguments~for~object~type~'#1'. }
+ {
+ An~object~may~accept~between~0~and~9~arguments.\\
+ You~asked~to~use~#2~arguments:~this~is~not~supported.
+ }
+\msg_new:nnnn { xtemplate } { bad-variable }
+ { Incorrect~variable~description~'#1'. }
+ {
+ The~argument~'#1'~is~not~of~the~form \\
+ ~~'<variable>'\\
+ ~or~\\
+ ~~'global~<variable>'.\\
+ It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template.
+ }
+\msg_new:nnnn { xtemplate } { choice-not-implemented }
+ { The~choice~'#1'~has~no~implementation. }
+ {
+ Each~choice~listed~in~the~interface~for~a~template~must~
+ have~an~implementation.
+ }
+\msg_new:nnnn { xtemplate } { choice-no-code }
+ { The~choice~'#1'~requires~implementation~details. }
+ {
+ When~creating~template~code~using~\DeclareTemplateCode,~
+ each~choice~name~must~have~an~associated~implementation.\\
+ This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
+ }
+\msg_new:nnnn { xtemplate } { choice-requires-code }
+ { The~choice~'#2'~for~key~'#1'~requires~an~implementation. }
+ {
+ You~should~have~put:\\
+ \ \ #1~:~choice~{~#2 = <code> ~} \\
+ but~LaTeX~did~not~find~any~<code>.
+ }
+\msg_new:nnnn { xtemplate } { duplicate-key-interface }
+ { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. }
+ {
+ Each~key~can~only~have~one~interface~declared~in~a~template.\\
+ LaTeX~found~two~interfaces~for~'#1'.
+ }
+\msg_new:nnnn { xtemplate } { keytype-requires-argument }
+ { The~key~type~'#1'~requires~an~argument~\msg_line_context:. }
+ {
+ You~should~have~put:\\
+ \ \ <key-name>~:~#1~{~<argument>~} \\
+ but~LaTeX~did~not~find~an~<argument>.
+ }
+\msg_new:nnnn { xtemplate } { invalid-keytype }
+ { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
+ {
+ Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\
+ \ \ <key>~:~<key-type>\\
+ LaTeX~could~not~find~a~<key-type>~in~your~input.
+ }
+\msg_new:nnnn { xtemplate } { key-no-value }
+ { The~key~'#1'~has~no~value~\msg_line_context:. }
+ {
+ When~creating~an~instance~of~a~template~
+ every~key~listed~must~include~a~value:\\
+ \ \ <key>~=~<value>
+ }
+\msg_new:nnnn { xtemplate } { key-no-variable }
+ { The~key~'#1'~requires~implementation~details~\msg_line_context:. }
+ {
+ When~creating~template~code~using~\DeclareTemplateCode,~
+ each~key~name~must~have~an~associated~implementation.\\
+ This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
+ }
+\msg_new:nnnn { xtemplate } { key-not-implemented }
+ { Key~'#1'~has~no~implementation~\msg_line_context:. }
+ {
+ The~definition~of~key~implementations~for~template~'#2'~
+ of~object~type~'#3'~does~not~include~any~details~for~key~'#1'.\\
+ The~key~was~declared~in~the~interface~definition,~
+ and~so~an~implementation~is~required.
+ }
+\msg_new:nnnn { xtemplate } { missing-keytype }
+ { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
+ {
+ Key~interface~definitions~should~be~of~the~form\\
+ \ \ #1~:~<key-type>\\
+ but~LaTeX~could~not~find~a~<key-type>.
+ }
+\msg_new:nnnn { xtemplate } { no-template-code }
+ {
+ The~template~'#2'~of~type~'#1'~is~unknown~
+ or~has~no~implementation.
+ }
+ {
+ There~is~no~code~available~for~the~template~name~given.\\
+ This~should~be~given~using~\DeclareTemplateCode.
+ }
+\msg_new:nnnn { xtemplate } { object-type-mismatch }
+ { Object~types~'#1'~and~'#2'~do~not~agree. }
+ {
+ You~are~trying~to~use~a~template~directly~with~\UseInstance
+ (or~a~similar~function),~but~the~object~types~do~not~match.
+ }
+\msg_new:nnnn { xtemplate } { unknown-attribute }
+ { The~template~attribute~'#1'~is~unknown. }
+ {
+ There~is~a~definition~in~the~current~template~reading\\
+ \ \ \token_to_str:N \KeyValue {~#1~} \\
+ but~there~is~no~key~called~'#1'.
+ }
+\msg_new:nnnn { xtemplate } { unknown-choice }
+ { The~choice~'#2'~was~not~declared~for~key~'#1'. }
+ {
+ The~key~'#1'~takes~a~fixed~list~of~choices~
+ and~this~list~does~not~include~'#2'.
+ }
+\msg_new:nnnn { xtemplate } { unknown-default-choice }
+ { The~default~choice~'#2'~was~not~declared~for~key~'#1'. }
+ {
+ The~key~'#1'~takes~a~fixed~list~of~choices~
+ and~this~list~does~not~include~'#2'.
+ }
+\msg_new:nnnn { xtemplate } { unknown-instance }
+ { The~instance~'#2'~of~type~'#1'~is~unknown. }
+ {
+ You~have~asked~to~use~an~instance~'#2',~
+ but~this~has~not~been~created.
+ }
+\msg_new:nnnn { xtemplate } { unknown-key }
+ { Unknown~template~key~'#1'. }
+ {
+ The~key~'#1'~was~not~declared~in~the~interface~
+ for~the~current~template.
+ }
+\msg_new:nnnn { xtemplate } { unknown-keytype }
+ { The~key-type~'#1'~is~unknown. }
+ {
+ Valid~key-types~are:\\
+ -~boolean;\\
+ -~choice;\\
+ -~commalist;\\
+ -~function;\\
+ -~instance;\\
+ -~integer;\\
+ -~length;\\
+ -~muskip;\\
+ -~real;\\
+ -~skip;\\
+ -~tokenlist.
+ }
+\msg_new:nnnn { xtemplate } { unknown-object-type }
+ { The~object~type~'#1'~is~unknown. }
+ {
+ An~object~type~needs~to~be~declared~with~\DeclareObjectType
+ prior~to~using~it.
+ }
+\msg_new:nnnn { xtemplate } { unknown-template }
+ { The~template~'#2'~of~type~'#1'~is~unknown. }
+ {
+ No~interface~has~been~declared~for~a~template~
+ '#2'~of~object~type~'#1'.
+ }
+\msg_new:nnn { xtemplate } { declare-object-type }
+ { Declaring~object~type~'#1'~taking~#2~argument(s)~\msg_line_context:. }
+\msg_new:nnn { xtemplate } { declare-template-code }
+ { Declaring~code~for~template~'#2'~of~object~type'#1'~\msg_line_context:. }
+\msg_new:nnn { xtemplate } { declare-template-interface }
+ {
+ Declaring~interface~for~template~'#2'~of~object~type~'#1'~
+ \msg_line_context:.
+ }
+\msg_new:nnn { xtemplate } { show-attribute }
+ {
+ The~template~'#2'~of~object~type~'#1'~has~
+ \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 }
+ }
+\msg_new:nnn { xtemplate } { show-values }
+ {
+ \tl_if_empty:nTF {#2}
+ { The~instance~'#3'~ }
+ { The~collection~ instance~'#3'~ (from~collection~'#2')~ }
+ of~object~type~'#1'~has~
+ \tl_if_empty:nTF {#4} { no~values. } { values: #4 }
+ }
+\cs_new_protected:Npn \DeclareObjectType #1#2
+ { \__xtemplate_declare_object_type:nn {#1} {#2} }
+\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4
+ { \__xtemplate_declare_template_keys:nnnn {#1} {#2} {#3} {#4} }
+\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5
+ { \__xtemplate_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} }
+\cs_new_protected:Npn \DeclareRestrictedTemplate #1#2#3#4
+ { \__xtemplate_declare_restricted:nnnn {#1} {#2} {#3} {#4} }
+\cs_new_protected:Npn \DeclareInstance #1#2#3#4
+ { \__xtemplate_declare_instance:nnnnn {#1} {#3} { } {#2} {#4} }
+\cs_new_protected:Npn \DeclareCollectionInstance #1#2#3#4#5
+ { \__xtemplate_declare_instance:nnnnn {#2} {#4} {#1} {#3} {#5} }
+\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3
+ { \__xtemplate_copy_instance:nnnn {#1} { } {#3} {#2} }
+\cs_new_protected:Npn \EditTemplateDefaults #1#2#3
+ { \__xtemplate_edit_defaults:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \EditInstance #1#2#3
+ { \__xtemplate_edit_instance:nnnn {#1} { } {#2} {#3} }
+\cs_new_protected:Npn \EditCollectionInstance #1#2#3#4
+ { \__xtemplate_edit_instance:nnnn {#2} {#1} {#3} {#4} }
+\cs_new_protected:Npn \UseTemplate #1#2#3
+ { \__xtemplate_use_template:nnn {#1} {#2} {#3} }
+\cs_new_protected:Npn \UseInstance #1#2
+ { \__xtemplate_use_instance:nn {#1} {#2} }
+\cs_new_protected:Npn \UseCollection #1#2
+ { \__xtemplate_use_collection:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowTemplateCode #1#2
+ { \__xtemplate_show_code:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowTemplateDefaults #1#2
+ { \__xtemplate_show_defaults:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowTemplateInterface #1#2
+ { \__xtemplate_show_keytypes:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowTemplateVariables #1#2
+ { \__xtemplate_show_vars:nn {#1} {#2} }
+\cs_new_protected:Npn \ShowInstanceValues #1#2
+ { \__xtemplate_show_values:nnn {#1} { } {#2} }
+\cs_new_protected:Npn \ShowCollectionInstanceValues #1#2#3
+ { \__xtemplate_show_values:nnn {#1} {#2} {#3} }
+\cs_new:Npn \IfInstanceExistTF #1#2
+ { \__xtemplate_if_instance_exist:nnnTF {#1} { } {#2} }
+\cs_new:Npn \IfInstanceExistT #1#2
+ { \__xtemplate_if_instance_exist:nnnT {#1} { } {#2} }
+\cs_new:Npn \IfInstanceExistF #1#2
+ { \__xtemplate_if_instance_exist:nnnF {#1} { } {#2} }
+\cs_new_protected:Npn \KeyValue #1 {#1}
+\cs_new_protected:Npn \AssignTemplateKeys
+ { \__xtemplate_assignments_pop: }
+\cs_new_protected:Npn \SetTemplateKeys #1#2#3
+ { \keys_set_known:nnN { template / #1 / #2 } {#3} \l__xtemplate_tmp_clist }
+\cs_new_eq:NN \ShowTemplateKeytypes \ShowTemplateInterface
+%%
+%%
+%% End of file `xtemplate.sty'.
diff --git a/macros/latex/contrib/l3packages/xtemplate.dtx b/macros/latex/contrib/l3packages/xtemplate.dtx
index 5080d94b0f..ee393ef3b3 100644
--- a/macros/latex/contrib/l3packages/xtemplate.dtx
+++ b/macros/latex/contrib/l3packages/xtemplate.dtx
@@ -4,7 +4,7 @@
%
% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
% (C) 2004-2010 Frank Mittelbach, The LaTeX Project
-% (C) 2011-2023 The LaTeX Project
+% (C) 2011-2024 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
@@ -24,23 +24,6 @@
%
% for those people who are interested.
%
-%<*driver|package>
-% The version of expl3 required is tested as early as possible, as
-% some really old versions do not define \ProvidesExplPackage.
-\RequirePackage{expl3}[2018/02/21]
-%<package>\@ifpackagelater{expl3}{2018/02/21}
-%<package> {}
-%<package> {%
-%<package> \PackageError{xtemplate}{Support package l3kernel too old}
-%<package> {%
-%<package> Please install an up to date version of l3kernel\MessageBreak
-%<package> using your TeX package manager or from CTAN.\MessageBreak
-%<package> \MessageBreak
-%<package> Loading xtemplate will abort!%
-%<package> }%
-%<package> \endinput
-%<package> }
-%</driver|package>
%<*driver>
\documentclass[full]{l3doc}
\usepackage{amstext}
@@ -51,7 +34,7 @@
% \fi
%
% \title{^^A
-% The \textsf{xtemplate} package\\ Prototype document functions^^A
+% The \pkg{xtemplate} package\\ Prototype document functions^^A
% }
%
% \author{^^A
@@ -63,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2023-10-10}
+% \date{Released 2024-02-13}
%
% \maketitle
%
@@ -98,7 +81,7 @@
% \item Loading one of the many packages to customise certain elements of
% the standard classes.
% \item Loading a completely different document class, such as
-% \textsf{KOMA-Script} or \textsf{memoir}, that allows easy customisation.
+% \cls{KOMA-Script} or \cls{memoir}, that allows easy customisation.
% \end{itemize}
% All three of these approaches have their drawbacks and learning curves.
%
@@ -467,14 +450,6 @@
% the general idea of fixing some settings.
% \end{function}
%
-% \begin{function}{\IfInstanceExistT, \IfInstanceExistF, \IfInstanceExistTF}
-% \begin{syntax}
-% \cs{IfInstanceExistTF} \Arg{object type} \Arg{instance} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if the named \meta{instance} of a \meta{object type} exists, and
-% then inserts the appropriate code into the input stream.
-% \end{function}
-%
% \begin{function}{\DeclareInstanceCopy}
% \begin{syntax}
% \cs{DeclareInstanceCopy}
@@ -707,2225 +682,35 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<@@=xtemplate>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2023-10-10}{}
- {L3 Experimental prototype document functions}
-% \end{macrocode}
-%
-% \subsection{Variables and constants}
-%
-% \begin{variable}{\c_@@_code_root_tl}
-% \begin{variable}{\c_@@_defaults_root_tl}
-% \begin{variable}{\c_@@_instances_root_tl}
-% \begin{variable}{\c_@@_keytypes_root_tl}
-% \begin{variable}{\c_@@_key_order_root_tl}
-% \begin{variable}{\c_@@_restrict_root_tl}
-% \begin{variable}{\c_@@_values_root_tl}
-% \begin{variable}{\c_@@_vars_root_tl}
-% So that literal values are kept to a minimum.
-% \begin{macrocode}
-\tl_const:Nn \c_@@_code_root_tl { template~code~>~ }
-\tl_const:Nn \c_@@_defaults_root_tl { template~defaults~>~ }
-\tl_const:Nn \c_@@_instances_root_tl { template~instance~>~ }
-\tl_const:Nn \c_@@_keytypes_root_tl { template~key~types~>~ }
-\tl_const:Nn \c_@@_key_order_root_tl { template~key~order~>~ }
-\tl_const:Nn \c_@@_restrict_root_tl { template~restrictions~>~ }
-\tl_const:Nn \c_@@_values_root_tl { template~values~>~ }
-\tl_const:Nn \c_@@_vars_root_tl { template~vars~>~ }
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\c_@@_keytypes_arg_seq}
-% A list of keytypes which also need additional data (an argument),
-% used to parse the keytype correctly. We suspend debugging to allow
-% an assignment to a constant.
-% \begin{macrocode}
-\seq_const_from_clist:Nn \c_@@_keytypes_arg_seq
- { choice , function , instance }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\g_@@_object_type_prop}
-% For storing types and the associated number of arguments.
-% \begin{macrocode}
-\prop_new:N \g_@@_object_type_prop
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_assignments_tl}
-% When creating an instance, the assigned values are collected here.
-% \begin{macrocode}
-\tl_new:N \l_@@_assignments_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_collection_tl}
-% The current instance collection name is stored here.
-% \begin{macrocode}
-\tl_new:N \l_@@_collection_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_collections_prop}
-% Lists current collection in force, indexed by object type.
-% \begin{macrocode}
-\prop_new:N \l_@@_collections_prop
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\l_@@_default_tl}
-% The default value for a key is recovered here from the property list
-% in which it is stored. The internal implementation of property lists
-% means that this is safe even with un-escaped |#| tokens.
-% \begin{macrocode}
-\tl_new:N \l_@@_default_tl
-% \end{macrocode}
-%\ end{macro}
-%
-% \begin{variable}{\l_@@_error_bool}
-% A flag for errors to be carried forward.
-% \begin{macrocode}
-\bool_new:N \l_@@_error_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_global_bool}
-% Used to indicate that assignments should be global.
-% \begin{macrocode}
-\bool_new:N \l_@@_global_bool
+%<@@=template>
% \end{macrocode}
-% \end{variable}
%
-% \begin{variable}{\l_@@_restrict_bool}
-% A flag to indicate that a template is being restricted.
-% \begin{macrocode}
-\bool_new:N \l_@@_restrict_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_restrict_clist}
-% A scratch list for restricting templates.
-% \begin{macrocode}
-\clist_new:N \l_@@_restrict_clist
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_key_name_tl}
-% \begin{variable}{\l_@@_keytype_tl}
-% \begin{variable}{\l_@@_keytype_arg_tl}
-% \begin{variable}{\l_@@_value_tl}
-% \begin{variable}{\l_@@_var_tl}
-% When defining each key in a template, the name and type of the key
-% need to be separated and stored. Any argument needed by the
-% keytype is also stored separately.
-% \begin{macrocode}
-\tl_new:N \l_@@_key_name_tl
-\tl_new:N \l_@@_keytype_tl
-\tl_new:N \l_@@_keytype_arg_tl
-\tl_new:N \l_@@_value_tl
-\tl_new:N \l_@@_var_tl
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_keytypes_prop}
-% \begin{variable}{\l_@@_key_order_seq}
-% \begin{variable}{\l_@@_values_prop}
-% \begin{variable}{\l_@@_vars_prop}
-% To avoid needing too many difficult-to-follow csname assignments,
-% various scratch token registers are used to build up data, which is
-% then transferred
-% \begin{macrocode}
-\prop_new:N \l_@@_keytypes_prop
-\seq_new:N \l_@@_key_order_seq
-\prop_new:N \l_@@_values_prop
-\prop_new:N \l_@@_vars_prop
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_clist}
-% \begin{variable}{\l_@@_tmp_dim}
-% \begin{variable}{\l_@@_tmp_int}
-% \begin{variable}{\l_@@_tmp_muskip}
-% \begin{variable}{\l_@@_tmp_skip}
-% For pre-processing the data stored by \pkg{xtemplate}, a number of
-% scratch variables are needed. The assignments are made to these in the
-% first instance, unless evaluation is delayed.
-% \begin{macrocode}
-\clist_new:N \l_@@_tmp_clist
-\dim_new:N \l_@@_tmp_dim
-\int_new:N \l_@@_tmp_int
-\muskip_new:N \l_@@_tmp_muskip
-\skip_new:N \l_@@_tmp_skip
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_tl}
-% A scratch variable for comparisons and so on.
-% \begin{macrocode}
-\tl_new:N \l_@@_tmp_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\s_@@_mark,\s_@@_stop}
-% Internal scan marks.
-% \begin{macrocode}
-\scan_new:N \s_@@_mark
-\scan_new:N \s_@@_stop
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\q_@@_nil}
-% Internal quarks.
-% \begin{macrocode}
-\quark_new:N \q_@@_nil
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[pTF]{\@@_quark_if_nil:n}
-% Branching quark conditional.
-% \begin{macrocode}
-\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Variant of prop functions}
-%
-% \begin{macro}[TF]{\prop_get:NoN}
-% In some cases, we need to expand the key, and get the corresponding
-% value in a property list if it exists.
-% \begin{macrocode}
-\cs_generate_variant:Nn \prop_get:NnNTF { No }
-\cs_generate_variant:Nn \prop_get:NnNT { No }
-\cs_generate_variant:Nn \prop_get:NnNF { No }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Testing existence and validity}
-%
-% There are a number of checks needed for either the existence of
-% a object type, template or instance. There are also some for the
-% validity of a particular call. All of these are collected up here.
-%
-% \begin{macro}{\@@_execute_if_arg_agree:nnT}
-% A test agreement between the number of arguments for the template
-% type and that specified when creating a template. This is not done as a
-% separate conditional for efficiency and better error message
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_execute_if_arg_agree:nnT #1#2#3
- {
- \prop_get:NnN \g_@@_object_type_prop {#1} \l_@@_tmp_tl
- \int_compare:nNnTF {#2} = \l_@@_tmp_tl
- {#3}
- {
- \msg_error:nneee { xtemplate }
- { argument-number-mismatch } {#1} { \l_@@_tmp_tl } {#2}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_execute_if_code_exist:nnT}
-% A template is only fully declared if the code has been set up,
-% which can be checked by looking for the template function itself.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_execute_if_code_exist:nnT #1#2#3
- {
- \cs_if_exist:cTF { \c_@@_code_root_tl #1 / #2 }
- {#3}
- {
- \msg_error:nnee { xtemplate } { no-template-code }
- {#1} {#2}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_execute_if_keytype_exist:nT}
-% \begin{macro}{\@@_execute_if_keytype_exist:oT}
-% The test for valid keytypes looks for a function to set up the key,
-% which is part of the \enquote{code} side of the template definition.
-% This avoids having different lists for the two parts of the process.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_execute_if_keytype_exist:nT #1#2
- {
- \cs_if_exist:cTF { @@_store_value_ #1 :n }
- {#2}
- { \msg_error:nne { xtemplate } { unknown-keytype } {#1} }
- }
-\cs_generate_variant:Nn \@@_execute_if_keytype_exist:nT { o }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_execute_if_type_exist:nT}
-% To check that a particular object type is valid.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_execute_if_type_exist:nT #1#2
- {
- \prop_if_in:NnTF \g_@@_object_type_prop {#1}
- {#2}
- { \msg_error:nne { xtemplate } { unknown-object-type } {#1} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_execute_if_keys_exist:nnT}
-% To check that the keys for a template have been set up before trying
-% to create any code, a simple check for the correctly-named keytype
-% property list.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_if_keys_exist:nnT #1#2#3
- {
- \cs_if_exist:cTF { \c_@@_keytypes_root_tl #1 / #2 }
- {#3}
- {
- \msg_error:nnee { xtemplate } { unknown-template }
- {#1} {#2}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[TF]{\@@_if_key_value:n, \@@_if_key_value:o}
-% Tests for the first token in a string being \cs{KeyValue}.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_if_key_value:n #1 { T , F , TF }
- {
- \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-\cs_generate_variant:Nn \@@_if_key_value:nT { o }
-\cs_generate_variant:Nn \@@_if_key_value:nF { o }
-\cs_generate_variant:Nn \@@_if_key_value:nTF { o }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[TF]{\@@_if_instance_exist:nnn}
-% Testing for an instance is collection dependent.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_if_instance_exist:nnn #1#2#3
- { T, F, TF }
- {
- \cs_if_exist:cTF { \c_@@_instances_root_tl #1 / #2 / #3 }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_if_use_template:nTF}
-% Tests for the first token in a string being \cs{UseTemplate}.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_if_use_template:n #1 { TF }
- {
- \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop }
- { \prg_return_true: }
- { \prg_return_false: }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Saving and recovering property lists}
-%
-% The various property lists for templates have to be shuffled in
-% and out of storage.
-%
-% \begin{macro}{\@@_store_defaults:n}
-% \begin{macro}{\@@_store_keytypes:n}
-% \begin{macro}{\@@_store_restrictions:n}
-% \begin{macro}{\@@_store_values:n}
-% \begin{macro}{\@@_store_vars:n}
-% The defaults and keytypes are transferred from the scratch property
-% lists to the \enquote{proper} lists for the template being created.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store_defaults:n #1
- {
- \prop_gclear_new:c { \c_@@_defaults_root_tl #1 }
- \prop_gset_eq:cN { \c_@@_defaults_root_tl #1 }
- \l_@@_values_prop
- }
-\cs_new_protected:Npn \@@_store_keytypes:n #1
- {
- \prop_gclear_new:c { \c_@@_keytypes_root_tl #1 }
- \prop_gset_eq:cN { \c_@@_keytypes_root_tl #1 }
- \l_@@_keytypes_prop
- \seq_gclear_new:c { \c_@@_key_order_root_tl #1 }
- \seq_gset_eq:cN { \c_@@_key_order_root_tl #1 }
- \l_@@_key_order_seq
- }
-\cs_new_protected:Npn \@@_store_values:n #1
- {
- \prop_clear_new:c { \c_@@_values_root_tl #1 }
- \prop_set_eq:cN { \c_@@_values_root_tl #1 }
- \l_@@_values_prop
- }
-\cs_new_protected:Npn \@@_store_restrictions:n #1
- {
- \clist_gclear_new:c { \c_@@_restrict_root_tl #1 }
- \clist_gset_eq:cN { \c_@@_restrict_root_tl #1 }
- \l_@@_restrict_clist
- }
-\cs_new_protected:Npn \@@_store_vars:n #1
- {
- \prop_gclear_new:c { \c_@@_vars_root_tl #1 }
- \prop_gset_eq:cN { \c_@@_vars_root_tl #1 }
- \l_@@_vars_prop
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_recover_defaults:n}
-% \begin{macro}{\@@_recover_keytypes:n}
-% \begin{macro}{\@@_recover_restrictions:n}
-% \begin{macro}{\@@_recover_values:n}
-% \begin{macro}{\@@_recover_vars:n}
-% Recovering the stored data for a template is rather less complex
-% than storing it. All that happens is the data is transferred from
-% the permanent to the scratch storage. However, we need to check the
-% scratch storage does exist.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_recover_defaults:n #1
- {
- \prop_if_exist:cTF
- { \c_@@_defaults_root_tl #1 }
- {
- \prop_set_eq:Nc \l_@@_values_prop
- { \c_@@_defaults_root_tl #1 }
- }
- { \prop_clear:N \l_@@_values_prop }
- }
-\cs_new_protected:Npn \@@_recover_keytypes:n #1
- {
- \prop_if_exist:cTF
- { \c_@@_keytypes_root_tl #1 }
- {
- \prop_set_eq:Nc \l_@@_keytypes_prop
- { \c_@@_keytypes_root_tl #1 }
- }
- { \prop_clear:N \l_@@_keytypes_prop }
- \seq_if_exist:cTF { \c_@@_key_order_root_tl #1 }
- {
- \seq_set_eq:Nc \l_@@_key_order_seq
- { \c_@@_key_order_root_tl #1 }
- }
- { \seq_clear:N \l_@@_key_order_seq }
- }
-\cs_new_protected:Npn \@@_recover_restrictions:n #1
- {
- \clist_if_exist:cTF
- { \c_@@_restrict_root_tl #1 }
- {
- \clist_set_eq:Nc \l_@@_restrict_clist
- { \c_@@_restrict_root_tl #1 }
- }
- { \clist_clear:N \l_@@_restrict_clist }
- }
-\cs_new_protected:Npn \@@_recover_values:n #1
- {
- \prop_if_exist:cTF
- { \c_@@_values_root_tl #1 }
- {
- \prop_set_eq:Nc \l_@@_values_prop
- { \c_@@_values_root_tl #1 }
- }
- { \prop_clear:N \l_@@_values_prop }
- }
-\cs_new_protected:Npn \@@_recover_vars:n #1
- {
- \prop_if_exist:cTF
- { \c_@@_vars_root_tl #1 }
- {
- \prop_set_eq:Nc \l_@@_vars_prop
- { \c_@@_vars_root_tl #1 }
- }
- { \prop_clear:N \l_@@_vars_prop }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Creating new object types}
-%
-% \begin{macro}{\@@_declare_object_type:nn}
-% Although the object type is the \enquote{top level} of the template
-% system, it is actually very easy to implement. All that happens is that
-% the number of arguments required is recorded, indexed by the name of the
-% object type.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_object_type:nn #1#2
- {
- \int_set:Nn \l_@@_tmp_int {#2}
- \int_compare:nTF { 0 <= \l_@@_tmp_int <= 9 }
- {
- \msg_info:nnnV { xtemplate } { declare-object-type }
- {#1} \l_@@_tmp_int
- \prop_gput:NnV \g_@@_object_type_prop {#1}
- \l_@@_tmp_int
- }
- {
- \msg_error:nnee { xtemplate } { bad-number-of-arguments }
- {#1} { \exp_not:V \l_@@_tmp_int }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Design part of template declaration}
-%
-% The \enquote{design} part of a template declaration defines the general
-% behaviour of each key, and possibly a default value. However, it does
-% not include the implementation. This means that what happens here is
-% the two properties are saved to appropriate lists, which can then
-% be used later to recover the information when implementing the keys.
-%
-% \begin{macro}{\@@_declare_template_keys:nnnn}
-% The main function for the \enquote{design} part of creating a template
-% starts by checking that the object type exists and that the number of
-% arguments required agree. If that is all fine, then the two storage
-% areas for defaults and keytypes are initialised. The mechanism is then
-% set up for the \pkg{l3keys} module to actually parse the keys.
-% Finally, the code hands of to the storage routine to save the parsed
-% information properly.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_template_keys:nnnn #1#2#3#4
- {
- \@@_execute_if_type_exist:nT {#1}
- {
- \@@_execute_if_arg_agree:nnT {#1} {#3}
- {
- \prop_clear:N \l_@@_values_prop
- \prop_clear:N \l_@@_keytypes_prop
- \seq_clear:N \l_@@_key_order_seq
- \keyval_parse:NNn
- \@@_parse_keys_elt:n \@@_parse_keys_elt:nn {#4}
- \@@_store_defaults:n { #1 / #2 }
- \@@_store_keytypes:n { #1 / #2 }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_parse_keys_elt:n}
-% \begin{macro}{\@@_parse_keys_elt_aux:n}
-% \begin{macro}{\@@_parse_keys_elt_aux:}
-% Processing the key part of the key--value pair is always carried out
-% using this function, even if a value was found. First, the key name
-% is separated from the keytype, and if necessary the keytype is
-% separated into two parts. This information is then used to check that
-% the keytype is valid, before storing the keytype (plus argument if
-% necessary) as a property of the key name. The key name is also stored
-% (in braces) in the token list to record the order the keys are defined
-% in.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_keys_elt:n #1
- {
- \@@_split_keytype:n {#1}
- \bool_if:NF \l_@@_error_bool
- {
- \@@_execute_if_keytype_exist:oT \l_@@_keytype_tl
- {
- \seq_map_function:NN \c_@@_keytypes_arg_seq
- \@@_parse_keys_elt_aux:n
- \bool_if:NF \l_@@_error_bool
- {
- \seq_if_in:NoTF \l_@@_key_order_seq
- \l_@@_key_name_tl
- {
- \msg_error:nne { xtemplate }
- { duplicate-key-interface }
- { \l_@@_key_name_tl }
- }
- { \@@_parse_keys_elt_aux: }
- }
- }
- }
- }
-\cs_new_protected:Npn \@@_parse_keys_elt_aux:n #1
- {
- \str_if_eq:onT \l_@@_keytype_tl {#1}
- {
- \tl_if_empty:NT \l_@@_keytype_arg_tl
- {
- \msg_error:nne { xtemplate }
- { keytype-requires-argument } {#1}
- \bool_set_true:N \l_@@_error_bool
- \seq_map_break:
- }
- }
- }
-\cs_new:Npn \@@_parse_keys_elt_aux:
- {
- \tl_set:Ne \l_@@_tmp_tl
- {
- \l_@@_keytype_tl
- \tl_if_empty:NF \l_@@_keytype_arg_tl
- { { \l_@@_keytype_arg_tl } }
- }
- \prop_put:Noo \l_@@_keytypes_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- \seq_put_right:No \l_@@_key_order_seq \l_@@_key_name_tl
- \str_if_eq:onT \l_@@_keytype_tl { choice }
- {
- \exp_args:No \clist_if_in:nnT \l_@@_keytype_arg_tl { unknown }
- { \msg_error:nn { xtemplate } { choice-unknown-reserved } }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_parse_keys_elt:nn}
-% For keys which have a default, the keytype and key name are first
-% separated out by the \cs{@@_parse_keys_elt:n}
-% routine, before storing the default value in the scratch property list.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_keys_elt:nn #1#2
- {
- \@@_parse_keys_elt:n {#1}
- \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#2}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_split_keytype:n}
-% \begin{macro}{\@@_split_keytype_aux:w}
-% The keytype and key name should be separated by |:|. As the
-% definition might be given inside or outside of a code block,
-% the category code of colons is standardised. After
-% that, the standard delimited argument method is used to separate the
-% two parts.
-% \begin{macrocode}
-\cs_new_protected:Npe \@@_split_keytype:n #1
- {
- \exp_not:N \bool_set_false:N \exp_not:N \l_@@_error_bool
- \tl_set:Nn \exp_not:N \l_@@_tmp_tl {#1}
- \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl { : } { \token_to_str:N : }
- \tl_if_in:onTF \exp_not:N \l_@@_tmp_tl { \token_to_str:N : }
- {
- \exp_not:n
- {
- \tl_clear:N \l_@@_key_name_tl
- \exp_after:wN \@@_split_keytype_aux:w
- \l_@@_tmp_tl \s_@@_stop
- }
- }
- {
- \exp_not:N \bool_set_true:N \exp_not:N \l_@@_error_bool
- \msg_error:nne { xtemplate } { missing-keytype } {#1}
- }
- }
-\use:e
- {
- \cs_new_protected:Npn \exp_not:N \@@_split_keytype_aux:w
- #1 \token_to_str:N : #2 \s_@@_stop
- {
- \tl_put_right:Ne \exp_not:N \l_@@_key_name_tl
- {
- \exp_not:N \tl_trim_spaces:e
- { \exp_not:N \tl_to_str:n {#1} }
- }
- \tl_if_in:nnTF {#2} { \token_to_str:N : }
- {
- \tl_put_right:Nn \exp_not:N \l_@@_key_name_tl
- { \token_to_str:N : }
- \exp_not:N \@@_split_keytype_aux:w #2 \s_@@_stop
- }
- {
- \exp_not:N \tl_if_empty:NTF \exp_not:N \l_@@_key_name_tl
- {
- \msg_error:nne { xtemplate } { empty-key-name }
- { \token_to_str:N : #2 }
- }
- { \exp_not:N \@@_split_keytype_arg:n {#2} }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_split_keytype_arg:n, \@@_split_keytype_arg:o}
-% \begin{macro}{\@@_split_keytype_arg_aux:n}
-% \begin{macro}{\@@_split_keytype_arg_aux:w}
-% The second stage of sorting out the keytype is to check for an
-% argument. As there is no convenient delimiting token to look for,
-% a check is made instead for each possible text value for the keytype.
-% To keep things faster, this only involves the keytypes that need an
-% argument. If a match is made, then a check is also needed to see that
-% it is at the start of the keytype information. All being well, the
-% split can then be applied. Any non-matching keytypes are assumed to
-% be \enquote{correct} as given, and are left alone (this is checked by
-% other code).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_split_keytype_arg:n #1
- {
- \tl_set:Ne \l_@@_keytype_tl { \tl_trim_spaces:n {#1} }
- \tl_clear:N \l_@@_keytype_arg_tl
- \cs_set_protected:Npn \@@_split_keytype_arg_aux:n ##1
- {
- \tl_if_in:nnT {#1} {##1}
- {
- \cs_set:Npn \@@_split_keytype_arg_aux:w
- ####1 ##1 ####2 \s_@@_stop
- {
- \tl_if_blank:nT {####1}
- {
- \tl_set:Ne \l_@@_keytype_tl
- { \tl_trim_spaces:n {##1} }
- \tl_if_blank:nF {####2}
- {
- \tl_set:Ne \l_@@_keytype_arg_tl
- { \use:n ####2 }
- }
- \seq_map_break:
- }
- }
- \@@_split_keytype_arg_aux:w #1 \s_@@_stop
- }
- }
- \seq_map_function:NN \c_@@_keytypes_arg_seq
- \@@_split_keytype_arg_aux:n
- }
-\cs_generate_variant:Nn \@@_split_keytype_arg:n { o }
-\cs_new:Npn \@@_split_keytype_arg_aux:n #1 { }
-\cs_new:Npn \@@_split_keytype_arg_aux:w #1 \s_@@_stop { }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsubsection{Storing values}
-%
-% As \pkg{xtemplate} pre-processes key values for efficiency reasons,
-% there is a need to convert the values given as defaults into
-% \enquote{ready to use} data. The same general idea is true when an instance
-% is declared. However, assignments are not made until an instance is
-% used, and so there has to be some intermediate storage. Furthermore,
-% the ability to delay evaluation of results is needed. To achieve these
-% aims, a series of \enquote{process and store} functions are defined here.
-%
-% All of the information about the key (the key name and the keytype)
-% is already stored as variables. The same property list is always used
-% to store the data, meaning that the only argument required is the
-% value to be processed and potentially stored.
-%
-% \begin{macro}{\@@_store_value_boolean:n}
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store_value_boolean:n #1
- { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_store_value:n, \@@_store_value_choice:n,
-% \@@_store_value_function:n, \@@_store_value_instance:n}
-% With no need to worry about delayed evaluation, these keytypes all
-% just store the input directly.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store_value:n #1
- { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} }
-\cs_new_eq:NN \@@_store_value_choice:n \@@_store_value:n
-\cs_new_eq:NN \@@_store_value_function:n \@@_store_value:n
-\cs_new_eq:NN \@@_store_value_instance:n \@@_store_value:n
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_store_value_aux:Nn, \@@_store_value_integer:n,
-% \@@_store_value_length:n, \@@_store_value_muskip:n,
-% \@@_store_value_real:n, \@@_store_value_skip:n,
-% \@@_store_value_tokenlist:n, \@@_store_value_commalist:n}
-% Storing values in \cs{l_@@_values_prop} is in most cases the same.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store_value_aux:Nn #1#2
- { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#2} }
-\cs_new_protected:Npn \@@_store_value_integer:n
- { \@@_store_value_aux:Nn \int_eval:n }
-\cs_new_protected:Npn \@@_store_value_length:n
- { \@@_store_value_aux:Nn \dim_eval:n }
-\cs_new_protected:Npn \@@_store_value_muskip:n
- { \@@_store_value_aux:Nn \muskip_eval:n }
-\cs_new_protected:Npn \@@_store_value_real:n
- { \@@_store_value_aux:Nn \fp_eval:n }
-\cs_new_protected:Npn \@@_store_value_skip:n
- { \@@_store_value_aux:Nn \skip_eval:n }
-\cs_new_protected:Npn \@@_store_value_tokenlist:n
- { \@@_store_value_aux:Nn \use:n }
-\cs_new_eq:NN \@@_store_value_commalist:n \@@_store_value_tokenlist:n
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Implementation part of template declaration}
-%
-% \begin{macro}{\@@_declare_template_code:nnnnn}
-% \begin{macro}{\@@_declare_template_code:nnn}
-% The main function for implementing a template starts with a couple of
-% simple checks to make sure that there are no obvious mistakes: the
-% number of arguments must agree and the template keys must have been
-% declared.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_template_code:nnnnn #1#2#3#4#5
- {
- \@@_execute_if_type_exist:nT {#1}
- {
- \@@_execute_if_arg_agree:nnT {#1}{#3}
- {
- \@@_if_keys_exist:nnT {#1} {#2}
- {
- \@@_store_key_implementation:nnn {#1} {#2} {#4}
- \regex_match:nnTF { \c { AssignTemplateKeys } } {#5}
- { \@@_declare_template_code:nnn { #1 / #2 } {#3} {#5} }
- {
- \@@_declare_template_code:nnn
- { #1 / #2 } {#3} { \AssignTemplateKeys #5 }
- }
- }
- }
- }
- }
-\cs_new_protected:Npn \@@_declare_template_code:nnn #1#2#3
- {
- \cs_generate_from_arg_count:cNnn
- { \c_@@_code_root_tl #1 }
- \cs_gset_protected:Npn {#2} {#3}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_store_key_implementation:nnn}
-% Actually storing the implementation part of a template is quite easy
-% as it only requires the list of keys given to be turned into a
-% property list. There is also some error-checking to do, hence the need
-% to have the list of defined keytypes available. In certain cases
-% (when choices are involved) parsing the key results in changes to the
-% default values. That is why they are loaded and then saved again.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store_key_implementation:nnn #1#2#3
- {
- \@@_recover_defaults:n { #1 / #2 }
- \@@_recover_restrictions:n { #1 / #2 }
- \@@_recover_keytypes:n { #1 / #2 }
- \prop_clear:N \l_@@_vars_prop
- \keyval_parse:nnn
- { \@@_parse_vars_elt:n } { \@@_parse_vars_elt:nnn { #1 / #2 } } {#3}
- \@@_store_vars:n { #1 / #2 }
- \@@_store_restrictions:n { #1 / #2 }
- \prop_map_inline:Nn \l_@@_keytypes_prop
- {
- \msg_error:nneee { xtemplate } { key-not-implemented }
- {##1} {#2} {#1}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_parse_vars_elt:n}
-% At the implementation stage, every key must have a value given. So
-% this is an error function.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_vars_elt:n #1
- { \msg_error:nne { xtemplate } { key-no-variable } {#1} }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_parse_vars_elt:nnn}
-% The actual storage part here is very simple: the storage bin name
-% is placed into the property list. At the same time, a comparison is
-% made with the keytypes defined earlier: if there is a mismatch then
-% an error is raised.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_vars_elt:nnn #1#2#3
- {
- \tl_set:Ne \l_@@_key_name_tl
- { \tl_trim_spaces:e { \tl_to_str:n {#2} } }
- \prop_get:NoNTF
- \l_@@_keytypes_prop
- \l_@@_key_name_tl
- \l_@@_keytype_tl
- {
- \@@_split_keytype_arg:o \l_@@_keytype_tl
- \@@_parse_vars_elt_aux:nn {#1} {#3}
- \prop_remove:NV \l_@@_keytypes_prop \l_@@_key_name_tl
- }
- { \msg_error:nne { xtemplate } { unknown-key } {#2} }
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\@@_parse_vars_elt_aux:nn}
-% \begin{macro}{\@@_parse_vars_elt_aux:nw}
-% \begin{macro}{\@@_parse_vars_elt_aux:nnn}
-% \begin{macro}{\@@_parse_vars_elt_key:nn}
-% Split off any leading \texttt{global} and they look for the way to
-% implement.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_vars_elt_aux:nn #1#2
- {
- \@@_parse_vars_elt_aux:nw {#1} #2 global global \s_@@_stop
- }
-\cs_new_protected:Npn \@@_parse_vars_elt_aux:nw
- #1#2 global #3 global #4 \s_@@_stop
- {
- \tl_if_blank:nTF {#4}
- { \@@_parse_vars_elt_aux:nnn {#1} { } {#2} }
- {
- \tl_if_blank:nTF {#2}
- {
- \exp_args:Nnne \@@_parse_vars_elt_aux:nnn
- {#1} { global } { \tl_trim_spaces:n {#3} }
- }
- { \msg_error:nnn { xtemplate } { bad-variable } { #2 global #3 } }
- }
- }
-\cs_new_protected:Npn \@@_parse_vars_elt_aux:nnn #1#2#3
- {
- \str_case:VnF \l_@@_keytype_tl
- {
- { choice } { \@@_implement_choices:nn {#1} {#3} }
- { function }
- {
- \cs_if_exist:NF #3
- { \cs_new:Npn #3 { } }
- \@@_parse_vars_elt_key:nn {#1}
- {
- .code:n =
- {
- \cs_generate_from_arg_count:NNnn
- \exp_not:N #3
- \exp_not:c
- { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn }
- { \exp_not:o \l_@@_keytype_arg_tl }
- {##1}
- }
- }
- \prop_put:Non \l_@@_vars_prop
- \l_@@_key_name_tl {#2#3}
- }
- { instance }
- {
- \@@_parse_vars_elt_key:nn {#1}
- {
- .code:n =
- {
- \exp_not:c
- { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn }
- \exp_not:N #3 { \UseInstance {##1} }
- }
- }
- \prop_put:Non \l_@@_vars_prop
- \l_@@_key_name_tl {#2#3}
- }
- }
- {
- \tl_if_single:nTF {#3}
- {
- \cs_if_exist:NF #3
- { \use:c { \@@_map_var_type: _new:N } #3 }
- \@@_parse_vars_elt_key:nn {#1}
- {
- . \@@_map_var_type:
- _ \str_if_eq:nnT {#1} { global } { g } set:N
- = \exp_not:N #3
- }
- \prop_put:Non \l_@@_vars_prop
- \l_@@_key_name_tl {#2#3}
- }
- { \msg_error:nne { xtemplate } { bad-variable } { #2#3 } }
- }
- }
-\cs_new_protected:Npn \@@_parse_vars_elt_key:nn #1#2
- {
- \keys_define:ne { template / #1 }
- { \l_@@_key_name_tl #2 }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_map_var_type:}
-% Turn a \enquote{friendly} variable type into an \texttt{expl3} one.
-% \begin{macrocode}
-\cs_new:Npn \@@_map_var_type:
- {
- \str_case:on \l_@@_keytype_tl
- {
- { boolean } { bool }
- { commalist } { clist }
- { integer } { int }
- { length } { dim }
- { muskip } { muskip }
- { real } { fp }
- { skip } { skip }
- { tokenlist } { tl }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_implement_choices:nn}
-% \begin{macro}{\@@_implement_choices_default:}
-% Implementing choices requires a second key--value loop. So after a
-% little set-up, the standard parser is called.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_implement_choices:nn #1#2
- {
- \clist_set:No \l_@@_tmp_clist { \l_@@_keytype_arg_tl }
- \prop_put:Non \l_@@_vars_prop \l_@@_key_name_tl { }
- \keys_define:ne { template / #1 } { \l_@@_key_name_tl .choice: }
- \keyval_parse:nnn
- { \@@_implement_choice_elt:n }
- { \@@_implement_choice_elt:nnn {#1} }
- {#2}
- \prop_get:NoNT \l_@@_values_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- { \@@_implement_choices_default: }
- \clist_if_empty:NF \l_@@_tmp_clist
- {
- \clist_map_inline:Nn \l_@@_tmp_clist
- {
- \msg_error:nne { xtemplate } { choice-not-implemented }
- {##1}
- }
- }
- }
-% \end{macrocode}
-% A sanity check for the default value, so that an error is raised
-% now and not when converting to assignments.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_implement_choices_default:
- {
- \tl_set:Ne \l_@@_tmp_tl
- { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl }
- \prop_if_in:NoF \l_@@_vars_prop \l_@@_tmp_tl
- {
- \tl_set:Ne \l_@@_tmp_tl
- { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl }
- \prop_if_in:NoF \l_@@_vars_prop \l_@@_tmp_tl
- {
- \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- \@@_split_keytype_arg:o \l_@@_tmp_tl
- \prop_get:NoN \l_@@_values_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- \msg_error:nneee { xtemplate } { unknown-default-choice }
- { \l_@@_key_name_tl } { \l_@@_key_name_tl }
- { \l_@@_keytype_arg_tl }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_implement_choice_elt:nnn, \@@_implement_choice_elt_aux:nnn}
-% \begin{macro}{\@@_implement_choice_elt:n}
-% The actual storage of the implementation of a choice is mainly about
-% error checking. The code here ensures that all choices have to have
-% been declared, apart from the special \texttt{unknown} choice, which
-% must come last. The code for each choice is stored along with the
-% key name in the variables property list.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_implement_choice_elt:nnn #1#2#3
- {
- \clist_if_empty:NTF \l_@@_tmp_clist
- {
- \str_if_eq:nnTF {#2} { unknown }
- { \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3} }
- {
- \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- \@@_split_keytype_arg:o \l_@@_tmp_tl
- \msg_error:nneee { xtemplate } { unknown-choice }
- { \l_@@_key_name_tl } {#2}
- { \l_@@_keytype_arg_tl }
- }
- }
- {
- \clist_if_in:NnTF \l_@@_tmp_clist {#2}
- {
- \clist_remove_all:Nn \l_@@_tmp_clist {#2}
- \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3}
- }
- {
- \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- \@@_split_keytype_arg:o \l_@@_tmp_tl
- \msg_error:nneee { xtemplate } { unknown-choice }
- { \l_@@_key_name_tl } {#2}
- { \l_@@_keytype_arg_tl }
- }
- }
- }
-\cs_new_protected:Npn \@@_implement_choice_elt_aux:nnn #1#2#3
- {
- \keys_define:ne { template / #1 }
- { \l_@@_key_name_tl / #2 .code:n = { \exp_not:n {#3} } }
- \tl_set:Ne \l_@@_tmp_tl
- { \l_@@_key_name_tl \c_space_tl #2 }
- \prop_put:Non \l_@@_vars_prop \l_@@_tmp_tl {#3}
- }
-\cs_new_protected:Npn \@@_implement_choice_elt:n #1
- {
- \msg_error:nneee { xtemplate } { choice-requires-code }
- { \l_@@_key_name_tl } {#1}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Editing template defaults}
-%
-% Template defaults can be edited either with no other changes or
-% to prevent further editing, forming a \enquote{restricted template}.
-% In the later case, a new template results, whereas simple editing
-% does not produce a new template name.
-%
-% \begin{macro}{\@@_declare_restricted:nnnn}
-% Creating a restricted template means copying the old template to the
-% new one first.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_restricted:nnnn #1#2#3#4
- {
- \@@_if_keys_exist:nnT {#1} {#2}
- {
- \@@_set_template_eq:nn { #1 / #3 } { #1 / #2 }
- \bool_set_true:N \l_@@_restrict_bool
- \@@_edit_defaults_aux:nnn {#1} {#3} {#4}
- \bool_set_false:N \l_@@_restrict_bool
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_edit_defaults:nnn}
-% \begin{macro}{\@@_edit_defaults_aux:nnn}
-% Editing the template defaults means getting the values back out
-% of the store, then parsing the list of new values before putting
-% the updated list back into storage. The auxiliary function is used
-% to allow code-sharing with the template-restriction system.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_edit_defaults:nnn
- {
- \bool_set_false:N \l_@@_restrict_bool
- \@@_edit_defaults_aux:nnn
- }
-\cs_new_protected:Npn \@@_edit_defaults_aux:nnn #1#2#3
- {
- \@@_if_keys_exist:nnT {#1} {#2}
- {
- \@@_recover_defaults:n { #1 / #2 }
- \@@_recover_restrictions:n { #1 / #2 }
- \@@_parse_values:nn { #1 / #2 } {#3}
- \@@_store_defaults:n { #1 / #2 }
- \@@_store_restrictions:n { #1 / #2 }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_parse_values:nn, \@@_parse_values_aux:nn}
-% The routine to parse values is the same for both editing a
-% template and setting up an instance. So the code here does only the
-% minimum necessary for reading the values.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_values:nn #1#2
- {
- \clist_clear:N \l_@@_restrict_clist
- \@@_parse_values_aux:nn {#1} {#2}
- }
-\cs_new_protected:Npn \@@_parse_values_aux:nn #1#2
- {
- \@@_recover_keytypes:n {#1}
- \keyval_parse:NNn
- \@@_parse_values_elt:n \@@_parse_values_elt:nn {#2}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_parse_values_elt:n}
-% Every key needs a value, so this is just an error routine.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_values_elt:n #1
- {
- \bool_set_true:N \l_@@_error_bool
- \msg_error:nne { xtemplate } { key-no-value } {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_parse_values_elt:nn}
-% \begin{macro}{\@@_parse_values_elt_aux:n}
-% To store the value, find the keytype then call the saving function.
-% These need the current key name saved as \cs{l_@@_key_name_tl}.
-% When a template is being restricted, the setting code will be
-% skipped for restricted keys.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_values_elt:nn #1#2
- {
- \tl_set:Ne \l_@@_key_name_tl
- { \tl_trim_spaces:e { \tl_to_str:n {#1} } }
- \prop_get:NoNTF \l_@@_keytypes_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- {
- \bool_if:NTF \l_@@_restrict_bool
- {
- \clist_if_in:NoF \l_@@_restrict_clist
- \l_@@_key_name_tl
- { \@@_parse_values_elt_aux:n {#2} }
- }
- { \@@_parse_values_elt_aux:n {#2} }
- }
- {
- \msg_error:nne { xtemplate } { unknown-key }
- { \l_@@_key_name_tl }
- }
- }
-\cs_new_protected:Npn \@@_parse_values_elt_aux:n #1
- {
- \clist_put_right:No \l_@@_restrict_clist \l_@@_key_name_tl
- \@@_split_keytype_arg:o \l_@@_tmp_tl
- \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#1}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_set_template_eq:nn}
-% To copy a template, each of the lists plus the code has to be copied
-% across. To keep this independent of the list storage system, it is
-% all done with two-part shuffles.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_template_eq:nn #1#2
- {
- \@@_recover_defaults:n {#2}
- \@@_store_defaults:n {#1}
- \@@_recover_keytypes:n {#2}
- \@@_store_keytypes:n {#1}
- \@@_recover_vars:n {#2}
- \@@_store_vars:n {#1}
- \cs_gset_eq:cc { \c_@@_code_root_tl #1 }
- { \c_@@_code_root_tl #2 }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%\subsection{Creating instances of templates}
-%
-% \begin{macro}{\@@_declare_instance:nnnnn}
-% \begin{macro}{\@@_declare_instance_aux:nnnnn}
-% Making an instance has two distinct parts. First, the keys given are
-% parsed to transfer the values into the structured data format used
-% internally. This allows the default and given values to be combined
-% with no repetition. In the second step, the structured data is
-% converted to pre-defined variable assignments, and these are stored
-% in the function for the instance. A final check is also made so that
-% there is always an instance \enquote{outside} of any collection.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_instance:nnnnn #1#2#3#4#5
- {
- \@@_execute_if_code_exist:nnT {#1} {#2}
- {
- \@@_recover_defaults:n { #1 / #2 }
- \@@_recover_restrictions:n { #1 / #2 }
- \@@_recover_vars:n { #1 / #2 }
- \@@_declare_instance_aux:nnnnn {#1} {#2} {#3} {#4} {#5}
- }
- }
-\cs_new_protected:Npn \@@_declare_instance_aux:nnnnn #1#2#3#4#5
- {
- \bool_set_false:N \l_@@_error_bool
- \@@_parse_values_aux:nn { #1 / #2 } {#5}
- \bool_if:NF \l_@@_error_bool
- {
- \prop_put:Nnn \l_@@_values_prop { from~template } {#2}
- \@@_store_values:n { #1 / #3 / #4 }
- \@@_convert_to_assignments:
- \cs_set_protected:cpe { \c_@@_instances_root_tl #1 / #3 / #4 }
- {
- \exp_not:N \@@_assignments_push:n
- { \exp_not:o \l_@@_assignments_tl }
- \exp_not:c { \c_@@_code_root_tl #1 / #2 }
- }
- \@@_if_instance_exist:nnnF {#1} { } {#4}
- {
- \cs_set_eq:cc
- { \c_@@_instances_root_tl #1 / / #4 }
- { \c_@@_instances_root_tl #1 / #3 / #4 }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_copy_instance:nnnn}
-% Copy--paste an instance
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_copy_instance:nnnn #1#2#3#4
- {
- \@@_if_instance_exist:nnnTF {#1} {#2} {#3}
- {
- \@@_recover_values:n { #1 / #2 / #3 }
- \@@_store_values:n { #1 / #2 / #4 }
- \cs_set_eq:cc { \c_@@_instances_root_tl #1 / #2 / #4 }
- { \c_@@_instances_root_tl #1 / #2 / #3 }
- }
- {
- \msg_error:nnee { xtemplate } { unknown-instance }
- {#1} {#3}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\@@_edit_instance:nnnn}
-% \begin{macro}{\@@_edit_instance_aux:nnnnn}
-% \begin{macro}{\@@_edit_instance_aux:nonnn}
-% Editing an instance is almost identical to declaring one. The only
-% variation is the source of the values to use. When editing, they are
-% recovered from the previous instance run.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_edit_instance:nnnn #1#2#3#4
- {
- \@@_if_instance_exist:nnnTF {#1} {#2} {#3}
- {
- \@@_recover_values:n { #1 / #2 / #3 }
- \prop_get:NnN \l_@@_values_prop { from~template }
- \l_@@_tmp_tl
- \@@_edit_instance_aux:nonnn {#1} \l_@@_tmp_tl
- {#2} {#3} {#4}
- }
- {
- \msg_error:nnee { xtemplate } { unknown-instance }
- {#1} {#3}
- }
- }
-\cs_new_protected:Npn \@@_edit_instance_aux:nnnnn #1#2
- {
- \@@_recover_vars:n { #1 / #2 }
- \@@_declare_instance_aux:nnnnn {#1} {#2}
- }
-\cs_generate_variant:Nn \@@_edit_instance_aux:nnnnn { no }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_convert_to_assignments:}
-% \begin{macro}{\@@_convert_to_assignments_aux:n}
-% \begin{macro}{\@@_convert_to_assignments_aux:nn}
-% \begin{macro}{\@@_convert_to_assignments_aux:no}
-% The idea on converting to a set of assignments is to loop over each
-% key, so that the loop order follows the declaration order of the keys.
-% This is done using a sequence as property lists are not
-% \enquote{ordered}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_convert_to_assignments:
- {
- \tl_clear:N \l_@@_assignments_tl
- \seq_map_function:NN \l_@@_key_order_seq
- \@@_convert_to_assignments_aux:n
- }
-\cs_new_protected:Npn \@@_convert_to_assignments_aux:n #1
- {
- \prop_get:NnN \l_@@_keytypes_prop {#1} \l_@@_tmp_tl
- \@@_convert_to_assignments_aux:no {#1} \l_@@_tmp_tl
- }
-% \end{macrocode}
-% The second auxiliary function actually does the work. The
-% arguments here are the key name (|#1|) and the keytype (|#2|).
-% From those, the value to assign and the name of the appropriate
-% variable are recovered. A bit of work is then needed to sort out
-% keytypes with arguments (for example instances), and to look for
-% global assignments. Once that is done, a hand-off can be made to the
-% handler for the relevant keytype.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_convert_to_assignments_aux:nn #1#2
- {
- \prop_get:NnNT \l_@@_values_prop {#1} \l_@@_value_tl
- {
- \prop_get:NnNTF \l_@@_vars_prop {#1} \l_@@_var_tl
- {
- \@@_split_keytype_arg:n {#2}
- \str_if_eq:onF \l_@@_keytype_tl { choice }
- {
- \str_if_eq:onF \l_@@_keytype_tl { code }
- { \@@_find_global: }
- }
- \tl_set:Nn \l_@@_key_name_tl {#1}
- \use:c { @@_assign_ \l_@@_keytype_tl : }
- }
- { \msg_error:nne { xtemplate } { unknown-attribute } {#1} }
- }
- }
-\cs_generate_variant:Nn \@@_convert_to_assignments_aux:nn { no }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_find_global:}
-% \begin{macro}{\@@_find_global_aux:w}
-% Global assignments should have the phrase |global| at the front.
-% This is pretty easy to find: no other error checking, though.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_find_global:
- {
- \bool_set_false:N \l_@@_global_bool
- \tl_if_in:onT \l_@@_var_tl { global }
- {
- \exp_after:wN \@@_find_global_aux:w \l_@@_var_tl \s_@@_stop
- }
- }
-\cs_new_protected:Npn \@@_find_global_aux:w #1 global #2 \s_@@_stop
- {
- \tl_set:Nn \l_@@_var_tl {#2}
- \bool_set_true:N \l_@@_global_bool
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Using templates directly}
-%
-% \begin{macro}{\@@_use_template:nnn}
-% Directly use a template with a particular parameter setting.
-% This is also picked up if used in a nested fashion inside a parameter
-% list. The idea is essentially the same as creating an instance,
-% just with no saving of the result.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_use_template:nnn #1#2#3
- {
- \@@_execute_if_code_exist:nnT {#1} {#2}
- {
- \@@_recover_defaults:n { #1 / #2 }
- \@@_recover_vars:n { #1 / #2 }
- \@@_parse_values:nn { #1 / #2 } {#3}
- \@@_convert_to_assignments:
- \use:c { \c_@@_code_root_tl #1 / #2 }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Assigning values to variables}
-%
-% \begin{macro}{\@@_assign_boolean:}
-% \begin{macro}{\@@_assign_boolean_aux:n}
-% Setting a Boolean value is slightly different to everything else
-% as the value can be used to work out which \texttt{set} function to
-% call. As long as there is no need to recover things from another
-% variable, everything is pretty easy. If there is, then we need to allow
-% for the fact that the recovered value here will \emph{not} be expandable,
-% so needs to be converted to something that is.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_boolean:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_boolean_aux:n { bool_gset } }
- { \@@_assign_boolean_aux:n { bool_set } }
- }
-\cs_new_protected:Npn \@@_assign_boolean_aux:n #1
- {
- \@@_if_key_value:oTF \l_@@_value_tl
- {
- \@@_key_to_value:
- \tl_put_right:Ne \l_@@_assignments_tl
- {
- \exp_not:c { #1 _eq:NN }
- \exp_not:o \l_@@_var_tl
- \exp_not:o \l_@@_value_tl
- }
- }
- {
- \tl_put_right:Ne \l_@@_assignments_tl
- {
- \exp_not:c { #1 _ \l_@@_value_tl :N }
- \exp_not:o \l_@@_var_tl
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_assign_choice:}
-% \begin{macro}
-% {\@@_assign_choice_aux:n, \@@_assign_choice_aux:o}
-% The idea here is to find either the choice as-given or else the
-% special |unknown| choice, and to copy the appropriate code across.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_choice:
- {
- \@@_assign_choice_aux:eF
- { \l_@@_key_name_tl \c_space_tl \l_@@_value_tl }
- {
- \@@_assign_choice_aux:eF
- { \l_@@_key_name_tl \c_space_tl unknown }
- {
- \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl
- \l_@@_tmp_tl
- \@@_split_keytype_arg:o \l_@@_tmp_tl
- \msg_error:nneee { xtemplate } { unknown-choice }
- { \l_@@_key_name_tl } { \l_@@_value_tl }
- { \l_@@_keytype_arg_tl }
- }
- }
- }
-\cs_new_protected:Npn \@@_assign_choice_aux:nF #1
- {
- \prop_get:NnNTF
- \l_@@_vars_prop
- {#1}
- \l_@@_tmp_tl
- { \tl_put_right:No \l_@@_assignments_tl \l_@@_tmp_tl }
- }
-\cs_generate_variant:Nn \@@_assign_choice_aux:nF { e }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_assign_function:}
-% \begin{macro}{\@@_assign_function_aux:N}
-% This looks a bit messy but is only actually one function.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_function:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_function_aux:N \cs_gset:Npn }
- { \@@_assign_function_aux:N \cs_set:Npn }
- }
-\cs_new_protected:Npn \@@_assign_function_aux:N #1
- {
- \tl_put_right:Ne \l_@@_assignments_tl
- {
- \cs_generate_from_arg_count:NNnn
- \exp_not:o \l_@@_var_tl
- \exp_not:N #1
- { \exp_not:o \l_@@_keytype_arg_tl }
- { \exp_not:o \l_@@_value_tl }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_assign_instance:}
-% \begin{macro}{\@@_assign_instance_aux:N}
-% Using an instance means adding the appropriate function creation to
-% the tl. No checks are made at this stage, so if the instance is
-% not valid then errors will arise later.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_instance:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_instance_aux:N \cs_gset_protected:Npn }
- { \@@_assign_instance_aux:N \cs_set_protected:Npn }
- }
-\cs_new_protected:Npn \@@_assign_instance_aux:N #1
- {
- \tl_put_right:Ne \l_@@_assignments_tl
- {
- \exp_not:N #1 \exp_not:o \l_@@_var_tl
- {
- \@@_use_instance:nn
- { \exp_not:o \l_@@_keytype_arg_tl }
- { \exp_not:o \l_@@_value_tl }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_assign_integer:}
-% \begin{macro}{\@@_assign_length:}
-% \begin{macro}{\@@_assign_muskip:}
-% \begin{macro}{\@@_assign_real:}
-% \begin{macro}{\@@_assign_skip:}
-% All of the calculated assignments use the same underlying code, with
-% only the low-level assignment function changing.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_integer:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_variable:N \int_gset:Nn }
- { \@@_assign_variable:N \int_set:Nn }
- }
-\cs_new_protected:Npn \@@_assign_length:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_variable:N \dim_gset:Nn }
- { \@@_assign_variable:N \dim_set:Nn }
-}
-\cs_new_protected:Npn \@@_assign_muskip:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_variable:N \muskip_gset:Nn }
- { \@@_assign_variable:N \muskip_set:Nn }
- }
-\cs_new_protected:Npn \@@_assign_real:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_variable:N \fp_gset:Nn }
- { \@@_assign_variable:N \fp_set:Nn }
- }
-\cs_new_protected:Npn \@@_assign_skip:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_variable:N \skip_gset:Nn }
- { \@@_assign_variable:N \skip_set:Nn }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_assign_tokenlist:}
-% \begin{macro}{\@@_assign_tokenlist_aux:NN}
-% Life would be easy here if it were not for \cs{KeyValue}. To deal
-% correctly with that, we need to allow for the recovery a stored value
-% at point of use.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_tokenlist:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_tokenlist_aux:NN \tl_gset:NV \tl_gset:Nn }
- { \@@_assign_tokenlist_aux:NN \tl_set:NV \tl_set:Nn }
- }
-\cs_new_protected:Npn \@@_assign_tokenlist_aux:NN #1#2
- {
- \@@_if_key_value:oTF \l_@@_value_tl
- {
- \@@_key_to_value:
- \tl_put_right:Ne \l_@@_assignments_tl
- {
- #1 \exp_not:o \l_@@_var_tl
- \exp_not:o \l_@@_value_tl
- }
- }
- {
- \tl_put_right:Ne \l_@@_assignments_tl
- {
- #2 \exp_not:o \l_@@_var_tl
- { \exp_not:o \l_@@_value_tl }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_assign_commalist:}
-% Very similar for commas lists, so some code is shared.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_commalist:
- {
- \bool_if:NTF \l_@@_global_bool
- { \@@_assign_tokenlist_aux:NN \clist_gset:NV \clist_gset:Nn }
- { \@@_assign_tokenlist_aux:NN \clist_set:NV \clist_set:Nn }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_assign_variable:N}
-% A general-purpose function for all of the numerical assignments.
-% As long as the value is not coming from another variable, the stored
-% value is simply transferred for output.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assign_variable:N #1
- {
- \@@_if_key_value:oT \l_@@_value_tl
- { \@@_key_to_value: }
- \tl_put_right:Ne \l_@@_assignments_tl
- {
- #1 \exp_not:o \l_@@_var_tl
- { \exp_not:o \l_@@_value_tl }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_key_to_value:}
-% \begin{macro}{\@@_key_to_value_auxi:w}
-% \begin{macro}{\@@_key_to_value_auxii:w}
-% The idea here is to recover the attribute value of another key. To
-% do that, the marker is removed and a look up takes place. If this
-% is successful, then the name of the variable of the attribute is
-% returned. This assumes that the value will be used in context where
-% it will be converted to a value, for example when setting a number.
-% There is also a need to check in case the copied value happens to be
-% \texttt{global}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_key_to_value:
- { \exp_after:wN \@@_key_to_value_auxi:w \l_@@_value_tl }
-\cs_new_protected:Npn \@@_key_to_value_auxi:w \KeyValue #1
- {
- \tl_set:Ne \l_@@_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } }
- \prop_get:NoNTF
- \l_@@_vars_prop
- \l_@@_tmp_tl
- \l_@@_value_tl
- {
- \exp_after:wN \@@_key_to_value_auxii:w \l_@@_value_tl
- \s_@@_mark global \q_@@_nil \s_@@_stop
- }
- {
- \msg_error:nne { xtemplate } { unknown-attribute }
- { \l_@@_tmp_tl }
- }
- }
-\cs_new_protected:Npn \@@_key_to_value_auxii:w #1 global #2#3 \s_@@_stop
- {
- \@@_quark_if_nil:NF #2
- { \tl_set:Nn \l_@@_value_tl {#2} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Using instances}
-%
-% \begin{macro}{\@@_use_instance:nn}
-% \begin{macro}{\@@_use_instance_aux:nNnnn}
-% \begin{macro}{\@@_use_instance_aux:nn}
-% Using an instance is just a question of finding the appropriate
-% function. There is the possibility that a collection instance exists,
-% so this is checked before trying the general instance. If nothing is
-% found, an error is raised. One additional complication is that
-% if the first token of argument |#2| is \cs{UseTemplate} then that
-% is also valid. There is an error-test to make sure that the
-% types agree, and if so the template is used directly.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_use_instance:nn #1#2
- {
- \@@_if_use_template:nTF {#2}
- { \@@_use_instance_aux:nNnnn {#1} #2 }
- { \@@_use_instance_aux:nn {#1} {#2} }
- }
-\cs_new_protected:Npn \@@_use_instance_aux:nNnnn #1#2#3#4#5
- {
- \str_if_eq:nnTF {#1} {#3}
- { \@@_use_template:nnn {#3} {#4} {#5} }
- { \msg_error:nnee { xtemplate } { type-mismatch } {#1} {#3} }
-}
-\cs_new_protected:Npn \@@_use_instance_aux:nn #1#2
- {
- \@@_get_collection:n {#1}
- \@@_if_instance_exist:nnnTF
- {#1} { \l_@@_collection_tl } {#2}
- {
- \use:c
- {
- \c_@@_instances_root_tl #1 /
- \l_@@_collection_tl / #2
- }
- }
- {
- \@@_if_instance_exist:nnnTF {#1} { } {#2}
- { \use:c { \c_@@_instances_root_tl #1 / / #2 } }
- {
- \msg_error:nnee { xtemplate } { unknown-instance }
- {#1} {#2}
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_use_collection:nn}
-% Switching to an instance collection is just a question of setting the
-% appropriate list.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_use_collection:nn #1#2
- { \prop_put:Nnn \l_@@_collections_prop {#1} {#2} }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_get_collection:n}
-% Recovering the collection for a given type is pretty easy: just a read
-% from the list.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_collection:n #1
- {
- \prop_get:NnNF \l_@@_collections_prop {#1}
- \l_@@_collection_tl
- { \tl_clear:N \l_@@_collection_tl }
- }
-% \end{macrocode}
-% \end{macro}
-%
-%\subsection{Assignment manipulation}
-%
-% A few functions to transfer assignments about, as this is needed by
-% \cs{AssignTemplateKeys}.
-%
-% \begin{macro}{\@@_assignments_pop:}
-% To actually use the assignments.
-% \begin{macrocode}
-\cs_new:Npn \@@_assignments_pop: { \l_@@_assignments_tl }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_assignments_push:n}
-% Here, the assignments are stored for later use.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_assignments_push:n #1
- { \tl_set:Nn \l_@@_assignments_tl {#1} }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Showing templates and instances}
-%
-% \begin{macro}{\@@_show_code:nn}
-% Showing the code for a template is just a translation of
-% \cs{cs_show:c}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_show_code:nn #1#2
- { \cs_show:c { \c_@@_code_root_tl #1 / #2 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \@@_show_defaults:nn, \@@_show_keytypes:nn,
-% \@@_show_vars:nn
-% }
-% \begin{macro}{\@@_show:Nnnn}
-% A modified version of the property-list printing code, such that
-% the output refers to templates and instances rather than to the
-% underlying structures.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_show_defaults:nn #1#2
- {
- \@@_if_keys_exist:nnT {#1} {#2}
- {
- \@@_recover_defaults:n { #1 / #2 }
- \@@_show:Nnnn \l_@@_values_prop
- {#1} {#2} { default~values }
- }
- }
-\cs_new_protected:Npn \@@_show_keytypes:nn #1#2
- {
- \@@_if_keys_exist:nnT {#1} {#2}
- {
- \@@_recover_keytypes:n { #1 / #2 }
- \@@_show:Nnnn \l_@@_keytypes_prop
- {#1} {#2} { interface }
- }
- }
-\cs_new_protected:Npn \@@_show_vars:nn #1#2
- {
- \@@_execute_if_code_exist:nnT {#1} {#2}
- {
- \@@_recover_vars:n { #1 / #2 }
- \@@_show:Nnnn \l_@@_vars_prop
- {#1} {#2} { variable~mapping }
- }
- }
-\cs_new_protected:Npn \@@_show:Nnnn #1#2#3#4
- {
- \msg_show:nneeee { xtemplate } { show-attribute }
- { \tl_to_str:n {#2} }
- { \tl_to_str:n {#3} }
- { \tl_to_str:n {#4} }
- { \prop_map_function:NN #1 \msg_show_item_unbraced:nn }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_show_values:nnn}
-% Instance values are a little more complex, as there are the collection
-% and template to consider.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_show_values:nnn #1#2#3
- {
- \@@_if_instance_exist:nnnT {#1} {#2} {#3}
- {
- \@@_recover_values:n { #1 / #2 / #3 }
- \msg_show:nneeee { xtemplate } { show-values }
- { \tl_to_str:n {#1} }
- { \tl_to_str:n {#2} }
- { \tl_to_str:n {#3} }
- {
- \prop_map_function:NN \l_@@_values_prop
- \msg_show_item_unbraced:nn
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Messages}
-%
-% The text for error messages: short and long text for all of them.
-% \begin{macrocode}
-\msg_new:nnnn { xtemplate } { argument-number-mismatch }
- { Object~type~'#1'~takes~#2~argument(s). }
- {
- Objects~of~type~'#1'~require~#2~argument(s).\\
- You~have~tried~to~make~a~template~for~'#1'~
- with~#3~argument(s),~which~is~not~possible:~
- the~number~of~arguments~must~agree.
- }
-\msg_new:nnnn { xtemplate } { bad-number-of-arguments }
- { Bad~number~of~arguments~for~object~type~'#1'. }
- {
- An~object~may~accept~between~0~and~9~arguments.\\
- You~asked~to~use~#2~arguments:~this~is~not~supported.
- }
-\msg_new:nnnn { xtemplate } { bad-variable }
- { Incorrect~variable~description~'#1'. }
- {
- The~argument~'#1'~is~not~of~the~form \\
- ~~'<variable>'\\
- ~or~\\
- ~~'global~<variable>'.\\
- It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template.
- }
-\msg_new:nnnn { xtemplate } { choice-not-implemented }
- { The~choice~'#1'~has~no~implementation. }
- {
- Each~choice~listed~in~the~interface~for~a~template~must~
- have~an~implementation.
- }
-\msg_new:nnnn { xtemplate } { choice-no-code }
- { The~choice~'#1'~requires~implementation~details. }
- {
- When~creating~template~code~using~\DeclareTemplateCode,~
- each~choice~name~must~have~an~associated~implementation.\\
- This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
- }
-\msg_new:nnnn { xtemplate } { choice-requires-code }
- { The~choice~'#2'~for~key~'#1'~requires~an~implementation. }
- {
- You~should~have~put:\\
- \ \ #1~:~choice~{~#2 = <code> ~} \\
- but~LaTeX~did~not~find~any~<code>.
- }
-\msg_new:nnnn { xtemplate } { duplicate-key-interface }
- { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. }
- {
- Each~key~can~only~have~one~interface~declared~in~a~template.\\
- LaTeX~found~two~interfaces~for~'#1'.
- }
-\msg_new:nnnn { xtemplate } { keytype-requires-argument }
- { The~key~type~'#1'~requires~an~argument~\msg_line_context:. }
- {
- You~should~have~put:\\
- \ \ <key-name>~:~#1~{~<argument>~} \\
- but~LaTeX~did~not~find~an~<argument>.
- }
-\msg_new:nnnn { xtemplate } { invalid-keytype }
- { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
- {
- Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\
- \ \ <key>~:~<key-type>\\
- LaTeX~could~not~find~a~<key-type>~in~your~input.
- }
-\msg_new:nnnn { xtemplate } { key-no-value }
- { The~key~'#1'~has~no~value~\msg_line_context:. }
- {
- When~creating~an~instance~of~a~template~
- every~key~listed~must~include~a~value:\\
- \ \ <key>~=~<value>
- }
-\msg_new:nnnn { xtemplate } { key-no-variable }
- { The~key~'#1'~requires~implementation~details~\msg_line_context:. }
- {
- When~creating~template~code~using~\DeclareTemplateCode,~
- each~key~name~must~have~an~associated~implementation.\\
- This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one.
- }
-\msg_new:nnnn { xtemplate } { key-not-implemented }
- { Key~'#1'~has~no~implementation~\msg_line_context:. }
- {
- The~definition~of~key~implementations~for~template~'#2'~
- of~object~type~'#3'~does~not~include~any~details~for~key~'#1'.\\
- The~key~was~declared~in~the~interface~definition,~
- and~so~an~implementation~is~required.
- }
-\msg_new:nnnn { xtemplate } { missing-keytype }
- { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. }
- {
- Key~interface~definitions~should~be~of~the~form\\
- \ \ #1~:~<key-type>\\
- but~LaTeX~could~not~find~a~<key-type>.
- }
-\msg_new:nnnn { xtemplate } { no-template-code }
- {
- The~template~'#2'~of~type~'#1'~is~unknown~
- or~has~no~implementation.
- }
- {
- There~is~no~code~available~for~the~template~name~given.\\
- This~should~be~given~using~\DeclareTemplateCode.
- }
-\msg_new:nnnn { xtemplate } { object-type-mismatch }
- { Object~types~'#1'~and~'#2'~do~not~agree. }
- {
- You~are~trying~to~use~a~template~directly~with~\UseInstance
- (or~a~similar~function),~but~the~object~types~do~not~match.
- }
-\msg_new:nnnn { xtemplate } { unknown-attribute }
- { The~template~attribute~'#1'~is~unknown. }
- {
- There~is~a~definition~in~the~current~template~reading\\
- \ \ \token_to_str:N \KeyValue {~#1~} \\
- but~there~is~no~key~called~'#1'.
- }
-\msg_new:nnnn { xtemplate } { unknown-choice }
- { The~choice~'#2'~was~not~declared~for~key~'#1'. }
- {
- The~key~'#1'~takes~a~fixed~list~of~choices~
- and~this~list~does~not~include~'#2'.
- }
-\msg_new:nnnn { xtemplate } { unknown-default-choice }
- { The~default~choice~'#2'~was~not~declared~for~key~'#1'. }
- {
- The~key~'#1'~takes~a~fixed~list~of~choices~
- and~this~list~does~not~include~'#2'.
- }
-\msg_new:nnnn { xtemplate } { unknown-instance }
- { The~instance~'#2'~of~type~'#1'~is~unknown. }
- {
- You~have~asked~to~use~an~instance~'#2',~
- but~this~has~not~been~created.
- }
-\msg_new:nnnn { xtemplate } { unknown-key }
- { Unknown~template~key~'#1'. }
- {
- The~key~'#1'~was~not~declared~in~the~interface~
- for~the~current~template.
- }
-\msg_new:nnnn { xtemplate } { unknown-keytype }
- { The~key-type~'#1'~is~unknown. }
- {
- Valid~key-types~are:\\
- -~boolean;\\
- -~choice;\\
- -~commalist;\\
- -~function;\\
- -~instance;\\
- -~integer;\\
- -~length;\\
- -~muskip;\\
- -~real;\\
- -~skip;\\
- -~tokenlist.
- }
-\msg_new:nnnn { xtemplate } { unknown-object-type }
- { The~object~type~'#1'~is~unknown. }
- {
- An~object~type~needs~to~be~declared~with~\DeclareObjectType
- prior~to~using~it.
- }
-\msg_new:nnnn { xtemplate } { unknown-template }
- { The~template~'#2'~of~type~'#1'~is~unknown. }
- {
- No~interface~has~been~declared~for~a~template~
- '#2'~of~object~type~'#1'.
- }
-% \end{macrocode}
-%
-% Information messages only have text: more text should not be needed.
-% \begin{macrocode}
-\msg_new:nnn { xtemplate } { declare-object-type }
- { Declaring~object~type~'#1'~taking~#2~argument(s)~\msg_line_context:. }
-\msg_new:nnn { xtemplate } { declare-template-code }
- { Declaring~code~for~template~'#2'~of~object~type'#1'~\msg_line_context:. }
-\msg_new:nnn { xtemplate } { declare-template-interface }
- {
- Declaring~interface~for~template~'#2'~of~object~type~'#1'~
- \msg_line_context:.
- }
-\msg_new:nnn { xtemplate } { show-attribute }
- {
- The~template~'#2'~of~object~type~'#1'~has~
- \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 }
- }
-\msg_new:nnn { xtemplate } { show-values }
- {
- \tl_if_empty:nTF {#2}
- { The~instance~'#3'~ }
- { The~collection~ instance~'#3'~ (from~collection~'#2')~ }
- of~object~type~'#1'~has~
- \tl_if_empty:nTF {#4} { no~values. } { values: #4 }
- }
-% \end{macrocode}
-%
-% \subsection{User functions}
-%
-% The user functions provided by \pkg{xtemplate} are pretty much direct
-% copies of internal ones. However, by sticking to the \pkg{xparse}
-% approach only the appropriate arguments are long.
-%
-% \begin{macro}{\DeclareObjectType}
-% \begin{macro}{\DeclareTemplateInterface}
-% \begin{macro}{\DeclareTemplateCode}
% \begin{macro}{\DeclareRestrictedTemplate}
-% \begin{macro}{\EditTemplateDefaults}
-% \begin{macro}{\DeclareInstance}
-% \begin{macro}{\DeclareCollectionInstance}
-% \begin{macro}{\DeclareInstanceCopy}
-% \begin{macro}{\EditInstance}
-% \begin{macro}{\EditCollectionInstance}
-% \begin{macro}{\UseTemplate}
-% \begin{macro}{\UseInstance}
-% \begin{macro}{\UseCollection}
-% All simple translations, with the appropriate long/short argument
-% filtering.
-% \begin{macrocode}
+% \begin{macro}{\DeclareObjectType}
+% If the new kernel code is not loaded, make a couple of compatibility
+% additions. Otherwise, hand over to the frozen version.
+% \begin{macrocode}
+\@ifundefined{NewTemplateType}
+ {%
+ \input{xtemplate-2023-10-10.sty}%
+ \endinput
+ }
+ {%
+ \ProvidesExplPackage{xtemplate}{2023-10-10}{}
+ {L3 Experimental prototype document functions}
+ \long\protected\def\DeclareRestrictedTemplate#1#2#3#4{%
+ \DeclareTemplateCopy{#1}{#3}{#2}%
+ \EditTemplateDefaults{#1}{#3}{#4}%
+ }%
+ }
+\ExplSyntaxOn
\cs_new_protected:Npn \DeclareObjectType #1#2
- { \@@_declare_object_type:nn {#1} {#2} }
-\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4
- { \@@_declare_template_keys:nnnn {#1} {#2} {#3} {#4} }
-\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5
- { \@@_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} }
-\cs_new_protected:Npn \DeclareRestrictedTemplate #1#2#3#4
- { \@@_declare_restricted:nnnn {#1} {#2} {#3} {#4} }
-\cs_new_protected:Npn \DeclareInstance #1#2#3#4
- { \@@_declare_instance:nnnnn {#1} {#3} { } {#2} {#4} }
-\cs_new_protected:Npn \DeclareCollectionInstance #1#2#3#4#5
- { \@@_declare_instance:nnnnn {#2} {#4} {#1} {#3} {#5} }
-\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3
- { \@@_copy_instance:nnnn {#1} { } {#3} {#2} }
-\cs_new_protected:Npn \EditTemplateDefaults #1#2#3
- { \@@_edit_defaults:nnn {#1} {#2} {#3} }
-\cs_new_protected:Npn \EditInstance #1#2#3
- { \@@_edit_instance:nnnn {#1} { } {#2} {#3} }
-\cs_new_protected:Npn \EditCollectionInstance #1#2#3#4
- { \@@_edit_instance:nnnn {#2} {#1} {#3} {#4} }
-\cs_new_protected:Npn \UseTemplate #1#2#3
- { \@@_use_template:nnn {#1} {#2} {#3} }
-\cs_new_protected:Npn \UseInstance #1#2
- { \@@_use_instance:nn {#1} {#2} }
-\cs_new_protected:Npn \UseCollection #1#2
- { \@@_use_collection:nn {#1} {#2} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ShowTemplateCode}
-% \begin{macro}{\ShowTemplateDefaults}
-% \begin{macro}{\ShowTemplateInterface}
-% \begin{macro}{\ShowTemplateVariables}
-% \begin{macro}{\ShowInstanceValues}
-% \begin{macro}{\ShowCollectionInstanceValues}
-% The show functions are again just translation.
-% \begin{macrocode}
-\cs_new_protected:Npn \ShowTemplateCode #1#2
- { \@@_show_code:nn {#1} {#2} }
-\cs_new_protected:Npn \ShowTemplateDefaults #1#2
- { \@@_show_defaults:nn {#1} {#2} }
-\cs_new_protected:Npn \ShowTemplateInterface #1#2
- { \@@_show_keytypes:nn {#1} {#2} }
-\cs_new_protected:Npn \ShowTemplateVariables #1#2
- { \@@_show_vars:nn {#1} {#2} }
-\cs_new_protected:Npn \ShowInstanceValues #1#2
- { \@@_show_values:nnn {#1} { } {#2} }
-\cs_new_protected:Npn \ShowCollectionInstanceValues #1#2#3
- { \@@_show_values:nnn {#1} {#2} {#3} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\IfInstanceExistT, \IfInstanceExistF, \IfInstanceExistTF}
-% More direct translation: only the base instance is checked for.
-% \begin{macrocode}
-\cs_new:Npn \IfInstanceExistTF #1#2
- { \@@_if_instance_exist:nnnTF {#1} { } {#2} }
-\cs_new:Npn \IfInstanceExistT #1#2
- { \@@_if_instance_exist:nnnT {#1} { } {#2} }
-\cs_new:Npn \IfInstanceExistF #1#2
- { \@@_if_instance_exist:nnnF {#1} { } {#2} }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\KeyValue}
-% Simply dump the argument when executed: this should not happen.
-% \begin{macrocode}
-\cs_new_protected:Npn \KeyValue #1 {#1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\AssignTemplateKeys}
-% A short call to use a token register by proxy.
-% \begin{macrocode}
-\cs_new_protected:Npn \AssignTemplateKeys
- { \@@_assignments_pop: }
+ { \@@_declare_type:nn {#1} {#2} }
+\ExplSyntaxOff
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\SetTemplateKeys}
-% A friendly wrapper
-% \begin{macrocode}
-\cs_new_protected:Npn \SetTemplateKeys #1#2#3
- { \keys_set_known:nnN { template / #1 / #2 } {#3} \l_@@_tmp_clist }
-% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-\cs_new_eq:NN \ShowTemplateKeytypes \ShowTemplateInterface
-% \end{macrocode}
-%
-% \begin{macrocode}
%</package>
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xtemplate.ins b/macros/latex/contrib/l3packages/xtemplate.ins
index 72bf777194..eaf3fe0ead 100644
--- a/macros/latex/contrib/l3packages/xtemplate.ins
+++ b/macros/latex/contrib/l3packages/xtemplate.ins
@@ -2,7 +2,7 @@
File: xtemplate.ins
-Copyright (C) 2000-2012,2016,2017,2019-2023 The LaTeX Project
+Copyright (C) 2000-2012,2016,2017,2019-2024 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
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2011-2023 The LaTeX Project
+Copyright (C) 2011-2024 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
diff --git a/macros/latex/contrib/l3packages/xtemplate.pdf b/macros/latex/contrib/l3packages/xtemplate.pdf
index 57ab72b148..c5fc465835 100644
--- a/macros/latex/contrib/l3packages/xtemplate.pdf
+++ b/macros/latex/contrib/l3packages/xtemplate.pdf
Binary files differ
diff --git a/macros/optex/README b/macros/optex/README
index 3dab8b68f1..aa84d46627 100644
--- a/macros/optex/README
+++ b/macros/optex/README
@@ -22,6 +22,11 @@ doc/ ... PDF version of the OpTeX documentation and sources.
History:
+<1.14> Feb 2024:
+ More links in doc: TeX primitives linked to TeX in a Nutshell.
+ \trykv returns unexpanded value of the key=value pair.
+ \bracedparam reimplemented, improved.
+ \optdef can create an expandable macro.
<1.13> Nov 2023:
\usebib completely reimplemented, libranian package not needed from now.
Selected OpTeX tricks are automatically loaded when a relevant macro is used.
diff --git a/macros/optex/base/alloc.opm b/macros/optex/base/alloc.opm
index fae88d286e..180adddeff 100644
--- a/macros/optex/base/alloc.opm
+++ b/macros/optex/base/alloc.opm
@@ -120,19 +120,18 @@
\_newdimen \tmpdim \_newdimen \_tmpdim
\_doc -----------------------------
- A few registers are initialized like in plain\TeX/. We absolutely
+ A few registers: \`\maxdimen`, \`\hideskip` and
+ \`\centering` are initialized like in plain\TeX/. We absolutely
don't support the `@`category dance, so `\z@skip`
- `\z@`, `\p@` etc. are defined but not recommended in \OpTeX/.
-
- The \`\_zo` and \`\_zoskip` (equivalents to `\z@` and `\z@skip`)
- are declared here and used in some internal macros of \OpTeX/
- for improving speed.
+ `\z@`, `\p@` etc. are defined but not recommended.
+ The \`\_zo`, \`\_zoskip` and \`\voidbox` (equivalents to
+ `\z@`, `\z@skip` and `\voidb@x`) are preferred in \OpTeX.
\_cod -----------------------------
\_newdimen\_maxdimen \_maxdimen=16383.99999pt % the largest legal <dimen>
-\_newdimen\_zo \_zo=0pt
\_newskip\_hideskip \_hideskip=-1000pt plus 1fill % negative but can grow
\_newskip\_centering \_centering=0pt plus 1000pt minus 1000pt
+\_newdimen\_zo \_zo=0pt
\_newskip\_zoskip \_zoskip=0pt plus0pt minus0pt
\_newbox\_voidbox % permanently void box register
diff --git a/macros/optex/base/doc.opm b/macros/optex/base/doc.opm
index fb96d35007..c334019de2 100644
--- a/macros/optex/base/doc.opm
+++ b/macros/optex/base/doc.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \printdoc {Macros for documentation printing <2022-12-11>} % loaded on demand by \load[doc]
+\_codedecl \printdoc {Macros for documentation printing <2023-12-10>} % loaded on demand by \load[doc]
\_doc -----------------------------
General decalarations.
@@ -41,8 +41,6 @@
\_doc -----------------------------
The listing mode is implemented here. The \`\maxlines`
is maximal lines of code printed in the listing mode.
- The \code{\\catcode`\\.=11} sets dot as letter in listngs (for package
- documentation where `\.foo` sequeces exist).
\_cod -----------------------------
\_newcount \_maxlines \_maxlines=100000
@@ -54,7 +52,7 @@
\_typosize[8/10]
\_let\_printverbline=\_printcodeline
\_ttline=\_inputlineno
- \_setverb \_catcode`\.=11
+ \_setverb
\_ifnum\_ttline<0 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi
\_adef{ }{\ }\_adef\^^I{\t}\_parindent=\_ttindent \_parskip=0pt
\_def\t{\_hskip \_dimexpr\_tabspaces em/2\_relax}%
@@ -88,7 +86,8 @@
the first `_` or `.` is removed from `\_tmpa` and the test is repeated.
\_cod -----------------------------
-\_def\_makecs{\_def\_tmpa{}\_futurelet\_next\_makecsA}
+\_def\_makecs{\_def\_tmpa{}\_futurelet\_next\_makecsD}
+\_def\_makecsD{\_if.\_next \_ea\_makecsB \_else \_ea\_makecsA \_fi} % \.foo is accepted
\_def\_makecsA{\_ifcat a\_noexpand\_next \_ea\_makecsB \_else \_ea\_makecsF \_fi}
\_def\_makecsB#1{\_addto\_tmpa{#1}\_futurelet\_next\_makecsA}
\_def\_makecsF{\_let\_tmpb=\_tmpa
@@ -363,6 +362,7 @@ have the same meaning: `\optexdoclink` in this example. And
\endinput
+2023-12-10 \catcode`.=11 removed, issue solved by \_makecsD.
2022-12-11 \_opwaning "Second main documentation point" introduced.
2022-12-11 \_docrefcodes added (bug due to 2022-11-13 fixed).
2022-11-21 magenta color for internal links instead green.
diff --git a/macros/optex/base/f-fbb.opm b/macros/optex/base/f-fbb.opm
new file mode 100644
index 0000000000..ac69a89a99
--- /dev/null
+++ b/macros/optex/base/f-fbb.opm
@@ -0,0 +1,26 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [fbb] \FBembo {Bembo–like fonts derived from Cardo}
+ {\caps \swash} {\rm \bf \it \bi} {}
+ {[fbb-Regular]}
+ {\_def\_fontnamegen {[fbb-\_currV]:script=latn;\_capsV\_swaV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps + old digits^^J
+ \swash ..... alternative Q letter and some other characters^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={},swa={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \caps {\_fsetV caps=+smcp;\_ffonum; }
+\_moddef \swash {\_fsetV swa=+swsh;+salt; }
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See historical notice in texdoc fbb.
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-gentium.opm b/macros/optex/base/f-gentium.opm
new file mode 100644
index 0000000000..e6775695c2
--- /dev/null
+++ b/macros/optex/base/f-gentium.opm
@@ -0,0 +1,26 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Gentium] \Gentium {Serif free fonts, support Greek, Cyrillic, IPA}
+ {\caps} {\rm \bf \it \bi} {Termes}
+ {[GentiumPlus-Regular]}
+ {\_def\_fontnamegen {[Gentium\_bkV Plus-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \caps ...... caps & small caps^^J
+ \book ...... Book variants (a little bolder)^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fsetV bk={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \caps {\_fsetV caps=+smcp;\_ffonum; }
+\_moddef \book {\_fsetV bk=Book }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyretermes-math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/fams-ini.opm b/macros/optex/base/fams-ini.opm
index 6dc19ca9b1..7d3f0332a8 100644
--- a/macros/optex/base/fams-ini.opm
+++ b/macros/optex/base/fams-ini.opm
@@ -107,6 +107,11 @@
\caps: {\rm\bf\it\bi} \caps\semibold: {\bf\bi} \caps\sans: {\rm\bf\it}
-: {\mono\initials\displ\keybr} }
+\_famfrom{Victor Gaultney}
+\_faminfo [Gentium] {Serif free fonts, support Greek, Cyrrilic, IPA} {f-gentium}
+ { -,\caps,\book,\book\caps: {\rm\bf\it\bi} }
+\_famalias [GentiumPro]
+
\_famfrom {Daniel Flipo}
\_faminfo [KP fonts] {KP fonts -- Johannes Kepler project} {f-kpfonts}
{ -,\light,\sans,\mono, \caps, \caps\light, \caps\sans,\caps\mono,\swash: {\rm\bf\it\bi} }
@@ -249,6 +254,11 @@
\_faminfo [GFSBodoni] {Based on Bodoni with greek letters} {f-gfsbodoni}
{ -: {\rm\bf\it\bi} \caps: {\rm} }
+\_famfrom {David J. Perry, Michael Sharpe}
+\_faminfo [fbb] {Bembo–like fonts derived from Cardo} {f-fbb}
+ { -,\caps: {\rm\bf\it\bi} \swash: {\rm} }
+\_famalias [Bembo] \_famalias [FBembo]
+
\_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,%
diff --git a/macros/optex/base/fonts-opmac.opm b/macros/optex/base/fonts-opmac.opm
index 158f19299e..ca4d38b4ce 100644
--- a/macros/optex/base/fonts-opmac.opm
+++ b/macros/optex/base/fonts-opmac.opm
@@ -171,10 +171,12 @@
\_ea\_ifx \_the\_font \_tenbi \_additcorr \_bf \_else
\_it \_aftergroup\_afteritcorr\_fi\_fi\_fi
}
-\_def\_additcorr{\_ifdim\_lastskip>\_zo
- \_skip0=\_lastskip \_unskip\_italcorr \_hskip\_skip0 \_else\_italcorr \_fi}
+\_def\_additcorr{\_ifhmode \_ifdim\_lastskip>\_zo
+ \_skip0=\_lastskip \_unskip \_additcorrA \_hskip\_skip0 \_else \_additcorrA \_fi\_fi}
+\_def\_additcorrA{\_ifnum\_lastpenalty=\_zo \_italcorr \_else
+ \_ea\_unpenalty \_ea\_italcorr \_ea\_penalty \_the\_lastpenalty \_relax \_fi}
\_def\_afteritcorr{\_futurelet\_next\_afteritcorrA}
-\_def\_afteritcorrA{\_ifx\_next.\_else\_ifx\_next,\_else \_italcorr \_fi\_fi}
+\_def\_afteritcorrA{\_ifhmode \_ifx\_next.\_else\_ifx\_next,\_else \_italcorr \_fi\_fi\_fi}
\_let\_italcorr=\/
\_doc -----------------------------
@@ -218,6 +220,7 @@
\_endcode % -------------------------------------
History:
+2024-01-25 \em: \_additcorr reimplemented to be more robust
2022-02-22 \_setmainvalues: only \rm initialized
2021-03-10 \boldify corrected
2021-03-09 \mfontsrule and \_setmathfonts introduced
diff --git a/macros/optex/base/fonts-preload.opm b/macros/optex/base/fonts-preload.opm
index 8562da786c..82387970e6 100644
--- a/macros/optex/base/fonts-preload.opm
+++ b/macros/optex/base/fonts-preload.opm
@@ -24,14 +24,14 @@
\_endcode %---------------------------------------------------
The format in Lua\TeX/ can download only non-Unicode fonts. Latin Modern EC is
-loaded here. These fonts are totally unusable in LuaTeX when languages with out
+loaded here. These fonts are totally unusable in \LuaTeX/ when languages with out
of ASCII or ISO-8859-1 alphabets are used (for example Czech). We load only
a few 8bit fonts here especially for simple testing of the format.
But, if the user needs to do more serious work, he/she can
-use `\fontfam` macro to load a selected font family of Unicode fonts.
+use \^`\fontfam` macro to load a selected font family of Unicode fonts.
We have a dilemma: when the Unicode fonts cannot be preloaded in the format then the basic
-font set can be loaded by `\everyjob`. But why to load a set of fonts at the
+font set can be loaded by \^`\everyjob`. But why to load a set of fonts at the
beginning of every job when it is highly likely that the user will
load something completely different. Our decision is: there is a basic 8bit
font set in the format (for testing purposes only) and the user should load
diff --git a/macros/optex/base/fonts-resize.opm b/macros/optex/base/fonts-resize.opm
index 323e1d72a0..f4dd3c4033 100644
--- a/macros/optex/base/fonts-resize.opm
+++ b/macros/optex/base/fonts-resize.opm
@@ -5,7 +5,7 @@
\_doc -----------------------------
\`\initunifonts` macro extends \LuaTeX's font capabilities,
in order to be able to load Unicode fonts. Unfortunately, this part of
- \OpTeX/ depends on the `luaotfload` package, which adapts Con\TeX/t's generic
+ \OpTeX/ depends on the `luaotfload` package, which adapts \ConTeXt's generic
font loader for plain \TeX/ and \LaTeX. `luaotfload` uses Lua functions
from \LaTeX's `luatexbase` namespace, we provide our own replacements.
\^`\initunifonts` sets itself to relax because we don't want to do
@@ -62,7 +62,8 @@
The `\fontname` primitive returns the <font file name> optionally
followed by <size spec>. The \`\xfontname` macro expands to <font file name>
without <size spec>. We need to remove the part `<space>at<dimen>` from
- `\fontname` output. The letters `at` have category 12.
+ `\fontname` output. The letters `at` have category 12 in the \`\_stringat`
+ macro.
\_cod -----------------------------
\_edef\_stringat{\_string a\_string t}
diff --git a/macros/optex/base/hyperlinks.opm b/macros/optex/base/hyperlinks.opm
index 1d15b5e734..7c3e78635a 100644
--- a/macros/optex/base/hyperlinks.opm
+++ b/macros/optex/base/hyperlinks.opm
@@ -6,11 +6,12 @@
\`\dest``[<type>:<spec>]` creates a destination of internal links. The
destination is declared in the format `<type>:<spec>`. If the \^`\hyperlinks`
command in not used, then `\dest` does nothing else it is set to `\_destactive`.
- The \`\_destactive` is implemented by `\_pdfdest` primitive. It creates a box
+ The \`\_destactive` is implemented by `\_pdfdest` primitive. It creates a
+ box using \`\_destbox``[<type>:<spec>]`
in which the destination is shifted by \`\_destheight`. The reason is that
the destination is exactly at the top border of the PDF viewer but we want to see
- the line where the destination is. The destination box is positioned by a
- different way dependent on the current vertical or horizontal mode.
+ the line where the destination is. The destination box is positioned
+ differently dependent on the current vertical or horizontal mode.
\_cod ----------------------------
\_def\_destheight{1.4em}
diff --git a/macros/optex/base/if-macros.opm b/macros/optex/base/if-macros.opm
index 415b2c01c8..eae011ae26 100644
--- a/macros/optex/base/if-macros.opm
+++ b/macros/optex/base/if-macros.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \newif {Special if-macros, is-macros and loops <2023-10-17>} % preloaded in format
+\_codedecl \newif {Special if-macros, is-macros and loops <2023-12-07>} % preloaded in format
\_doc ----------------------------
\secc Classical \code{\\newif}
@@ -95,8 +95,8 @@
\_immediateassignment \_long\_gdef\_fbody#2{\_testparam##1..\_iftrue #3\_ea\_fbody\_fi}%
\_fbody #1#2\_finbody\_getforstack
}
-\_def\_testparam#1#2#3\_iftrue{\_ifx###1\_empty\_ea\_finbody\_else}
-\_def\_finbody#1\_finbody{}
+\_long\_def\_testparam#1#2#3\_iftrue{\_ifx###1\_empty\_ea\_finbody\_else}
+\_long\_def\_finbody#1\_finbody{}
\_long\_def\foreach #1\do#2#{\_isempty{#2}\_iftrue
\_afterfi{\_foreachA{#1}{##1}}\_else\_afterfi{\_foreachA{#1}{#2}}\_fi}
@@ -376,6 +376,7 @@
\_endcode
+2023-12-07 \_testparam define \long (big fixed)
2023-10-17 \qcasesof introduced, \xcasesof reimplemented.
2023-01-16 \isnextchar created expandable.
2022-12-02 \xcasesof: its first parameter is \long too.
diff --git a/macros/optex/base/keyval.opm b/macros/optex/base/keyval.opm
index 68f3fea536..645a3b33a5 100644
--- a/macros/optex/base/keyval.opm
+++ b/macros/optex/base/keyval.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \readkv {Key-value dictionaries <2023-10-23>} % preloaded in format
+\_codedecl \readkv {Key-value dictionaries <2023-11-24>} % preloaded in format
\_doc ----------------------------
{\bf Implementation.}\nl
@@ -12,8 +12,10 @@
<value> after it.\nl
The \`\kvx``{<key>}{<code>}` defines the `\_kvx:<dict>:<key>#1` macro
and \`\nokvx``{<code>}` defines the `\_nokvx:<dict>:<key>` macro.\nl
- The \`\kv``{<key>}` expands the `\_kv:<dict>:<key>` macro. If this macro isn't
- defined then \`\_kvunknown` is processed. You can re-define it if you want.\nl
+ The \`\trykv``{<key>}{<code>}`
+ returns unexpanded value of <key> if declared, else it runs <code>.\nl
+ The \`\kv``{<key>}` returns expanded value of <key> if declared,
+ else returns expanded value of `.notdef` key else expands \`\_kvunknown`.\nl
The \`\iskv``{<key>}\iftrue` (or `\iffalse`) is the test,
if the `<key>` is defined in current <dict>.
\_cod ----------------------------
@@ -28,12 +30,14 @@
{\_trycs{_nokvx:\_the\_kvdict}{\_ea\_ignoreit}{#1}\_ea\_ignoreit}{#2}}
\_def\_kvx#1#2{\_sdef{_kvx:\_the\_kvdict:#1}##1{#2}}
\_def\_nokvx#1{\_sdef{_nokvx:\_the\_kvdict}##1\_ea\_ignoreit##2{#1}}
-\_def\_kv#1{\_trycs{\_kvcs#1}{\_kvunknown}}
+\_def\_trykv#1{\_ea\_trykvA \_begincsname\_kvcs#1\_endcsname \_ignoreit}
+\_def\_trykvA#1{\_ifx #1\_ignoreit \_ea\_useit\_else \_unexpanded\_ea{#1}\_fi}
+\_def\_kv#1{\_expanded{\_trykv{#1}{\_trykv{.\_csstring\notdef}{\_kvunknown}}}}
\_def\_iskv#1#2{#2\_else\_ea\_unless\_fi \_ifcsname\_kvcs#1\_endcsname}
\_def\_kvcs{_kv:\_the\_kvdict:}
\_def\_kvunknown{???}
-\public \readkv \kvx \nokvx \kv \iskv ;
+\public \readkv \kvx \nokvx \kv \trykv \iskv ;
\_endcode
@@ -75,7 +79,13 @@ register. First: we read default parameters by \^`\readkv\myframedefaults`
and secondly the actual parameters are read by \^`\readkv{\the\opt}`.
The last setting wins.
Third: the values can be used by the expandable \^`\kv{<key>}` macro.
-The \^`\kv{<key>}` returns `???` if such key is not declared.
+The \^`\kv{<key>}` returns `???` if such a <key> isn't declared
+but if `.notdef` key is declared then its value is returned in this case.
+
+The \^`\kv{<key>}` macro fully expands the value of key. If you don't want to expand
+the value, use \^`\trykv``{<key>}{<code>}`. It returns unexpanded value of <key> if
+declared else returns expanded <code>. For example
+`\edef\macro{\trykv{key}{}}` defines `\macro` as the unexpanded value of the `key`.
You can use keys without values in the parameters list too.
Then you can ask if the key is declared by \^`\iskv``{<key>}\iftrue`
@@ -114,7 +124,7 @@ for undeclared <key>. Example: `\nokvx{\opwarning{Unknown option "#1"}}`.
The default dictionary name (where key-value pairs are processed) is
empty. You can use your specific dictionary by
-\^`\kvdict``={<name>}`. Then `\redakv`, `\kv`, `\iskv`, `\kvx` and `\nokvx`
+\^`\kvdict``={<name>}`. Then `\redakv`, `\kv`, `\trykv`, `\iskv`, `\kvx` and `\nokvx`
macros use this named dictionary of <key>/<value> pairs.
Package options can be processed when
`\kvdict={pkg:<pkg>}`, example is the `\mathset` macro in
@@ -128,6 +138,7 @@ A more extensive example can be found in
\_endinput
+2023-11-24 \trykv introduced.
2023-10-23 minor changes in \readkv, empty key isn't processed.
2023-03-11 \nokvx: \fi bug (due to \afterfi in \trycs) fixed.
2023-01-13 \kvx parameter added, \nokvx introduced.
diff --git a/macros/optex/base/logos.opm b/macros/optex/base/logos.opm
index a510a74a30..1168c25b58 100644
--- a/macros/optex/base/logos.opm
+++ b/macros/optex/base/logos.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \TeX {Logos TeX, LuaTeX, etc. <2020-02-28>} % preloaded in format
+\_codedecl \TeX {Logos TeX, LuaTeX, etc. <2024-02-12>} % preloaded in format
\_doc ----------------------------
Despite plain \TeX/ each macro for logos ends by \`\ignoreslash`.
@@ -20,6 +20,18 @@
\_public \TeX \OpTeX \LuaTeX \XeTeX \ignoreslash ;
+ \_doc ----------------------------
+ The \`\ConTeXt` logo is implemented as in the \ConTeXt/ format itself.
+ The kerning between \"Con" and \"\TeX/t" is calculated by measuring the kerning
+ between the letters \"T" and \"e".
+ \_cod ----------------------------
+
+\_protected\_def \_ConTeXt{\_begingroup
+ Con\_setbox0=\_hbox{T\_kern\_zo e}\_setbox1=\_hbox{Te}{\_kern\_dimexpr\_wd1 -\_wd0}%
+ \_TeX t\_endgroup\_ignoreslash}
+
+\_public \ConTeXt ;
+
\_doc -----------------------------
The \`\_slantcorr` macro expands to the slant-correction of the current font. It is
used to shifting A if the \`\LaTeX` logo is in italic.
@@ -53,9 +65,12 @@
\_def\TeX{TeX\_ignslash}\_def\OpTeX{OpTeX\_ignslash}%
\_def\LuaTeX{LuaTeX\_ignslash}\_def\XeTeX{XeTeX\_ignslash}%
\_def\LaTeX{LaTeX\_ignslash}\_def\OPmac{OPmac\_ignslash}%
+ \_def\ConTeXt{ConTeXt\_ignslash}%
\_def\CS{CS}\_def\csplain{csplain\_ignslash}%
}
\_public \ignslash ;
\_endcode
+2024-02-12 ConTeXt logo added.
+2020-02-28 Released.
diff --git a/macros/optex/base/margins.opm b/macros/optex/base/margins.opm
index 0f544fc5dd..c77926f9ad 100644
--- a/macros/optex/base/margins.opm
+++ b/macros/optex/base/margins.opm
@@ -64,7 +64,9 @@
\_doc ----------------------------
\`\magscale` `[<factor>]` does `\mag=<factor>` and recalculates page
- dimensions to their true values.
+ dimensions to their true values.\nl
+ \`\_truedimen``<dimen-register>` retunrs true value of <dimen-register>
+ regardless of `\mag`.
\_cod ----------------------------
\_def\_trueunit{}
diff --git a/macros/optex/base/math-macros.opm b/macros/optex/base/math-macros.opm
index 00adc9f1aa..fa4317f25a 100644
--- a/macros/optex/base/math-macros.opm
+++ b/macros/optex/base/math-macros.opm
@@ -347,7 +347,10 @@
names from plain\TeX/ with `@` character are re-written in a more readable
form.\nl
\`\sp` is an alternative for `^`. The \`\sb` alternative for `_` was defined
- at line 27 of the file `math-macros.opm`.
+ at line 27 of the file `math-macros.opm`.\nl
+ \`\_thinsk`, \`\_medsk`, \`\_thicksk` and \`\_thinneg` should be used
+ instead `\,`, `\>`, `\;` and `\!` in macros because a user can re-define
+ these single-letter sequences.
\_cod -----------------------------
\_let\_sp=^ \public \sp ;
diff --git a/macros/optex/base/more-macros.opm b/macros/optex/base/more-macros.opm
index 8c62243234..3f4916a9c3 100644
--- a/macros/optex/base/more-macros.opm
+++ b/macros/optex/base/more-macros.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \eoldef {OpTeX useful macros <2023-01-18>} % preloaded in format
+\_codedecl \eoldef {OpTeX useful macros <2024-02-10>} % preloaded in format
\_doc -----------------------------
We define \`\opinput` `{<file name>}` macro which
@@ -119,8 +119,9 @@
\_newtoks\_opt
\_def\_optdef#1[#2]{%
- \_def#1{\_opt={#2}\_isnextchar[{\_cs{_oA:\_csstring#1}}{\_cs{_oB:\_csstring#1}}}%
- \_sdef{_oA:\_csstring#1}[##1]{\_opt={##1}\_cs{_oB:\_csstring#1\_nospaceafter}}%
+ \_def#1{\_isnextchar[{\_cs{_oA:\_csstring#1}}{\_cs{_oA:\_csstring#1}[#2]}}%
+ \_sdef{_oA:\_csstring#1}[##1]{%
+ \_immediateassignment\_opt={##1}\_cs{_oB:\_csstring#1\_nospaceafter}}%
\_sdef{_oB:\_csstring#1\_nospaceafter}%
}
\_def\_nospaceafter#1{\_ea#1\_romannumeral-`\.\_noexpand}
@@ -130,12 +131,21 @@
\_public \opt \optdef \nospaceafter \nospacefuturelet ;
\_doc -----------------------------
+ \`\_noprefix` `<cs>` works like `\csstring` `<cs>`, but ignores not only
+ the first backlash but the second~\"`_`" ignores too (if it follows the
+ backslash).
+ \_cod -----------------------------
+
+\_def\_noprefix#1{\_ea\_noprefixA \_csstring#1\_empty\_fin}
+\_def\_noprefixA #1#2\_fin{\_if _#1\_else #1\_fi #2}
+
+ \_doc -----------------------------
The declarator \`\eoldef``\macro #1{<replacement text>}` defines a `\macro`
which scans its parameter to the end of the current line.
This is the parameter `#1` which can be used in the `<replacement text>`.
The catcode of the `\endlinechar` is reset temporarily when the parameter is scanned.
- The macro defined by `\eoldef` cannot be used with its parameter inside
+ The macro defined by \^`\eoldef` cannot be used with its parameter inside
other macros because the catcode dancing is not possible here. But the
\`\bracedparam``\macro{<parameter>}` can be used here. The `\bracedparam`
is a prefix that re-sets temporarily the `\macro` to a `\macro` with
@@ -146,15 +156,16 @@
\_cod -----------------------------
\_def\_eoldef #1{\_def #1{\_begingroup \_catcode`\^^M=12 \_eoldefA #1}%
- \_ea\_def\_csname _\_csstring #1:M\_endcsname}
+ \_ea\_def\_csname _eol:\_noprefix #1\_endcsname}
\_catcode`\^^M=12 %
-\_def\_eoldefA #1#2^^M{\_endgroup\_csname _\_csstring #1:M\_endcsname{#2}}%
+\_def\_eoldefA #1#2^^M{\_endgroup\_csname _eol:\_noprefix #1\_endcsname{#2}}%
\_normalcatcodes %
\_eoldef\_skiptoeol#1{}
-\_def\_bracedparam#1{\_ifcsname _\_csstring #1:M\_endcsname
- \_csname _\_csstring #1:M\_ea \_endcsname
- \_else \_csname _in\_csstring #1\_ea \_endcsname \_fi
+
+\_def\_bracedparam#1{%
+ \_trycs{_eol:\_noprefix#1}%
+ {\_errmessage{\_string\bracedparam: \_string#1 isn't defined by \_string\eoldef}}%
}
\_public \eoldef \skiptoeol \bracedparam ;
@@ -270,7 +281,8 @@
\endtt
You can use expandable \`\expr``{<expression>}` for analogical purposes.
It expands to the value of the `<expression>` at expand processor level.
- The `<expression>` can include `+-*/()` and decimal numbers in common syntax.
+ The `<expression>` can include `+-*/^()` and decimal numbers in common syntax.
+ Moreover, `a//b` means integer division and `a\%b` is remainder.
The math functions (and pi constant) have to be prefixed by `math.`,
because it is processed by Lua interpreter. For
example `\expr{math.pi*math.sqrt(2)}`.
@@ -298,6 +310,21 @@
\_public \expr \bp ;
+ \_doc -----------------------------
+ The \^`\expr` and \^`\bp` macros return their results with given number of decimal
+ digits even if there are trailing zeros. There is the \^`\nnum` macro to
+ \"normalize" such decimal numbers. \`\nnum``{<number>}` expands its parameter
+ and removes trailing zeros after decimal point and removes the decimal point
+ if nothing follows. For example, use `\nnum{\expr[10]{<expression>}}`.
+ The `\nnum` macro is fully expandable.
+ \_cod -----------------------------
+
+\_def\_nnum #1{\_ea\_nnumA\_expanded{#1}.\_fin}
+\_def\_nnumA #1.#2\_fin{#1\_ifx~#2~\_else \_nnumB #20.\_fin \_fi}
+\_def\_nnumB #10.#2\_fin{\_ifx~#2~\_nnumC#1\_else \_nnumB #1.0.\_fin \_fi}
+\_def\_nnumC #1.{\_ifx~#1~\_else .#1\_fi}
+\_public \nnum ;
+
\_doc ------------------
You can write \^`\setpos``[<label>]` somewhere and the position of such
\^`\setpos``[<label>]` can be referenced by \^`\posx``[<label>]`,
@@ -374,6 +401,9 @@
\_endcode % -------------------------------------
+2024-02-10 \optdef reimplemented, it can create expandable macros now.
+2024-01-18 \bracedparam reimplemented.
+2023-12-04 \nnum introduced
2023-01-18 \bp, \expr have optional syntax for setting dec-digits
2022-11-24 \setpos, \posx, \posy moved from OpTeX trick here
2022-11-22 \docgen writes banner to log
diff --git a/macros/optex/base/optex-tricks.opm b/macros/optex/base/optex-tricks.opm
index 89fc7dd5e7..456a7472e1 100644
--- a/macros/optex/base/optex-tricks.opm
+++ b/macros/optex/base/optex-tricks.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \_undefined {OpTeX tricks ready to autoload <2023-11-15>} % chunks loaded on demand
+\_codedecl \_undefined {OpTeX tricks ready to autoload <2024-02-13>} % chunks loaded on demand
% Selected OpTeX tricks are here, they are auto-loaded if the macro is used first
% namespace: optextrick
@@ -97,13 +97,14 @@
\_trick 105 \directoutput ;
%%%%%%%%%%%
-\_def\directoutput{\_begingroup \_afterassignment\.directoutputA \_setbox0=}
+\_newbox\.outbox
+\_def\directoutput{\_begingroup \_afterassignment\.directoutputA \_setbox\.outbox=}
\_def\.directoutputA{\_aftergroup \.directoutputB}
-\_def\.directoutputB{\_preshipout0\_box0
- \_pdfpageheight=\_dimexpr\_ht0+\_dp0+2\_vvkern \_relax
- \_pdfpagewidth=\_dimexpr\_wd0+2\_hhkern\_relax
+\_def\.directoutputB{\_preshipout\.outbox\_box\.outbox
+ \_pdfpageheight=\_dimexpr\_ht\.outbox+\_dp\.outbox+2\_vvkern \_relax
+ \_pdfpagewidth=\_dimexpr\_wd\.outbox+2\_hhkern\_relax
\_hoffset=\_hhkern \_voffset=\_vvkern
- \_shipout\_box0
+ \_shipout\_box\.outbox
\_incr\_pageno
\_endgroup
}
@@ -735,12 +736,47 @@
+\_topskip \_relax
}
+\_trick 0129 \pgforeground ;
+%%%%%%%%%%%%
+
+\_newtoks \pgforeground
+
+\_addto\_makefootline{
+ \_istoksempty\pgforeground \_iffalse
+ \_vskip-\_prevdepth
+ \_vskip-\_vsize
+ \_vskip-\_voffset
+ \_istoksempty\_footline \_iffalse \_vskip-\_footlinedist \_fi
+ \_nointerlineskip
+ \_moveleft\_hoffset \_vbox{\_the\pgforeground}
+ \_fi
+}
+
+\_trick 0130 \onlyifnew ;
+%%%%%%%%%%%%
+
+\_def \onlyifnew#1#2{\_begingroup%
+ \_edef\.tmpA{\_csstring #2}%
+ \_edef\.tmpB{\_string #2}%
+ \_ea\_ifcsname\.tmpA\_endcsname%
+ \_ifx\.tmpA\.tmpB% #2 has no backslash
+ \_def\.onlyifnewA{#1{_optextrick_onlyifnewB}}\_else%
+ \_def\.onlyifnewA{#1\_optextrick_onlyifnewB}\_fi%
+ \_else%
+ \_ifx\.tmpA\.tmpB%
+ \_def\.onlyifnewA{#1{#2}}\_else%
+ \_def\.onlyifnewA{#1#2}\_fi%
+ \_fi\_ea\_endgroup\.onlyifnewA}
+
+%%%%%%%%%%%%
\_trick end ;
\_endcode
+2024-02-13 \onlyifnew added
+2024-02-12 \pgforeground added
2023-11-15 \correctvsize added
-2023-11-09 \makeLOF, \makeLOT aded
+2023-11-09 \makeLOF, \makeLOT added
2023-11-08 \ispageodd, \seccc added
2023-11-07 \settabs \import \incrpp added
2023-11-05 \twoblocks, \pstart added
diff --git a/macros/optex/base/optex.ini b/macros/optex/base/optex.ini
index b65832faf8..a659f43dc8 100644
--- a/macros/optex/base/optex.ini
+++ b/macros/optex/base/optex.ini
@@ -21,7 +21,7 @@
% OpTeX version
-\def\optexversion{1.13 Nov 2023}
+\def\optexversion{1.14 Feb 2024}
\def\fmtname{OpTeX}
\let\fmtversion=\optexversion
diff --git a/macros/optex/base/others.opm b/macros/optex/base/others.opm
index 9926c98fef..9b7e3a7ead 100644
--- a/macros/optex/base/others.opm
+++ b/macros/optex/base/others.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \uv {Miscenaleous <2023-10-17>} % preloaded in format
+\_codedecl \uv {Miscenaleous <2023-12-23>} % preloaded in format
\_doc ----------------------------
\`\useOpTeX` and \`\useoptex` are declared as `\relax`.
@@ -105,13 +105,14 @@
first sentence from the paragraph <number> using \`\_lipsumdot`.
\_cod ----------------------------
+\_newbox\_nonebox
\_def\_lipsumtext[#1]{\_lipsumload\_cs{_lip:#1}}
\_def\_lipsum[#1]{\_lipsumA #1.]{#1}}
\_def\_lipsumA #1.#2]#3{\_ifx^#2^\_lipsumB #1\_empty-\_empty\_fin \_else \_lipsumdot[#1].\_fi}
\_def\_lipsumB #1-#2\_empty#3\_fin{%
\_fornum #1..\_ifx^#2^#1\_else#2\_fi \_do {\_lipsumtext[##1]\_par}}
\_def\_lipsumload{{%
- \_setbox0=\_vbox{\_tmpnum=0 % vertical mode during \input lipsum.ltd.tex
+ \_setbox\_nonebox=\_vbox{\_tmpnum=0 % vertical mode during \input lipsum.ltd.tex
\_def\ProvidesFile##1[##2]{}%
\_def\SetLipsumLanguage##1{}%
\_def\NewLipsumPar{\_incr\_tmpnum \_sxdef{_lip:\_the\_tmpnum}}%
@@ -149,7 +150,7 @@
\_savecatcodetable\_tmpcatcodes \_catcodetable\_tmpcatcodes
\_long\_def\_loadtrickA ##1\_trick##2#1##3;{##1}%
\_wlog{Loading trick macros for \_string#1}%
- \_setbox0=\_vbox{\_globaldefs=1 \_ea\_loadtrickA \_input {optex-tricks.opm}}%
+ \_setbox\_nonebox=\_vbox{\_globaldefs=1 \_ea\_loadtrickA \_input {optex-tricks.opm}}%
\_restorectable \_endnamespace
}
\_def\_trick #1;{\_endinput}
@@ -161,7 +162,8 @@
\shadedframe \roundframe \cancel \ignoreinspic \keystroke
\colortab \crx \crtop \crbot \crmid \longtable \vcent \vbot \tnote \tabnodes \tablebefore
\framedblocks \twoblocks \pstart \settabs \import \incrpp \ispageodd
- \iniseccc \seccc \makeLOF \makeLOT \captionF \captionT \correctvsize ;
+ \iniseccc \seccc \makeLOF \makeLOT \captionF \captionT \correctvsize \pgforeground
+ \onlyifnew ;
\_sdef{_item:m}{\_loadtrick{\style m}\_cs{_item:m}}
\_doc -----------------------------
@@ -238,6 +240,7 @@
\_endcode
+2023-12-23 \_nonebox instead box 0 introduced.
2023-10-17 \_loadtrick introduced.
2022-05-04 \lipsum[<num>]. changed to \lipsum[<num>.] to keep macro expandable.
2022-04-21 syntax \lipsum[<num>]. introduced.
diff --git a/macros/optex/base/parameters.opm b/macros/optex/base/parameters.opm
index f831fa6a2d..05abe42275 100644
--- a/macros/optex/base/parameters.opm
+++ b/macros/optex/base/parameters.opm
@@ -144,12 +144,12 @@
\_voffset=25mm
\_hsize=160mm % 210mm (from A4 size) - 2*25mm (default margins)
\_vsize=244mm % 297mm (from A4 size) - 2*25mm (default margins) -3mm baseline correction
-\_pagewidth=210 true mm
-\_pageheight=297 true mm
+\_pdfpagewidth=210 true mm
+\_pdfpageheight=297 true mm
\_doc -----------------------------
If you insist on plain \TeX/ values of these parameters then you can
- call the `\plaintexsetting` macro.
+ call the \`\plaintexsetting` macro.
\_cod -----------------------------
\_def\_plaintexsetting{%
@@ -162,8 +162,8 @@
\_voffset=0pt
\_hsize=6.5in
\_vsize=8.9in
- \_pagewidth=8.5 true in
- \_pageheight=11 true in
+ \_pdfpagewidth=8.5 true in
+ \_pdfpageheight=11 true in
\_nonfrenchspacing
}
\_public \plaintexsetting ;
diff --git a/macros/optex/base/plain-macros.opm b/macros/optex/base/plain-macros.opm
index 6ae59108b5..f3aa8c5334 100644
--- a/macros/optex/base/plain-macros.opm
+++ b/macros/optex/base/plain-macros.opm
@@ -8,6 +8,8 @@
\begtt
\addto \dospecials{\do\_}
\endtt
+ \`\active` is character constant 13, we can use it in the context
+ \code{\\catcode`}<character>\code{=\\active}.
\_cod -----------------------------
\_def\_dospecials {\do\ \do\\\do\{\do\}\do\$\do\&%
@@ -138,6 +140,7 @@
\_doc -----------------------------
The \`\strutbox` is declared as 10pt size dependent (like in plain \TeX), but
the macro `\_setbaselineskip` (from `fonts-opmac.opm`) redefines it.
+ The `\strut` macro puts the \^`\strutbox`.
\_cod -----------------------------
\_newbox\_strutbox
@@ -162,8 +165,8 @@
\_doc -----------------------------
Tabbing macros are omitted because they are obsolete.
\nl
- Indentation and others. \`\textindent`, \`\item`, \`\itemitem`,
- \`\narrower`, \`\raggedright`, \`\ttraggedright`, \`\leavevmode`.
+ Indentation and similar macros are defined here: \`\hang`, \`\textindent`,
+ \`\item`, \`\itemitem`, \`\narrower`, \`\raggedright`, \`\ttraggedright`, \`\leavevmode`.
\_cod -----------------------------
\_def \_hang {\_hangindent\_parindent}
@@ -181,7 +184,7 @@
\_doc -----------------------------
Few character codes are set for backward compatibility. But old obscurities
- (from plain TeX) based on \`\mathhexbox`
+ (from plain \TeX) based on \`\mathhexbox`
are not supported -- an error message and recommendation
to directly using the desired character is implemented by the
\`\_usedirectly` macro).
@@ -219,7 +222,7 @@
\_public \mathhexbox ;
\_doc -----------------------------
- The \`\_unichars` macro is run in \~`\initunifonts`,
+ The \`\_unichars` macro is run when Unicode font family is loaded,
Unicodes are used instead old plain \TeX/ settings.
\_cod -----------------------------
@@ -263,6 +266,9 @@
macro \`\oldaccents` which defines accented macros.
\nl
Much more usable is to define these control sequences for other purposes.
+ \nl
+ The \`\_uniaccents` macro redeclares codes for accents and it is run when
+ Unicode font family is loaded.
\_cod -----------------------------
\_def \_oldaccents {%
@@ -342,7 +348,7 @@
\rightarrowfill \leftarrowfill \downbracefill \upbracefill ;
\_doc -----------------------------
- The last part of plain \TeX/ macros: \`\magnification`, \`\bye`.
+ The last part of plain \TeX/ macros: \`\magnification`, \`\showhyphens`, \`\bye`.
Note that math macros are defined in the `math-macros.opm` file
(section~\ref[math-macros]).
\_cod -----------------------------
@@ -361,7 +367,7 @@
\_public \showhyphens \bye ;
\_doc -----------------------------
- Plain \TeX/ reads `hyphen.tex` with patterns as `\language=0`. We do the same.
+ Plain \TeX/ reads `hyphen.tex` with patterns when \^`\language``=0`. We do the same.
\_cod -----------------------------
\_lefthyphenmin=2 \_righthyphenmin=3 % disallow x- or -xx breaks
diff --git a/macros/optex/base/prefixed.opm b/macros/optex/base/prefixed.opm
index 3d25b0c894..89aa0b4966 100644
--- a/macros/optex/base/prefixed.opm
+++ b/macros/optex/base/prefixed.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \public {Prefixing and code syntax <2022-11-25>} % preloaded in format
+\_codedecl \public {Prefixing and code syntax <2024-02-02>} % preloaded in format
\_doc ---------
All \TeX/ primitives have alternative control sequence `\_hbox` `\_string`, ...
@@ -97,6 +97,8 @@
\_def \_nspublic {\_xargs \_nspublicA}
\_def \_nspublicA #1{%
\_checkexists \_nspublic {\_pkglabel _\_csstring #1}%
+ \_ifcsname _eol:\_ea\_ignoreit\_pkglabel _\_csstring #1\_endcsname % defined by \eoldef
+ \_slet {_eol:\_csstring #1}{_eol:\_ea\_ignoreit\_pkglabel _\_csstring #1}\_fi
\_ea\_newpublic \_ea\_let \_ea#1\_csname \_pkglabel _\_csstring #1\_endcsname
}
\_def \_nsprivate {\_xargs \_nsprivateA}
@@ -388,6 +390,8 @@ can look like. Another good and short example is
\endinput
+2024-02-02 \_nspublicA bug correction (#1 may be set as \outer)
+2024-01-18 \_nspublic modified in order to \eoldef+\bracedparam
2023-01-30 doc. about namespaces rewritten
2022-11-25 \_resetnamespace: moved \gdef\_namesp:#1 {} to \_namespace
2022-11-24 \newpublic introduced, \_checkexists with only two parameters.
diff --git a/macros/optex/base/sections.opm b/macros/optex/base/sections.opm
index ef5958e788..de647475ef 100644
--- a/macros/optex/base/sections.opm
+++ b/macros/optex/base/sections.opm
@@ -1,6 +1,6 @@
%% This is part of the OpTeX project, see http://petr.olsak.net/optex
-\_codedecl \chap {Titles, chapters, sections, subsections <2023-05-02>} % preloaded in format
+\_codedecl \chap {Titles, chapters, sections, subsections <2024-01-19>} % preloaded in format
\_doc ---------------------------
We are using scaled fonts for titles
@@ -28,7 +28,7 @@
\_nobreak\_bigskip
}
\_def\_tit{\_scantoeol\_printtit}
-\_let\_intit=\_printtit % used by \bracedparam
+\_sdef{_eol:tit}{\_printtit} % enables \bracedparam\tit{title}
\_public \tit ;
@@ -156,7 +156,7 @@
\_doc ----------------------------
The \`\notoc` and \`\nonum` prefixes are implemented by
- internal `\_ifnotoc` and `\_ifnonum`. They are reset
+ internal \`\_ifnotoc` and \`\_ifnonum`. They are reset
after each chapter/section/subsection by the \`\_resetnonumnotoc` macro.
\_cod ----------------------------
@@ -179,6 +179,10 @@
\_optdef\_secc[]{\_trylabel \_scantoeol\_insecc}
\_def\_trylabel{\_istoksempty\_opt\_iffalse \_label[\_the\_opt]\_fi}
+\_sdef{_eol:chap}{\_inchap} % enebles \bracedparam\chap{title}
+\_sdef{_eol:sec}{\_insec} % enables \bracedparam\sec{title}
+\_sdef{_eol:secc}{\_insecc} % enables \bracedparam\secc{title}
+
\_def\_inchap #1{\_par \_sectionlevel=1
\_def \_savedtitle {#1}% saved to .ref file
\_ifnonum \_else {\_globaldefs=1 \_incr\_chapnum \_chapx}\_fi
@@ -317,12 +321,14 @@
`\secl3` is `\secc` and all more levels (for <number>$>3$)
are printed by the common \`\_seclp` macro. It declares only a simple design.
If there is a requirement to use such more levels then the book designer can
- define something different here.
+ define something different here.\nl
+ The variant `\_eol:secl` is defined to enable \^`\bracedparam``\secl<number> {<title-text>}`.
\_cod -----------------------------
-\_def\_secl{\_afterassignment\_secla \_sectionlevel=}
+\_def\_secl{\_let\_secle=\_ea \_afterassignment\_secla \_sectionlevel=}
+\_sdef{_eol:secl}{\_def\_secle{\_ea\_bracedparam\_ea}\_afterassignment\_secla \_sectionlevel=}
\_def\_secla{\_ifcase\_sectionlevel
- \_or\_ea\_chap\_or\_ea\_sec\_or\_ea\_secc\_else\_ea\_seclp\_fi}
+ \_or \_secle\_chap \_or \_secle\_sec \_or \_secle\_secc \_else \_ea \_seclp\_fi}
\_eoldef\_seclp#1{\_par \_ifnum\_lastpenalty=0 \_removelastskip\_medskip\_fi
\_noindent{\_bf #1}\_vadjust{\_nobreak}\_nl\_ignorepars}
\_def\_ignorepars{\_isnextchar\_par{\_ignoresecond\_ignorepars}{}}
@@ -473,6 +479,8 @@
\_endcode % -------------------------------------
+2024-01-19 \bracedparam\secl enalbed
+2024-01-18 \tit, \chap, \sec, \secc: added cooperation with new \bracedparam
2023-05-02 \_numprint used
2022-10-19 More robust \caption (two opened groups, \_printcaption introduced)
2022-08-02 Penalties in \_printsec, \_printsecc changed
diff --git a/macros/optex/base/unimath-codes.opm b/macros/optex/base/unimath-codes.opm
index 66be7487d4..d2b7e0e1e3 100644
--- a/macros/optex/base/unimath-codes.opm
+++ b/macros/optex/base/unimath-codes.opm
@@ -198,7 +198,8 @@
}
\_doc -----------------------------
- The math alphabets \`\cal`, \`\bbchar`, \`\frak`, \`\script` are re-defined
+ The math alphabets \`\cal`, \`\bbchar`, \`\frak`, \`\script`,
+ \`\misans`, \`\mbisans` are re-defined
here. The \`\_marm`, \`\_mabf`, \`\_mait`, \`\_mabi`, \`\_matt`
used in \^`\rm`, \^`\bf`, \^`\it`, \^`\bi` are re-defined too.\nl
You can redefine them again if you need different behavior (for example
@@ -548,7 +549,7 @@
\secc More Unicode-math examples
Example of using additional math font is in section 5.3 in the
-\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]{\tt optex-math.pdf} documentation
+\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]{\tt optex-math.pdf} documentation.
More examples are in the
\ulink[http://petr.olsak.net/optex/optex-tricks.html]{OpTeX tricks} and in the
\ulink[https://petr.olsak.net/ftp/olsak/optex/math-doc.pdf]{math.opm} package.
diff --git a/macros/optex/base/unimath-macros.opm b/macros/optex/base/unimath-macros.opm
index 35842e674d..ac926b5e89 100644
--- a/macros/optex/base/unimath-macros.opm
+++ b/macros/optex/base/unimath-macros.opm
@@ -181,7 +181,9 @@
\`\themathcodefam``<math-char>` and \`\themathcodechar``<math-char>` macros.
The parameter <math-char> is a math character or it is a macro like `\doteq`, `\times`.
Moreower, \`\thedelcodefam``<math-char>` and \`\thedelcodechar``<math-char>`
- return delcode quaitities of givem math character.
+ return delcode quaitities of given math character.
+ All these commands use the common Lua code defined in
+ the \`\_getmathcode``<code>{<math or del>}<character number>` macro.
\_cod -----------------------------
\_def\_getmathcode#1#2{\_directlua{tex.print(tex.get#2code(token.scan_int())[#1])}}
diff --git a/macros/optex/demo/op-mathalign.tex b/macros/optex/demo/op-mathalign.tex
index b2524ee80d..7770a8d0e2 100644
--- a/macros/optex/demo/op-mathalign.tex
+++ b/macros/optex/demo/op-mathalign.tex
@@ -44,7 +44,7 @@
\tit Math alignment examples
The document \url{https://www.ntg.nl/maps/34/06.pdf} shows examples how to
-do special math alignments in display mode in ConTeXt (and in \LaTeX/ for
+do special math alignments in display mode in \ConTeXt/ (and in \LaTeX/ for
comparison). We present the same examples here. They are created in
\OpTeX/ and the \LaTeX/ source is shown for comparison.
diff --git a/macros/optex/doc/optex-doc.pdf b/macros/optex/doc/optex-doc.pdf
index aebe78c634..731b1ab179 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 d780ceeeef..eb0fcc5682 100644
--- a/macros/optex/doc/optex-doc.tex
+++ b/macros/optex/doc/optex-doc.tex
@@ -21,9 +21,9 @@
\tit Format Based on Plain \TeX/ and OPmac\fnotemark1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\hfill Version 1.13
+\hfill Version 1.14
-\centerline{\it Petr Olšák, 2020, 2021, 2022, 2023}
+\centerline{\it Petr Olšák, 2020, 2021, 2022, 2023, 2024}
\bigskip
\centerline{\url{http://petr.olsak.net/optex}}
@@ -65,7 +65,7 @@ The main goal of \OpTeX/ is:
If you need to customize your document or you need to use something
very specific, then you can copy relevant parts of \OpTeX/ macros into your macro
file and do changes to these macros here. This is a significant difference from
-\LaTeX/ or ConTeXt, which is an attempt to create a new user level with a
+\LaTeX/ or \ConTeXt/, which is an attempt to create a new user level with a
plenty of non-primitive parameters and syntax hiding \TeX/ internals.
The macros from \OpTeX/ are simple and straightforward because they solve only
what is explicitly needed, they do not create a new user level for
@@ -113,13 +113,28 @@ document \ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf]
\nonum\chap Index
\noindent
-There are all control sequences used in \OpTeX/ except \TeX/ primitives.
-If you want to know something about \TeX/ primitives then you can use another index from
-\ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf\#ref:index]{\TeX/ in a Nutshell}.
+Control sequences declared by \OpTeX/ have page list here and they are
+internal links to their main documentation point. \TeX/ primitives used by
+\OpTeX/ have no page list here and they are external links to
+\ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf]{\TeX/ in a Nutshell}
+to the place where the primitive is briefly described.
+%Only primitives used in \OpTeX/ macros are listed here. There are much more
+%primitives implemented in \LuaTeX/, see
+%\ulink[https://www.pragma-ade.com/general/manuals/luatex.pdf]{\LuaTeX/ manual},
+%section \"primitives".
% active links directly to the main documentation point but not to the pages:
-\def\_printii #1&{\noindent\hskip-\iindent \link[cs:#1]\Blue{\bslash #1} }
+\def\_printii #1&{%
+ \noindent\hskip-\iindent
+ \ea\ifx \csname,#1\endcsname \empty % primitive
+ \_dest[cs:#1]% main documentation point for primitives is in the Index
+ \ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf\#cs:#1]{\bslash#1}
+ \ea\ea\ea\nopages
+ \else \link[cs:#1]\Blue{\bslash #1} % OpTeX macro
+ \fi
+}
\def\_pgprintA #1{#1}
+\def\nopages#1&{*\_par}
\begmulti 3 \tt \makeindex \endmulti
\bye
diff --git a/macros/optex/doc/optex-techdoc.tex b/macros/optex/doc/optex-techdoc.tex
index 7815619404..894f2d8cd3 100644
--- a/macros/optex/doc/optex-techdoc.tex
+++ b/macros/optex/doc/optex-techdoc.tex
@@ -5,6 +5,7 @@
% (three times) to create whole documentation including all references and the index.
\load [doc.opm]
+\input primitives
\thisoutline {TECHNICAL DOCUMENTATION}
diff --git a/macros/optex/doc/optex-userdoc.tex b/macros/optex/doc/optex-userdoc.tex
index 61157b0d31..c99e63c21d 100644
--- a/macros/optex/doc/optex-userdoc.tex
+++ b/macros/optex/doc/optex-userdoc.tex
@@ -1896,7 +1896,7 @@ tests, if the current point is at odd page regardless of asynchronous processing
\tpg[perpage]\t\incrpp. \t\thepp, \t\thepplast, \t\truepage\
does per-page counting of objects.
-\tpg[keystrokes]\t\keystoke\
+\tpg[keystrokes]\t\keystroke\
prints given text in a keystroke-like frame.
\tpg[longtable]\t\longtable\
@@ -1905,15 +1905,21 @@ alows to break a table to more pages and repeates header.
\tpg[lot]\t\makeLOF, \t\makeLOT, \t\captionF, \t\captionT\
create list of tables and list of figures similar to \^`\maketoc`.
+\tpg[onlyifnew]\t\onlyifnew\
+only define a macro if it is not already defined.
+
+\tpg[pgforeground]\t\pgforeground\
+adds material to the foreground of each page.
+
\tpg[linnum]\t\pstart, \t\pend\
dispalys line numbers of the marked text in the margin.
-\tpg[shadedframe]\t\shadedframe\
-colored rectangular frames with simple shadows.
-
\tpg[roundframe]\t\roundframe\
colored frames with rounded corners and many options.
+\tpg[shadedframe]\t\shadedframe\
+colored rectangular frames with simple shadows.
+
\tpg[scaleto]\t\scaleto, \t\scaletof\
text font size changed to the desired width.
@@ -2072,8 +2078,8 @@ documentation.
Example: \~`\isinlist\list{<text>}\iftrue` does `\iftrue` if <text> is in `\list`.\nl
\^`\isnextchar`` <char>{<text1>}{<text2>}` performs <text1> if next
character is <char>, else <text2>.\nl
-\~`\kv` `{<key>}` expands to value when key-value parameters are used.
- See also \~`\iskv`, \~`\readkv`, \~`\kvx`, \~`\nokvx`.\nl
+\~`\kv` `{<key>}` expands to a value given by key=value.
+ See also \~`\trykv`, \~`\iskv`, \~`\readkv`, \~`\kvx`, \~`\nokvx`.\nl
\^`\loop` `...` \^`\repeat` is classical Plain \TeX/ loop.\nl
\^`\mathstyles`` {<math list>}` enables to create macros dependent on current math style.\nl
\~`\_namespace`` {<pkg>}` declares name space used by package writers.\nl
diff --git a/macros/optex/doc/primitives.tex b/macros/optex/doc/primitives.tex
new file mode 100644
index 0000000000..11ced8bca1
--- /dev/null
+++ b/macros/optex/doc/primitives.tex
@@ -0,0 +1,387 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% There is a list of TeX primitives used by OpTeX, they are printed in the Index.
+
+\def\addprimitive#1{\_ea\addprimitiveA \_csname,\_csstring#1\_endcsname}
+\def\addprimitiveA#1{\ifx#1\relax\_addto\_iilist#1\fi \_gdef#1{}}
+\def\_intlink{\_link[cs:\_tmpa]{\choosecolor}{\_csstring\\\_tmpb}}
+\def\choosecolor{\_ea\ifx\csname,\_tmpa\endcsname\empty \primcolor\else\ulinkcolor\fi}
+\def\primcolor{\setcmykcolor{.7 0 .7 .5}}
+
+\xargs\addprimitive
+%\above
+\abovedisplayshortskip
+\abovedisplayskip
+%\abovewithdelims
+\accent
+\adjdemerits
+\advance
+\afterassignment
+\aftergroup
+\atop
+\atopwithdelims
+\attributedef
+\baselineskip
+%\batchmode
+\begingroup
+\belowdisplayshortskip
+\belowdisplayskip
+\binoppenalty
+%\botmark
+\box
+\boxmaxdepth
+\breakafterdirmode
+\brokenpenalty
+%\catcode
+\catcodetable
+\char
+\chardef
+\cleaders
+\closein
+\closeout
+\clubpenalty
+\copy
+\countdef
+\cr
+\crampeddisplaystyle
+\crampedscriptstyle
+\crampedscriptscriptstyle
+\crampedtextstyle
+\crcr
+\csname
+\csstring
+\day
+\def
+\defaulthyphenchar
+\defaultskewchar
+\delcode
+\delimiter
+\delimiterfactor
+\delimitershortfall
+\detokenize
+\dimen
+\dimendef
+\dimexpr
+\directlua
+\discretionary
+%\displaylimits
+\displaystyle
+\displaywidowpenalty
+\displaywidth
+\divide
+\doublehyphendemerits
+\dump
+\edef
+%\efcode
+\else
+\emergencystretch
+\end
+\endcsname
+\endgroup
+\endinput
+\endlinechar
+\eqno
+\errmessage
+\errorcontextlines
+%\errorstopmode
+\escapechar
+\everycr
+\everydisplay
+\everyeof
+%\everyhbox
+\everyjob
+\everymath
+\everypar
+%\everyvbox
+\exhyphenpenalty
+\expandafter
+\expanded
+\fi
+\finalhyphendemerits
+\firstmark
+\floatingpenalty
+\font
+\fontdimen
+\fontname
+\futurelet
+\gdef
+\glet
+\global
+\globaldefs
+\halign
+\hangafter
+\hangindent
+\hbadness
+\hbox
+\hfil
+\hfill
+%\hfilneg
+\hfuzz
+\hoffset
+\hrule
+\hsize
+\hskip
+\hss
+\hyphenation
+\hyphenchar
+\hyphenpenalty
+\if
+\ifcase
+\ifcat
+\ifcsname
+\ifdim
+\ifeof
+\iffalse
+%\ifhbox
+\ifhmode
+\ifinner
+\ifmmode
+\ifnum
+\ifodd
+\iftrue
+%\ifvbox
+\ifvmode
+\ifvoid
+\ifx
+\ignorespaces
+\immediate
+\immediateassigned
+\immediateassignment
+\indent
+\input
+\inputlineno
+\interlinepenalty
+\jobname
+\kern
+%\knaccode
+%\knbccode
+%\knbscode
+\language
+\lastbox
+\lastnamedcs
+\lastpenalty
+\lastskip
+\lccode
+\leaders
+\left
+\lefthyphenmin
+\leftskip
+\leqno
+\let
+%\letterspacefont
+\limits
+\linepenalty
+\lineskip
+\lineskiplimit
+\long
+%\looseness
+\lower
+\lowercase
+%\lpcode
+\luaescapestring
+\mag
+\mark
+\mathaccent
+\mathbin
+\mathchar
+\mathchardef
+\mathchoice
+\mathclose
+\mathcode
+\matheqdirmode
+\mathop
+\mathopen
+\mathord
+\mathpunct
+\mathrel
+\mathsurround
+\maxdepth
+\meaning
+\medmuskip
+\message
+\middle
+\mkern
+\month
+\moveleft
+\moveright
+\mskip
+\multiply
+\muskip
+\muskipdef
+\newlinechar
+\noalign
+\noexpand
+\noindent
+\nolimits
+\nonscript
+%\nonstopmode
+\nulldelimiterspace
+\nullfont
+\number
+\numexpr
+\omit
+\openin
+\openout
+\outer
+\output
+\outputmode
+\outputpenalty
+\over
+\overfullrule
+%\overwithdelims
+\par
+\parfillskip
+\parindent
+%\parshape
+\parskip
+\patterns
+%\pdfadjustinterwordglue
+%\pdfadjustspacing
+\pdfcatalog
+%\pdfcolorstack
+\pdfdest
+\pdfendlink
+\pdfextension
+\pdffeedback
+%\pdffontexpand
+\pdfhorigin
+\pdfinfo
+\pdflastximage
+\pdflastxpos
+\pdflastypos
+\pdfliteral
+%\pdfnormaldeviate
+\pdfoutline
+\pdfpageheight
+\pdfpagewidth
+%\pdfprotrudechars
+\pdfrefximage
+\pdfrestore
+\pdfsave
+\pdfsavepos
+\pdfsetmatrix
+%\pdfsetrandomseed
+\pdfstartlink
+%\pdfstrcmp
+%\pdfuniformdeviate
+\pdfvariable
+\pdfvorigin
+\pdfximage
+\penalty
+\postdisplaypenalty
+\predisplaypenalty
+\pretolerance
+\prevdepth
+\prevgraph
+\protected
+\protrudechars
+\radical
+\raise
+\read
+\relax
+\relpenalty
+\right
+\righthyphenmin
+\rightskip
+\romannumeral
+\root
+%\rpcode
+\savecatcodetable
+\scantextokens
+\scantokens
+\scriptfont
+\scriptscriptfont
+\scriptscriptstyle
+\scriptstyle
+%\scrollmode
+\setbox
+\sfcode
+%\shbscode
+\shipout
+\show
+\showbox
+\showboxbreadth
+\showboxdepth
+\showlists
+\showthe
+\skewchar
+\skip
+\skipdef
+\spacefactor
+\spaceskip
+\span
+%\special
+\splitmaxdepth
+\splittopskip
+\sqrt
+%\stbscode
+\string
+\suppressfontnotfounderror
+\tabskip
+\textfont
+\textstyle
+\the
+\thickmuskip
+\thinmuskip
+\time
+\toks
+\toksdef
+\tolerance
+%\topmark
+\topskip
+\tracingassigns
+\tracingcommands
+\tracinggroups
+\tracingifs
+\tracinglostchars
+\tracingmacros
+\tracingonline
+\tracingoutput
+\tracingpages
+\tracingparagraphs
+\tracingrestores
+\tracingscantokens
+\tracingstats
+\uccode
+\Uchar
+\uchyph
+\Udelcode
+\Udelimiter
+\Umathaccent
+\Umathchar
+\Umathchardef
+\Umathcode
+\unexpanded
+\unhbox
+\unhcopy
+\unless
+\unpenalty
+\unskip
+\unvbox
+\unvcopy
+\uppercase
+\Uradical
+\vadjust
+\valign
+\vbadness
+\vbox
+\vcenter
+\vfil
+\vfill
+\vfilneg
+\vfuzz
+\voffset
+\vrule
+\vsize
+\vskip
+\vsplit
+\vss
+\vtop
+\wd
+\widowpenalty
+\write
+\xdef
+%\xleaders
+\xspaceskip
+\year
+;
diff --git a/macros/optex/pkg/mte.opm b/macros/optex/pkg/mte.opm
index 0c8b22152a..5352d5dd78 100644
--- a/macros/optex/pkg/mte.opm
+++ b/macros/optex/pkg/mte.opm
@@ -658,7 +658,7 @@ You can define your own protrusion or expansion values: copy macros
as you wish using `\def`. Such definition has precedence.
Similar definitions can be in some font family files too, so: do your
definition after all `\fontfam` if you want to keep the precedence.
-All such definitions must be performed before the `\mteinit` command.
+All such definitions must be performed before the \^`\enablemte` command.
You can use `\def\_mte_P` for data of protrusion for all fonts
which has general precedence. For example, if you want to protrude hyphen
diff --git a/support/texlogfilter/README b/support/texlogfilter/README
index e8ceb46dc5..d621a2aeb4 100644
--- a/support/texlogfilter/README
+++ b/support/texlogfilter/README
@@ -69,13 +69,15 @@ texlogfilter
1.1
HISTORY
- * 2024, February, version 1.2 : fix duplicate or missing lines; handle
- package and class names with hyphen ; add info and warning patterns
+ * 2024, February, version 1.3: better detect the current file name.
+
+ * 2024, February, version 1.2: fix duplicate or missing lines; handle
+ package and class names with hyphen; add info and warning patterns
for fonts.
- * 2022, March, version 1.1 : add --info and --no-info options.
+ * 2022, March, version 1.1: add --info and --no-info options.
- * 2021, November, version 1.0 : initial version.
+ * 2021, November, version 1.0: initial version.
DOCUMENTATION
The documentation is integrated, writtent in Plain Old Documentation
diff --git a/support/texlogfilter/texlogfilter b/support/texlogfilter/texlogfilter
index 6a8b246232..341318e576 100755
--- a/support/texlogfilter/texlogfilter
+++ b/support/texlogfilter/texlogfilter
@@ -16,7 +16,7 @@ use Getopt::Long;
use Term::ANSIColor;
my $name = "texlogfilter";
-my $version = "1.2";
+my $version = "1.3";
# options
my @userfilters;
@@ -27,7 +27,7 @@ my $showboxmsg = 1;
my $showinfomsg = 0;
my $showskips = 0;
my $skipmarker = "...";
-my $extpattern = "tex|sty|cls|bib";
+my $extpattern = "tex|sty|cls|bib|fd|bst|bbx|cbx|def|clo";
my $fulllog = 0;
my $printfilename = -1; # -1: value not modified by options
my $errcolor = "red";
@@ -187,7 +187,8 @@ while (<>) {
# assume currentfile is given in the last open parenthesis
# (works badly for packages)
- if (/\(([^)]+$extpattern)$/) {$currentfile = $1;}
+ if (/^[^(]*\)/) {$currentfile = ""; $lastfile = "";}
+ if (/\(([^)]+($extpattern))$/) {$currentfile = $1;}
# try to show usefull lines following some warnings or errors (starting with
# whitespaces or package name)
@@ -341,12 +342,14 @@ distributions of LaTeX version 2005/12/01 or later.
=over
-=item * 2024, February, version 1.2 : fix duplicate or missing lines; handle
-package and class names with hyphen ; add info and warning patterns for fonts.
+=item * 2024, February, version 1.3: better detect the current file name.
-=item * 2022, March, version 1.1 : add --info and --no-info options.
+=item * 2024, February, version 1.2: fix duplicate or missing lines; handle
+package and class names with hyphen; add info and warning patterns for fonts.
-=item * 2021, November, version 1.0 : initial version.
+=item * 2022, March, version 1.1: add --info and --no-info options.
+
+=item * 2021, November, version 1.0: initial version.
=back
diff --git a/support/texlogfilter/texlogfilter.html b/support/texlogfilter/texlogfilter.html
index 789edcbc84..350951829e 100644
--- a/support/texlogfilter/texlogfilter.html
+++ b/support/texlogfilter/texlogfilter.html
@@ -94,13 +94,16 @@
<ul>
-<li><p>2024, February, version 1.2 : fix duplicate or missing lines; handle package and class names with hyphen ; add info and warning patterns for fonts.</p>
+<li><p>2024, February, version 1.3: better detect the current file name.</p>
</li>
-<li><p>2022, March, version 1.1 : add --info and --no-info options.</p>
+<li><p>2024, February, version 1.2: fix duplicate or missing lines; handle package and class names with hyphen; add info and warning patterns for fonts.</p>
</li>
-<li><p>2021, November, version 1.0 : initial version.</p>
+<li><p>2022, March, version 1.1: add --info and --no-info options.</p>
+
+</li>
+<li><p>2021, November, version 1.0: initial version.</p>
</li>
</ul>
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index 99a93e2a42..06638ca3e0 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -24,9 +24,6 @@ $mirrors = {
'https://mirrors.tuna.tsinghua.edu.cn/CTAN/' => 1,
'https://mirrors.ustc.edu.cn/CTAN/' => 1,
},
- 'Hong Kong' => {
- 'https://mirror-hk.koddos.net/CTAN/' => 1,
- },
'India' => {
'https://in.mirrors.cicku.me/ctan/' => 1,
'https://mirror.niser.ac.in/ctan/' => 1,
@@ -40,13 +37,14 @@ $mirrors = {
'https://ctan.yazd.ac.ir/' => 1,
},
'Japan' => {
- 'http://ring.airnet.ne.jp/archives/text/CTAN/' => 1,
+ 'https://ftp.jaist.ac.jp/pub/CTAN/' => 1,
'https://ftp.kddilabs.jp/CTAN/' => 1,
'https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/' => 1,
'https://jp.mirrors.cicku.me/ctan/' => 1,
},
'Korea' => {
'http://ftp.ktug.org/tex-archive/' => 1,
+ 'https://ftp.kaist.ac.kr/tex-archive/' => 1,
'https://kr.mirrors.cicku.me/ctan/' => 1,
'https://lab.uklee.pe.kr/tex-archive/' => 1,
'https://mirror.kakao.com/CTAN/' => 1,
@@ -200,7 +198,6 @@ $mirrors = {
'Australia' => {
'https://au.mirrors.cicku.me/ctan/' => 1,
'https://mirror.aarnet.edu.au/pub/CTAN/' => 1,
- 'https://mirror.cse.unsw.edu.au/pub/CTAN/' => 1,
},
},
'South America' => {
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 70e76c2b39..ad8d52af03 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,7 +26,7 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2023
-depend revision/69828
+depend revision/69848
name 00texlive.image
category TLCore
@@ -4850,7 +4850,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 69818
+revision 69830
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -324576,7 +324576,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 69818
+revision 69830
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -324584,10 +324584,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 114048
-containerchecksum c4473bfee861397aaf297a42fa17af1eeb0d0ede0b9e2ce1987f939c80e8f2b13c1a55f8634d38b20bb5d6dc184ffad40cecc4dc332b1ca66db22806521e8162
+containersize 114016
+containerchecksum b51853014b8eb066752a924af18874e9e8294bcee70f32578c9c8f236623307ccca583ab7b5e0328f353784f6fa530486fea721e298c514fc7019eeba43f5cd1
doccontainersize 432272
-doccontainerchecksum 72f5fa48ffdbc124956fbcdb1f32ab4a6582c103058e6e00c4c588963f7fde3ca0ec3f353ac6b0d447d325bed0808f4381cf22416bef2eb0ca4a15896a547a73
+doccontainerchecksum 52fe9ea255c6ac85aadfe1b49efafae42d0896e16859e6b9c2826746dc265c9846816785c45ec45e5b96162e99772fcbfb7a445ae46c39dcfcc67014fe35a84e
docfiles size=564
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index b62201a301..a0531955de 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-de4a5aa6a764933f85281b384f474e18 texlive.tlpdb
+cc308c08b6deabc7d0f2f62ad9cb7436 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index fa167724f7..303f85debe 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-c8dafd24d336467b4248536de63d42ec2992d95fdacaf4dc25a519b507556c180e54232d9133a01c55b1ec14c3908975964328f61316aaa07dc9cf831c1769c5 texlive.tlpdb
+5d6fd5d771e3136953ebcef2ec11e9b3b76c9eb29a73ae14675b51f5fc1805cd5a12178892c2be60de4da71e63314eb75627e7330f26cfd754307da8db566155 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 1ce121f343..455a3625fd 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,11 +1,11 @@
-----BEGIN PGP SIGNATURE-----
-iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmXK0ycACgkQTOGHfhlD
-jHDIJggAim+czRYNVtOnwXq2Cw8BpRMzjePCNjNeiWEajSg17mjMNrxAhKyN5Umb
-9rtBrDIjCdmsTUAefwwyVd27ZUbTvtGcehOhOabhXq5hf2+ZAqjdBG4/bqUWEqc/
-DNYTAA0p9nehqHjuXjcVQ+ZmoDVJ+sCb8nVxSFFMQjUqq4jeJXUCTp96HcFpaE9F
-zfkQjZivfQ01ad7SK1oeDz/4YYJGooiErNggbMsyer3AqTjisXJ/2UFVr6Pecho5
-tWzKDUkdCdmNqsTT4ZtULXf4Z+mlKJH1g3oodcxfxwj8awow2O3ms5H9LWWCG0U+
-Gn68PihBnbIhhO6iC9OfNEl6isQXLQ==
-=SxXi
+iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmXMJN0ACgkQTOGHfhlD
+jHCiJggAi+byUEyFm7TcdlSBTCttv4vaLx7rJXmnrvoZ7T7ImA5VfTSubTLWUOJ8
+mHCRnuPjt6xbl7EMBqJubIc/SoHxSMzLBrpSlf9TRJj5NytX8peowp8/TSuFlhSS
+JTZzAMrF6e3pqhT3qC0w8gv0zUMn1LAX1DY5TkxsB65cUzHEhYtswCWJYiOgs0+D
+ygzm6u6qiXNXGl38x4bOEPPv9YErqrBOm4aTP8NXkI4kvLPhChv9NEYLojHoaV0l
+GbUlpeQb+yHRgJ/HYtXF/YnYkD6A89jI/mujOxzbtKBhHgSrKvHMdZoQQe8q5jDr
+bVCagm9Xxm+tDLICVmEWmpkobSD3PQ==
+=ZEZ5
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index a1db8e19b0..dc7092d953 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/timestamp b/timestamp
index b182a596d5..985d91ff3c 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2024-02-14-02-02
+2024-02-15-02-02