summaryrefslogtreecommitdiff
path: root/macros/latex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex')
-rw-r--r--macros/latex/base/README.md13
-rw-r--r--macros/latex/base/alltt.dtx4
-rw-r--r--macros/latex/base/alltt.ins4
-rw-r--r--macros/latex/base/alltt.pdfbin214860 -> 223831 bytes
-rw-r--r--macros/latex/base/cfgguide.pdfbin242895 -> 242888 bytes
-rw-r--r--macros/latex/base/cfgguide.tex2
-rw-r--r--macros/latex/base/changes.txt333
-rw-r--r--macros/latex/base/classes.dtx4
-rw-r--r--macros/latex/base/classes.ins4
-rw-r--r--macros/latex/base/classes.pdfbin550870 -> 560350 bytes
-rw-r--r--macros/latex/base/clsguide.pdfbin402787 -> 402780 bytes
-rw-r--r--macros/latex/base/clsguide.tex2
-rw-r--r--macros/latex/base/cmextra.ins4
-rw-r--r--macros/latex/base/cmfonts.ins4
-rw-r--r--macros/latex/base/cmfonts.pdfbin292376 -> 292376 bytes
-rw-r--r--macros/latex/base/cyrguide.pdfbin239688 -> 239689 bytes
-rw-r--r--macros/latex/base/cyrguide.tex2
-rw-r--r--macros/latex/base/doc-2016-02-15.sty826
-rw-r--r--macros/latex/base/doc-2021-06-01.sty (renamed from macros/latex/base/doc-v3beta.sty)801
-rw-r--r--macros/latex/base/doc-code.pdfbin0 -> 1081719 bytes
-rw-r--r--macros/latex/base/doc-code.tex4
-rw-r--r--macros/latex/base/doc.dtx4725
-rw-r--r--macros/latex/base/doc.pdfbin677451 -> 755165 bytes
-rw-r--r--macros/latex/base/docstrip.dtx4
-rw-r--r--macros/latex/base/docstrip.ins5
-rw-r--r--macros/latex/base/docstrip.pdfbin503607 -> 503620 bytes
-rw-r--r--macros/latex/base/ec.ins4
-rw-r--r--macros/latex/base/encguide.pdfbin1309999 -> 1318126 bytes
-rw-r--r--macros/latex/base/encguide.tex2
-rw-r--r--macros/latex/base/exscale.dtx4
-rw-r--r--macros/latex/base/exscale.ins4
-rw-r--r--macros/latex/base/exscale.pdfbin204716 -> 204711 bytes
-rw-r--r--macros/latex/base/fix-cm.dtx4
-rw-r--r--macros/latex/base/fix-cm.ins4
-rw-r--r--macros/latex/base/fix-cm.pdfbin287729 -> 288328 bytes
-rw-r--r--macros/latex/base/fntguide.pdfbin493966 -> 502880 bytes
-rw-r--r--macros/latex/base/fntguide.tex510
-rw-r--r--macros/latex/base/fontdef.dtx4
-rw-r--r--macros/latex/base/format.ins11
-rw-r--r--macros/latex/base/graphpap.dtx4
-rw-r--r--macros/latex/base/graphpap.ins4
-rw-r--r--macros/latex/base/graphpap.pdfbin161721 -> 161713 bytes
-rw-r--r--macros/latex/base/idx.tex2
-rw-r--r--macros/latex/base/ifthen.dtx19
-rw-r--r--macros/latex/base/ifthen.ins4
-rw-r--r--macros/latex/base/ifthen.pdfbin220540 -> 221211 bytes
-rw-r--r--macros/latex/base/inputenc.dtx6
-rw-r--r--macros/latex/base/inputenc.ins4
-rw-r--r--macros/latex/base/inputenc.pdfbin318171 -> 318204 bytes
-rw-r--r--macros/latex/base/lablst.tex2
-rw-r--r--macros/latex/base/lamport-manual.pdfbin170882 -> 170878 bytes
-rw-r--r--macros/latex/base/latex209.dtx4
-rw-r--r--macros/latex/base/latex209.ins4
-rw-r--r--macros/latex/base/latexchanges.pdfbin469973 -> 0 bytes
-rw-r--r--macros/latex/base/latexchanges.tex1025
-rw-r--r--macros/latex/base/latexrelease.dtx42
-rw-r--r--macros/latex/base/latexrelease.ins8
-rw-r--r--macros/latex/base/latexrelease.pdfbin281880 -> 281906 bytes
-rw-r--r--macros/latex/base/latexsym.dtx4
-rw-r--r--macros/latex/base/latexsym.ins6
-rw-r--r--macros/latex/base/latexsym.pdfbin200762 -> 200760 bytes
-rw-r--r--macros/latex/base/lb2.err2
-rw-r--r--macros/latex/base/lb2.pdfbin252163 -> 252140 bytes
-rw-r--r--macros/latex/base/letter.dtx6
-rw-r--r--macros/latex/base/letter.ins4
-rw-r--r--macros/latex/base/letter.pdfbin328903 -> 337544 bytes
-rw-r--r--macros/latex/base/lgc2.err10
-rw-r--r--macros/latex/base/lgc2.pdfbin215099 -> 215684 bytes
-rw-r--r--macros/latex/base/lppl.pdfbin132380 -> 132382 bytes
-rw-r--r--macros/latex/base/ltalloc.dtx4
-rw-r--r--macros/latex/base/ltbibl.dtx41
-rw-r--r--macros/latex/base/ltboxes.dtx8
-rw-r--r--macros/latex/base/ltclass.dtx79
-rw-r--r--macros/latex/base/ltcmd.dtx76
-rw-r--r--macros/latex/base/ltcmdhooks-code.pdfbin717887 -> 720048 bytes
-rw-r--r--macros/latex/base/ltcmdhooks-doc.pdfbin479214 -> 478890 bytes
-rw-r--r--macros/latex/base/ltcmdhooks-doc.tex1
-rw-r--r--macros/latex/base/ltcmdhooks.dtx11
-rw-r--r--macros/latex/base/ltcntrl.dtx4
-rw-r--r--macros/latex/base/ltcounts.dtx4
-rw-r--r--macros/latex/base/ltdefns.dtx8
-rw-r--r--macros/latex/base/ltdirchk.dtx21
-rw-r--r--macros/latex/base/lterror.dtx4
-rw-r--r--macros/latex/base/ltexpl.dtx135
-rw-r--r--macros/latex/base/ltfilehook-code.pdfbin795179 -> 802835 bytes
-rw-r--r--macros/latex/base/ltfilehook-doc.pdfbin547018 -> 548523 bytes
-rw-r--r--macros/latex/base/ltfilehook-doc.tex1
-rw-r--r--macros/latex/base/ltfilehook.dtx129
-rw-r--r--macros/latex/base/ltfiles.dtx83
-rw-r--r--macros/latex/base/ltfinal.dtx89
-rw-r--r--macros/latex/base/ltfloat.dtx4
-rw-r--r--macros/latex/base/ltfntcmd.dtx4
-rw-r--r--macros/latex/base/ltfssaxes.dtx4
-rw-r--r--macros/latex/base/ltfssbas.dtx14
-rw-r--r--macros/latex/base/ltfsscmp.dtx4
-rw-r--r--macros/latex/base/ltfssdcl.dtx4
-rw-r--r--macros/latex/base/ltfssini.dtx4
-rw-r--r--macros/latex/base/ltfsstrc.dtx4
-rw-r--r--macros/latex/base/lthooks-code.pdfbin1083186 -> 1096906 bytes
-rw-r--r--macros/latex/base/lthooks-doc.pdfbin703644 -> 703813 bytes
-rw-r--r--macros/latex/base/lthooks-doc.tex1
-rw-r--r--macros/latex/base/lthooks.dtx165
-rw-r--r--macros/latex/base/lthyphen.dtx4
-rw-r--r--macros/latex/base/ltidxglo.dtx4
-rw-r--r--macros/latex/base/ltkeys.dtx518
-rw-r--r--macros/latex/base/ltlength.dtx4
-rw-r--r--macros/latex/base/ltlists.dtx4
-rw-r--r--macros/latex/base/ltlogos.dtx4
-rw-r--r--macros/latex/base/ltluatex.dtx58
-rw-r--r--macros/latex/base/ltluatex.pdfbin317601 -> 317700 bytes
-rw-r--r--macros/latex/base/ltmarks-code.pdfbin0 -> 715490 bytes
-rw-r--r--macros/latex/base/ltmarks-code.tex5
-rw-r--r--macros/latex/base/ltmarks-doc.pdfbin0 -> 586925 bytes
-rw-r--r--macros/latex/base/ltmarks-doc.tex8
-rw-r--r--macros/latex/base/ltmarks.dtx1649
-rw-r--r--macros/latex/base/ltmath.dtx21
-rw-r--r--macros/latex/base/ltmeta.dtx216
-rw-r--r--macros/latex/base/ltmiscen.dtx4
-rw-r--r--macros/latex/base/ltnews.pdfbin1120381 -> 1180993 bytes
-rw-r--r--macros/latex/base/ltnews.tex10
-rw-r--r--macros/latex/base/ltnews01.pdfbin161527 -> 161518 bytes
-rw-r--r--macros/latex/base/ltnews01.tex2
-rw-r--r--macros/latex/base/ltnews02.pdfbin159800 -> 159792 bytes
-rw-r--r--macros/latex/base/ltnews02.tex2
-rw-r--r--macros/latex/base/ltnews03.pdfbin159341 -> 159332 bytes
-rw-r--r--macros/latex/base/ltnews03.tex2
-rw-r--r--macros/latex/base/ltnews04.pdfbin152535 -> 152525 bytes
-rw-r--r--macros/latex/base/ltnews04.tex2
-rw-r--r--macros/latex/base/ltnews05.pdfbin174508 -> 174494 bytes
-rw-r--r--macros/latex/base/ltnews05.tex2
-rw-r--r--macros/latex/base/ltnews06.pdfbin142860 -> 142849 bytes
-rw-r--r--macros/latex/base/ltnews06.tex2
-rw-r--r--macros/latex/base/ltnews07.pdfbin137821 -> 137811 bytes
-rw-r--r--macros/latex/base/ltnews07.tex2
-rw-r--r--macros/latex/base/ltnews08.pdfbin155062 -> 155053 bytes
-rw-r--r--macros/latex/base/ltnews08.tex2
-rw-r--r--macros/latex/base/ltnews09.pdfbin129581 -> 129570 bytes
-rw-r--r--macros/latex/base/ltnews09.tex2
-rw-r--r--macros/latex/base/ltnews10.pdfbin169419 -> 169416 bytes
-rw-r--r--macros/latex/base/ltnews10.tex2
-rw-r--r--macros/latex/base/ltnews11.pdfbin111963 -> 111948 bytes
-rw-r--r--macros/latex/base/ltnews11.tex2
-rw-r--r--macros/latex/base/ltnews12.pdfbin156565 -> 156551 bytes
-rw-r--r--macros/latex/base/ltnews12.tex2
-rw-r--r--macros/latex/base/ltnews13.pdfbin182229 -> 182225 bytes
-rw-r--r--macros/latex/base/ltnews13.tex2
-rw-r--r--macros/latex/base/ltnews14.pdfbin170481 -> 170473 bytes
-rw-r--r--macros/latex/base/ltnews14.tex2
-rw-r--r--macros/latex/base/ltnews15.pdfbin130318 -> 130309 bytes
-rw-r--r--macros/latex/base/ltnews15.tex2
-rw-r--r--macros/latex/base/ltnews16.pdfbin138088 -> 138073 bytes
-rw-r--r--macros/latex/base/ltnews16.tex2
-rw-r--r--macros/latex/base/ltnews17.pdfbin166242 -> 166228 bytes
-rw-r--r--macros/latex/base/ltnews17.tex2
-rw-r--r--macros/latex/base/ltnews18.pdfbin38039 -> 38033 bytes
-rw-r--r--macros/latex/base/ltnews18.tex2
-rw-r--r--macros/latex/base/ltnews19.pdfbin230035 -> 230028 bytes
-rw-r--r--macros/latex/base/ltnews19.tex2
-rw-r--r--macros/latex/base/ltnews20.pdfbin318554 -> 318548 bytes
-rw-r--r--macros/latex/base/ltnews21.pdfbin244869 -> 244867 bytes
-rw-r--r--macros/latex/base/ltnews22.pdfbin317774 -> 317773 bytes
-rw-r--r--macros/latex/base/ltnews22.tex2
-rw-r--r--macros/latex/base/ltnews23.pdfbin286599 -> 286591 bytes
-rw-r--r--macros/latex/base/ltnews23.tex2
-rw-r--r--macros/latex/base/ltnews24.pdfbin265291 -> 265279 bytes
-rw-r--r--macros/latex/base/ltnews24.tex2
-rw-r--r--macros/latex/base/ltnews25.pdfbin204941 -> 204935 bytes
-rw-r--r--macros/latex/base/ltnews25.tex2
-rw-r--r--macros/latex/base/ltnews26.pdfbin379468 -> 379462 bytes
-rw-r--r--macros/latex/base/ltnews26.tex2
-rw-r--r--macros/latex/base/ltnews27.pdfbin250601 -> 250592 bytes
-rw-r--r--macros/latex/base/ltnews27.tex2
-rw-r--r--macros/latex/base/ltnews28.pdfbin376655 -> 376643 bytes
-rw-r--r--macros/latex/base/ltnews28.tex2
-rw-r--r--macros/latex/base/ltnews29.pdfbin455108 -> 455107 bytes
-rw-r--r--macros/latex/base/ltnews29.tex2
-rw-r--r--macros/latex/base/ltnews30.pdfbin511909 -> 511909 bytes
-rw-r--r--macros/latex/base/ltnews31.pdfbin526324 -> 526323 bytes
-rw-r--r--macros/latex/base/ltnews32.pdfbin546175 -> 546160 bytes
-rw-r--r--macros/latex/base/ltnews32.tex2
-rw-r--r--macros/latex/base/ltnews33.pdfbin522421 -> 522412 bytes
-rw-r--r--macros/latex/base/ltnews34.pdfbin507763 -> 508044 bytes
-rw-r--r--macros/latex/base/ltnews34.tex9
-rw-r--r--macros/latex/base/ltnews35.pdfbin0 -> 563513 bytes
-rw-r--r--macros/latex/base/ltnews35.tex987
-rw-r--r--macros/latex/base/ltoutenc.dtx390
-rw-r--r--macros/latex/base/ltoutenc.ins4
-rw-r--r--macros/latex/base/ltoutput.dtx16
-rw-r--r--macros/latex/base/ltpage.dtx65
-rw-r--r--macros/latex/base/ltpageno.dtx4
-rw-r--r--macros/latex/base/ltpar.dtx4
-rw-r--r--macros/latex/base/ltpara-code.pdfbin666698 -> 666944 bytes
-rw-r--r--macros/latex/base/ltpara-doc.pdfbin560208 -> 560439 bytes
-rw-r--r--macros/latex/base/ltpara-doc.tex1
-rw-r--r--macros/latex/base/ltpara.dtx8
-rw-r--r--macros/latex/base/ltpictur.dtx4
-rw-r--r--macros/latex/base/ltplain.dtx149
-rw-r--r--macros/latex/base/ltsect.dtx4
-rw-r--r--macros/latex/base/ltshipout-code.pdfbin817756 -> 820689 bytes
-rw-r--r--macros/latex/base/ltshipout-doc.pdfbin564767 -> 564986 bytes
-rw-r--r--macros/latex/base/ltshipout-doc.tex1
-rw-r--r--macros/latex/base/ltshipout.dtx88
-rw-r--r--macros/latex/base/ltspace.dtx4
-rw-r--r--macros/latex/base/lttab.dtx4
-rw-r--r--macros/latex/base/lttextcomp.dtx40
-rw-r--r--macros/latex/base/ltthm.dtx4
-rw-r--r--macros/latex/base/ltvers.dtx30
-rw-r--r--macros/latex/base/ltx3info.pdfbin219360 -> 219349 bytes
-rw-r--r--macros/latex/base/ltx3info.tex2
-rw-r--r--macros/latex/base/ltxcheck.tex2
-rw-r--r--macros/latex/base/ltxdoc.dtx132
-rw-r--r--macros/latex/base/ltxdoc.pdfbin230966 -> 242822 bytes
-rw-r--r--macros/latex/base/ltxref.dtx87
-rw-r--r--macros/latex/base/makeindx.dtx4
-rw-r--r--macros/latex/base/makeindx.ins4
-rw-r--r--macros/latex/base/makeindx.pdfbin165836 -> 165821 bytes
-rw-r--r--macros/latex/base/manifest.txt14
-rw-r--r--macros/latex/base/modguide.pdfbin243610 -> 243605 bytes
-rw-r--r--macros/latex/base/modguide.tex2
-rw-r--r--macros/latex/base/newdc.ins4
-rw-r--r--macros/latex/base/newlfont.dtx4
-rw-r--r--macros/latex/base/nfssfont.dtx4
-rw-r--r--macros/latex/base/nfssfont.ins4
-rw-r--r--macros/latex/base/nfssfont.pdfbin211186 -> 211180 bytes
-rw-r--r--macros/latex/base/olddc.ins4
-rw-r--r--macros/latex/base/oldlfont.dtx4
-rw-r--r--macros/latex/base/preload.dtx4
-rw-r--r--macros/latex/base/proc.dtx20
-rw-r--r--macros/latex/base/proc.ins4
-rw-r--r--macros/latex/base/proc.pdfbin226371 -> 227059 bytes
-rw-r--r--macros/latex/base/slides.dtx9
-rw-r--r--macros/latex/base/slides.ins8
-rw-r--r--macros/latex/base/slides.pdfbin374232 -> 375518 bytes
-rw-r--r--macros/latex/base/slifonts.pdfbin234186 -> 234191 bytes
-rw-r--r--macros/latex/base/source2e.pdfbin5461272 -> 5761047 bytes
-rw-r--r--macros/latex/base/source2e.tex8
-rw-r--r--macros/latex/base/source2edoc.cls17
-rw-r--r--macros/latex/base/syntonly.dtx4
-rw-r--r--macros/latex/base/syntonly.ins4
-rw-r--r--macros/latex/base/syntonly.pdfbin189946 -> 189644 bytes
-rw-r--r--macros/latex/base/testpage.tex2
-rw-r--r--macros/latex/base/tex2.txt83
-rw-r--r--macros/latex/base/texpert.txt210
-rw-r--r--macros/latex/base/tlc2.err22
-rw-r--r--macros/latex/base/tlc2.pdfbin289525 -> 290615 bytes
-rw-r--r--macros/latex/base/tulm.ins4
-rw-r--r--macros/latex/base/tulm.pdfbin162776 -> 162772 bytes
-rw-r--r--macros/latex/base/unpack.ins2
-rw-r--r--macros/latex/base/usrguide.pdfbin431002 -> 430994 bytes
-rw-r--r--macros/latex/base/usrguide.tex2
-rw-r--r--macros/latex/base/usrguide3.pdfbin325735 -> 403394 bytes
-rw-r--r--macros/latex/base/usrguide3.tex370
-rw-r--r--macros/latex/base/utf8ienc.dtx80
-rw-r--r--macros/latex/base/utf8ienc.pdfbin352793 -> 353574 bytes
-rw-r--r--macros/latex/base/webcomp.pdfbin146209 -> 146198 bytes
-rw-r--r--macros/latex/contrib/pxcjkcat/README-ja.md7
-rw-r--r--macros/latex/contrib/pxcjkcat/README.md6
-rw-r--r--macros/latex/contrib/pxcjkcat/pxcjkcat.pdfbin163412 -> 197668 bytes
-rw-r--r--macros/latex/contrib/pxcjkcat/pxcjkcat.sty397
-rw-r--r--macros/latex/contrib/pxcjkcat/pxcjkcat.tex420
-rw-r--r--macros/latex/required/amsmath/README.md5
-rw-r--r--macros/latex/required/amsmath/amsbsy.dtx2
-rw-r--r--macros/latex/required/amsmath/amsbsy.ins2
-rw-r--r--macros/latex/required/amsmath/amsbsy.pdfbin173746 -> 174944 bytes
-rw-r--r--macros/latex/required/amsmath/amscd.dtx4
-rw-r--r--macros/latex/required/amsmath/amscd.ins4
-rw-r--r--macros/latex/required/amsmath/amscd.pdfbin178672 -> 179945 bytes
-rw-r--r--macros/latex/required/amsmath/amsgen.dtx4
-rw-r--r--macros/latex/required/amsmath/amsgen.ins2
-rw-r--r--macros/latex/required/amsmath/amsgen.pdfbin176740 -> 178187 bytes
-rw-r--r--macros/latex/required/amsmath/amsldoc.pdfbin508199 -> 508210 bytes
-rw-r--r--macros/latex/required/amsmath/amsldoc.tex2
-rw-r--r--macros/latex/required/amsmath/amsmath.dtx155
-rw-r--r--macros/latex/required/amsmath/amsmath.ins4
-rw-r--r--macros/latex/required/amsmath/amsmath.pdfbin399735 -> 419913 bytes
-rw-r--r--macros/latex/required/amsmath/amsopn.dtx96
-rw-r--r--macros/latex/required/amsmath/amsopn.ins4
-rw-r--r--macros/latex/required/amsmath/amsopn.pdfbin138783 -> 140095 bytes
-rw-r--r--macros/latex/required/amsmath/amstext.dtx4
-rw-r--r--macros/latex/required/amsmath/amstext.ins4
-rw-r--r--macros/latex/required/amsmath/amstext.pdfbin215810 -> 217498 bytes
-rw-r--r--macros/latex/required/amsmath/amsxtra.dtx4
-rw-r--r--macros/latex/required/amsmath/amsxtra.ins4
-rw-r--r--macros/latex/required/amsmath/amsxtra.pdfbin112556 -> 113561 bytes
-rw-r--r--macros/latex/required/amsmath/changes.txt29
-rw-r--r--macros/latex/required/amsmath/subeqn.pdfbin109737 -> 109731 bytes
-rw-r--r--macros/latex/required/amsmath/technote.pdfbin145610 -> 147462 bytes
-rw-r--r--macros/latex/required/amsmath/testmath.pdfbin454662 -> 454511 bytes
-rw-r--r--macros/latex/required/firstaid/changes.txt9
-rw-r--r--macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx61
-rw-r--r--macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdfbin238410 -> 256609 bytes
-rw-r--r--macros/latex/required/graphics/README.md4
-rw-r--r--macros/latex/required/graphics/changes.txt20
-rw-r--r--macros/latex/required/graphics/color.dtx13
-rw-r--r--macros/latex/required/graphics/color.pdfbin208054 -> 212223 bytes
-rw-r--r--macros/latex/required/graphics/drivers.dtx4
-rw-r--r--macros/latex/required/graphics/drivers.pdfbin286458 -> 286459 bytes
-rw-r--r--macros/latex/required/graphics/epsfig.dtx4
-rw-r--r--macros/latex/required/graphics/epsfig.pdfbin160073 -> 159997 bytes
-rw-r--r--macros/latex/required/graphics/graphics.dtx57
-rw-r--r--macros/latex/required/graphics/graphics.ins2
-rw-r--r--macros/latex/required/graphics/graphics.pdfbin303029 -> 303464 bytes
-rw-r--r--macros/latex/required/graphics/graphicx.dtx4
-rw-r--r--macros/latex/required/graphics/graphicx.pdfbin240629 -> 240623 bytes
-rw-r--r--macros/latex/required/graphics/grfguide.pdfbin330070 -> 330978 bytes
-rw-r--r--macros/latex/required/graphics/grfguide.tex17
-rw-r--r--macros/latex/required/graphics/keyval.dtx8
-rw-r--r--macros/latex/required/graphics/keyval.pdfbin239821 -> 239589 bytes
-rw-r--r--macros/latex/required/graphics/lscape.dtx4
-rw-r--r--macros/latex/required/graphics/lscape.pdfbin155981 -> 155986 bytes
-rw-r--r--macros/latex/required/graphics/mathcolor.dtx431
-rw-r--r--macros/latex/required/graphics/mathcolor.pdfbin0 -> 475986 bytes
-rw-r--r--macros/latex/required/graphics/rotating.dtx4
-rw-r--r--macros/latex/required/graphics/rotating.pdfbin269553 -> 278253 bytes
-rw-r--r--macros/latex/required/graphics/rotex.pdfbin172230 -> 172227 bytes
-rw-r--r--macros/latex/required/graphics/trig.dtx4
-rw-r--r--macros/latex/required/graphics/trig.pdfbin199269 -> 199266 bytes
-rw-r--r--macros/latex/required/latex-lab/README.md42
-rw-r--r--macros/latex/required/latex-lab/changes.txt27
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-code.pdfbin0 -> 512020 bytes
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-code.tex4
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-doc.pdfbin0 -> 375907 bytes
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support-doc.tex6
-rw-r--r--macros/latex/required/latex-lab/documentmetadata-support.dtx418
-rw-r--r--macros/latex/required/latex-lab/latex-lab-footnotes.dtx1822
-rw-r--r--macros/latex/required/latex-lab/latex-lab-footnotes.pdfbin0 -> 614594 bytes
-rw-r--r--macros/latex/required/latex-lab/latex-lab-new-or.dtx545
-rw-r--r--macros/latex/required/latex-lab/latex-lab-new-or.pdfbin0 -> 529091 bytes
-rw-r--r--macros/latex/required/latex-lab/latex-lab-testphase.dtx84
-rw-r--r--macros/latex/required/latex-lab/latex-lab-testphase.pdfbin0 -> 290879 bytes
-rw-r--r--macros/latex/required/latex-lab/latex-lab.ins82
-rw-r--r--macros/latex/required/latex-lab/usage-of-@footnotemark.txt186
-rw-r--r--macros/latex/required/latex-lab/usage-of-@footnotetext.txt842
-rw-r--r--macros/latex/required/latex-lab/usage-of-kern-kern.txt80
-rw-r--r--macros/latex/required/tools/README.md4
-rw-r--r--macros/latex/required/tools/afterpage.dtx4
-rw-r--r--macros/latex/required/tools/afterpage.ins4
-rw-r--r--macros/latex/required/tools/afterpage.pdfbin205344 -> 197738 bytes
-rw-r--r--macros/latex/required/tools/array.dtx16
-rw-r--r--macros/latex/required/tools/array.pdfbin517114 -> 516458 bytes
-rw-r--r--macros/latex/required/tools/bm.dtx13
-rw-r--r--macros/latex/required/tools/bm.ins4
-rw-r--r--macros/latex/required/tools/bm.pdfbin331424 -> 323432 bytes
-rw-r--r--macros/latex/required/tools/calc.dtx4
-rw-r--r--macros/latex/required/tools/calc.pdfbin370414 -> 370657 bytes
-rw-r--r--macros/latex/required/tools/changes.txt29
-rw-r--r--macros/latex/required/tools/dcolumn.dtx4
-rw-r--r--macros/latex/required/tools/dcolumn.pdfbin220689 -> 220834 bytes
-rw-r--r--macros/latex/required/tools/delarray.dtx4
-rw-r--r--macros/latex/required/tools/delarray.pdfbin198647 -> 191064 bytes
-rw-r--r--macros/latex/required/tools/enumerate.dtx4
-rw-r--r--macros/latex/required/tools/enumerate.pdfbin215355 -> 215498 bytes
-rw-r--r--macros/latex/required/tools/fileerr.dtx4
-rw-r--r--macros/latex/required/tools/fileerr.pdfbin195578 -> 187495 bytes
-rw-r--r--macros/latex/required/tools/fontsmpl.dtx4
-rw-r--r--macros/latex/required/tools/fontsmpl.pdfbin154034 -> 146446 bytes
-rw-r--r--macros/latex/required/tools/ftnright.dtx4
-rw-r--r--macros/latex/required/tools/ftnright.pdfbin370277 -> 386995 bytes
-rw-r--r--macros/latex/required/tools/hhline.dtx4
-rw-r--r--macros/latex/required/tools/hhline.pdfbin189538 -> 189679 bytes
-rw-r--r--macros/latex/required/tools/indentfirst.dtx4
-rw-r--r--macros/latex/required/tools/indentfirst.pdfbin157803 -> 157954 bytes
-rw-r--r--macros/latex/required/tools/layout.dtx4
-rw-r--r--macros/latex/required/tools/layout.pdfbin267761 -> 259969 bytes
-rw-r--r--macros/latex/required/tools/longtable.dtx4
-rw-r--r--macros/latex/required/tools/longtable.ins4
-rw-r--r--macros/latex/required/tools/longtable.pdfbin382155 -> 391313 bytes
-rw-r--r--macros/latex/required/tools/multicol-2019-10-01.sty1105
-rw-r--r--macros/latex/required/tools/multicol.dtx14
-rw-r--r--macros/latex/required/tools/multicol.ins4
-rw-r--r--macros/latex/required/tools/multicol.pdfbin518295 -> 521223 bytes
-rw-r--r--macros/latex/required/tools/rawfonts.dtx4
-rw-r--r--macros/latex/required/tools/rawfonts.pdfbin146534 -> 138963 bytes
-rw-r--r--macros/latex/required/tools/shellesc.dtx2
-rw-r--r--macros/latex/required/tools/shellesc.pdfbin183532 -> 175929 bytes
-rw-r--r--macros/latex/required/tools/showkeys-2014-10-28.sty272
-rw-r--r--macros/latex/required/tools/showkeys.dtx52
-rw-r--r--macros/latex/required/tools/showkeys.pdfbin260624 -> 251782 bytes
-rw-r--r--macros/latex/required/tools/somedefs.dtx4
-rw-r--r--macros/latex/required/tools/somedefs.pdfbin175169 -> 167572 bytes
-rw-r--r--macros/latex/required/tools/tabularx.dtx4
-rw-r--r--macros/latex/required/tools/tabularx.ins4
-rw-r--r--macros/latex/required/tools/tabularx.pdfbin278041 -> 287073 bytes
-rw-r--r--macros/latex/required/tools/theorem.dtx4
-rw-r--r--macros/latex/required/tools/theorem.pdfbin351794 -> 351471 bytes
-rw-r--r--macros/latex/required/tools/tools-overview.pdfbin73674 -> 73672 bytes
-rw-r--r--macros/latex/required/tools/tools-overview.tex2
-rw-r--r--macros/latex/required/tools/tools.ins4
-rw-r--r--macros/latex/required/tools/trace.dtx4
-rw-r--r--macros/latex/required/tools/trace.pdfbin229713 -> 222076 bytes
-rw-r--r--macros/latex/required/tools/varioref.dtx54
-rw-r--r--macros/latex/required/tools/varioref.ins4
-rw-r--r--macros/latex/required/tools/varioref.pdfbin383524 -> 398985 bytes
-rw-r--r--macros/latex/required/tools/verbatim.dtx4
-rw-r--r--macros/latex/required/tools/verbatim.pdfbin330815 -> 330963 bytes
-rw-r--r--macros/latex/required/tools/xr.dtx4
-rw-r--r--macros/latex/required/tools/xr.pdfbin177595 -> 169986 bytes
-rw-r--r--macros/latex/required/tools/xspace.dtx4
-rw-r--r--macros/latex/required/tools/xspace.pdfbin256897 -> 257018 bytes
399 files changed, 17570 insertions, 4903 deletions
diff --git a/macros/latex/base/README.md b/macros/latex/base/README.md
index 9155151888..436bffdd5e 100644
--- a/macros/latex/base/README.md
+++ b/macros/latex/base/README.md
@@ -1,7 +1,7 @@
The LaTeX kernel
================
-Release 2021-11-15 patch level 1
+Release 2022-06-01
Overview
--------
@@ -10,10 +10,15 @@ This bundle provides the core LaTeX kernel. In addition to this bundle,
a minimal LaTeX system also needs the files contained in the
- LaTeX team documentation (`doc`)
+- L3 programming layer (`l3kernel`)
+- L3 backend interfaces (`l3backend`)
+- L3 unicode support (`unicode-data`)
+
- Packages which must be available (`required`). These are
- Essential tools (`tools`)
- Core graphics and color support (`graphics`)
- Key mathematics support (`amsmath`)
+ - First aid for external packages (`firstaid`)
This file contains a small set of pointers to other more complete
documentation on installing and using a LaTeX system.
@@ -36,10 +41,6 @@ the most significant of these files are
with one line of information about the contents
- `legal.txt` and `lppl.txt` (LaTeX Project Public License) describe the
LaTeX copyright, warranty and copying restrictions.
-- `texpert.txt` contains information about the system that may still be
- useful for TeX experts
-- `tex2.txt` contains important information for users of extremely
- old versions of TeX (pre 1990)
- `bugs.txt` describes how to submit a bug report for LaTeX
Other documentation files include files with names of the form:
@@ -93,6 +94,6 @@ version 1.3c or later.
-----
-<p>Copyright (C) 1989-2021 The LaTeX Project <br />
+<p>Copyright (C) 1989-2022 The LaTeX Project <br />
<a href="http://latex-project.org/">http://latex-project.org/</a> <br />
All rights reserved.</p>
diff --git a/macros/latex/base/alltt.dtx b/macros/latex/base/alltt.dtx
index 350229ab40..908fe92400 100644
--- a/macros/latex/base/alltt.dtx
+++ b/macros/latex/base/alltt.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -104,7 +104,7 @@
% The glyph at the position of the $ in an italic font: \textit{$}.
% \end{alltt}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Implementation}
%
diff --git a/macros/latex/base/alltt.ins b/macros/latex/base/alltt.ins
index 7ce2103207..f46404bcf4 100644
--- a/macros/latex/base/alltt.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/alltt.pdf b/macros/latex/base/alltt.pdf
index 63530059b0..7f53e4ee12 100644
--- a/macros/latex/base/alltt.pdf
+++ b/macros/latex/base/alltt.pdf
Binary files differ
diff --git a/macros/latex/base/cfgguide.pdf b/macros/latex/base/cfgguide.pdf
index 30ca13ff99..d018177ecb 100644
--- a/macros/latex/base/cfgguide.pdf
+++ b/macros/latex/base/cfgguide.pdf
Binary files differ
diff --git a/macros/latex/base/cfgguide.tex b/macros/latex/base/cfgguide.tex
index 66c02e4c33..7694ef9b63 100644
--- a/macros/latex/base/cfgguide.tex
+++ b/macros/latex/base/cfgguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/changes.txt b/macros/latex/base/changes.txt
index 1b8b0fc5d4..f880f43d67 100644
--- a/macros/latex/base/changes.txt
+++ b/macros/latex/base/changes.txt
@@ -11,6 +11,329 @@ All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2022-06-01 Release
+#########################
+
+2022-06-07 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * utf8ienc.dtx (subsection{The mapping table}):
+ Fix \guillemetleft and \guillemetright also in dfu files (gh/65)
+
+2022-06-03 David Carlisle <David.Carlisle@latex-project.org>
+
+ * doc.dtx: adjust ltxdoc.cls and doc.dtx to process existing
+ use of L3 names and \pkg in base dtx files
+
+2022-06-02 David Carlisle <David.Carlisle@latex-project.org>
+
+ * ltfinal.dtx: add \NoCaseChange (previously available in the
+ textcase package)
+
+2022-06-01 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmarks.dtx (subsection{Updating mark structures}):
+ Be more careful when unpackage a \vbox for mark detection, it might
+ contain infinite shrink glue (gh/836)
+
+2022-05-27 David Carlisle <David.Carlisle@latex-project.org>
+
+ * ltfiles.dtx, ltoutenc.dtx:
+ save the original version string in \ver@@...
+ Usable by \listfiles if the standard \ver@... command has been set to \relax
+ (as in fontenc.sty) gh/825
+
+2022-05-27 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltxdoc.dtx (section{Customisation}):
+ Added option doc2 so that old doc version can be requested (gh/822)
+
+2022-05-27 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * doc.dtx (subsection{Processing the package keys}):
+ Adjusted doc to use \ProcessKeyOptions (not the older l3keys2e variant)
+
+2022-05-17 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * lthooks.dtx (subsection{Setting rules for hooks code}):
+ Refuse sorting one-time hooks (gh/818).
+
+2022-05-17 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * ltmeta.dtx:
+ Added dummy definitions for target commands.
+
+2022-05-13 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * lthooks.dtx (subsection{Using the hook}):
+ Avoid l3debug error on an undeclared variable in \hook_use_once:nnn.
+
+2022-05-08 Marcel Krüger <Marcel.Krueger@latex-project.org>
+
+ * utf8ienc.dtx:
+ Declare Unicode codepoints U+3008 and U+3009 to be equivalent
+ to their canonical equivalent codepoints 2329/232A (corresponding
+ to \textlangle/\textrangle)
+
+2022-05-08 Marcel Krüger <Marcel.Krueger@latex-project.org>
+
+ * ltmath.dtx: Use more consistent default math styles on LuaLaTeX
+
+2022-04-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * ltxref.dtx:
+ Added starred versions of \ref, \pageref and \Ref
+ Added expandable version for \pageref and \ref
+ * ifthen.dtx:
+ use new expandable version for \pageref and \ref
+
+2022-05-08 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltshipout.dtx (subsection{Handling the end of job hook}):
+ Handle case where shipout/lastpage is run too early and issue
+ a warning (gh/813)
+
+2022-04-21 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltfinal.dtx (subsection{Lccodes and uccodes}):
+ Support \noexpand in arg. to \MakeUppercase and
+ \MakeLowercase
+
+2022-04-08 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmath.dtx (subsubsection{The UNSORTED Rest}):
+ Make \openup robust (gh/123)
+
+2022-04-03 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmarks.dtx: New module to implement new marks mechanism
+
+ * ltpage.dtx (section| command.):
+ Updates to \markboth and \markright to interface with new mark mechanism
+
+ * ltoutput.dtx (subsection{Floats}):
+ Interface with new mark mechanism
+
+ * ltfinal.dtx (subsection{Typesetting parameters}):
+ Integration of new mark management interface
+
+2022-04-01 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltfiles.dtx (section{File Handling}):
+ Process include/excluded hook(s) if an include file is bypassed
+
+ * lthooks.dtx (subsection{Adding or removing hook code}):
+ Add support for generic include/.../excluded hooks
+
+ * ltfilehook.dtx: document include/excluded hooks
+
+2022-03-18 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * ltcmd.dtx (subsection{Utilities}):
+ Fix \@@_cmd_type_cases:NnnnnF prematurely expanding macros (gh/795).
+
+2022-03-18 Joseph Wright <joseph.wright@latex-project.org>
+
+ * ltkeys.dtx:
+ Remove \ProcessKeyPackageOptions
+
+2022-03-10 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * ltfilehook.dtx (subsection{Selecting a file (\cs{set@curr@file})}):
+ Add \set@curr@file@nosearch, to ignore \input@path and \l_file_search_path_seq.
+
+2022-03-10 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltbibl.dtx (section{Bibliography Generation}):
+ Ensure that an empty argument given to \cite generates
+ a warning (gh/790)
+
+2022-02-28 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * ltvers.dtx (subsection{Declaring an all-new module}):
+ Detect a missing \IncludeInRelease{0000/00/00} in a new module.
+
+2022-02-28 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * latexrelease.dtx, ltexpl.dtx, ltcmd.dtx:
+ Move most make-harmless redefinitions right after ltexpl.dtx.
+
+2022-02-21 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltkeys.dtx:
+ More efficient module expansion
+
+2022-02-19 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltcmd.dtx (subsection{User functions}):
+ Added \IfBlankTF and friends to test if a received argument
+ is empty or contains only normal space characters.
+
+2022-02-19 David Carlisle <David.Carlisle@latex-project.org>
+
+ * utf8ienc.dtx: use \protected definitions.
+ also avoid global definitions for gh/762
+
+2022-02-16 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltkeys.dtx:
+ Allow for active characters in module argument
+ \DeclareUnknownKeyHandler better than with the "s"
+
+2022-02-15 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltkeys.dtx:
+ Expand optional module argument in design-level commands
+ Add \DeclareUnknownKeysHandler
+
+2022-02-07 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltkeys.dtx:
+ Correct definition of .code property
+
+2022-02-05 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * ltkeys.dtx:
+ Create key properties at the 2e layer
+ Add .code property
+
+2022-01-25 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltplain.dtx (section{Plain \TeX}):
+ Alter \obeyspaces and \obeylines to use a redirection for special
+ use cases (gh/367)}
+
+2022-01-20 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * doc.dtx (subsection{Keys supported by doc):
+ Fixed key handling for nohyperref and nomulticol (gh/750).
+
+2022-01-15 Joseph Wright <Joseph.Wright-project.org>
+
+ * ltkeys.dtx:
+ Clear option data in \AtEndOfPackage hook
+
+2022-01-06 Joseph Wright <Joseph.Wright-project.org>
+
+ * ltexpl.dtx (section{Document-level command names for expl3 functions}):
+ Adjust document-level names for \exp_args:Nc and the like
+
+2021-12-30 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * ltmeta.dtx:
+ Adapted bundle name to new name `LaTeX-lab'
+
+2021-12-31 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * ltcmd.dtx (subsubsection{Showing the definition of a command}):
+ Make \ShowCommand stop for interaction with ltcmd (gh/739)
+
+2021-12-28 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltexpl.dtx (section{Document-level command names for expl3 functions}):
+ Added document-level names for \exp_args:Nc and the like
+ for use with \NewDocumentCommand, etc. (gh/735)
+
+2021-12-27 Marcel Krüger <Marcel.Krueger@latex-project.org>
+
+ * ltluatex.dtx:
+ Added \newluacmd and \newprotectedluacmd for easy allocation of Lua command ids.
+
+2021-12-13 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmeta.dtx:
+ First version of this module added implementing an interface to
+ \DocumentMetadata. At the moment the actual code is outside the
+ format and only loaded if the command is called.
+
+2021-12-13 David Carlisle <David.Carlisle@latex-project.org>
+
+ * utf8ienc.dtx: Use hex 80 not A0 to test for single byte UTF-8 github/730
+
+2021-12-12 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltoutenc.dtx (subsection{Definitions for the TU encoding}):
+ \DeclareUnicodeAccent now makes the encoding argument implicit
+ as it is already done for other Unicode encoding commands.
+ Also added \DeclareUnicodeCommand and \DeclareUnicodeSymbol (gh/253).
+
+2021-12-12 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * doc.dtx (subsection[Dealing with the change history]):
+ Implement option recordchangedates to show dates in the change log
+ if that option is used (gh/531).
+
+2021-12-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltdirchk.dtx (section{Initialization}):
+ Add comment lines into latex.ltx to indicate temp definitions that
+ are later overwritten (gh/725).
+
+2021-12-10 David Carlisle <David.Carlisle@latex-project.org>
+
+ * utf8ienc.dtx: Add inputenc UTF-8 support for Digraphs U+01C4-U+01CC
+
+2021-12-09 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * proc.dtx (subsection{The page style}):
+ Support twoside by providing an appropriate footer line (gh/704).
+
+2021-12-08 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * lttextcomp.dtx (section{Sub-encodings}):
+ Describe correctly (I hope) how sub-encodings work for TS1.
+
+2021-11-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltexpl.dtx:
+ Added \fpeval, \inteval, \dimeval, and \skipeval (gh711)
+
+2021-11-18 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * All *.dtx: Replaced \StopEventually by \MaybeStop
+
+2021-11-30 Joseph Wright <joseph.wright@latex-project.org>
+
+ * ltclasses.dtx
+ New option handling routine using ltkeys
+
+2021-11-26 Joseph Wright <joseph.wright@latex-project.org>
+
+ * ltkeys.dtx
+ New file to integrate keyval option processing into the kernel
+
+2021-11-17 Marcel Krüger <Marcel.Krueger@latex-project.org>
+
+ * ltluatex.dtx:
+ Classify [hv]pack_quality callbacks as exclusive
+ Never pass true to the engine for LuaTeX list callbacks
+
+2021-11-15 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * build.lua (textfiles):
+ Dropped a few obsolete documentation files (nobody installs manually these
+ days and the advice given was no longer current).
+
+ * latexchanges.tex:
+ We no longer maintain this file; instead everything is documented in ltnewsXX
+ and in the changes.txt files so we zap this file too because the double book
+ keeping always means one or the other is out of date.
+
+2021-11-14 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * doc.dtx: Replaced doc.dtx with V3 version.
+ The old doc can be reactivated with \usepackage{doc}[=v2].
+ Hyperref usage (on by default) can be turned off with
+ \usepackage[hyperref=false]{doc}.
+ New options etc are documented: use texdoc doc
+ (code documentation only partly done).
+
+2021-11-12 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltxdoc.dtx (section{Configuration file}):
+ Added our default .cfg for extraction.
+ Added option "nocfg" to bypass a system cfg.
+
+#########################
# 2021-11-15 PL1 Release
#########################
@@ -24,7 +347,7 @@ All changes above are only part of the development branch for the next release.
# 2021-11-15 Release
#########################
-2021-10-20 Phelype Oleinik <phelype.oleinik@latex-project.org>
+2021-10-20 Phelype Oleinik <phelype.oleinik@latex-project.org>
* ltcmdhooks.dtx (subsubsection{Patching by expansion and redefinition}):
Fix patching of commands that contain parameter tokens (gh/697)
@@ -62,7 +385,7 @@ All changes above are only part of the development branch for the next release.
* classes.dtx, doc.dtx, makeindx.dtx, preload.dtx, slides.dtx, array.dtx
Removed old references to latex.tex or latex.dtx (gh/685)
-2021-09-28 Phelype Oleinik <phelype.oleinik@latex-project.org>
+2021-09-28 Phelype Oleinik <phelype.oleinik@latex-project.org>
* ltcmdhooks.dtx (subsection{Patching commands}):
Make patching of commands with generic cmd hooks a global operation (gh/674)
@@ -1435,8 +1758,8 @@ All changes above are only part of the development branch for the next release.
* fontdef.dtx (subsection{Defaults}): Set
\shapedefault explicitly to "n" not \updefault
- \bfdefault set to to "b" not "bx" (but bx for CM fonts)
- \updefault set to to "up" not "n".
+ \bfdefault set to "b" not "bx" (but bx for CM fonts)
+ \updefault set to "up" not "n".
Part of extending the series and shape handling, see ltnews31.
2019-12-17 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
@@ -12007,7 +12330,7 @@ All changes above are only part of the development branch for the next release.
* unpack2e.ins:
Removed unnecessary .drv generation (some are still there)
- Added the the WITHOUT ANY WARRANTY message to some preambles.
+ Added the WITHOUT ANY WARRANTY message to some preambles.
* oldgerm.dtx:
Moved the driver code in front so that the documentation can be
diff --git a/macros/latex/base/classes.dtx b/macros/latex/base/classes.dtx
index a13053b871..857cfc799e 100644
--- a/macros/latex/base/classes.dtx
+++ b/macros/latex/base/classes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -230,7 +230,7 @@
% \maketitle
% \tableofcontents
%
-% \StopEventually{} ^^A
+% \MaybeStop{} ^^A
%
% \section{The {\sc docstrip} modules}
%
diff --git a/macros/latex/base/classes.ins b/macros/latex/base/classes.ins
index be0dcaf8ff..1f7b331691 100644
--- a/macros/latex/base/classes.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/classes.pdf b/macros/latex/base/classes.pdf
index 3dfd203f5a..20fbdaf242 100644
--- a/macros/latex/base/classes.pdf
+++ b/macros/latex/base/classes.pdf
Binary files differ
diff --git a/macros/latex/base/clsguide.pdf b/macros/latex/base/clsguide.pdf
index 5d18a12d96..11d0c9e47a 100644
--- a/macros/latex/base/clsguide.pdf
+++ b/macros/latex/base/clsguide.pdf
Binary files differ
diff --git a/macros/latex/base/clsguide.tex b/macros/latex/base/clsguide.tex
index 3667210e5f..6f4d1cf027 100644
--- a/macros/latex/base/clsguide.tex
+++ b/macros/latex/base/clsguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/cmextra.ins b/macros/latex/base/cmextra.ins
index c530e04d0b..a2befb3aef 100644
--- a/macros/latex/base/cmextra.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/cmfonts.ins b/macros/latex/base/cmfonts.ins
index d54a325f42..55af4759c5 100644
--- a/macros/latex/base/cmfonts.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/cmfonts.pdf b/macros/latex/base/cmfonts.pdf
index 1fce33a17b..5c25484024 100644
--- a/macros/latex/base/cmfonts.pdf
+++ b/macros/latex/base/cmfonts.pdf
Binary files differ
diff --git a/macros/latex/base/cyrguide.pdf b/macros/latex/base/cyrguide.pdf
index 9100b0a809..e9fa336379 100644
--- a/macros/latex/base/cyrguide.pdf
+++ b/macros/latex/base/cyrguide.pdf
Binary files differ
diff --git a/macros/latex/base/cyrguide.tex b/macros/latex/base/cyrguide.tex
index 07d4bc0b3f..3b16687f39 100644
--- a/macros/latex/base/cyrguide.tex
+++ b/macros/latex/base/cyrguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/doc-2016-02-15.sty b/macros/latex/base/doc-2016-02-15.sty
new file mode 100644
index 0000000000..96b6500463
--- /dev/null
+++ b/macros/latex/base/doc-2016-02-15.sty
@@ -0,0 +1,826 @@
+%%
+%% This is file contains the code from 'doc.sty' from around 2017.
+%%
+%% The original source files were:
+%%
+%% doc.dtx (with options: `package')
+%%
+%%
+%% Copyright 1993-2016
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) 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 2005/12/01 or later.
+%%
+%% This file contains the code for an earlier release and is therefore
+%% frozen. It is used as part of the current doc.sty when the user
+%% requests a rollback.
+%%
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+ \ProvidesPackage{doc}
+ [2016/02/15 v2.1g
+ Standard LaTeX documentation package (FMi)]
+%%
+%% Package `doc' to use with LaTeX 2e
+%% Copyright (C) 1989-1999 Frank Mittelbach, all rights reserved.
+\@ifundefined{macro@cnt}{}{\endinput}
+\catcode`\^^A=14
+\AtBeginDocument{\catcode`\^^A=14\relax}
+\def\macrocode{\macro@code
+ \frenchspacing \@vobeyspaces
+ \xmacro@code}
+\def\macro@code{%
+ \topsep \MacrocodeTopsep
+ \@beginparpenalty \predisplaypenalty
+ \if@inlabel\leavevmode\fi
+ \trivlist \parskip \z@ \item[]%
+ \macro@font
+ \leftskip\@totalleftmargin \advance\leftskip\MacroIndent
+ \rightskip\z@ \parindent\z@ \parfillskip\@flushglue
+ \blank@linefalse \def\par{\ifblank@line
+ \leavevmode\fi
+ \blank@linetrue\@@par
+ \penalty\interlinepenalty}
+ \obeylines
+ \let\do\do@noligs \verbatim@nolig@list
+ \let\do\@makeother \dospecials
+ \global\@newlistfalse
+ \global\@minipagefalse
+ \ifcodeline@index
+ \everypar{\global\advance\c@CodelineNo\@ne
+ \llap{\theCodelineNo\ \hskip\@totalleftmargin}%
+ \check@module}%
+ \else \everypar{\check@module}%
+ \fi
+ \init@crossref}
+\newif\ifblank@line
+\def\endmacrocode{%
+ \ifpm@module \endgroup \pm@modulefalse \fi
+ \everypar{}%
+ \global\@inlabelfalse
+ \endtrivlist
+ \close@crossref}
+\@ifundefined{MacroFont}{%
+ \if@compatibility
+ \def\MacroFont{\small
+ \usefont\encodingdefault
+ \ttdefault
+ \mddefault
+ \updefault
+ }%
+ \else
+ \def\MacroFont{\fontencoding\encodingdefault
+ \fontfamily\ttdefault
+ \fontseries\mddefault
+ \fontshape\updefault
+ \small}%
+ \fi
+ }{}
+\@ifundefined{AltMacroFont}{%
+ \if@compatibility
+ \def\AltMacroFont{\small
+ \usefont\encodingdefault
+ \ttdefault
+ \mddefault
+ \sldefault
+ }%
+ \else
+ \def\AltMacroFont{\fontencoding\encodingdefault
+ \fontfamily\ttdefault
+ \fontseries\mddefault
+ \fontshape\sldefault
+ \small
+ }%
+ \fi
+ }{}
+\AtBeginDocument{\let\macro@font\MacroFont}
+\def\check@module{%
+ \ifcheck@modules
+ \ifpm@module \endgroup \pm@modulefalse \fi
+ \expandafter\futurelet\expandafter\next\expandafter\ch@percent
+ \fi}
+\newif\ifpm@module
+\def\DontCheckModules{\check@modulesfalse}
+\def\CheckModules{\check@modulestrue}
+\newif\ifcheck@modules \check@modulestrue
+\def\ch@percent{%
+ \if \percentchar\next
+ \expandafter\check@angle
+ \fi}
+\def\check@angle#1{\futurelet\next\ch@angle}
+\begingroup
+\catcode`\<\active
+\gdef\ch@angle{\ifx<\next
+ \expandafter\ch@plus@etc
+ \else \percentchar \fi}
+\gdef\ch@plus@etc<{\futurelet\next\check@plus@etc}
+\gdef\check@plus@etc{%
+ \if +\next
+ \let\next\pm@module
+ \else\if -\next
+ \let\next\pm@module
+ \else\if *\next
+ \let\next\star@module
+ \else\if /\next
+ \let\next\slash@module
+ \else\ifx <\next
+ \percentchar
+ \else
+ \let\next\pm@module
+ \fi\fi\fi\fi\fi
+ \next}
+\endgroup
+\begingroup
+\catcode`\~=\active
+\lccode`\~=`\>
+\lowercase{\gdef\pm@module#1~}{\pm@moduletrue
+ \Module{#1}\begingroup
+ \advance\guard@level\@ne
+ \ifnum\guard@level>\c@StandardModuleDepth\AltMacroFont\fi
+}
+\lowercase{\gdef\star@module#1~}{%
+ \Module{#1}%
+ \global \advance \guard@level\@ne
+ \ifnum \guard@level>\c@StandardModuleDepth
+ \global\let\macro@font=\AltMacroFont \macro@font
+ \fi}
+\catcode`\>=\active
+\gdef\slash@module#1>{%
+ \Module{#1}%
+ \global \advance \guard@level\m@ne
+ \ifnum \guard@level=\c@StandardModuleDepth
+ \global\let\macro@font\MacroFont \macro@font
+ \fi
+}
+\endgroup
+\newcounter{StandardModuleDepth}
+\newcount \guard@level
+\@ifundefined{Module}{%
+ \def\Module#1{\mod@math@codes$\langle\mathsf{#1}\rangle$}
+ }{}
+\def\mod@math@codes{\mathcode`\|="226A \mathcode`\&="2026
+ \mathcode`\-="702D \mathcode`\+="702B
+ \mathcode`\:="703A \mathcode`\=="703D }
+\newskip\MacrocodeTopsep \MacrocodeTopsep = 3pt plus 1.2pt minus 1pt
+\newdimen\MacroIndent
+\settowidth\MacroIndent{\rmfamily\scriptsize 00\ }
+\@namedef{macrocode*}{\macro@code\sxmacro@code}
+\expandafter\let\csname endmacrocode*\endcsname = \endmacrocode
+\catcode`\!=\catcode`\% ^^A In this section there must not be
+ ^^A any exclamation marks.
+ ^^A
+\begingroup
+\catcode`\|=\z@ \catcode`\[=\@ne \catcode`\]=\tw@
+\catcode`\{=12 \catcode`\}=12
+\catcode`\%=12 \catcode`\ =\active \catcode`\\=\active
+!% \end{macrocode*}
+! Next follows the actual definition of |\macro@code|;
+! notice the
+! use of the new escape character. We manage to get the argument
+! surrounded by the string |\end{macrocode}|, but at the end
+! however, in spite of the actual characters used during the
+! definition of
+! this macro, |\end| with the argument |{macrocode}|
+! will be executed, to ensure a balanced environment.
+! \begin{macrocode*}
+|gdef|xmacro@code#1% \end{macrocode}[#1|end[macrocode]]
+!% \end{macrocode*}
+! \begin{macro}{\sxmacro@code}
+! The definition of |\sxmacro@code| is completely analogous,
+! only
+! here a slightly different terminating string will be used.
+! Note that the space is not active in this environment.
+! \begin{macrocode}
+|catcode`| =12
+|gdef|sxmacro@code#1% \end{macrocode*}[#1|end[macrocode*]]
+!% \end{macrocode}
+! because the |\catcode| changes have been made local by
+! commencing a
+! new group, there now follows the matching |\endgroup|
+! in a rather
+! unusual style of writing.
+! \begin{macrocode}
+|endgroup
+!% \end{macrocode}
+\catcode`\!=12
+\def\DescribeMacro{\leavevmode\@bsphack
+ \begingroup\MakePrivateLetters\Describe@Macro}
+\def\Describe@Macro#1{\endgroup
+ \marginpar{\raggedleft\PrintDescribeMacro{#1}}%
+ \SpecialUsageIndex{#1}\@esphack\ignorespaces}
+\def\DescribeEnv{\leavevmode\@bsphack\begingroup\MakePrivateLetters
+ \Describe@Env}
+\def\Describe@Env#1{\endgroup
+ \marginpar{\raggedleft\PrintDescribeEnv{#1}}%
+ \SpecialEnvIndex{#1}\@esphack\ignorespaces}
+\reversemarginpar
+\setlength\marginparpush{0pt} \setlength\marginparwidth{8pc}
+{\catcode`\|=\z@ \catcode`\\=12
+|gdef|bslash{\}}
+\def\verbatim{\@beginparpenalty \predisplaypenalty \@verbatim
+ \MacroFont \frenchspacing \@vobeyspaces \@xverbatim}
+\@namedef{verbatim*}{\@beginparpenalty \predisplaypenalty \@verbatim
+ \MacroFont \@sxverbatim}
+\def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi
+ \leftskip\@totalleftmargin\rightskip\z@
+ \parindent\z@\parfillskip\@flushglue\parskip\z@
+ \@@par
+ \@tempswafalse
+ \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par
+ \penalty\interlinepenalty
+ \check@percent}%
+ \obeylines
+ \let\do\do@noligs \verbatim@nolig@list
+ \let\do\@makeother \dospecials}
+{\catcode`\%=12
+ \long\gdef\check@percent#1{\ifx #1%\let\next\@empty \else
+ \let\next=#1\fi \next}}
+\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}}
+\let\verb@balance@group\@empty
+
+\def\verb@egroup{\global\let\verb@balance@group\@empty\egroup}
+
+\begingroup
+ \obeylines%
+ \gdef\verb@eol@error{\obeylines%
+ \def^^M{\verb@egroup\@latex@error{%
+ Text for \noexpand\verb command ended by end of line}\@ehc}}%
+\endgroup
+\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}}
+\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}}}
+\newcount\macro@cnt \macro@cnt=0
+\def\macro{\begingroup
+ \catcode`\\12
+ \MakePrivateLetters \m@cro@ \iftrue}
+\def\environment{\begingroup
+ \catcode`\\12
+ \MakePrivateLetters \m@cro@ \iffalse}
+\long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist
+ \edef\saved@macroname{\string#2}%
+ #1
+ \let\saved@indexname\saved@macroname
+ \else
+ \edef\saved@indexname{\expandafter\@gobble\string#2}%
+ \fi
+ \def\makelabel##1{\llap{##1}}%
+ \if@inlabel
+ \let\@tempa\@empty \count@\macro@cnt
+ \loop \ifnum\count@>\z@
+ \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+ \edef\makelabel##1{\llap{\vtop to\baselineskip
+ {\@tempa\hbox{##1}\vss}}}%
+ \advance \macro@cnt \@ne
+ \else \macro@cnt\@ne \fi
+ \edef\@tempa{\noexpand\item[%
+ #1%
+ \noexpand\PrintMacroName
+ \else
+ \noexpand\PrintEnvName
+ \fi
+ {\string#2}]}%
+ \@tempa
+ \global\advance\c@CodelineNo\@ne
+ #1%
+ \SpecialMainIndex{#2}\nobreak
+ \DoNotIndex{#2}%
+ \else
+ \SpecialMainEnvIndex{#2}\nobreak
+ \fi
+ \global\advance\c@CodelineNo\m@ne
+ \ignorespaces}
+\let\endmacro \endtrivlist
+\let\endenvironment\endmacro
+\newskip\MacroTopsep \MacroTopsep = 7pt plus 2pt minus 2pt
+\@ifundefined{PrintMacroName}
+ {\def\PrintMacroName#1{\strut \MacroFont \string #1\ }}{}
+\@ifundefined{PrintDescribeMacro}
+ {\def\PrintDescribeMacro#1{\strut \MacroFont \string #1\ }}{}
+\@ifundefined{PrintDescribeEnv}
+ {\def\PrintDescribeEnv#1{\strut \MacroFont #1\ }}{}
+\@ifundefined{PrintEnvName}
+ {\def\PrintEnvName#1{\strut \MacroFont #1\ }}{}
+\begingroup
+\catcode`\~\active
+\gdef\SpecialEscapechar#1{%
+ \begingroup
+ \uccode`\~`#1%
+ \uppercase{\gdef\active@escape@char{~}}%
+ \escapechar\m@ne \xdef\special@escape@char{\string#1}%
+ \endgroup}
+\endgroup
+\begingroup \catcode`\|=\z@ \catcode`\\=\active
+|gdef|init@crossref{|catcode`|\|active |let\|bslash
+ |MakePrivateLetters
+ |catcode|expandafter`|special@escape@char|active
+ |expandafter|let|active@escape@char|scan@macro}
+|endgroup
+\SpecialEscapechar{\\}
+\@ifundefined{MakePrivateLetters}
+ {\let\MakePrivateLetters\makeatletter}{}
+\def\close@crossref{\SpecialEscapechar\\}
+\def\scan@macro{%
+ \special@escape@char
+ \step@checksum
+ \ifscan@allowed
+ \let\macro@namepart\@empty
+ \def\next{\futurelet\next\macro@switch}%
+ \else \let\next\@empty \fi
+ \next}
+\newif\ifscan@allowed \scan@allowedtrue
+\def\DisableCrossrefs{\@bsphack\scan@allowedfalse\@esphack}
+\def\EnableCrossrefs{\@bsphack\scan@allowedtrue
+ \def\DisableCrossrefs{\@bsphack\@esphack}\@esphack}
+\def\macro@switch{\ifcat\noexpand\next a%
+ \let\next\macro@name
+ \else \let\next\short@macro \fi
+ \next}
+\begingroup
+\catcode`\&=12
+\gdef\short@macro#1{\begingroup
+ \uccode`\&=\expandafter`\string#1%
+ \uppercase{\def\x{\def\macro@namepart{&}}}%
+ \expandafter\endgroup\x
+ \ifnot@excluded
+ \produce@index{#1}\fi
+ \scan@allowedfalse#1%
+ \scan@allowedtrue }
+\endgroup
+\def\produce@index#1{%
+ \if\noexpand#1\special@escape@char
+ \scan@allowedfalse \it@is@a\special@escape@char \else
+ \if\noexpand#1\bslash \it@is@a\bslash \else
+ \if\noexpand#1\space \it@is@a\space \else
+ \ifx#1\par
+ \it@is@a\space \else
+ \ifx#1\relax \else
+ \if\noexpand#1\bgroup \LeftBraceIndex \else
+ \if\noexpand#1\egroup \RightBraceIndex \else
+ \if\noexpand#1\percentchar \PercentIndex \else
+ \it@is@a{\string#1}%
+ \fi \fi \fi \fi \fi \fi \fi \fi}
+\def\macro@name#1{\edef\macro@namepart{\macro@namepart#1}%
+ \futurelet\next\more@macroname}
+\def\more@macroname{\ifcat\noexpand\next a%
+ \let\next\macro@name
+ \else \let\next\macro@finish \fi
+ \next}
+\def\macro@finish{%
+ \macro@namepart
+ \ifnot@excluded
+ \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}%
+ \@tempa \fi}
+\def\DoNotIndex{\begingroup \MakePrivateLetters
+ \catcode`\\12
+ \do@not@index}
+\long\def\do@not@index#1{%
+ \endgroup
+ \addto@hook\index@excludelist{#1,}}
+\long\def\addto@hook#1#2{#1\expandafter{\the#1#2}}
+\newtoks\index@excludelist
+\index@excludelist{}
+\begingroup
+\catcode`\|=0%
+\catcode`\\=12
+|gdef|ifnot@excluded{|expandafter
+ |expanded@notin|expandafter{|expandafter
+ \|macro@namepart,}{|the|index@excludelist}}
+|endgroup
+\def\expanded@notin#1#2{%
+ \def\in@@##1#1##2##3\in@@{%
+ \ifx\expanded@notin##2}%
+ \expandafter\in@@#2#1\expanded@notin\in@@}
+\@ifundefined{actualchar}{\def\actualchar{=}}{}
+\@ifundefined{quotechar}{\def\quotechar{!}}{}
+\@ifundefined{levelchar}{\def\levelchar{>}}{}
+\@ifundefined{encapchar}{\def\encapchar{|}}{}
+\@ifundefined{verbatimchar}{\def\verbatimchar{+}}{}
+\def\SpecialIndex#1{\@bsphack\special@index{\expandafter\@gobble
+ \string#1\actualchar
+ \string\verb\quotechar*\verbatimchar\string#1\verbatimchar}%
+ \@esphack}
+
+\def\SpecialMainIndex#1{\@bsphack\SpecialIndex@{#1}{\encapchar main}%
+ \@esphack}
+\begingroup
+ \catcode`\|=0
+ \catcode`\\=12
+ |gdef|@SpecialIndexHelper@#1#2|@nil{%
+ |if |noexpand#1\%
+ |gdef|@gtempa{#2}%
+ |else
+ |begingroup
+ |escapechar|m@ne
+ |expandafter|gdef|expandafter|@gtempa|expandafter{|string#1#2}%
+ |endgroup
+ |fi}
+|endgroup
+\def\SpecialIndex@#1#2{%
+ \@SpecialIndexHelper@#1\@nil
+ \def\@tempb{ }%
+ \ifcat \@tempb\@gtempa
+ \special@index{\quotechar\space\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \quotechar\bslash\quotechar\space\verbatimchar#2}%
+ \else
+ \def\@tempb##1##2\relax{\ifx\relax##2\relax
+ \def\@tempc{\special@index{\quotechar##1\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \quotechar\bslash\quotechar##1\verbatimchar#2}}%
+ \else
+ \def\@tempc{\special@index{##1##2\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \bslash##1##2\verbatimchar#2}}%
+ \fi}%
+ \expandafter\@tempb\@gtempa\relax
+ \@tempc
+ \fi}
+\def\SpecialMainEnvIndex#1{\@bsphack\special@index{%
+ #1\actualchar
+ {\string\ttfamily\space#1}
+ (environment)%
+ \encapchar main}%
+ \special@index{environments:\levelchar#1\actualchar{%
+ \string\ttfamily\space#1}\encapchar
+ main}\@esphack}
+\def\SpecialUsageIndex#1{\@bsphack
+ {\let\special@index\index\SpecialIndex@{#1}{\encapchar usage}}%
+ \@esphack}
+\def\SpecialEnvIndex#1{\@bsphack
+ \index{#1\actualchar{\protect\ttfamily#1}
+ (environment)\encapchar usage}%
+ \index{environments:\levelchar#1\actualchar
+ {\protect\ttfamily#1}\encapchar usage}\@esphack}
+\def\SortIndex#1#2{\index{#1\actualchar#2}}
+\def\it@is@a#1{\special@index{\quotechar #1\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \quotechar\bslash\quotechar#1\verbatimchar}}
+\@ifundefined{LeftBraceIndex}{\def\LeftBraceIndex{%
+ \special@index{\bgroup\actualchar\string\verb\quotechar*\verbatimchar
+ \quotechar\bslash{\verbatimchar\string\iffalse}\string\fi}}}{}
+
+\@ifundefined{RightBraceIndex}{\def\RightBraceIndex{%
+ \special@index{\egroup\actualchar\string\iffalse{\string\fi\string\verb
+ \quotechar*\verbatimchar\quotechar\bslash}\verbatimchar}}}{}
+\@ifundefined{PercentIndex}
+ {\def\PercentIndex{\it@is@a\percentchar}}{}
+\def\OldMakeindex{\def\PercentIndex{%
+ \special@index{\quotechar\percentchar\actualchar\string\verb
+ \quotechar*\verbatimchar\quotechar\bslash
+ \percentchar\percentchar\verbatimchar}}}
+{\catcode`\%=12 \gdef\percentchar{%}}
+\newif\ifhave@multicol
+\IfFileExists{multicol.sty}{\have@multicoltrue
+ \RequirePackage{multicol}%
+ }{}
+
+\newdimen\IndexMin \IndexMin = 80pt
+\newcount\c@IndexColumns \c@IndexColumns = 3
+\ifhave@multicol
+ \renewenvironment{theindex}
+ {\begin{multicols}\c@IndexColumns[\index@prologue][\IndexMin]%
+ \IndexParms \let\item\@idxitem \ignorespaces}%
+ {\end{multicols}}
+\else
+ \typeout{Can't find multicol.sty -- will use normal index layout if
+ necessary.}
+ \def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
+ \columnseprule \z@ \columnsep 35\p@
+ \twocolumn[\index@prologue]%
+ \IndexParms \let\item\@idxitem \ignorespaces}
+ \def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi}
+\fi
+\long\def\IndexPrologue#1{\@bsphack\def\index@prologue{#1}\@esphack}
+\@ifundefined{index@prologue}
+ {\def\index@prologue{\section*{Index}%
+ \markboth{Index}{Index}%
+ Numbers written in italic refer to the page
+ where the corresponding entry is described;
+ numbers underlined refer to the
+ \ifcodeline@index
+ code line of the
+ \fi
+ definition; numbers in roman refer to the
+ \ifcodeline@index
+ code lines
+ \else
+ pages
+ \fi
+ where the entry is used.
+ }}{}
+\@ifundefined{IndexParms}
+ {\def\IndexParms{%
+ \parindent \z@
+ \columnsep 15pt
+ \parskip 0pt plus 1pt
+ \rightskip 15pt
+ \mathsurround \z@
+ \parfillskip=-15pt
+ \small
+ \def\@idxitem{\par\hangindent 30pt}%
+ \def\subitem{\@idxitem\hspace*{15pt}}%
+ \def\subsubitem{\@idxitem\hspace*{25pt}}%
+ \def\indexspace{\par\vspace{10pt plus 2pt minus 3pt}}%
+ }}{}
+\def\efill{\hfill\nopagebreak}%
+\def\dotfill{\leaders\hbox to.6em{\hss .\hss}\hskip\z@ plus 1fill}%
+\def\dotfil{\leaders\hbox to.6em{\hss .\hss}\hfil}%
+\def\pfill{\unskip~\dotfill\penalty500\strut\nobreak
+ \dotfil~\ignorespaces}%
+\def\*{\leavevmode\lower.8ex\hbox{$\,\widetilde{\ }\,$}}
+\@ifundefined{main}{\def\main#1{\underline{#1}}}{}
+\@ifundefined{usage}{\def\usage#1{\textit{#1}}}{}
+\def\PrintIndex{\@input@{\jobname.ind}%
+ \global\let\PrintIndex\@empty}
+\def\changes{\@bsphack\begingroup\@sanitize
+ \catcode`\\\z@ \catcode`\ 10 \MakePercentIgnore
+ \changes@}
+\def\changes@#1#2#3{%
+ \protected@edef\@tempa{\noexpand\glossary{#1\levelchar
+ \ifx\saved@macroname\@empty
+ \space
+ \actualchar
+ \generalname
+ \else
+ \saved@indexname
+ \actualchar
+ \string\verb\quotechar*%
+ \verbatimchar\saved@macroname
+ \verbatimchar
+ \fi
+ :\levelchar #3}}%
+ \@tempa\endgroup\@esphack}
+\def\saved@macroname{}
+\def\saved@indexname{}
+\def\generalname{General}
+\let\RecordChanges\makeglossary
+\newdimen\GlossaryMin \GlossaryMin = 80pt
+\newcount\c@GlossaryColumns \c@GlossaryColumns = 2
+\ifhave@multicol
+ \newenvironment{theglossary}{%
+ \begin{multicols}\c@GlossaryColumns
+ [\glossary@prologue][\GlossaryMin]%
+ \GlossaryParms \let\item\@idxitem \ignorespaces}%
+ {\end{multicols}}
+\else
+ \newenvironment{theglossary}{%
+ \@restonecoltrue\if@twocolumn\@restonecolfalse\fi
+ \columnseprule \z@ \columnsep 35\p@
+ \twocolumn[\glossary@prologue]%
+ \GlossaryParms \let\item\@idxitem \ignorespaces}
+ {\if@restonecol\onecolumn\else\clearpage\fi}
+\fi
+\long\def\GlossaryPrologue#1{\@bsphack
+ \def\glossary@prologue{#1}%
+ \@esphack}
+\@ifundefined{glossary@prologue}
+ {\def\glossary@prologue{\section*{{Change History}}%
+ \markboth{{Change History}}{{Change History}}%
+ }}{}
+\@ifundefined{GlossaryParms}{\let\GlossaryParms\IndexParms
+ \expandafter\def\expandafter\GlossaryParms\expandafter{\GlossaryParms
+ \rightskip 15pt plus 1fil
+ \parfillskip -15pt plus -1fil\relax}
+}{}
+\def\PrintChanges{\@input@{\jobname.gls}%
+ \global\let\PrintChanges\@empty}
+\newcommand\AlsoImplementation{%
+ \long\def\StopEventually##1{\@bsphack\gdef\Finale{##1%
+ \check@checksum}%
+ \init@checksum
+ \@esphack}%
+ }
+\AlsoImplementation
+\def\OnlyDescription{\@bsphack\long\def\StopEventually##1{%
+ ##1\endinput}\@esphack}
+\let\Finale\relax
+\ifx\l@nohyphenation\undefined
+ \newlanguage\l@nohyphenation
+\fi
+\DeclareRobustCommand\meta[1]{%
+ \ensuremath\langle
+ \ifmmode \expandafter \nfss@text \fi
+ {%
+ \meta@font@select
+ \edef\meta@hyphen@restore
+ {\hyphenchar\the\font\the\hyphenchar\font}%
+ \hyphenchar\font\m@ne
+ \language\l@nohyphenation
+ #1\/%
+ \meta@hyphen@restore
+ }\ensuremath\rangle
+}
+\def\meta@font@select{\itshape}
+\def\IndexInput#1{%
+ \begingroup \macro@code
+ \frenchspacing \@vobeyspaces
+ \input{#1}\endmacrocode
+ \endgroup}
+\def\maketitle{\par
+ \begingroup \def \thefootnote {\fnsymbol {footnote}}%
+ \setcounter {footnote}\z@
+ \def\@makefnmark{\hbox to\z@{$\m@th^{\@thefnmark}$\hss}}%
+ \long\def\@makefntext##1{\parindent 1em\noindent
+ \hbox to1.8em{\hss$\m@th^{\@thefnmark}$}##1}%
+ \if@twocolumn \twocolumn [\@maketitle ]%
+ \else \newpage \global \@topnum \z@ \@maketitle \fi
+ \thispagestyle{titlepage}\@thanks \endgroup
+ \setcounter {footnote}\z@
+ \gdef\@date{\today}\gdef\@thanks{}%
+ \gdef\@author{}\gdef\@title{}}
+\@ifundefined{ps@titlepage}
+ {\let\ps@titlepage=\ps@plain}{}
+\def\MakeShortVerb{%
+ \@ifstar
+ {\def\@shortvrbdef{\verb*}\@MakeShortVerb}%
+ {\def\@shortvrbdef{\verb}\@MakeShortVerb}}
+\def\@MakeShortVerb#1{%
+ \expandafter\ifx\csname cc\string#1\endcsname\relax
+ \@shortvrbinfo{Made }{#1}\@shortvrbdef
+ \add@special{#1}%
+ \expandafter
+ \xdef\csname cc\string#1\endcsname{\the\catcode`#1}%
+ \begingroup
+ \catcode`\~\active \lccode`\~`#1%
+ \lowercase{%
+ \global\expandafter\let
+ \csname ac\string#1\endcsname~%
+ \expandafter\gdef\expandafter~\expandafter{\@shortvrbdef~}}%
+ \endgroup
+ \global\catcode`#1\active
+ \else
+ \@shortvrbinfo\@empty{#1 already}{\@empty\verb(*)}%
+ \fi}
+\def\DeleteShortVerb#1{%
+ \expandafter\ifx\csname cc\string#1\endcsname\relax
+ \@shortvrbinfo\@empty{#1 not}{\@empty\verb(*)}%
+ \else
+ \@shortvrbinfo{Deleted }{#1 as}{\@empty\verb(*)}%
+ \rem@special{#1}%
+ \global\catcode`#1\csname cc\string#1\endcsname
+ \global \expandafter\let \csname cc\string#1\endcsname \relax
+ \ifnum\catcode`#1=\active
+ \begingroup
+ \catcode`\~\active \lccode`\~`#1%
+ \lowercase{%
+ \global\expandafter\let\expandafter~%
+ \csname ac\string#1\endcsname}%
+ \endgroup \fi \fi}
+\def\@shortvrbinfo#1#2#3{%
+ \PackageInfo{doc}{%
+ #1\expandafter\@gobble\string#2 a short reference
+ for \expandafter\string#3}}
+\def\add@special#1{%
+ \rem@special{#1}%
+ \expandafter\gdef\expandafter\dospecials\expandafter
+ {\dospecials \do #1}%
+ \expandafter\gdef\expandafter\@sanitize\expandafter
+ {\@sanitize \@makeother #1}}
+\def\rem@special#1{%
+ \def\do##1{%
+ \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
+ \xdef\dospecials{\dospecials}%
+ \begingroup
+ \def\@makeother##1{%
+ \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
+ \xdef\@sanitize{\@sanitize}%
+ \endgroup}
+\def\MakeShortverb{\typeout{*** Switch to \noexpand\MakeShortVerb
+ syntax, this is obsolete ***}\MakeShortVerb}
+\def\DeleteShortverb{\typeout{*** Switch to \noexpand\DeleteShortVerb
+ syntax, this is obsolete ***}\DeleteShortVerb}
+\def\init@checksum{\relax
+ \global\bslash@cnt\z@}
+\def\check@checksum{\relax
+ \ifnum\check@sum>\m@ne
+ \ifnum\check@sum=\z@
+ \typeout{**********************************}%
+ \typeout{* This macro file has no checksum!}%
+ \typeout{* The checksum should be \the\bslash@cnt!}%
+ \typeout{**********************************}%
+ \else
+ \ifnum\check@sum=\bslash@cnt
+ \typeout{*******************}%
+ \typeout{* Checksum passed *}%
+ \typeout{*******************}%
+ \else
+ \PackageError{doc}{Checksum not passed
+ (\the\check@sum<>\the\bslash@cnt)}%
+ {The file currently documented seems to be wrong.^^J%
+ Try to get a correct version.}%
+ \fi
+ \fi
+ \fi
+ \global\check@sum\m@ne}
+\newcount\check@sum \check@sum = \m@ne
+\newcount\bslash@cnt \bslash@cnt = \z@
+\def\CheckSum#1{\@bsphack\global\check@sum#1\relax\@esphack}
+\def\step@checksum{\global\advance\bslash@cnt\@ne}
+\def\CharacterTable{\begingroup \CharTableChanges \character@table}
+\begingroup
+ \catcode`\~=11
+ \gdef\character@table#1{\def\used~table{#1}%
+ \ifx\used~table\default~table
+ \typeout{***************************}%
+ \typeout{* Character table correct *}%
+ \typeout{***************************}%
+ \else
+ \PackageError{doc}{Character table corrupted}
+ {\the\wrong@table}
+ \show\default~table
+ \show\used~table
+ \fi
+ \endgroup}
+ \global\let\CharTableChanges\@empty
+ \makeatother
+ \gdef\default~table
+ {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+ Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+ Digits \0\1\2\3\4\5\6\7\8\9
+ Exclamation \! Double quote \" Hash (number) \#
+ Dollar \$ Percent \% Ampersand \&
+ Acute accent \' Left paren \( Right paren \)
+ Asterisk \* Plus \+ Comma \,
+ Minus \- Point \. Solidus \/
+ Colon \: Semicolon \; Less than \<
+ Equals \= Greater than \> Question mark \?
+ Commercial at \@ Left bracket \[ Backslash \\
+ Right bracket \] Circumflex \^ Underscore \_
+ Grave accent \` Left brace \{ Vertical bar \|
+ Right brace \} Tilde \~}
+\endgroup
+ \newhelp\wrong@table{Some of the ASCII characters are corrupted.^^J
+ I now \string\show\space you both tables for comparison.}
+\newif\ifcodeline@index \codeline@indexfalse
+\let\CodelineNumbered\codeline@indextrue
+\def\codeline@wrindex#1{\if@filesw
+ \immediate\write\@indexfile
+ {\string\indexentry{#1}%
+ {\number\c@CodelineNo}}\fi}
+\let\special@index = \@gobble
+\def\CodelineIndex{\makeindex
+ \codeline@indextrue
+ \let\special@index\codeline@wrindex}
+\def\PageIndex{\makeindex
+ \codeline@indexfalse
+ \let\special@index\index}
+\newcount\c@CodelineNo \c@CodelineNo\z@
+\@ifundefined{theCodelineNo}
+ {\ifx\selectfont\undefined
+ \def\theCodelineNo{\rmfamily\scriptsize\arabic{CodelineNo}}%
+ \else
+ \def\theCodelineNo{\reset@font\scriptsize\arabic{CodelineNo}}%
+ \fi}
+ {}
+ \tolerance=1000\relax
+{ \catcode`\"=12
+ \global\mathcode`\\="705C \global\mathcode`\@="7040 }
+\@ifundefined{DocstyleParms}{}{\DocstyleParms}
+\let\DocstyleParms\relax
+\@ifundefined{AmSTeX}
+ {\def\AmSTeX{\leavevmode\hbox{$\mathcal A\kern-.2em\lower.376ex%
+ \hbox{$\mathcal M$}\kern-.2em\mathcal S$-\TeX}}}{}
+\@ifundefined{BibTeX}
+ {\def\BibTeX{{\rmfamily B\kern-.05em%
+ \textsc{i\kern-.025em b}\kern-.08em%
+ T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}}{}
+\@ifundefined{SliTeX}
+ {\def\SliTeX{{\rmfamily S\kern-.06emL\kern-.18em\raise.32ex\hbox
+ {\scshape i}\kern -.03em\TeX}}}{}
+\@ifundefined{PlainTeX}{\def\PlainTeX{\textsc{Plain}\kern2pt\TeX}}{}
+\@ifundefined{Web}{\def\Web{\textsc{Web}}}{}
+\def\MakePercentIgnore{\catcode`\%9\relax}
+\def\MakePercentComment{\catcode`\%14\relax}
+\def\DocInput#1{\MakePercentIgnore\input{#1}\MakePercentComment}
+\def\GetFileInfo#1{%
+ \def\filename{#1}%
+ \def\@tempb##1 ##2 ##3\relax##4\relax{%
+ \def\filedate{##1}%
+ \def\fileversion{##2}%
+ \def\fileinfo{##3}}%
+ \edef\@tempa{\csname ver@#1\endcsname}%
+ \expandafter\@tempb\@tempa\relax? ? \relax\relax}
+\endinput
+%%
+%% End of file `doc.sty'.
diff --git a/macros/latex/base/doc-v3beta.sty b/macros/latex/base/doc-2021-06-01.sty
index eeac71568c..444849f2e7 100644
--- a/macros/latex/base/doc-v3beta.sty
+++ b/macros/latex/base/doc-2021-06-01.sty
@@ -1,10 +1,10 @@
%%
-%% This is file `doc-v3beta.sty',
+%% This is file `doc.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
-%% doc.dtx (with options: `package,beta')
+%% doc.dtx (with options: `package')
%%
%% This is a generated file.
%%
@@ -13,8 +13,8 @@
%% (but please observe conditions on bug reports sent to that address!)
%%
%%
-%% Copyright 1993-2018
-%% The LaTeX3 Project and any individual authors listed elsewhere
+%% Copyright (C) 1993-2021
+%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
%% This file was generated from file(s) of the LaTeX base system.
@@ -26,7 +26,7 @@
%% 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.
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -42,56 +42,15 @@
%% and covered by LPPL is defined by the unpacking scripts (with
%% extension .ins) which are part of the distribution.
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-
-\providecommand\DeclareRelease[3]{}
-\providecommand\DeclareCurrentRelease[2]{}
-
-\DeclareRelease{v2}{2016-02-15.sty}
- {doc-2016-02-15.sty}
-\DeclareCurrentRelease{v3}{2018-04-16}
-
-\ProvidesPackage{doc-v3beta}
- [2021/02/07 v3.0e
- Standard LaTeX documentation package V3 (FMi)]
+ \ProvidesPackage{doc}
+ [2021/05/28 v2.1n
+ Standard LaTeX documentation package (FMi)]
%%
%% Package `doc' to use with LaTeX 2e
-%% Copyright (C) 1989-2018 Frank Mittelbach, all rights reserved.
-
-
-
-
-
+%% Copyright (C) 1989-2020 Frank Mittelbach, all rights reserved.
\@ifundefined{macro@cnt}{}{\endinput}
\catcode`\^^A=14
\AtBeginDocument{\catcode`\^^A=14\relax}
-\RequirePackage{kvoptions}
-\SetupKeyvalOptions{family=doc,prefix=doc@}
-\DeclareBoolOption{noprint}
-\DeclareBoolOption{noindex}
-\DeclareBoolOption[true]{hyperref}
-\DeclareBoolOption[true]{multicol}
-\DeclareBoolOption[false]{debugshow}
-\DeclareBoolOption[true]{toplevel}
-\DeclareComplementaryOption{notoplevel}{toplevel}
-\DeclareBoolOption{macrolike}
-\DeclareComplementaryOption{envlike}{macrolike}
-\DeclareStringOption{idxtype}
-\DeclareStringOption{idxgroup}
-\DeclareStringOption{printtype}
-\DeclareBoolOption[false]{outer}
-\ProcessKeyvalOptions*
-\newif\ifscan@allowed \scan@allowedtrue
-\def\SetupDoc#1{%
- \setkeys{doc}{#1}%
- \edef\doc@noprintdefault{\ifdoc@noprint true\else false\fi}%
- \ifdoc@noindex
- \def\doc@noindexdefault{true}%
- \scan@allowedfalse
- \else
- \def\doc@noindexdefault{false}%
- \fi
-}
-\SetupDoc{} % just save the default values
\def\macrocode{\macro@code
\frenchspacing \@vobeyspaces
\xmacro@code}
@@ -100,6 +59,7 @@
\@beginparpenalty \predisplaypenalty
\if@inlabel\leavevmode\fi
\trivlist \parskip \z@ \item[]%
+ \global\setbox\@labels\box\voidb@x
\macro@font
\leftskip\@totalleftmargin \advance\leftskip\MacroIndent
\rightskip\z@ \parindent\z@ \parfillskip\@flushglue
@@ -132,13 +92,13 @@
\usefont\encodingdefault
\ttdefault
\mddefault
- \updefault
+ \shapedefault
}%
\else
\def\MacroFont{\fontencoding\encodingdefault
\fontfamily\ttdefault
\fontseries\mddefault
- \fontshape\updefault
+ \fontshape\shapedefault
\small}%
\fi
}{}
@@ -221,7 +181,6 @@
\endgroup
\newcounter{StandardModuleDepth}
\newcount \guard@level
-
\@ifundefined{Module}{%
\def\Module#1{\mod@math@codes$\langle\mathsf{#1}\rangle$}
}{}
@@ -270,16 +229,25 @@
|endgroup
!% \end{macrocode}
\catcode`\!=12
-
+\def\DescribeMacro{\leavevmode\@bsphack
+ \begingroup\MakePrivateLetters\Describe@Macro}
+\def\Describe@Macro#1{\endgroup
+ \marginpar{\raggedleft\PrintDescribeMacro{#1}}%
+ \SpecialUsageIndex{#1}\@esphack\ignorespaces}
+\def\DescribeEnv{\leavevmode\@bsphack\begingroup\MakePrivateLetters
+ \Describe@Env}
+\def\Describe@Env#1{\endgroup
+ \marginpar{\raggedleft\PrintDescribeEnv{#1}}%
+ \SpecialEnvIndex{#1}\@esphack\ignorespaces}
\reversemarginpar
\setlength\marginparpush{0pt} \setlength\marginparwidth{8pc}
-\setlength\marginparsep{\labelsep}
{\catcode`\|=\z@ \catcode`\\=12
|gdef|bslash{\}}
\def\verbatim{\@beginparpenalty \predisplaypenalty \@verbatim
\MacroFont \frenchspacing \@vobeyspaces \@xverbatim}
\@namedef{verbatim*}{\@beginparpenalty \predisplaypenalty \@verbatim
- \MacroFont \@sxverbatim}
+ \@setupverbvisiblespace
+ \MacroFont \@vobeyspaces \@sxverbatim}
\def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi
\leftskip\@totalleftmargin\rightskip\z@
\parindent\z@\parfillskip\@flushglue\parskip\z@
@@ -306,14 +274,8 @@
\obeylines%
\gdef\verb@eol@error{\obeylines%
\def^^M{\verb@egroup\@latex@error{%
- Text for \noexpand\verb command ended by end of line}\@ehc}}%
+ \noexpand\verb ended by end of line}\@ehc}}%
\endgroup
-\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}}
\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-}
\def\do@noligs#1{%
\catcode`#1\active
@@ -321,7 +283,56 @@
\lccode`\~=`#1\relax
\lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}}
\newcount\macro@cnt \macro@cnt=0
+\def\macro{\begingroup
+ \catcode`\\12
+ \MakePrivateLetters \m@cro@ \iftrue}
+\def\environment{\begingroup
+ \catcode`\\12
+ \MakePrivateLetters \m@cro@ \iffalse}
+\long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist
+ \edef\saved@macroname{\string#2}%
+ #1
+ \let\saved@indexname\saved@macroname
+ \else
+ \edef\saved@indexname{\expandafter\@gobble\string#2}%
+ \fi
+ \def\makelabel##1{\llap{##1}}%
+ \if@inlabel
+ \let\@tempa\@empty \count@\macro@cnt
+ \loop \ifnum\count@>\z@
+ \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+ \edef\makelabel##1{\llap{\vtop to\baselineskip
+ {\@tempa\hbox{##1}\vss}}}%
+ \advance \macro@cnt \@ne
+ \else \macro@cnt\@ne \fi
+ \edef\@tempa{\noexpand\item[%
+ #1%
+ \noexpand\PrintMacroName
+ \else
+ \noexpand\PrintEnvName
+ \fi
+ {\string#2}]}%
+ \@tempa
+ \global\advance\c@CodelineNo\@ne
+ #1%
+ \SpecialMainIndex{#2}\nobreak
+ \DoNotIndex{#2}%
+ \else
+ \SpecialMainEnvIndex{#2}\nobreak
+ \fi
+ \global\advance\c@CodelineNo\m@ne
+ \ignorespaces}
+\let\endmacro \endtrivlist
+\let\endenvironment\endmacro
\newskip\MacroTopsep \MacroTopsep = 7pt plus 2pt minus 2pt
+\@ifundefined{PrintMacroName}
+ {\def\PrintMacroName#1{\strut \MacroFont \string #1\ }}{}
+\@ifundefined{PrintDescribeMacro}
+ {\def\PrintDescribeMacro#1{\strut \MacroFont \string #1\ }}{}
+\@ifundefined{PrintDescribeEnv}
+ {\def\PrintDescribeEnv#1{\strut \MacroFont #1\ }}{}
+\@ifundefined{PrintEnvName}
+ {\def\PrintEnvName#1{\strut \MacroFont #1\ }}{}
\begingroup
\catcode`\~\active
\gdef\SpecialEscapechar#1{%
@@ -349,6 +360,7 @@
\def\next{\futurelet\next\macro@switch}%
\else \let\next\@empty \fi
\next}
+\newif\ifscan@allowed \scan@allowedtrue
\def\DisableCrossrefs{\@bsphack\scan@allowedfalse\@esphack}
\def\EnableCrossrefs{\@bsphack\scan@allowedtrue
\def\DisableCrossrefs{\@bsphack\@esphack}\@esphack}
@@ -362,10 +374,24 @@
\uccode`\&=\expandafter`\string#1%
\uppercase{\def\x{\def\macro@namepart{&}}}%
\expandafter\endgroup\x
- \maybe@index@short@macro\macro@namepart
+ \ifnot@excluded
+ \produce@index{#1}\fi
\scan@allowedfalse#1%
\scan@allowedtrue }
\endgroup
+\def\produce@index#1{%
+ \if\noexpand#1\special@escape@char
+ \scan@allowedfalse \it@is@a\special@escape@char \else
+ \if\noexpand#1\bslash \it@is@a\bslash \else
+ \if\noexpand#1\space \it@is@a\space \else
+ \ifx#1\par
+ \it@is@a\space \else
+ \ifx#1\relax \else
+ \if\noexpand#1\bgroup \LeftBraceIndex \else
+ \if\noexpand#1\egroup \RightBraceIndex \else
+ \if\noexpand#1\percentchar \PercentIndex \else
+ \it@is@a{\string#1}%
+ \fi \fi \fi \fi \fi \fi \fi \fi}
\def\macro@name#1{\edef\macro@namepart{\macro@namepart#1}%
\futurelet\next\more@macroname}
\def\more@macroname{\ifcat\noexpand\next a%
@@ -374,171 +400,41 @@
\next}
\def\macro@finish{%
\macro@namepart
- \maybe@index@macro \macro@namepart
-}
-
-\RequirePackage{expl3}
-\ExplSyntaxOn
-\seq_new:N \l__doc_donotindex_seq
-\prop_new:N \g__doc_idxtype_prop
-\cs_new:Npn\__doc_trace:x {
- \ifdoc@debugshow
- \expandafter \iow_term:x
- \else
- \expandafter \use_none:n
- \fi
-}
-\cs_new:Npn \doc_dont_index:n {
- \group_begin:
- \MakePrivateLetters
- \__doc_dont_index:n
-}
-\cs_new:Npn \__doc_dont_index:n #1 {
- \group_end:
- \__doc_trace:x{Disable~ indexing~ for~ '\tl_to_str:n{#1}' }
- \clist_map_function:nN {#1} \__doc_dont_index_aux:n
-}
-\cs_new:Npn \__doc_dont_index_aux:n #1 {
- \seq_put_right:Nx \l__doc_donotindex_seq {\expandafter\@gobble \string#1}
-}
-\cs_set_eq:NN \DoNotIndex \doc_dont_index:n
-\def \ShowIndexingState {
- \__doc_trace:x{Show~ doc~ indexing~ state:}
- \seq_show:N \l__doc_donotindex_seq
- \prop_show:N \g__doc_idxtype_prop
-}
-
-\cs_new:Npn \__doc_idxtype_put:Nn #1#2 {
- \exp_args:Nx \__doc_idxtype_put:nn { \cs_to_str:N #1 }{#2}
- \protected@write\@auxout{}
- {\string\RecordIndexTypeAux {\string#1 }{#2} }
-}
-\cs_new:Npn \RecordIndexTypeAux #1#2 {
- \exp_args:Nx \__doc_idxtype_put:nn { \cs_to_str:N #1 }{#2}
-}
-\AtEndDocument{
- \cs_set_eq:NN \RecordIndexTypeAux \use_none:nn
-}
-\cs_set_eq:NN \RecordIndexType \__doc_idxtype_put:Nn
-\cs_new:Npn \__doc_idxtype_put_scan:nn #1#2 {
- \exp_args:Nf \__doc_idxtype_put:nn { \tl_to_str:n {#1} }{#2}
- \protected@write\@auxout{}
- {\string\RecordIndexTypeAux {\bslash #1 }{#2} }
-}
-\cs_generate_variant:Nn \__doc_idxtype_put_scan:nn {o}
-\cs_set_eq:NN \record@index@type@save \__doc_idxtype_put_scan:on
-\cs_new:Npn \__doc_idxtype_put:nn #1#2 {
- \exp_args:NNf
- \seq_if_in:NnTF \l__doc_donotindex_seq {\tl_to_str:n{#1}}
- {
- \__doc_trace:x{Not~ recording~ index~ type~ for~ '\bslash #1' }
- }
- {
- \__doc_trace:x{Recording~ index~ type~ for~ '\bslash #1' ~ as~ #2 }
- \prop_gput:Nnn \g__doc_idxtype_prop {#1}{#2}
- }
-}
-\cs_new:Npn \exp_args:co #1#2
- { \cs:w #1 \exp_after:wN \cs_end:\exp_after:wN {#2} }
-\cs_generate_variant:Nn \tl_to_str:n {o}
-
-\cs_new:Npn \__doc_maybe_index:o #1 {
- \exp_args:Nf \__doc_maybe_index_aux:nN { \tl_to_str:o {#1} }
- \SpecialIndex
-}
-\cs_set_eq:NN \maybe@index@macro \__doc_maybe_index:o
-\cs_new:Npn \__doc_maybe_index_short:o #1 {
- \exp_args:Nf \__doc_maybe_index_aux:nN { \tl_to_str:o {#1} }
- \SpecialShortIndex
-}
-\cs_set_eq:NN \maybe@index@short@macro \__doc_maybe_index_short:o
-\cs_new:Npn \__doc_maybe_index_aux:nN #1#2 {
- \__doc_trace:x{Searching~ for~ '\bslash #1'}
- \seq_if_in:NnTF \l__doc_donotindex_seq {#1}
- {
- \__doc_trace:x{Not~ indexing~ '\bslash #1' }
- }
- {
- \prop_get:NnNTF \g__doc_idxtype_prop {#1} \l__doc_idxtype_tl
- {
- \exp_args:Ncno \__doc_maybe_index_aux:Nnn
- { Code \tl_use:N \l__doc_idxtype_tl Index }
- {code} {\bslash #1}
- }
- {
- \__doc_trace:x{Indexing~ '\bslash #1'\space (\string #2)}
- \exp_args:No #2 {\bslash #1}
- }
- }
-}
-\cs_new:Npn \SpecialShortIndex #1 {
- \@SpecialIndexHelper@ #1\@nil
- \@bsphack
- \ifdoc@noindex \else
- \str_case_e:nnF {\@gtempa }
- {
- {\cs_to_str:N \^^M } {\def\reserved@a{ \string \space \actualchar }
- \def\reserved@b { \space }
- \let\reserved@c \@empty }
- { } {\def\reserved@a{ \string \space \actualchar }
- \def\reserved@b { \space }
- \let\reserved@c \@empty }
- {\c_left_brace_str} { \def\reserved@a{ \bgroup \actualchar }
- \def\reserved@b { \c_left_brace_str }
- \def\reserved@c { \noexpand\iffalse
- \c_right_brace_str
- \noexpand\fi } }
- {\c_right_brace_str} { \def\reserved@a{ \egroup \actualchar
- \noexpand\iffalse
- \c_left_brace_str
- \noexpand\fi }
- \def\reserved@b { \c_right_brace_str }
- \let\reserved@c \@empty }
- {\verbatimchar} { \def\reserved@a{ \quotechar\verbatimchar
- \actualchar }
- \let\reserved@b \@empty
- \def\reserved@c
- { \string\texttt{\string\string\verbatimchar} } }
- }
- { \def\reserved@a {\quotechar \@gtempa \actualchar }
- \def\reserved@b {\quotechar \@gtempa }
- \let\reserved@c \@empty }
- \special@index {
- \reserved@a
- \string\verb
- \quotechar *\verbatimchar \quotechar \bslash
- \reserved@b
- \verbatimchar
- \reserved@c
- \encapchar code}
- \fi
- \@esphack
-}
-
-\cs_new:Npn \__doc_maybe_index_aux:Nnn #1#2#3 {
- \cs_if_exist:NTF #1
- {
- \__doc_trace:x{Indexing~ '#3'\space as~
- \tl_use:N \l__doc_idxtype_tl }
- #1{#2}{#3}
- }
- {
- \PackageError{doc}{Doc~ element~
- '\tl_use:N \l__doc_idxtype_tl'~ unknown}%
-
- {When~ using~ '\string\RecordIndexType'~ the~ type~ must~
- be~ known~\MessageBreak
- to~ the~ system,~ i.e.,~ declared~ via~
- '\string\NewDocElement'\MessageBreak
- before~ it~ can~ be~ used~ in~ indexing.}
- }
-}
-\ExplSyntaxOff
+ \ifnot@excluded
+ \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}%
+ \@tempa \fi}
+\def\DoNotIndex{\begingroup \MakePrivateLetters
+ \catcode`\\12
+ \do@not@index}
+\long\def\do@not@index#1{%
+ \endgroup
+ \addto@hook\index@excludelist{#1,}}
+\long\def\addto@hook#1#2{#1\expandafter{\the#1#2}}
+\newtoks\index@excludelist
+\index@excludelist{}
+\begingroup
+\catcode`\|=0%
+\catcode`\\=12
+|gdef|ifnot@excluded{|expandafter
+ |expanded@notin|expandafter{|expandafter
+ \|macro@namepart,}{|the|index@excludelist}}
+|endgroup
+\def\expanded@notin#1#2{%
+ \def\in@@##1#1##2##3\in@@{%
+ \ifx\expanded@notin##2}%
+ \expandafter\in@@#2#1\expanded@notin\in@@}
\@ifundefined{actualchar}{\def\actualchar{=}}{}
\@ifundefined{quotechar}{\def\quotechar{!}}{}
\@ifundefined{levelchar}{\def\levelchar{>}}{}
\@ifundefined{encapchar}{\def\encapchar{|}}{}
\@ifundefined{verbatimchar}{\def\verbatimchar{+}}{}
+\def\SpecialIndex#1{\@bsphack\special@index{\expandafter\@gobble
+ \string#1\actualchar
+ \string\verb\quotechar*\verbatimchar\string#1\verbatimchar}%
+ \@esphack}
+
+\def\SpecialMainIndex#1{\@bsphack\SpecialIndex@{#1}{\encapchar main}%
+ \@esphack}
\begingroup
\catcode`\|=0
\catcode`\\=12
@@ -552,43 +448,75 @@
|endgroup
|fi}
|endgroup
-\def\SortIndex#1#2{%
- \ifdoc@noindex\else
- \index{#1\actualchar#2}%
- \fi
-}
+\def\SpecialIndex@#1#2{%
+ \@SpecialIndexHelper@#1\@nil
+ \def\@tempb{ }%
+ \ifcat \@tempb\@gtempa
+ \special@index{\quotechar\space\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \quotechar\bslash\quotechar\space\verbatimchar#2}%
+ \else
+ \def\@tempb##1##2\relax{\ifx\relax##2\relax
+ \def\@tempc{\special@index{\quotechar##1\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \quotechar\bslash\quotechar##1\verbatimchar#2}}%
+ \else
+ \def\@tempc{\special@index{##1##2\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \bslash##1##2\verbatimchar#2}}%
+ \fi}%
+ \expandafter\@tempb\@gtempa\relax
+ \@tempc
+ \fi}
+\def\SpecialMainEnvIndex#1{\@bsphack\special@index{%
+ #1\actualchar
+ {\string\ttfamily\space#1}
+ (environment)%
+ \encapchar main}%
+ \special@index{environments:\levelchar#1\actualchar{%
+ \string\ttfamily\space#1}\encapchar
+ main}\@esphack}
+\def\SpecialUsageIndex#1{\@bsphack
+ {\let\special@index\index\SpecialIndex@{#1}{\encapchar usage}}%
+ \@esphack}
+\def\SpecialEnvIndex#1{\@bsphack
+ \index{#1\actualchar{\protect\ttfamily#1}
+ (environment)\encapchar usage}%
+ \index{environments:\levelchar#1\actualchar
+ {\protect\ttfamily#1}\encapchar usage}\@esphack}
+\def\SortIndex#1#2{\index{#1\actualchar#2}}
+\def\it@is@a#1{\special@index{\quotechar #1\actualchar
+ \string\verb\quotechar*\verbatimchar
+ \quotechar\bslash\quotechar#1\verbatimchar}}
\@ifundefined{LeftBraceIndex}{\def\LeftBraceIndex{%
- \special@index{\bgroup\actualchar
- \string\verb% % to fool emacs highlighting
- \quotechar*\verbatimchar
- \quotechar\bslash{\verbatimchar\string\iffalse}\string\fi}}}{}
+ \special@index{\bgroup\actualchar\string\verb\quotechar*\verbatimchar
+ \quotechar\bslash{\verbatimchar\string\iffalse}\string\fi}}}{}
\@ifundefined{RightBraceIndex}{\def\RightBraceIndex{%
- \special@index{\egroup\actualchar\string\iffalse{\string\fi
- \string\verb% % to fool emacs highlighting
+ \special@index{\egroup\actualchar\string\iffalse{\string\fi\string\verb
\quotechar*\verbatimchar\quotechar\bslash}\verbatimchar}}}{}
\@ifundefined{PercentIndex}
{\def\PercentIndex{\it@is@a\percentchar}}{}
\def\OldMakeindex{\def\PercentIndex{%
- \special@index{\quotechar\percentchar\actualchar
- \string\verb% % to fool emacs highlighting
+ \special@index{\quotechar\percentchar\actualchar\string\verb
\quotechar*\verbatimchar\quotechar\bslash
\percentchar\percentchar\verbatimchar}}}
{\catcode`\%=12 \gdef\percentchar{%}}
-\def\it@is@a#1{\special@index{\quotechar #1\actualchar
- \string\verb% % to fool emacs highlighting
- \quotechar*\verbatimchar
- \quotechar\bslash\quotechar#1\verbatimchar}}
+\newif\ifhave@multicol
+\IfFileExists{multicol.sty}{\have@multicoltrue
+ \RequirePackage{multicol}%
+ }{}
\newdimen\IndexMin \IndexMin = 80pt
\newcount\c@IndexColumns \c@IndexColumns = 3
-\ifdoc@multicol
- \RequirePackage{multicol}
+\ifhave@multicol
\renewenvironment{theindex}
{\begin{multicols}\c@IndexColumns[\index@prologue][\IndexMin]%
\IndexParms \let\item\@idxitem \ignorespaces}%
{\end{multicols}}
\else
+ \typeout{Can't find multicol.sty -- will use normal index layout if
+ necessary.}
\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
\columnseprule \z@ \columnsep 35\p@
\twocolumn[\index@prologue]%
@@ -628,15 +556,13 @@
\def\indexspace{\par\vspace{10pt plus 2pt minus 3pt}}%
}}{}
\def\efill{\hfill\nopagebreak}%
-\def\pfill{\unskip~%
- \leaders\hbox to.6em{\hss .\hss}\hfill
- \penalty500\strut\nobreak
- \leaders\hbox to.6em{\hss .\hss}\hfil
- ~\ignorespaces}%
+\def\dotfill{\leaders\hbox to.6em{\hss .\hss}\hskip\z@ plus 1fill\kern\z@}%
+\def\dotfil{\leaders\hbox to.6em{\hss .\hss}\hfil\kern\z@}%
+\def\pfill{\unskip~\dotfill\penalty500\strut\nobreak
+ \dotfil~\ignorespaces}%
\def\*{\leavevmode\lower.8ex\hbox{$\,\widetilde{\ }\,$}}
\@ifundefined{main}{\def\main#1{\underline{#1}}}{}
\@ifundefined{usage}{\def\usage#1{\textit{#1}}}{}
-\@ifundefined{code}{\def\code#1{#1}}{}
\def\PrintIndex{\@input@{\jobname.ind}%
\global\let\PrintIndex\@empty}
\def\changes{\@bsphack\begingroup\@sanitize
@@ -644,19 +570,18 @@
\changes@}
\def\changes@#1#2#3{%
\protected@edef\@tempa{\noexpand\glossary{#1\levelchar
- \ifx\saved@macroname\@empty
- \quotechar!%
- \actualchar
- \generalname
- \else
- \saved@indexname
- \actualchar
- \string\verb% % to fool emacs highlighting
- \quotechar*%
- \verbatimchar\saved@macroname
- \verbatimchar
- \fi
- :\levelchar #3}}%
+ \ifx\saved@macroname\@empty
+ \space
+ \actualchar
+ \generalname
+ \else
+ \saved@indexname
+ \actualchar
+ \string\verb\quotechar*%
+ \verbatimchar\saved@macroname
+ \verbatimchar
+ \fi
+ :\levelchar #3}}%
\@tempa\endgroup\@esphack}
\def\saved@macroname{}
\def\saved@indexname{}
@@ -664,7 +589,7 @@
\let\RecordChanges\makeglossary
\newdimen\GlossaryMin \GlossaryMin = 80pt
\newcount\c@GlossaryColumns \c@GlossaryColumns = 2
-\ifdoc@multicol
+\ifhave@multicol
\newenvironment{theglossary}{%
\begin{multicols}\c@GlossaryColumns
[\glossary@prologue][\GlossaryMin]%
@@ -693,16 +618,15 @@
\def\PrintChanges{\@input@{\jobname.gls}%
\global\let\PrintChanges\@empty}
\newcommand\AlsoImplementation{%
- \long\def\MaybeStopHere##1{\@bsphack\gdef\Finale{##1%
+ \long\def\StopEventually##1{\@bsphack\gdef\Finale{##1%
\check@checksum}%
\init@checksum
\@esphack}%
}
\AlsoImplementation
-\def\OnlyDescription{\@bsphack\long\def\MaybeStopHere##1{%
+\def\OnlyDescription{\@bsphack\long\def\StopEventually##1{%
##1\endinput}\@esphack}
\let\Finale\relax
-\def\StopEventually{\MaybeStopHere}
\ifx\l@nohyphenation\undefined
\newlanguage\l@nohyphenation
\fi
@@ -758,20 +682,13 @@
\endgroup
\global\catcode`#1\active
\else
- \@shortvrbinfo\@empty{#1 already}%
- {\@empty\verb% % to fool emacs highlighting
- (*)}%
+ \@shortvrbinfo\@empty{#1 already}{\@empty\verb(*)}%
\fi}
\def\DeleteShortVerb#1{%
\expandafter\ifx\csname cc\string#1\endcsname\relax
- \@shortvrbinfo\@empty{#1 not}%
- {\@empty\verb% % to fool emacs highlighting
- (*)}%
+ \@shortvrbinfo\@empty{#1 not}{\@empty\verb(*)}%
\else
- \@shortvrbinfo{Deleted }{#1 as}%
- {\@empty\verb% % to fool emacs
- % highlighting
- (*)}%
+ \@shortvrbinfo{Deleted }{#1 as}{\@empty\verb(*)}%
\rem@special{#1}%
\global\catcode`#1\csname cc\string#1\endcsname
\global \expandafter\let \csname cc\string#1\endcsname \relax
@@ -801,6 +718,10 @@
\ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
\xdef\@sanitize{\@sanitize}%
\endgroup}
+\def\MakeShortverb{\typeout{*** Switch to \noexpand\MakeShortVerb
+ syntax, this is obsolete ***}\MakeShortVerb}
+\def\DeleteShortverb{\typeout{*** Switch to \noexpand\DeleteShortVerb
+ syntax, this is obsolete ***}\DeleteShortVerb}
\def\init@checksum{\relax
\global\bslash@cnt\z@}
\def\check@checksum{\relax
@@ -866,13 +787,9 @@
\newif\ifcodeline@index \codeline@indexfalse
\let\CodelineNumbered\codeline@indextrue
\def\codeline@wrindex#1{\if@filesw
- \begingroup
- \set@display@protect
\immediate\write\@indexfile
{\string\indexentry{#1}%
- {\number\c@CodelineNo}}%
- \endgroup
- \fi}
+ {\number\c@CodelineNo}}\fi}
\let\special@index = \@gobble
\def\CodelineIndex{\makeindex
\codeline@indextrue
@@ -916,326 +833,6 @@
\def\fileinfo{##3}}%
\edef\@tempa{\csname ver@#1\endcsname}%
\expandafter\@tempb\@tempa\relax? ? \relax\relax}
-
-\ifdoc@hyperref
- \let\PrintDescribeMacro \@empty
- \let\PrintDescribeEnv \@empty
- \let\PrintMacroName \@empty
- \let\PrintEnvName \@empty
- \let\SpecialUsageIndex \@empty
- \let\SpecialEnvIndex \@empty
- \expandafter\let\expandafter\doc@eoph@@k\csname doc.sty-h@@k\endcsname
- \RequirePackage{hypdoc}
- \expandafter\let\csname doc.sty-h@@k\endcsname\doc@eoph@@k
- \let\PrintDescribeMacro \relax
- \let\PrintDescribeEnv \relax
- \let\PrintMacroName \relax
- \let\PrintEnvName \relax
- \def\doc@providetarget{\HD@target}
- \def\doc@handleencap#1{\encapchar hdclindex{\the\c@HD@hypercount}{#1}}
-\else
- \let\doc@providetarget\@empty
- \def\doc@handleencap#1{\encapchar #1}
- \def\hdclindex#1#2{\ifx\@nil#2\@nil\else\csname #2\expandafter\endcsname\fi}
- \def\hdpindex #1{\ifx\@nil#1\@nil\else\csname #1\expandafter\endcsname\fi}
-\fi
-
-
-\ExplSyntaxOn
-
-\long\def\@doc@env#1#2#3{
- \endgroup
- \clist_map_inline:nn {#3} { \@doc@env@{#1}{#2}{##1} }
-}
-
-\ExplSyntaxOff
-\long\def\@doc@env@#1#2#3{%
- \topsep\MacroTopsep
- \trivlist
- \edef\saved@macroname{\string#3}%
- \if #1%
- \edef\saved@indexname{\expandafter\@gobble\saved@macroname}%
- \expandafter\ifx
- \csname Code#2Index\endcsname
- \CodeMacroIndex
- \else
- \record@index@type@save
- {\saved@indexname}{#2}%
- \fi
- \else
- \let\saved@indexname\saved@macroname
- \fi
- \def\makelabel##1{\llap{##1}}%
- \if@inlabel
- \let\@tempa\@empty
- \count@\macro@cnt
- \loop\ifnum\count@>\z@
- \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne
- \repeat
- \edef\makelabel##1{\llap{\vtop to\baselineskip{\@tempa\hbox{##1}\vss}}}%
- \advance\macro@cnt\@ne
- \else
- \macro@cnt\@ne
- \fi
- \ifdoc@noprint
- \item
- \else
- \edef\@tempa{%
- \noexpand\item[%
- \noexpand\doc@providetarget
- \noexpand\strut
- \noexpand\@nameuse{Print#2Name}{\saved@macroname}]}%
- \@tempa
- \fi
- \ifdoc@noindex\else
- \global\advance\c@CodelineNo\@ne
- \csname SpecialMain#2Index\expandafter\endcsname
- \expandafter{\saved@macroname}\nobreak
- \global\advance\c@CodelineNo\m@ne
- \fi
- \if#1\expandafter\DoNotIndex \expandafter {\saved@macroname}\fi
- \ignorespaces}
-
-\def\doc@env#1#2[#3]{%
- \@nameuse{doc@noprint\doc@noprintdefault}%
- \@nameuse{doc@noindex\doc@noindexdefault}%
- \setkeys{doc}{#3}%
- \begingroup
- \ifdoc@outer
- \catcode`\\12
- \fi
- \MakePrivateLetters
- \@doc@env{#1}{#2}%
-}
-
-\def\@doc@describe#1#2{%
- \ifdoc@noprint\else
- \marginpar{\raggedleft
- \strut
- \doc@providetarget
- \@nameuse{PrintDescribe#1}{#2}}%
- \fi
- \ifdoc@noindex\else
- \@nameuse{Special#1Index}{#2}%
- \fi
- \@esphack
- \endgroup
- \ignorespaces}
-\def\doc@describe#1[#2]{%
- \leavevmode\@bsphack
- \setkeys{doc}{#2}%
- \@doc@describe{#1}}
-\@ifundefined{temptokenb}{\newtoks\@temptokenb}{}
-\def\doc@createspecialindexes#1#2#3{%
- \@temptokena{\space (#2)}%
- \@temptokenb{#3:}%
- \@nameedef{SpecialMain#1Index}##1{%
- \noexpand\@bsphack
- \ifdoc@toplevel
- \noexpand\special@index{##1\noexpand\actualchar
- {\string\ttfamily\space##1}%
- \ifx\@nil#2\@nil\else \the\@temptokena \fi
- \noexpand\encapchar main}%
- \fi
- \ifx\@nil#3\@nil\else
- \noexpand\special@index{\the\@temptokenb\noexpand\levelchar
- ##1\noexpand\actualchar{\string\ttfamily\space##1}%
- \noexpand\encapchar main}%
- \fi
- \noexpand\@esphack}%
- \@nameedef{Special#1Index}##1{%
- \noexpand\@bsphack
- \ifdoc@toplevel
- \noexpand\doc@providetarget
- \noexpand\index{##1\noexpand\actualchar{\string\ttfamily\space##1}%
- \ifx\@nil#2\@nil\else \the\@temptokena \fi
- \noexpand\doc@handleencap{usage}}%
- \fi
- \ifx\@nil#3\@nil\else
- \noexpand\index{\the\@temptokenb\noexpand\levelchar
- ##1\noexpand\actualchar{\string\ttfamily\space##1}%
- \noexpand\doc@handleencap{usage}}%
- \fi
- \noexpand\@esphack}}
-\def\doc@createspecialmacrolikeindexes#1#2#3{%
- \@temptokena{\space (#2)}%
- \@temptokenb{#3:}%
- \@nameedef{Code#1Index}##1##2{%
- \noexpand\@SpecialIndexHelper@##2\noexpand\@nil
- \noexpand\@bsphack
- \noexpand\ifdoc@noindex\noexpand\else
- \ifdoc@toplevel
- \noexpand\special@index{\noexpand\@gtempa\noexpand\actualchar
-\string\verb% % to fool emacs highlighting
-\noexpand\quotechar*\noexpand\verbatimchar
-\noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
-\ifx\@nil#2\@nil\else \the\@temptokena \fi
-\noexpand\encapchar ##1}%
- \fi
- \ifx\@nil#3\@nil\else
- \noexpand\special@index{\the\@temptokenb\noexpand\levelchar
-\noexpand\@gtempa\noexpand\actualchar
-\string\verb% % to fool emacs highlighting
-\noexpand\quotechar*\noexpand\verbatimchar
-\noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
-\noexpand\encapchar ##1}%
- \fi
- \noexpand\fi
- \noexpand\@esphack}%
- \@nameedef{SpecialMain#1Index}##1{%
- \expandafter\noexpand\csname Code#1Index\endcsname
- {main}{##1}}%
- \@nameedef{Special#1Index}##1{%
- \noexpand\@SpecialIndexHelper@##1\noexpand\@nil
- \noexpand\@bsphack
- \noexpand\ifdoc@noindex\noexpand\else
- \ifdoc@toplevel
- \noexpand\doc@providetarget
- \noexpand\index{\noexpand\@gtempa\noexpand\actualchar
-\string\verb% % to fool emacs highlighting
-\noexpand\quotechar*\noexpand\verbatimchar
-\noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
-\ifx\@nil#2\@nil\else \the\@temptokena \fi
-\noexpand\doc@handleencap{usage}}%
- \fi
- \ifx\@nil#3\@nil\else
- \noexpand\index{\the\@temptokenb\noexpand\levelchar
-\noexpand\@gtempa\noexpand\actualchar
-\string\verb% % to fool emacs highlighting
-\noexpand\quotechar*\noexpand\verbatimchar
-\noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
-\noexpand\doc@handleencap{usage}}%
- \fi
- \noexpand\fi
- \noexpand\@esphack}}
-
-\def\doc@createdescribe#1{%
- \@namedef{Describe#1}{%
- \begingroup
- \MakePrivateLetters
- \@ifnextchar[%]
- {\doc@describe{#1}}{\doc@describe{#1}[]}}}
-\def\doc@createenv#1#2#3{%
- \@namedef{#3}{%
- \@ifnextchar[%]
- {\doc@env{#1}{#2}}{\doc@env{#1}{#2}[]}}%
- \@namedef{end#3}{\endtrivlist}%
-}
-
-\def\@nameedef#1{\expandafter\edef\csname #1\endcsname}
-
-
-\def\doc@declareerror#1#2{%
- \PackageError{doc}{Doc element '#1/#2' already defined?\@gobble}%
- {There is already a definition for
- '\string\Print#1Name',\MessageBreak
- '\string\PrintDescribe#1'
- or the environment '#2'.\MessageBreak
- Maybe you are overwriting something by mistake!\MessageBreak
- Otherwise use '\string\RenewDocElement' instead.}%
-}
-
-\def\doc@notdeclarederror#1#2{%
- \PackageError{doc}{Doc element '#1/#2' unknown}%
- {I expected an existing definition for
- '\string\Print#1Name',\MessageBreak
- '\string\PrintDescribe#1' and
- the environment '#2' but\MessageBreak
- not all of them are defined.\MessageBreak
- Maybe you wanted to use
- '\string\NewDocElement'?}%
-}
-\newcommand\NewDocElement[3][]{%
- \@ifundefined{Print#2Name}%
- {\@ifundefined{PrintDescribe#2}%
- {\@ifundefined{#3}%
- {\@ifundefined{end#3}%
- {\@NewDocElement{#1}}%
- \doc@declareerror
- }\doc@declareerror
- }\doc@declareerror
- }\doc@declareerror
- {#2}{#3}%
-}
-\newcommand\RenewDocElement[3][]{%
- \@ifundefined{Print#2Name}\doc@notdeclarederror
- {\@ifundefined{PrintDescribe#2}\doc@notdeclarederror
- {\@ifundefined{#3}\doc@notdeclarederror
- {\@ifundefined{end#3}\doc@notdeclarederror
- {\@NewDocElement{#1}}%
- }%
- }%
- }%
- {#2}{#3}%
-}
-\def\@NewDocElement#1#2#3{%
- \doc@macrolikefalse
- \doc@topleveltrue
- \def\doc@idxtype{#3}%
- \def\doc@idxgroup{#3s}%
- \let\doc@printtype\@empty
- \setkeys{doc}{#1}%
- \ifx\doc@printtype\@empty
- \@temptokena{}%
- \else
- \@temptokena\expandafter{\expandafter
- \textnormal\expandafter{\expandafter
- \space\expandafter
- (\doc@printtype)}}%
- \fi
- \@nameedef{Print#2Name}##1{%
- {\noexpand\MacroFont
- \ifdoc@macrolike
- \noexpand\string
- \fi
- ##1%
- \the\@temptokena
- }}%
- \expandafter\let\csname PrintDescribe#2\expandafter\endcsname
- \csname Print#2Name\endcsname
- \edef\doc@expr{%
- \ifdoc@macrolike
- \noexpand\doc@createspecialmacrolikeindexes
- \else
- \noexpand\doc@createspecialindexes
- \fi
- {#2}%
- }%
- \expandafter\expandafter\expandafter
- \doc@expr
- \expandafter\expandafter\expandafter
- {\expandafter\doc@idxtype\expandafter}\expandafter
- {\doc@idxgroup}%
- \doc@createdescribe{#2}%
- \ifdoc@macrolike
- \doc@createenv{TT}{#2}{#3}%
- \else
- \doc@createenv{TF}{#2}{#3}%
- \fi
-}
-
-
-\NewDocElement[macrolike = true ,
- idxtype = ,
- idxgroup = ,
- printtype =
- ]{Macro}{macro}
-
-\def\SpecialMainIndex{\SpecialMainMacroIndex}
-
-\def\SpecialUsageIndex{\SpecialMacroIndex}
-
-\def\SpecialIndex {\CodeMacroIndex{code}}
-
-\NewDocElement[macrolike = false ,
- idxtype = env. ,
- idxgroup = environments ,
- printtype = \textit{env.}
- ]{Env}{environment}
-
-
-\DeclareRobustCommand\cs[1]{\texttt{\bslash #1}}
-
\endinput
%%
-%% End of file `doc-v3beta.sty'.
+%% End of file `doc.sty'.
diff --git a/macros/latex/base/doc-code.pdf b/macros/latex/base/doc-code.pdf
new file mode 100644
index 0000000000..9d52323c41
--- /dev/null
+++ b/macros/latex/base/doc-code.pdf
Binary files differ
diff --git a/macros/latex/base/doc-code.tex b/macros/latex/base/doc-code.tex
new file mode 100644
index 0000000000..6457d22e03
--- /dev/null
+++ b/macros/latex/base/doc-code.tex
@@ -0,0 +1,4 @@
+% this will typeset documentation + code
+
+\AtBeginDocument{\AlsoImplementation}
+\input{doc.dtx}
diff --git a/macros/latex/base/doc.dtx b/macros/latex/base/doc.dtx
index 41bc073315..d6b21744df 100644
--- a/macros/latex/base/doc.dtx
+++ b/macros/latex/base/doc.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
-% The LaTeX Project and any individual authors listed elsewhere
+% Copyright 1993-2022
+% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the LaTeX base system.
@@ -33,10 +33,20 @@
% ^^A category for `<'
%\catcode`\<=14
%<+package|shortvrb>\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-%<+package> \ProvidesPackage{doc}
+%<+package>
+%<+package>\providecommand\DeclareRelease[3]{}
+%<+package>\providecommand\DeclareCurrentRelease[2]{}
+%<+package>
+%<+package>\DeclareRelease{v2.1g}{2016-02-15}
+%<+package> {doc-2016-02-15.sty}
+%<+package>\DeclareRelease{v2}{2021-06-01}
+%<+package> {doc-2021-06-01.sty}
+%<+package>\DeclareCurrentRelease{v3}{2022-06-01}
+%<+package>
+%<+package>\ProvidesPackage{doc}
%<+shortvrb>\ProvidesPackage{shortvrb}
-%<+package|shortvrb> [2021/10/04 v2.1n
-%<+package|shortvrb> Standard LaTeX documentation package (FMi)]
+%<+package|shortvrb> [2022/06/08 v3.0j
+%<+package|shortvrb> Standard LaTeX documentation package V3 (FMi)]
%\catcode`\<=12
%
%%
@@ -47,7 +57,7 @@
%
%
%% Package `doc' to use with LaTeX 2e
-%% Copyright (C) 1989-2020 Frank Mittelbach, all rights reserved.
+%% Copyright (C) 1989-2022 Frank Mittelbach, all rights reserved.
%
%
% Version: Date: Changes:
@@ -128,18 +138,104 @@
% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
% \DoNotIndex{\bfdefault}
%
-% \MakeShortVerb{\"}
+% \MakeShortVerb{\|}
% \setcounter{StandardModuleDepth}{1}
%
% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print
-% \gdef\dimenvalue#1pt{$#1$pt}} ^^A register values with a - sign
+% \gdef\dimenvalue#1pt{$#1$pt}} ^^A a register value with a - sign
+%
+% \newcommand{\DOC}{\texttt{doc}\xspace}
+%
+% \changes{v3.0j}{2022/06/02}{Use \cs{providecommand} to define \cs{pkg}}
+% \providecommand\env{\texttt}
+% \providecommand\opt{\texttt}
+% \providecommand\cls{\texttt}
+% \providecommand\pkg{\texttt}
+% \providecommand\prg{\textsf}
+%
+% \newcommand\DOX{\env{DoX}\xspace}
+% \newcommand\api{\textsc{api}\xspace}
+%
+% \newcommand\fmi[1]{\par\textbf{TODO: }\textit{#1}\par}
+%
+% \newcommand\NewIn[1]{\leavevmode
+% \marginpar{\hfill\fbox{\fbox{New in #1}}\hspace*{1em}}\ignorespaces}
+%
+%
+%\RenewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = ,
+% idxgroup = LaTeX comands\actualchar\LaTeX{} commands ,
+% printtype =
+% ]{Macro}{macro}
+%
+%\RenewDocElement[macrolike = false ,
+% toplevel = false,
+% idxtype = env. ,
+% idxgroup = Package environments,
+% printtype = \textit{env.}
+% ]{Env}{environment}
+%
+%
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = ,
+% idxgroup = Package commands,
+% printtype =
+% ]{InterfaceMacro}{imacro}
+%
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = ,
+% idxgroup = Package commands (obsolete),
+% printtype =
+% ]{ObsoleteInterfaceMacro}{omacro}
+%
+%\NewDocElement[macrolike = false ,
+% toplevel = false,
+% idxtype = counter ,
+% idxgroup = LaTeX counters\actualchar \LaTeX{} counters ,
+% printtype = \textit{counter}
+% ]{LaTeXCounter}{lcounter}
+%
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = counter ,
+% idxgroup = TeX counters\actualchar \protect\TeX{} counters ,
+% printtype = \textit{counter}
+% ]{TeXCounter}{tcounter}
+%
+%
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = skip ,
+% idxgroup = LaTeX length\actualchar \LaTeX{} length (skip) ,
+% printtype = \textit{skip}
+% ]{LaTeXSkip}{lskip}
+%
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = dimen ,
+% idxgroup = LaTeX length\actualchar \LaTeX{} length (dimen) ,
+% printtype = \textit{dimen}
+% ]{LaTeXDimen}{ldimen}
+%
+%\NewDocElement[macrolike = false ,
+% toplevel = false,
+% idxtype = option ,
+% idxgroup = Package options ,
+% printtype = \textit{option}
+% ]{Option}{option}
+%
+% \renewcommand\code[1]{\mbox{$\ell$-#1}}
+% \renewcommand\main[1]{\underline{\mbox{$\ell$-#1}}}
+% \setcounter{IndexColumns}{2}
%
-% \newcommand{\DOC}{\texttt{doc}}
%
% \changes{v1.9t}{1995/05/11}{Use \cs{GetFileInfo}}
% \GetFileInfo{doc.sty}
%
-% \CheckSum{2213} ^^A % keep the checksum in this file
+% \CheckSum{0} ^^A % keep the checksum in this file but not now :-)
%
% \title{The \DOC{} and \texttt{shortvrb} Packages\thanks
% {This file has version number \fileversion{} dated \filedate{}.}}
@@ -149,190 +245,77 @@
% provided by Andrew Mills; fairly substantial additions,
% particularly from \texttt{newdoc}, and
% documentation of post-v1.5q features added at v1.7a by Dave
-% Love (SERC Daresbury Lab). Extraction of \texttt{shortvrb}
-% package added by Joachim Schrod (TU~Darmstadt).}}
+% Love (SERC Daresbury Lab).}~\thanks
+% {Extraction of \texttt{shortvrb}
+% package added by Joachim Schrod (TU~Darmstadt).}~\thanks
+% {Version~3 now integrates code from Didier Verna's
+% \DOX package and some of his documentation was
+% reused (a.k.a.\ stolen).}}
+% \date{Printed \today}
%
% \MaintainedByLaTeXTeam{latex}
+%
% \maketitle
%
% \begin{abstract}
-% This package contains the definitions that are necessary to
-% format the documentation of package files. The package was
-% developed in Mainz in cooperation with the Royal Military College
-% of Science. This is an update which documents various changes
-% and new features in \DOC{} and integrates the features of
-% \textsf{newdoc}.
+% Roughly 30 years ago (version 1.0 was dated 1988/05/05) I wrote
+% the first version of the \DOC package, a package to provide code
+% documentation for \TeX{} code. Since then it has be used all over
+% the place to document the \LaTeX{} kernel and most of the
+% packages that are nowadays available. The core code of version 2
+% (which is the current version) exists since 1998, i.e., for 20
+% years.
+%
+% If I would restart from scratch I would do a lot of things
+% differently these days and in fact several other people have
+% tried to come up with better solutions. However, as the saying
+% goes, a bad standard is better than none, \DOC has prevailed and
+% changing it now in incompatible ways is probably not really
+% helpful.
+%
+% So this is version 3 of the package with some smaller extensions
+% that are upwards compatible but hopefully serve well. Most
+% important modifications are the integration of the
+% \pkg{hypdoc} package to enable links within the document (in
+% particular from the index) if so desired. Also integrated are the
+% ideas from the \DOX package by Didier Verna (although I
+% offer a different interface that imho fits better with the rest
+% of \DOC's interfaces). Finally I updated a few odds and ends.
% \end{abstract}
%
-% \newif\ifmulticols
-% \IfFileExists{multicol.sty}{\multicolstrue}{}
%
-% \ifmulticols
+% \newpage
+%
% \addtocontents{toc}{\protect\begin{multicols}{2}}
-% \fi
%
-% {\parskip 0pt ^^A We have to reset \parskip
+% ^^A{\parskip 0pt ^^A We have to reset \parskip
% ^^A (bug in \LaTeX)
% \tableofcontents
-% }
+% ^^A}
%
% \changes{v1.7a}{1992/02/25}{Miscellaneous small changes to the text}
+% \changes{v3.0a}{2018/03/04}{Integrated DoX package}
+% \changes{v3.0a}{2018/03/04}{Interfaced hypdoc package}
%
-% \ifmulticols
-% \begin{multicols}{2}[\section*{Preface to version 1.7}]
-% \else \section*{Preface to version 1.7} \fi
-%
-% This version of \texttt{doc.dtx} documents changes which have occurred
-% since the last published version \cite{art:doc} but which have been
-% present in distributed versions of \texttt{doc.sty} for some time. It
-% also integrates the (undocumented) features of the distributed
-% \texttt{newdoc.sty}.
-%
-% The following changes and additions have been made to the user
-% interface since the published version~\cite{art:doc}. See
-% \S\ref{sec:interface} for more details.
-% \begin{description}
-% \item[Driver mechanism] "\DocInput" is now used in the driver file
-% to input possibly multiple independent \DOC{} files and \DOC{} no
-% longer has to be the last package. "\IndexListing" is replaced
-% by "\IndexInput";
-% \item[Indexing] is controlled by "\PageIndex" and "\CodelineIndex",
-% one of which must be specified to produce an index---there is no
-% longer a "\makeindex" in the default "\DocstyleParms";
-% \item[The \texttt{macro} environment] now takes as argument the
-% macro name {\em with\/} the backslash;
-% \item[Verbatim text] Newlines are now forbidden inside "\verb" and
-% commands "\MakeShortVerb" and "\DeleteShortVerb" are provided for
-% verbatim shorthand;
-% \item[\texttt{\bslash par}] can now be used in "\DoNotIndex";
-% \item[Checksum/character table support] for ensuring the integrity
-% of distributions is added;
-% \item[\texttt{\bslash printindex}] becomes "\PrintIndex";
-% \item[\texttt{multicol.sty}] is no longer necessary to use \DOC{} or
-% print the documentation (although it is recommended);
-% \item[`Docstrip' modules] are recognised and formatted specially.
-% \end{description}
-%
-% As well as adding some completely new stuff,
-% the opportunity has been taken to add some commentary to the code
-% formerly in \texttt{newdoc.sty} and that added after version 1.5k of
-% \texttt{doc.sty}. Since (as noted in the sections concerned) this
-% commentary wasn't written by Frank Mittelbach but the code was, it is
-% probably {\em not\/} true in this case that ``if the code and
-% comments disagree both are probably wrong''!
%
-% \subsection*{Bugs}
%
-% There are some known bugs in this version:
-% \begin{itemize}
-% \item The "\DoNotIndex" command doesn't work for some single
-% character commands most noticeable "\%".
-% \item The `General changes' glossary entry would come out after
-% macro names with a leading "!" and possibly a leading |"|;
-% \item If you have an old version of \textsf{makeindex} long "\changes"
-% entries will come out strangely and you may find the section
-% header amalgamated with the first changes entry. Try to get an
-% up-to-date one (see p.~\pageref{makeindex:version});
-% \item Because the accompanying \textsf{makeindex} style files support
-% the inconsistent attribute specifications of older and newer
-% versions \textsf{makeindex} always complains about three `unknown
-% specifier's when sorting the index and changes entries.
-% \item If "\MakeShortVerb" and "\DeleteShortVerb" are used with
-% single character arguments, e.g., "{|}" instead of "{\|}" chaos
-% may happen.
-% \end{itemize}
-% (Some `features' are documented below.)
-%
-% \subsection*{Wish list}
-%
-% \begin{itemize}
-% \item Hooks to allow "\DescribeMacro" and "\DescribeEnv" to write
-% out to a special file information about the package's `exported'
-% definitions which they describe. This could subsequently be
-% included in the \texttt{docstrip}ped \texttt{.sty} file in a
-% suitable form for use by smart editors in command completion,
-% spelling checking etc., based on the packages used in a document.
-% This would need agreement on a `suitable form'. \item Indexing of
-% the modules used in \texttt{docstrip}'s "%<" directives. I'm not
-% sure how to index directives containing module combinations; \item
-% Writing out bibliographic information about the package; \item Allow
-% turning off use of the special font for, say, the next guarded
-% block.
-% \end{itemize}
-%
-% \ifmulticols
-% \end{multicols}
-%
-% \begin{multicols}{2}[\medskip \rule{\textwidth}{.3pt}
-% \section{Introduction}]
-% \else
% \section{Introduction}
-% \fi
-%
-% The \TeX{} macros which are described here allow definitions and
-% documentation to be held in one and the same file. This has the
-% advantage that normally very complicated instructions are made
-% simpler to understand by comments inside the definition. In addition
-% to this, updates are easier and only one source file needs to be
-% changed. On the other hand, because of this, the package files are
-% considerably longer: thus \TeX{} takes longer to load them. If this
-% is a problem, there is an easy remedy: one needs only to run the
-% \texttt{docstrip.tex} program that removes nearly all lines that begin
-% with a
-% percent sign.
%
-% The idea of integrated documentation was born with the development
-% of the \TeX{} program; it was crystallized in Pascal with the \Web{}
-% system. The advantages of this method are plain to see (it's easy
-% to make comparisons \cite{art:Knuthliterat}). Since this
-% development, systems similar to \Web{} have been developed for other
-% programming languages. But for one of the most complicated
-% programming languages (\TeX) the documentation has however been
-% neglected. The \TeX{} world seems to be divided between:---
-% \begin{itemize} \item a couple of ``wizards'', who produce many
-% lines of completely unreadable code ``off the cuff'', and \item many
-% users who are amazed that it works just how they want it to do. Or
-% rather, who despair that certain macros refuse to do what is
-% expected of them.\end{itemize}
+% This is a new version of the \DOC package, written roughly 30 years
+% after the initial release. As the package has been used for so long
+% (and largely unchanged)
+% it is absolutely important to preserve existing interfaces, even if
+% we can agree that they could have been done better.
%
-% I do not think that the \Web{} system is {\em the\/} reference work;
-% on the contrary, it is a prototype which suffices for the
-% development of programs within the \TeX{} world. It is sufficient,
-% but not totally sufficient.\footnote{I know that this will be seen
-% differently by a few people, but this product should not be seen as
-% the finished product, at least as far as applications concerning
-% \TeX{} are concerned. The long-standing debate over `multiple
-% change files' shows this well.} As a result of \Web, new programming
-% perspectives have been demonstrated; unfortunately, though, they
-% haven't been developed further for other programming languages.
+% So this is a light-weight change, basically adding hyperlink support
+% and adding a way to provide generally \DOC elements (not just macros
+% and environments) and try to do this properly (which wasn't the case
+% for environments either in the past). The ideas for this have been
+% stolen from the \DOX package by Didier Verna even though I
+% didn't keep his interfaces.
%
-% The method of documentation of \TeX{} macros which I have introduced
-% here should also only be taken as a first sketch. It is designed
-% explicitly to run under \LaTeX{} alone. Not because I was of the
-% opinion that this was the best starting point, but because from this
-% starting point it was the quickest to develop.\footnote{This
-% argument is a bad one, however, it is all too often trotted out.} As
-% a result of this design decision, I had to move away from the
-% concept of modularization; this was certainly a step backward.
-%
-% I would be happy if this article could spark off discussion over
-% \TeX\ documentation. I can only advise anyone who thinks that they
-% can cope without documentation to ``Stop Time'' until he or she
-% completely understands the \AmSTeX{} source code.
-%
-%
-%
-%
-%
-% \subsection{Using the \DOC{} package}
-%
-% Just like any other package, invoke it by requesting it with a
-% |\usepackage| command in the preamble. \textsf{Doc}'s use of
-% |\reversemarginpars| may make it incompatible with some classes.
-% \changes{v1.7a}{1992/02/25}{Altered usage info}
-%
-%
-% \ifmulticols\end{multicols}\fi
+% Most of the documentation below is from the earlier release which
+% accounts for some inconsistencies in presentation, mea culpa.
%
%
% \section{The User Interface}\label{sec:interface}
@@ -342,36 +325,38 @@
% package one has to prepare a special driver file which produces the
% formatted document. This driver file has the following
% characteristics:
-%
-% \noindent |\documentclass[|\meta{options}]^^A
-% |{|\meta{document-class}|}|\\[1pt]
+% \begin{quote}
+% \noindent |\documentclass|\oarg{options}^^A
+% \marg{document-class}\\[1pt]
% |\usepackage{doc}|\\[3pt]
% \hspace*{10pt}\meta{preamble}\\[3pt]
% |\begin{document}|\\[3pt]
% \hspace*{10pt}\meta{special input commands}\\[3pt]
% |\end{document}|
-%
-% The \meta{document-class} might be any document class, I normally
+% \end{quote}
+% The \meta{document-class} might be any document class, I usually
% use \texttt{article}.
%
% In the \meta{preamble} one should place declarations which
% manipulate the behavior of the \DOC{} package like
% |\DisableCrossrefs| or |\OnlyDescription|.
%
-% \DescribeMacro\DocInput \DescribeMacro\IndexInput
-% Finally the \meta{special input commands} part should contain one or
-% more |\DocInput|\meta{file name} and/or
-% |\IndexInput|\meta{file name} commands. The
+%
+% \DescribeInterfaceMacro\DocInput \DescribeInterfaceMacro\IndexInput
+% Finally
+% the \meta{special input commands} part should contain one or
+% more |\DocInput|\marg{file name} and/or
+% |\IndexInput|\marg{file name} commands. The
% |\DocInput| command is used for files prepared for the
% \DOC{} package whereas |\IndexInput| can be used for all kinds of
% macro files. See page \pageref{..Input} for more details of
-% "\IndexInput". Multiple "\DocInput"s can be used with a
+% |\IndexInput|. Multiple |\DocInput|s can be used with a
% number of included files which are each self-contained
% self-documenting packages---for instance, each containing
-% "\maketitle".
+% |\maketitle|.
%
% As an example, the driver file for the \DOC{} package itself is
-% the following text surrounded by "%<*driver>" and "%</driver>".
+% the following text surrounded by |%<*driver>| and |%</driver>|.
% To produce the documentation you can simply run the \texttt{.dtx}
% file through \LaTeX{} in which case this code will be executed
% (loading the document class \texttt{ltxdoc}, etc.) or you can
@@ -379,7 +364,7 @@
% the \texttt{docstrip} program.
% The line numbers below are added by
% \DOC{}'s formatting.
-% Note that the class \textsf{ltxdoc} has the \DOC{} package
+% Note that the class \cls{ltxdoc} has the \DOC{} package
% preloaded.
% \changes{v1.7a}{1992/03/06}{Added
% docstrip-derivable driver file as example.}
@@ -387,20 +372,83 @@
% \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
+
+\usepackage[T1]{fontenc}
+\usepackage{xspace}
+
+\OnlyDescription
+
\EnableCrossrefs
- %\DisableCrossrefs % Say \DisableCrossrefs if index is ready
+ %\DisableCrossrefs % Say \DisableCrossrefs if index is ready
\CodelineIndex
-\RecordChanges % Gather update information
- %\OnlyDescription % comment out for implementation details
- %\OldMakeindex % use if your MakeIndex is pre-v2.9
-\setlength\hfuzz{15pt} % dont make so many
-\hbadness=7000 % over and under full box warnings
+\RecordChanges % Gather update information
+\SetupDoc{reportchangedates}
+ %\OnlyDescription % comment out for implementation details
+\setlength\hfuzz{15pt} % don't show so many
+\hbadness=7000 % over- and underfull box warnings
\begin{document}
\DocInput{doc.dtx}
\end{document}
%</driver>
% \end{macrocode}
%
+% \RecordIndexType{\CodelineIndex}{InterfaceMacro}
+% \RecordIndexType{\DisableCrossrefs}{InterfaceMacro}
+% \RecordIndexType{\DocInput}{InterfaceMacro}
+% \RecordIndexType{\EnableCrossrefs}{InterfaceMacro}
+% \RecordIndexType{\OnlyDescription}{InterfaceMacro}
+% \RecordIndexType{\RecordChanges}{InterfaceMacro}
+% \RecordIndexType{\hbadness}{TeXCounter}
+% \RecordIndexType{\hfuzz}{LaTeXDimen}
+%
+%
+% \subsection{Package options}
+%
+% \NewIn{v3}
+% Starting with version~3 the \DOC package now offers a small number
+% of package options to modify its overall behavior. These are:
+% \DescribeOption[noprint]{multicol}
+% \DescribeOption[noprint]{nomulticol}
+% \DescribeOption[noprint]{hyperref}
+% \DescribeOption[noprint]{nohyperref}
+% \DescribeOption[noprint]{debugshow}
+% \DescribeOption[noprint]{noindex}
+% \DescribeOption[noprint]{noprint}
+% \DescribeOption[noprint]{reportchangedates}
+% \begin{description}
+% \item[\opt{hyperref}, \opt{nohyperref}] Boolean (default \texttt{true}). Load the
+% \pkg{hyperref} package and make index references to code lines
+% and pages and other items clickable links. \opt{nohyperref} is
+% the complementary key.
+%
+% \item[\opt{multicol}, \opt{nomulticol}] Boolean (default \texttt{true}). Load the
+% \pkg{multicol} package for use in typesetting the index and the
+% list of changes. \opt{nomulticol} is
+% the complementary key.
+%
+% \item[\opt{debugshow}] Boolean (default \texttt{false}). Provide
+% various tracing information at the terminal and in the transcript
+% file. In particular show which elements are indexed.
+%
+% \item[\opt{noindex}] Boolean (default \texttt{false}). If set, all
+% automatic indexing is suppressed. This option can also be used on
+% individual elements as described below.
+%
+% \item[\opt{noprint}] Boolean (default \texttt{false}). If set, then
+% printing of element names in the margin will be suppressed. This
+% option can also be used on individual elements as described
+% below.
+% \item[\opt{reportchangedates}] Boolean (default \texttt{false}). If
+% set, then change entries list the date after the version number in
+% the change log.
+% \end{description}
+%
+% \DescribeInterfaceMacro{\SetupDoc} Instead of providing options to the \DOC
+% package you can call \cs{SetupDoc} and provide them there. This
+% allows, for example, to change default values in case \DOC was already
+% loaded earlier.
+%
+%
%
% \subsection{General conventions}
%
@@ -413,10 +461,18 @@
% \LaTeX{} commands except that the character `|%|' cannot be
% used as a comment character.
% \SortIndex{\string^\string^A}{\string\verb\verbatimchar
-% \string^\string^A\verbatimchar \encapchar usage} To allow user
-% comments, the |^^A| character is defined as a comment character
-% later on. Such `metacomments' may be also be included simply by
-% surrounding them with "\iffalse" \ldots~"\fi".
+% \string^\string^A\verbatimchar \encapchar usage}^^A
+% \SortIndex{\string^\string^X}{\string\verb\verbatimchar
+% \string^\string^X\verbatimchar \encapchar usage}
+% To allow user
+% comments, the characters |^^A| and |^^X| are both defined as a comment character
+% later on.\footnote{In version 2 it was only
+% \texttt{\string^\string^A}, but many keyboards combine
+% \texttt{\string^} and \texttt{A} and automatically turn it into
+% ``Ä''; so \texttt{\string^\string^X} was added as an
+% alternative in version 3.}
+% Such `metacomments' may be also be included simply by
+% surrounding them with |\iffalse| \ldots~|\fi|.
%
% All other parts of the file are called `definition parts'. They
% contain fractions of the macros described in the `documentation
@@ -430,13 +486,17 @@
% \DescribeEnv{macrocode}
% On the other hand, if the documentation of these macros is to be
% produced, the `definition parts' should be typeset verbatim. To
-% achieve this, these parts are surrounded by the \textsf{macrocode}
+% achieve this, these parts are surrounded by the \env{macrocode}
% environment.
% More exactly: before a `definition part' there should be a line
-% containing\\
-% \hspace*{\MacroIndent}\verb*+% \begin{macrocode}+\\
-% and after this part a line\\
-% \hspace*{\MacroIndent}\verb*+% \end{macrocode}+\\
+% containing
+% \begin{flushleft}
+% \hspace*{\MacroIndent}\verb*+% \begin{macrocode}+
+% \end{flushleft}
+% and after this part a line
+% \begin{flushleft}
+% \hspace*{\MacroIndent}\verb*+% \end{macrocode}+
+% \end{flushleft}
% There must be {\em exactly\/} four spaces between the |%|
% and |\end{macrocode}| --- \TeX{} is looking for this string
% and not for the macro while processing a `definition part'.
@@ -444,16 +504,16 @@
% Inside a `definition part' all \TeX{} commands are allowed; even the
% percent sign could be used to suppress unwanted spaces etc.
%
-% \DescribeEnv{macrocode*} Instead of the \textsf{macrocode}
-% environment one can also use the \textsf{macrocode$*$} environment
+% \DescribeEnv{macrocode*} Instead of the \env{macrocode}
+% environment one can also use the \env{macrocode$*$} environment
% which produces the same results except that spaces are printed as
% \nopagebreak\verb*+ + characters.
%
%
%
-% \subsection{Describing the usage of new macros}
+% \subsection{Describing the usage of macros and environments}
%
-% \DescribeMacro\DescribeMacro
+% \DescribeInterfaceMacro\DescribeMacro
% When you describe a new macro you may use |\DescribeMacro| to
% indicate that at this point the usage of a specific macro is
% explained. It takes one argument which will be printed in the margin
@@ -461,35 +521,38 @@
% |\DescribeMacro{\DescribeMacro}| to make clear that this is the
% point where the usage of |\DescribeMacro| is explained.
%
-% \DescribeMacro\DescribeEnv
-% An analogous macro |\DescribeEnv| should be used to indicate
-% that a \LaTeX{} environment is explained. It will produce a somewhat
-% different index entry. Below I used |\DescribeEnv{verbatim}|.
+% As the argument to |\DescribeMacro| is a command name, many people
+% got used to using the (incorrect) short form, i.e., omitting the
+% braces around the argument as in |\DescribeMacro\foo|. This does
+% work as long as the macro name consists only of ``letters''.
+% However, if the name contains special characters that are normally
+% not of type ``letter'' (such as |@|, or in case of \pkg{expl3} |_|
+% and |:|) this will fail dramatically. |\DescribeMacro| would then
+% receive only a partial command name (up to the first ``non-letter'')
+% e.g., |\DescribeMacro\foo@bar| would be equivalent to
+% |\DescribeMacro{\foo} @bar| and you can guess that this can
+% resulting in both incorrect output and possibly low-level error
+% messages.
+%
+% \DescribeInterfaceMacro\DescribeEnv
+% An analogous macro |\DescribeEnv| should be used to indicate that a
+% \LaTeX{} environment is explained. It will produce a somewhat
+% different index entry and a slightly different display in the
+% margin. Below I used |\DescribeEnv{verbatim}|.
%
-% \DescribeEnv{verbatim}
-% It is often a good idea to include examples of the usage of new macros
-% in the text. Because of the |%| sign in the first column of every
-% row, the \textsf{verbatim} environment is slightly altered to suppress
-% those
-% characters.\footnote{These macros were written by Rainer
-% Sch\"opf~\cite{art:verbatim}. He also
-% provided a new \textsf{verbatim} environment
-% which can be used inside of other macros.}
-% \DescribeEnv{verbatim*}
-% The \textsf{verbatim$*$} environment is changed in the same way.
-% \changes{v1.7a}{1992/02/26}{Documented \cs{verb} change.}
-% \DescribeMacro\verb
-% The "\verb" command is re-implemented to give an error report if a
-% newline appears in its argument.
-% The \textsf{verbatim} and \textsf{verbatim$*$} environments set text
-% in the style defined by "\MacroFont"~(\S\ref{sec:macrofont}).
%
+% \NewIn{v3}
+% Starting with version~3 the \cs{Describe...} commands accept an
+% optional argument in which you can specify either \opt{noindex}
+% or \opt{noprint} to suppress indexing or printing for that
+% particular instance. Using both would be possible too, but pointless
+% as then the commands wouldn't do anything any more.
%
%
-% \subsection{Describing the definition of new macros}
+% \subsection{Describing the definition of macros and environments}
%
% \DescribeEnv{macro}
-% To describe the definition of a new macro we use the \textsf{macro}
+% To describe the definition of a (new) macro we use the \env{macro}
% environment. It has one argument: the name of the new
% macro.\footnote{This is a change to the style design I described in
% ^^A \TUB ^^A removed in case ltugboat.sty not used
@@ -505,20 +568,26 @@
% labels in the margin are placed under each other.
% \changes{v1.7a}{1992/02/26}{Note on need for some text in macro env.}
% There should be some text---even if it's just an empty
-% "\mbox{}"---in this environment before "\begin{macrocode}" or the
+% |\mbox{}|---in this environment before |\begin{macrocode}| or the
% marginal label won't print in the right place.
%
-% \DescribeMacro\MacrocodeTopsep
-% \DescribeMacro\MacroTopsep
+% \NewIn{v3}
+% In fact it is now allowed to specify several macros in the argument,
+% separated by commas. This is a short form for starting several
+% \env{macro} environments in direct succession. Of course, you
+% should then have also only one matching |\end{macro}|.
+%
+% \DescribeLaTeXSkip\MacrocodeTopsep
+% \DescribeLaTeXSkip\MacroTopsep
% There also exist four style parameters: |\MacrocodeTopsep| and
% |\MacroTopsep| are used to control the vertical spacing above
-% and below the \textsf{macrocode} and the \textsf{macro}
-% \DescribeMacro\MacroIndent
+% and below the \env{macrocode} and the \env{macro}
+% \DescribeLaTeXDimen\MacroIndent
% environment, |\MacroIndent| is used to indent the lines of code
% and
-% \DescribeMacro\MacroFont \label{sec:macrofont}
+% \DescribeInterfaceMacro\MacroFont \label{sec:macrofont}
% |\MacroFont| holds the font and a possible size change command
-% for the code lines, the "verbatim"["*"] environment and the macro
+% for the code lines, the |verbatim|[|*|] environment and the macro
% names printed in the margin. If you want
% to change their default values in a
% class file (like \texttt{ltugboat.cls}) use the |\DocstyleParms|
@@ -526,17 +595,34 @@
% be changed directly as long as the redefinition happens before
% the |\begin{document}|.
%
+% \DescribeEnv{environment}
+% For documenting the definition of environments one can use the
+% environment \texttt{environment} which works like the \texttt{macro}
+% environment, except that it expects an \meta{env-name}
+% (without a backslash)
+% as its argument and internally provides different index
+% entries suitable for environments.
+% Nowadays you can alternatively specify a comma-separated list of environments.
+%
+% \NewIn{v3}
+% Starting with version~3 these environments accept an optional
+% argument in which you can specify \opt{noindex} or \opt{noprint} or
+% both to suppress indexing or printing for that particular
+% instance. If any such setting is made on the environment level it
+% overwrites whatever default was given when the \DOC element was
+% defined or when the package was loaded.
+%
%
%
%
-% \subsection{Formatting the margins}
+% \subsection{Formatting names in the margin}
%
-% \DescribeMacro\PrintDescribeMacro
-% \DescribeMacro\PrintDescribeEnv
-% \DescribeMacro\PrintMacroName
-% \DescribeMacro\PrintEnvName
-% As mentioned earlier, some macros and the \textsf{macro} environment
-% print their arguments in the margin. This is actually done by four
+% \DescribeInterfaceMacro\PrintDescribeMacro
+% \DescribeInterfaceMacro\PrintDescribeEnv
+% \DescribeInterfaceMacro\PrintMacroName
+% \DescribeInterfaceMacro\PrintEnvName
+% As mentioned earlier, some macros and environment
+% print their arguments in the margin. The actual formatting is done by four
% macros which are user
% definable.\footnote{You may place the changed definitions in a
% separate package
@@ -544,33 +630,157 @@
% file.
% For example, if you don't like any names in the
% margin
-% but want a fine index you can simply
-% \texttt{\bslash let}
-% these macros equal \texttt{\bslash @gobble}.
-% The doc package won't redefine any existing
-% definitions of these macros.}
-% They are named |\PrintDescribeMacro|, |\PrintDescribeEnv|,
-% |\PrintMacroName| (called by the \textsf{macro} environment) and
-% |\PrintEnvName| (called by the \textsf{environment} environment).
+% but want a fine index you can simply redefine them
+% accept their argument and do nothing with it.}
+% They are named |\PrintDescribeMacro| and |\PrintDescribeEnv| (defining
+% how |\DescribeMacro| and |\DescribeEnv| behave) and
+% |\PrintMacroName| and
+% |\PrintEnvName| (called by the \env{macro} and \env{environment}
+% environments, respectively).
+%
+%
+% \subsection{Providing further documentation items}
+%
+% Out of the box the \DOC package offers the above commands and
+% environments to document macros and environments.
+% \NewIn{v3}
+% With version 3
+% this has now been extended in a generic fashion so that you can
+% easily provide your own items, such as counters, length register,
+% options etc.
+%
+% \DescribeInterfaceMacro{\NewDocElement}
+% The general syntax for providing a new \DOC element is
+% \begin{quote}
+% \cs{NewDocElement}\oarg{options}\marg{element-name}\marg{env-name}
+% \end{quote}
+% By convention the \meta{element-name} has the first letter
+% uppercased as in \texttt{Env} or \texttt{Macro}.
+%
+% Such a declaration will define for you
+% \begin{itemize}
+% \item the command |\Describe|\meta{element-name} which has the
+% syntax
+% \begin{quote}
+% |\Describe|\meta{element-name}\oarg{options}\marg{element}
+% \end{quote}
+%
+% \item the environment \meta{env-name} which has the syntax
+% \begin{quote}
+% \cs{begin}\marg{env-name}\oarg{options}\marg{element}
+% \end{quote}
+%
+% \item the display command |\PrintDescribe|\meta{element-name} with
+% the syntax
+% \begin{quote}
+% |\PrintDescribe|\meta{element-name}\marg{element}
+% \end{quote}
+%
+% \item and the
+% |\Print|\meta{element-name}|Name| display command for the
+% environment.
+% \end{itemize}
+% If any of the commands or the environment is already defined (which
+% especially with the \meta{env-name} is a danger) then you will
+% receive an error telling you so.
+%
+% \DescribeInterfaceMacro{\RenewDocElement}
+% If you want to modify an existing \DOC element use
+% |\RenewDocElement| instead.
+%
+% For example, the already provided ``\texttt{Env}'' \DOC element could have been
+% defined simply by making the declaration
+% |\NewDocElement{Env}{environment}|
+% though that's not quite what has been done, as we will see later.
+%
+% \DescribeOption[noprint]{macrolike}
+% \DescribeOption[noprint]{envlike}
+% \DescribeOption[noprint]{toplevel}
+% \DescribeOption[noprint]{notoplevel}
+% \DescribeOption[noprint]{idxtype}
+% \DescribeOption[noprint]{printtype}
+% \DescribeOption[noprint]{idxgroup}
+% The \meta{options} are keyword/value and define further details on
+% how that \DOC element should behave. They are:
+% \begin{description}
+% \item[\opt{macrolike}] Boolean (default \opt{false}). Does this \DOC
+% element starts with a backslash?
+%
+% \item[\opt{envlike}] Boolean. Complementary option to
+% \opt{macrolike}.
+%
+% \item[\opt{toplevel}] Boolean (default \opt{true}). Should all
+% a top-level index entry be made? If set to \texttt{false} then
+% either no index entries are produced or only grouped index entries
+% (see \opt{idxgroup} for details).
+%
+% \item[\opt{notoplevel}] Boolean. Complementary option to
+% \opt{toplevel}.
+%
+% \item[\opt{idxtype}] String (default \meta{env-name}). What to put
+% (in parentheses if non-empty) at the end of a top-level index entry.
+%
+% \item[\opt{printtype}] String (default \meta{env-name}). What to put
+% (in parentheses if non-empty) after an element name in the margin.
+%
+% \item[\opt{idxgroup}] String (default
+% \meta{env-name}\texttt{s}). Name of the top-level index entry if
+% entries are grouped. They are only grouped if this option is
+% non-empty.
+%
+% \item[\opt{noindex}] Boolean (default \texttt{false}). If set this
+% will suppress indexing for elements of this type. This setting
+% overwrite any global setting of \opt{noindex}.
+%
+% \item[\opt{noprint}] Boolean (default \texttt{false}). If set this
+% will suppress printing the element name in the margin. This setting
+% overwrite any global setting of \opt{noprint}.
+% \end{description}
+% As usual giving a boolean option without a value sets it to
+% \texttt{true}.
+
+
+
+
+% \subsection{Displaying sample code verbatim}
%
+% \DescribeEnv{verbatim}
+% It is often a good idea to include examples of the usage of new macros
+% in the text. Because of the |%| sign in the first column of every
+% row, the \env{verbatim} environment is slightly altered to suppress
+% those
+% characters.\footnote{These macros were written by Rainer
+% Schöpf~\cite{art:verbatim}. He also
+% provided a new \env{verbatim} environment
+% which can be used inside of other macros.}
+% \DescribeEnv{verbatim*}
+% The \env{verbatim$*$} environment is changed in the same way.
+% \changes{v1.7a}{1992/02/26}{Documented \cs{verb} change.}
+% \DescribeInterfaceMacro\verb
+% The |\verb| command is re-implemented to give an error report if a
+% newline appears in its argument.
+% The \env{verbatim} and \env{verbatim$*$} environments set text
+% in the style defined by |\MacroFont|~(\S\ref{sec:macrofont}).
%
+%
+
% \subsection{Using a special escape character}
%
-% \DescribeMacro\SpecialEscapechar
+% \DescribeInterfaceMacro\SpecialEscapechar
% If one defines complicated macros it is sometimes necessary to
% introduce a new escape character because the `|\|' has got a
% special |\catcode|. In this case one can use
% |\SpecialEscapechar| to indicate which character is actually
% used to play the r\^ole of the `|\|'. A scheme like this is
-% needed because the \textsf{macrocode} environment and its counterpart
-% \textsf{macrocode$*$} produce an index entry for every occurrence of a
+% needed because the \env{macrocode} environment and its counterpart
+% \env{macrocode$*$} produce an index entry for every occurrence of a
% macro name. They would be very confused if you didn't tell them that
% you'd changed |\catcode|$\,$s. The argument to
% |\SpecialEscapechar| is a single-letter control sequence, that
-% is, one has to use "\|" for example to denote that `\verb+|+'
+% is, one has to use \verb=\|= for example to denote that `\verb+|+'
% is used as an escape character. |\SpecialEscapechar| only
-% changes the behavior of the next \textsf{macrocode} or
-% \textsf{macrocode$*$} environment.
+% changes the behavior of the next \env{macrocode} or
+% \env{macrocode$*$} environment.
%
% The actual index entries created will all be printed with |\|
% rather than \verb+|+, but this probably reflects their usage, if not
@@ -582,20 +792,24 @@
%
% \subsection{Cross-referencing all macros used}
%
-% \DescribeMacro\DisableCrossrefs \DescribeMacro\EnableCrossrefs As
-% already mentioned, every new macro name used within a
-% \textsf{macrocode} or \textsf{macrocode$*$} environment will produce
-% an index entry. In this way one can easily find out where a specific
-% macro is used. Since \TeX{} is considerably slower when it has to
-% produce such a bulk of index entries one can turn off this feature
-% by using |\DisableCrossrefs| in the driver file. To turn it on again
-% just use |\EnableCrossrefs|.\footnote{Actually, \texttt{\bslash
-% EnableCrossrefs} changes things more drastically; any following
-% \texttt{\bslash DisableCrossrefs} which might be present in the
-% source will be ignored.}
-%
-%
-% \DescribeMacro\DoNotIndex
+% \DescribeInterfaceMacro\DisableCrossrefs \DescribeInterfaceMacro\EnableCrossrefs As
+% already mentioned, every macro name used within a
+% \env{macrocode} or \env{macrocode$*$} environment will produce an
+% index entry. In this way one can easily find out where a specific
+% macro is used. Since \TeX{} is considerably slower\footnote{This
+% comment was written about 30 years ago. \TeX{} is still considerably
+% slower but while it took minutes to process a large document (such
+% as the \LaTeX{} kernel documentation) it takes seconds or less these
+% days. Thus \cs{DisableCrossrefs} isn't really that necessary these
+% days.} when it has to produce such a bulk of index entries one can
+% turn off this feature by using |\DisableCrossrefs| in the driver
+% file. To turn it on again just use
+% |\EnableCrossrefs|.\footnote{Actually, \cs{EnableCrossrefs} changes
+% things more drastically; any following call to \cs{DisableCrossrefs}
+% which might be present in the source will be ignored.}
+%
+%
+% \DescribeInterfaceMacro\DoNotIndex
% But also finer control is provided. The |\DoNotIndex| macro
% takes a list of macro names separated by commas. Those names won't
% show up in the index. You might use several |\DoNotIndex|
@@ -605,26 +819,28 @@
%
% All three above declarations are local to the current group.
%
-% Production (or not) of the index (via the "\makeindex" commend) is
+% Production (or not) of the index (via the |\makeindex| commend) is
% controlled by using or omitting the following declarations in the
% driver file preamble; if neither is used, no index is produced.
-% \DescribeMacro\PageIndex Using "\PageIndex" makes all index
+% \DescribeInterfaceMacro\PageIndex Using |\PageIndex| makes all index
% entries refer to their page number; with
-% \DescribeMacro\CodelineIndex "\CodelineIndex", index entries
-% produced by "\DescribeMacro" and "\DescribeEnv" refer to page number
-% but those produced by the \textsf{macro} environment refer to the
+% \DescribeInterfaceMacro\CodelineIndex |\CodelineIndex|, index entries
+% produced by |\DescribeMacro| and |\DescribeEnv| and possibly further
+% |\Describe...| commands refer to a page number
+% but those produced by the \env{macro} environment (or other \DOC
+% element environments) refer to the
% code lines, which will be numbered automatically.\footnote{The line
% number is actually that of the first line of the first
-% \textsf{macrocode} environment in the \textsf{macro} environment.}
-% \DescribeMacro\theCodelineNo
+% \env{macrocode} environment in the \env{macro} environment.}
+% \DescribeInterfaceMacro\theCodelineNo
% The style of this numbering can be controlled by defining the macro
-% "\theCodelineNo". Its default definition is to use scriptsize
+% |\theCodelineNo|. Its default definition is to use scriptsize
% arabic numerals; a user-supplied definition won't be overwritten.
%
-% \DescribeMacro\CodelineNumbered
+% \DescribeInterfaceMacro\CodelineNumbered
% When you don't wish to get an index but want your code lines
-% numbered use "\CodelineNumbered" instead of "\CodelineIndex". This
-% prevents the generation of an unnecessary ".idx" file.
+% numbered use |\CodelineNumbered| instead of |\CodelineIndex|. This
+% prevents the generation of an unnecessary |.idx| file.
%
%
% \subsection{Producing the actual index entries}
@@ -632,7 +848,7 @@
% Several of the aforementioned macros will produce some sort of index
% entries. These entries have to be sorted by an external
% program---the current implementation assumes that the
-% \textsf{makeindex} program by Chen~\cite{art:Chen} is used.
+% \prg{makeindex} program by Chen~\cite{art:Chen} is used.
%
% But this isn't built in: one has only to redefine some of the
% following macros to be able to use any other index program. All
@@ -644,25 +860,25 @@
%
% To allow the user to change the specific characters recognized by
% his or her index program all characters which have special meaning
-% in the \textsf{makeindex} program are given symbolic
+% in the \prg{makeindex} program are given symbolic
% names.\footnote{I don't know if there exists a program which needs
% more command characters, but I hope not.}
% However, all characters used should be of |\catcode| other than
% `letter' (11).
%
-% \DescribeMacro{\actualchar}
+% \DescribeInterfaceMacro{\actualchar}
% The |\actualchar| is used to separate the `key' and the actual
% index entry.
-% \DescribeMacro{\quotechar}
+% \DescribeInterfaceMacro{\quotechar}
% The |\quotechar| is used before a special index program
% character to suppress its special meaning.
-% \DescribeMacro{\encapchar}
+% \DescribeInterfaceMacro{\encapchar}
% The |\encapchar| separates the indexing information from a
-% letter string which \textsf{makeindex} uses as a \TeX{} command to
+% letter string which \prg{makeindex} uses as a \TeX{} command to
% format the page number associated with a special entry. It is used
% in this package to apply the |\main| and the |\usage|
% commands.
-% \DescribeMacro{\levelchar}
+% \DescribeInterfaceMacro{\levelchar}
% Additionally |\levelchar| is used to separate `item',
% `subitem' and `subsubitem' entries.
%
@@ -670,33 +886,54 @@
% which index program is used. In this way your files will be
% portable.
%
-% \DescribeMacro\SpecialMainIndex
-% \DescribeMacro\SpecialMainEnvIndex
+% \fmi{describe old \cs{SpecialMainIndex} and \cs{SpecialUsageIndex}}
+%
+% \DescribeInterfaceMacro\SpecialMainMacroIndex
+% \DescribeInterfaceMacro\SpecialMainEnvIndex
% To produce a main index entry for a macro the
-% |\SpecialMainIndex| macro\footnote{This macro is called by the
-% \textsf{macro} environment.} may be used. It is called `special'
+% |\SpecialMainMacroIndex| macro\footnote{This macro is called by the
+% \env{macro} environment.} may be used. It is called `special'
% because it has to print its argument verbatim.
% A similar macro, called |\SpecialMainEnvIndex| is used for indexing
% the main definition point of an
% environment.\footnote{This macro is called by the
-% \textsf{environment} environment.}
-% \DescribeMacro\SpecialIndex
-% If you want a normal index entry for a macro name
-% |\SpecialIndex| might be used.\footnote{This macro is called
-% within the \textsf{macrocode} environment when encountering a macro
-% name.}
-% \DescribeMacro\SpecialUsageIndex
-% \DescribeMacro\SpecialEnvIndex
+% \env{environment} environment.}
+%
+% \DescribeInterfaceMacro\SpecialMacroIndex
+% \DescribeInterfaceMacro\SpecialEnvIndex
% To index the usage of a macro or an environment
-% |\SpecialUsageIndex| and |\SpecialEnvIndex| may be used.
-% \DescribeMacro\SortIndex
-% Additionally a |\SortIndex| command is provided. It takes two
-% arguments---the sort key and the actual index entry.
+% |\SpecialMacroIndex| and |\SpecialEnvIndex| may be used.
%
% All these macros are normally used by other macros; you will need
% them only in an emergency.
%
-% \DescribeMacro\verbatimchar
+% \NewIn{v3}
+% If further code elements are declared with
+% |\NewDocElement|\marg{name}\texttt{...} then this sets up
+% additional indexing commands, e.g.,
+% \cs{SpecialMain\meta{name}Index}.
+%
+% \DescribeInterfaceMacro\SpecialIndex
+% The \env{macrocode} environment is automatically indexing macros
+% (normally by code line number). You can (with care) also do this
+% manually by
+% |\SpecialIndex|. However, note that if |\CodelineIndex| is used
+% this will generate an entry referring to the last code line which is
+% usually not what you want. It does, however, make some sense if you
+% always refer to pages only, i.e., if you use |\PageIndex|.
+%
+% \DescribeInterfaceMacro\SpecialShortIndex
+% \NewIn{v3}
+% For single character macros, e.g., |\{|, doesn't always work
+% correctly.
+% For this reason there is now also
+% a special variant the can produce correct index entries for them.
+%
+% \DescribeInterfaceMacro\SortIndex
+% Additionally a |\SortIndex| command is provided. It takes two
+% arguments---the sort key and the actual index entry.
+%
+% \DescribeInterfaceMacro\verbatimchar
% But there is one characteristic worth mentioning: all macro names in
% the index are typeset with the |\verb*| command. Therefore one
% special character is needed to act as a delimiter for this command.
@@ -704,12 +941,14 @@
% referenced indirectly, by the macro |\verbatimchar|. It expands
% by default to \verb?+? but if your code lines contain macros with
% `\texttt{+}' characters in their names (e.g.\ when you use \verb?\+?)
-% you will end up with an index entry containing \verb?\verb+\++?
-% which will be typeset as `\verb+\++' and not as `\verb?\+?'. In this
-% case you should redefine |\verbatimchar| globally or locally to
-% overcome this problem.
-%
-% \DescribeMacro\*
+% then that caused a problem because you ended up with an
+% index entry containing \verb?\verb+\++?
+% which will be typeset as `\verb+\++' and not as `\verb?\+?'.
+% \NewIn{v3}
+% In version 3 this is now automatically taken care of (with the help
+% of the |\SpecialShortIndex| command).
+%
+% \DescribeInterfaceMacro\*
% We also provide a |\*| macro. This is intended to be used for
% index entries like
% \begin{quote}
@@ -721,49 +960,39 @@
% \index{index entries\levelchar Special macros for \*}
%\end{verbatim}
%
-% \DescribeMacro\OldMakeindex
-% Versions of \textsf{makeindex} prior to 2.9 had some bugs affecting
-% \DOC{}. One of these,
-% pertaining to the "%" character doesn't have a work-around
-% appropriate for versions with and without the
-% bug.\label{makeindex:version} If
-% you have an old version, invoke "\OldMakeindex" in a
-% package file or the driver file to prevent problems with index entries
-% such as "\%", although you'll probably normally want to turn off
-% indexing of "\%" anyway. Try to get an up-to-date \textsf{makeindex}
-% from one of the \TeX{} repositories.
-%
%
% \subsection{Setting the index entries}
%
% \changes{v1.7a}{1992/03/11}{Usage note on gind.ist.} After the first
% formatting pass through the \texttt{.dtx} file you need to sort the
% index entries written to the \texttt{.idx} file using
-% \textsf{makeindex} or your favourite alternative. You need a
-% suitable style file for \textsf{makeindex} (specified by the
+% \prg{makeindex} or your favorite alternative. You need a
+% suitable style file for \prg{makeindex} (specified by the
% \texttt{-s} switch). A suitable one is supplied with \DOC{},
% called \texttt{gind.ist}.
%
-% \DescribeMacro\PrintIndex
+% \DescribeInterfaceMacro\PrintIndex
% To read in and print the sorted index, just put the
% |\PrintIndex| command as the last (commented-out, and thus
% executed during the documentation pass through the file) command
% in your package file. Precede it by any bibliography commands
% necessary for your citations.
% Alternatively, it may be more convenient to put all such calls
-% amongt the arguments of the |\StopEventually| macro, in
+% amongst the arguments of the |\MaybeStop| macro, in
% which case a |\Finale| command should appear at the end of
% your file.
%
% \DescribeEnv{theindex}
% Contrary to standard \LaTeX, the index is typeset in three columns
-% by default. This is controlled by the \LaTeX{} counter
+% by default.
+% \DescribeLaTeXCounter{IndexColumns}
+% This is controlled by the \LaTeX{} counter
% `\textsf{IndexColumns}' and can therefore be changed with a
% |\setcounter| declaration. Additionally one doesn't want to
-% start a new page unnecessarily. Therefore the \textsf{theindex}
+% start a new page unnecessarily. Therefore the \env{theindex}
% environment is redefined.
-% \DescribeMacro\IndexMin
-% When the \textsf{theindex} environment starts it will measure how much
+% \DescribeLaTeXDimen\IndexMin
+% When the \env{theindex} environment starts it will measure how much
% space is left on the current page. If this is more than
% |\IndexMin| then the index will start on this page. Otherwise
% |\newpage| is called.
@@ -771,23 +1000,23 @@
% Then a short introduction about the meaning of several index entries
% is typeset (still in onecolumn mode). Afterwards the actual index
% entries follow in multi-column mode.
-% \DescribeMacro\IndexPrologue
+% \DescribeInterfaceMacro\IndexPrologue
% You can change this prologue with the help of the
% |\IndexPrologue| macro. Actually the section heading is also
% produced in this way, so you'd better write something like:
% \begin{verbatim}
% \IndexPrologue{\section*{Index} The index entries underlined ...}
%\end{verbatim}
-% When the \textsf{theindex} environment is finished the last page will
+% When the \env{theindex} environment is finished the last page will
% be reformatted to produce balanced columns. This improves the layout
% and allows the next article to start on the same page.
-% \DescribeMacro\IndexParms
+% \DescribeInterfaceMacro\IndexParms
% Formatting of the index columns (values for |\columnssep|
% etc.)\ is controlled by the |\IndexParms| macro. It assigns the
% following values:
-% \SpecialUsageIndex{\parindent}\SpecialUsageIndex{\columnsep}^^A
-% \SpecialUsageIndex{\parskip}\SpecialUsageIndex{\rightskip}^^A
-% \SpecialUsageIndex{\mathsurround}\SpecialUsageIndex{\parfillskip}
+% \SpecialLaTeXDimenIndex{\parindent}\SpecialLaTeXDimenIndex{\columnsep}^^A
+% \SpecialLaTeXSkipIndex{\parskip}\SpecialLaTeXSkipIndex{\rightskip}^^A
+% \SpecialLaTeXDimenIndex{\mathsurround}\SpecialLaTeXSkipIndex{\parfillskip}
% \begin{center}
% \begin{tabular}{l@{\,=\,}ll@{\,=\,}l}
% |\parindent| & \IndexParms \the\parindent &
@@ -800,24 +1029,27 @@
% \expandafter\dimenvalue\the\parfillskip
% \end{tabular}
% \end{center}
-% \DescribeMacro{\@idxitem}
+% \DescribeInterfaceMacro{\@idxitem}
% Additionally it defines |\@idxitem| (which will be used when an
% |\item| command is encountered) and selects |\small| size.
% If you want to change any of these values you have to define them
% all.
%
-% \DescribeMacro\main
-% \DescribeMacro\usage
+% \DescribeInterfaceMacro\main
+% \DescribeInterfaceMacro\usage
+% \DescribeInterfaceMacro\code
% The page numbers for main index entries are encapsulated by the
% |\main| macro (underlining its argument) and the numbers
% denoting the description are encapsulated by the |\usage| macro
-% (which produces {\em italics}). As usual these commands are user
+% (which produces \textit{italics}). |\code| encapsulates page or code
+% line numbers in entries generated by parsing the code inside
+% \env{macrocode} environments. As usual these commands are user
% definable.
%
%
% \subsection{Changing the default values of style parameters}
%
-% \DescribeMacro\DocstyleParms If you want to overwrite some default
+% \DescribeInterfaceMacro\DocstyleParms If you want to overwrite some default
% settings made by the \DOC{} package, you can either put your
% declarations in the driver file (that is after \texttt{doc.sty} is
% read in) or use a separate package file for doing this work. In the
@@ -828,10 +1060,13 @@
%
% The doc package currently assigns values to the following
% registers:
-% \SpecialUsageIndex{\IndexMin}\SpecialUsageIndex{\MacrocodeTopsep}^^A
-% \SpecialUsageIndex{\MacroTopsep}^^A
-% \SpecialUsageIndex{\MacroIndent}\SpecialUsageIndex{\marginparpush}^^A
-% \SpecialUsageIndex{\marginparwidth}\SpecialUsageIndex{\tolerance}
+% \SpecialLaTeXDimenIndex{\IndexMin}^^A
+% \SpecialLaTeXSkipIndex{\MacrocodeTopsep}^^A
+% \SpecialLaTeXSkipIndex{\MacroTopsep}^^A
+% \SpecialLaTeXDimenIndex{\MacroIndent}^^A
+% \SpecialLaTeXDimenIndex{\marginparpush}^^A
+% \SpecialLaTeXDimenIndex{\marginparwidth}^^A
+% \SpecialTeXCounterIndex{\tolerance}
% \begin{center}
% \begin{tabular}{l@{\,=\,}ll@{\,=\,}l}
% |\IndexMin| & \the\IndexMin &
@@ -847,34 +1082,34 @@
%
% \subsection{Short input of verbatim text pieces}
%
-% \DescribeMacro\MakeShortVerb
-% \DescribeMacro{\MakeShortVerb*} \DescribeMacro\DeleteShortVerb It is
-% awkward to have to type, say, "\verb|"\ldots"|" continually when
+% \DescribeInterfaceMacro\MakeShortVerb
+% \DescribeInterfaceMacro{\MakeShortVerb*} \DescribeInterfaceMacro\DeleteShortVerb It is
+% awkward to have to type, say, \verb"\verb|"\ldots\verb"|" continually when
% quoting
% verbatim bits (like macro names) in the text, so an abbreviation
% mechanism is provided. Pick a character \meta{c}---one which
% normally has catcode `other' unless you have very good reason not
% to---which you don't envisage using in the text, or not using often.
-% (I like |"|, but you may prefer "|" if you have |"| active to do
+% (I like |"|, but you may prefer \verb"|" if you have |"| active to do
% umlauts, for instance.) Then if you say
-% "\MakeShortVerb{\"\meta{c}"}" you can subsequently use
+% |\MakeShortVerb{\|\meta{c}|}| you can subsequently use
% \meta{c}\meta{text}\meta{c} as the equivalent of
-% "\verb"\meta{c}\meta{text}\meta{c}; analogously, the "*"-form
-% "\MakeShortVerb*{\"\meta{c}"}" gives you the equivalent of
-% "\verb*"\meta{c}\meta{text}\meta{c}. Use
-% "\DeleteShortVerb{\"\meta{c}"}" if you subsequently want \meta{c} to
+% |\verb|\meta{c}\meta{text}\meta{c}; analogously, the |*|-form
+% |\MakeShortVerb*{\|\meta{c}|}| gives you the equivalent of
+% |\verb*|\meta{c}\meta{text}\meta{c}. Use
+% |\DeleteShortVerb{\|\meta{c}|}| if you subsequently want \meta{c} to
% revert to its previous meaning---you can always turn it on again
% after the unusual section. The `short verb' commands make global
-% changes. The abbreviated "\verb" may not appear in the argument of
-% another command just like "\verb". However the `short verb'
-% character may be used freely in the \textsf{verbatim} and
-% \textsf{macrocode} environments without ill effect.
-% "\DeleteShortVerb" is silently ignored if its argument does not
+% changes. The abbreviated |\verb| may not appear in the argument of
+% another command just like |\verb|. However the `short verb'
+% character may be used freely in the \env{verbatim} and
+% \env{macrocode} environments without ill effect.
+% |\DeleteShortVerb| is silently ignored if its argument does not
% currently represent a short verb character. Both commands type a
% message to tell you the meaning of the character is being changed.
%
-% Please remember that the command "\verb" cannot be used in arguments
-% of other commands. Therefore abbreviation characters for "\verb"
+% Please remember that the command |\verb| cannot be used in arguments
+% of other commands. Therefore abbreviation characters for |\verb|
% cannot be used there either.
%
% This feature is also available as a sole package, \texttt{shortvrb}.
@@ -885,24 +1120,33 @@
% We provide macros for logos such as \Web, \AmSTeX, \BibTeX,
% \SliTeX{} and \PlainTeX. Just type |\Web|, |\AmSTeX|,
% |\BibTeX|, |\SliTeX| or |\PlainTeX|, respectively.
-% \LaTeX{} and \TeX{} are already defined in the \LaTeX{} format.
+% \LaTeX{} and \TeX{} are already defined in \texttt{latex.tex}.
%
-% \DescribeMacro\meta
+% \DescribeInterfaceMacro\meta
% Another useful macro is |\meta| which has one argument and
% produces something like \meta{dimen parameter}.
%
-% \DescribeMacro\OnlyDescription
-% \DescribeMacro\StopEventually
+% \DescribeInterfaceMacro\OnlyDescription
+% \DescribeInterfaceMacro\MaybeStop
+% \DescribeObsoleteInterfaceMacro\StopEventually
% You can use the |\OnlyDescription| declaration in the driver
% file to suppress the last part of your document (which presumably
% exhibits the code). To make this work
-% you have to place the command |\StopEventually| at a suitable
-% point in your file. This macro has one argument in which you put
+% \NewIn{v3}
+% you have to place the command |\MaybeStop| at a suitable
+% point in your file. This macro\footnote{For about 30 years this
+% macro was called \cs{StopEventually} which was due to a ``false
+% friend'' misunderstanding. In the German language the word
+% ``eventuell'' mean roughly ``perhaps'' which isn't quite the same
+% as ``eventually''. But given that this is now used for so long
+% and all over the place we can't drop the old name. So it is still
+% there to allow processing all the existing documentation.}
+% has one argument in which you put
% all information you want to see printed if your document ends at
% this point (for example a bibliography which is normally printed at
% the very end). When the |\OnlyDescription| declaration is
-% missing the |\StopEventually|
-% \DescribeMacro\Finale
+% missing the |\MaybeStop|
+% \DescribeInterfaceMacro\Finale
% macro saves its argument in a macro called |\Finale| which can
% afterwards be used to get things back (usually at the very end).
% Such a scheme makes changes in two places unnecessary.
@@ -910,17 +1154,17 @@
% Thus you can use this feature to produce a local guide for the
% \TeX{} users which describes only the usage of macros (most of them
% won't be interested in your definitions anyway). For the same
-% reason the |\maketitle| \DescribeMacro\maketitle command is slightly
+% reason the |\maketitle| \DescribeInterfaceMacro\maketitle command is slightly
% changed to allow multiple titles in one document. So you can make
% one driver file reading in several articles at once.
-% \DescribeMacro{\ps@titlepage} To avoid an unwanted
+% \DescribeInterfaceMacro{\ps@titlepage} To avoid an unwanted
% \textsf{pagestyle} on the title page the |\maketitle| command issues
% a |\thispagestyle{titlepage}| declaration which produces a
% \textsf{plain} page if the \textsf{titlepage} page style is
-% undefined. This allows class files like \textsf{ltugboat.cls} to
+% undefined. This allows class files like \cls{ltugboat.cls} to
% define their own page styles for title pages.
%
-% \DescribeMacro\AlsoImplementation
+% \DescribeInterfaceMacro\AlsoImplementation
% Typesetting the whole document is the default. However, this default
% can also be explicitly selected using the declaration
% |\AlsoImplementation|. This overwrites any previous
@@ -933,24 +1177,23 @@
% \end{quote}
% to make sure that all documents will show the code part.
%
-% \DescribeMacro\IndexInput \label{..Input} Last but not least I
+% \DescribeInterfaceMacro\IndexInput \label{..Input} Last but not least I
% defined an |\IndexInput| macro which takes a file name as an
% argument and produces a verbatim listing of the file, indexing every
% command as it goes along. This might be handy, if you want to learn
% something about macros without enough documentation. I used this
-% feature to cross-reference \texttt{latex.tex} (these days
-% called \texttt{latex.ltx}) getting a verbatim
+% feature to cross-reference \texttt{latex.tex} getting a verbatim
% copy with about 15 pages index.\footnote{It took quite a long time
% and the resulting \texttt{.idx} file was longer than the
% \texttt{.dvi} file. Actually too long to be handled by the
-% \textsf{makeindex} program directly (on our MicroVAX) but the final
+% \prg{makeindex} program directly (on our MicroVAX) but the final
% result was worth the trouble.}
%
% \changes{v2.1d}{2006/02/02}{Corrected description of \cs{changes}
% macro.}
-% \DescribeMacro\changes
+% \DescribeInterfaceMacro\changes
% To maintain a change history within the file, the |\changes|
-% command may be placed amongt the description part of the changed
+% command may be placed amongst the description part of the changed
% code. It takes three arguments, thus:
% \begin{quote}
% |\changes{|\meta{version}|}{|\meta{date}|}{|^^A
@@ -960,7 +1203,7 @@
% |\glossary| mechanism is used for this) which may be printed
% after suitable formatting. The |\changes| macro generates the
% printed entry in such a change history; because old
-% versions\footnote{Before 2.6.} of the \textsf{makeindex}
+% versions\footnote{Before 2.6.} of the \prg{makeindex}
% program limit such fields to 64 characters, care should be taken
% not to exceed this limit when describing the change. The actual
% entry consists of the \meta{version}, the |\actualchar|, the current
@@ -970,101 +1213,38 @@
% text |\generalname| is used instead of the macro name. When
% referring to macros in change descriptions it is conventional to use
% |\cs{|\meta{macroname}|}| rather than attempting to format it properly
-% and using up valuable characters in the entry with old \textsf{makeindex}
+% and using up valuable characters in the entry with old \prg{makeindex}
% versions.
%
% \changes{v1.7a}{1992/02/26}{Description of \cs{RecordChanges} etc.
% added
-% to interface section.} \DescribeMacro\RecordChanges To cause the
-% change information to be written out, include "\RecordChanges" in
-% the driver file. \DescribeMacro\PrintChanges To read in and print
+% to interface section.} \DescribeInterfaceMacro\RecordChanges To cause the
+% change information to be written out, include |\RecordChanges| in
+% the driver file. \DescribeInterfaceMacro\PrintChanges To read in and print
% the sorted change history (in two columns), just put the
% |\PrintChanges| command as the last (commented-out, and thus
% executed during the documentation pass through the file) command in
% your package file. Alternatively, this command may form one of the
-% arguments of the |\StopEventually| command, although a change
+% arguments of the |\MaybeStop| command, although a change
% history is probably {\em not\/} required if only the description is
-% being printed. The command assumes that \textsf{makeindex} or some
+% being printed. The command assumes that \prg{makeindex} or some
% other program has processed the \texttt{.glo} file to generate a
-% sorted \texttt{.gls} file. You need a special \textsf{makeindex}
+% sorted \texttt{.gls} file. You need a special \prg{makeindex}
% style file; a suitable one is supplied with \DOC{}, called
-% \texttt{gglo.ist}. \DescribeMacro\GlossaryMin
-% \DescribeMacro\GlossaryPrologue \DescribeMacro\GlossaryParms The
-% "\GlossaryMin", "\GlossaryPrologue" and "\GlossaryParms" macros are
-% analogous to the "\Index"\ldots\ versions. (The \LaTeX{} `glossary'
+% \texttt{gglo.ist}.
+%
+% \DescribeLaTeXDimen\GlossaryMin
+% \DescribeInterfaceMacro\GlossaryPrologue
+% \DescribeInterfaceMacro\GlossaryParms
+% \DescribeLaTeXCounter{GlossaryColumns}
+% The
+% |\GlossaryMin|, |\GlossaryPrologue| and |\GlossaryParms| macros and
+% the counter \texttt{GlossaryColumns} are
+% analogous to the |\Index|\ldots\ versions. (The \LaTeX{} `glossary'
% mechanism is used for the change entries.)
%
-% \label{sec:checksum}
-% \DescribeMacro\CharacterTable
-% \DescribeMacro\CheckSum
-% To overcome some of the problems of sending files over the networks
-% we developed two macros which should detect corrupted files. If one
-% places the lines
-% \begin{flushleft}
-% \small\ttfamily ^^A \ttfamily to get the blanks between "..."s
-% ^^A right
-%"%%\CharacterTable"\\
-%"%% {Upper-case "
-%"\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z"\\
-%"%% Lower-case "
-%"\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z"\\
-%"%% Digits \0\1\2\3\4\5\6\7\8\9"\\
-%"%% Exclamation \! Double quote "\verb=\"=
-%" Hash (number) \#"\\
-%"%% Dollar \$ Percent \% Ampersand \&"\\
-%"%% Acute accent \' Left paren \( Right paren \)"\\
-%"%% Asterisk \* Plus \+ Comma \,"\\
-%"%% Minus \- Point \. Solidus \/"\\
-%"%% Colon \: Semicolon \; Less than \<"\\
-%"%% Equals \= Greater than \> Question mark \?"\\
-%"%% Commercial at \@ Left bracket \[ Backslash \\"\\
-%"%% Right bracket \] Circumflex \^ Underscore \_"\\
-%"%% Grave accent \` Left brace \{ Vertical bar \|"\\
-%"%% Right brace \} Tilde \~}"\\
-%"%%"
-%\end{flushleft}
-% at the beginning of the file then character translation failures
-% will be detected, provided of course, that the used \DOC{}
-% package has a correct default table. The percent
-% signs\footnote{There are two percent signs in each line. This has
-% the effect that these lines are not removed by the
-% \texttt{docstrip.tex} program.} at the beginning of the lines should
-% be typed in, since only the \DOC{} package should look at this
-% command.
-%
-%
-% Another problem of mailing files is possible truncation. To detect
-% these sort of errors we provide a |\CheckSum| macro. The check-sum
-% of a file is simply the number of backslashes in the code, i.e.\ all
-% lines between the \textsf{macrocode} environments. But don't be
-% afraid: you don't have count the code-lines yourself; this is done
-% by the \DOC{} package for you. You simply have add
-% \begin{quote}
-% |% \CheckSum{0}|
-% \end{quote}
-% near the beginning of the file and
-% use
-% the |\StopEventually| (which starts looking for backslashes) and the
-% |\Finale| command. The latter will inform you either that your file
-% has no check-sum (telling you the right number) or that your number
-% is incorrect if you put in anything other than zero but guessed wrong (this time
-% telling you both the correct and the
-% incorrect one). Then you go to the top of your file again and change the
-% line to the right number, i.e.
-% line
-% \begin{quote}
-% |% \CheckSum{|\meta{number}|}|
-% \end{quote}
-% and that's all.
-%
-% While |\CharacterTable| and |\CheckSum| have been important features
-% in the early days of the public internet when \DOC{} was written as
-% the mail gateways back then were rather unreliable and often mangled
-% files they are these days more a nuisance than any help. They are
-% therefore now fully optional and no longer recommended for use with new files.
%
-%
-% \DescribeMacro\bslash
+% \DescribeInterfaceMacro\bslash
% From time to time, it is necessary to print a |\| without
% being able to use the |\verb| command because the
% |\catcode|$\,$s of the symbols are already firmly
@@ -1072,53 +1252,55 @@
% |\bslash| presupposing, of course, that the actual font in
% use at this point contains a `backslash' as a symbol. Note that
% this definition of |\bslash| is expandable; it inserts a
-% $"\"_{12}$. This means that you have to |\protect|
+% $|\|_{12}$. This means that you have to |\protect|
% it if it is used in `moving arguments'.
%
-% \DescribeMacro\MakePrivateLetters
+% \DescribeInterfaceMacro\MakePrivateLetters
% \changes{v1.7a}{1992/02/26}{Documented \cs{MakePrivateLetters} in
% interface section}^^A
-% If your macros "\catcode" anything other than "@" to `letter', you
-% should redefine "\MakePrivateLetters" so that it also makes the
+% If your macros |\catcode| anything other than |@| to `letter', you
+% should redefine |\MakePrivateLetters| so that it also makes the
% relevant characters `letters' for the benefit of the indexing. The
-% default definition is just "\makeatletter".
+% default definition is just |\makeatletter|.
%
-% \DescribeMacro\DontCheckModules \DescribeMacro\CheckModules
-% \DescribeMacro\Module \DescribeMacro\AltMacroFont The `module'
-% directives of the \textsf{docstrip} system \cite{art:docstrip} are
-% normally recognised and invoke special formatting. This can be
+% \DescribeInterfaceMacro\DontCheckModules \DescribeInterfaceMacro\CheckModules
+% \DescribeInterfaceMacro\Module \DescribeInterfaceMacro\AltMacroFont The `module'
+% directives of the \prg{docstrip} system \cite{art:docstrip} are
+% normally recognized and invoke special formatting. This can be
% turned on and off in the \texttt{.dtx} file or the driver file using
-% "\CheckModules" and "\DontCheckModules". If checking for module
+% |\CheckModules| and |\DontCheckModules|. If checking for module
% directives is on (the default) then code in the scope of the
-% directives is set as determined by the hook "\AltMacroFont", which
+% directives is set as determined by the hook |\AltMacroFont|, which
% gives {\small\ttfamily\itshape small italic type\-writer\/} by
% default in the New Font Selection Scheme but just ordinary
% {\small\ttfamily small type\-writer} in the old one, where a font
% such as italic typewriter can't be used portably (plug for NFSS);
% you will need to override this if you don't have the italic
% typewriter font available. Code is in such a scope if it's on a
-% line beginning with "%<" or is between lines starting with
-% "%<*"\meta{name list}">" and "%</"\meta{name list}">". The
-% directive is formatted by the macro "\Module" whose single argument
+% line beginning with |%<| or is between lines starting with
+% |%<*|\meta{name list}|>| and |%</|\meta{name list}|>|. The
+% directive is formatted by the macro |\Module| whose single argument
% is the text of the directive between, but not including, the angle
% brackets; this macro may be re-defined in the driver or package file
% and by default produces results like \Module{+foo\string|bar} with no
% following space.
%
-% \DescribeMacro{StandardModuleDepth} Sometimes (as in this file) the
+% \DescribeLaTeXCounter{StandardModuleDepth} Sometimes (as in this file) the
% whole code is surrounded by modules to produce several files from a
% single source. In this case it is clearly not appropriate to format
-% all code lines in a special "\AltMacroFont". For this reason a
-% counter "StandardModuleDepth" is provided which defines the level of
+% all code lines in a special |\AltMacroFont|. For this reason a
+% counter |StandardModuleDepth| is provided which defines the level of
% module nesting which is still supposed to be formatted in
-% "\MacroFont" rather then "\AltMacroFont". The default setting is
-% "0", for this documentation it was set to
+% |\MacroFont| rather then |\AltMacroFont|. The default setting is
+% |0|, for this documentation it was set to
%\begin{verbatim}
% \setcounter{StandardModuleDepth}{1}
%\end{verbatim}
% at the beginning of the file.
%
%
+% \section{Examples and basic usage summary}
+%
% \subsection{Basic usage summary}
% \changes{v1.7a}{1992/03/11}{Added basic usage summary to spell
% it out.}
@@ -1126,26 +1308,482 @@
% To sum up, the basic structure of a \texttt{.dtx} file without any
% refinements is like this:
% \begin{verse}\small
-% "% "\meta{waffle}\ldots\\
+% |% |\meta{waffle}\ldots\\
% \quad\ldots \\
-% "% \DescribeMacro{\fred}"\\
-% "% "\meta{description of fred's use}\\
+% |% \DescribeMacro{\fred}|\\
+% |% |\meta{description of fred's use}\\
% \quad\ldots\\
-% "% \StopEventually{"\meta{finale code}"}"\\
+% |% \MaybeStop{|\meta{finale code}|}|\\
% \quad\ldots\\
-% "% \begin{macro}{\fred}"\\
-% "% "\meta{commentary on macro fred}\\
+% |% \begin{macro}{\fred}|\\
+% |% |\meta{commentary on macro fred}\\
% \verb*+% \begin{macrocode}+\\
% \meta{code for macro fred}\\
% \verb*+% \end{macrocode}+\\
-% "% \end{macro}"\\
+% |% \end{macro}|\\
% \quad\ldots\\
-% "% \Finale \PrintIndex \PrintChanges"
+% |% \Finale \PrintIndex \PrintChanges|
% \end{verse}
-% For examples of the use of most---if not all---of the features
-% described above consult the \texttt{doc.dtx} source itself.
+% For further examples of the use of most---if not all---of the features
+% described above, consult the \texttt{doc.dtx} source itself.
+%
+%
+%
+% \subsection{Examples}
+%
+% The default setup includes definitions for the \DOC elements
+% ``macro'' and ``environment''. They correspond to the following
+% declarations:
+%\begin{verbatim}
+% \NewDocElement[macrolike = true ,
+% idxtype = ,
+% idxgroup = ,
+% printtype =
+% ]{Macro}{macro}
+%
+% \NewDocElement[macrolike = false ,
+% idxtype = env. ,
+% idxgroup = environments ,
+% printtype = \textit{env.}
+% ]{Env}{environment}
+%\end{verbatim}
+%
+% To showcase the new features of \DOC version 3 to some extend, the
+% current documentation is done by redefining these declarations and
+% also adding a few additional declarations on top.
%
-% \subsection{Acknowledgements}
+% For any internal command we document we use \texttt{Macro} and put
+% all of them under the heading ``\LaTeX{} commands'' (note the use of \cs{actualchar}):
+%\begin{verbatim}
+%\RenewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = ,
+% idxgroup = LaTeX comands\actualchar\LaTeX{} commands ,
+% printtype =
+% ]{Macro}{macro}
+%\end{verbatim}
+%
+% We only have package environments so we use \texttt{Env} for those
+% and group them as well:
+%\begin{verbatim}
+%\RenewDocElement[macrolike = false ,
+% toplevel = false,
+% idxtype = env. ,
+% idxgroup = Package environments,
+% printtype = \textit{env.}
+% ]{Env}{environment}
+%\end{verbatim}
+%
+%
+% All the interface commands are also grouped together under the label
+% ``Package commands'', we use \texttt{InterfaceMacro} for them:
+%\begin{verbatim}
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = ,
+% idxgroup = Package commands,
+% printtype =
+% ]{InterfaceMacro}{imacro}
+%\end{verbatim}
+%
+% And since we also have a few obsolete interfaces we add yet another category:
+%\begin{verbatim}
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = ,
+% idxgroup = Package commands (obsolete),
+% printtype =
+% ]{ObsoleteInterfaceMacro}{omacro}
+%\end{verbatim}
+%
+% Another type of category are the package keys:
+%\begin{verbatim}
+%\NewDocElement[macrolike = false ,
+% toplevel = false,
+% idxtype = key ,
+% idxgroup = Package keys ,
+% printtype = \textit{key}
+% ]{Key}{key}
+%\end{verbatim}
+%
+% Finally we have \TeX{} counters (with a backslash in front) and
+% \LaTeX{} counters (no backslash) and the two types of \LaTeX{}
+% length registers:
+%\begin{verbatim}
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = counter ,
+% idxgroup = TeX counters\actualchar \protect\TeX{} counters ,
+% printtype = \textit{counter}
+% ]{TeXCounter}{tcounter}
+%
+%\NewDocElement[macrolike = false ,
+% toplevel = false,
+% idxtype = counter ,
+% idxgroup = LaTeX counters\actualchar \LaTeX{} counters ,
+% printtype = \textit{counter}
+% ]{LaTeXCounter}{lcounter}
+%
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = skip ,
+% idxgroup = LaTeX length\actualchar \LaTeX{} length (skip) ,
+% printtype = \textit{skip}
+% ]{LaTeXSkip}{lskip}
+%
+%\NewDocElement[macrolike = true ,
+% toplevel = false,
+% idxtype = dimen ,
+% idxgroup = LaTeX length\actualchar \LaTeX{} length (dimen) ,
+% printtype = \textit{dimen}
+% ]{LaTeXDimen}{ldimen}
+%
+%\end{verbatim}
+%
+% And we modify the appearance of the index: just 2 columns not 3 and
+% all the code-line entries get prefixed with an ``$\ell$'' (for line)
+% so that they can easily be distinguished from page index entries.
+%\begin{verbatim}
+% \renewcommand\code[1]{\mbox{$\ell$-#1}}
+% \renewcommand\main[1]{\underline{\mbox{$\ell$-#1}}}
+% \setcounter{IndexColumns}{2}
+%\end{verbatim}
+%
+%
+%
+% \section{Incompatibilities between version 2 and 3}
+%
+% The basic approach when developing version~3 was to provide a very
+% high level of compatibility with version~2 so that nearly all
+% older documents should work out of the box without the need for
+% any adjustments.
+%
+% But as with any change there are situations where that change can
+% result in some sort of incompatibility, e.g., if a newly introduce
+% command name was already been defined in the user document then
+% there will be a conflict that is nearly impossible to avoid
+% 100\%.
+%
+% As mentioned earlier, \DOC now supports options on several commands
+% and environments and as a result it is necessary to use braces
+% around the argument for \cs{DescribeMaro} if the ``macro to be
+% described'' uses private letters such as |@| or |_| as part of its
+% name. That was always the official syntax but in the past you could
+% get away with leaving out the braces more often than you can now.
+%
+% The old \DOC documentation also claimed that redefinitions of things
+% like \cs{PrintDescribeMacro} could be done before loading the
+% package (and not only afterwards) and \DOC would in that case not
+% change those commands. As the setup mechanisms are now much more
+% powerful and general such an approach is not really good. So with
+% \DOC version~3 modifications have to be done after the \DOC package
+% got loaded and the last modification will always win.
+%
+% I'm temped to drop compatibility with \LaTeX~2.09 (but so far I
+% have left it in).
+%
+% In the past it was possible to use macros declared with \cs{outer}
+% in the argument of \verb=\begin{macro}= or \cs{DoNotIndex} even
+% though \cs{outer} is not a concept supported in \LaTeX{}. This is no
+% longer possible. More exactly, it is no longer possible to prevent
+% them from being indexed (as \cs{DoNotIndex} can't be used), but you
+% can pass them to the \env{macro} environment as follows:
+%\begin{verbatim}
+% \begin{macro}[outer]{\foo}
+%\end{verbatim}
+% if \cs{foo} is a macro declared with \cs{outer}. The technical
+% reason for this change is that in the past various other commands,
+% such as |\{| or |\}| did not work properly in these arguments when
+% they where passed as ``strings'' and not as single macro tokens. But
+% by switching to macro tokens we can't have \cs{outer} macros because
+% their feature is to be not allowed in arguments. So what happens
+% above when you use \texttt{[outer]} is that the argument is read as
+% a string with four character tokens so that it is not recognized as
+% being \cs{outer}.
+%
+%
+% \section{Old interfaces no longer really needed}
+%
+% 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.
+% We list them here, but in general we suggest that for new
+% documentation they should not be used.
+%
+%
+% \subsection{\prg{makeindex} bugs}
+%
+% \DescribeObsoleteInterfaceMacro\OldMakeindex
+% Versions of \prg{makeindex} prior to 2.9 had some bugs affecting
+% \DOC{}. One of these,
+% pertaining to the |%| character doesn't have a work-around
+% appropriate for versions with and without the
+% bug.\label{makeindex:version} If
+% you really still have an old version, invoke |\OldMakeindex| in a
+% package file or the driver file to prevent problems with index entries
+% such as |\%|, although you'll probably normally want to turn off
+% indexing of |\%| anyway. Try to get an up-to-date \prg{makeindex}
+% from one of the \TeX{} repositories.
+%
+% \subsection{File transmission issues}
+%
+% In the early days of the Internet file transmission issues have been
+% a serious problem. There was a famous gateway in Rochester, UK that
+% handled the traffic from the European continent to the UK and that
+% consisted of two IBM machines running with different codepages (that
+% had non-reversible differences). As a result ``strange'' \TeX{}
+% characters got replaced with something else with the result that the
+% files became unusable.
+%
+% To guard against this problem (or rather to detect it if something
+% got broken in transfer I added code to \DOC to check a static
+% character table and also to have a very simple checksum feature
+% (counting backslashes).
+%
+% These days the \cs{CheckSum} is of little value (and a lot of pain
+% for the developer) and character scrambling doesn't happen any more
+% so the \cs{CharacterTable} is essentially useless. Thus neither
+% should be used in new developments.
+%
+% \label{sec:checksum}
+% \DescribeObsoleteInterfaceMacro\CharacterTable
+% \DescribeObsoleteInterfaceMacro\CheckSum
+% To overcome some of the problems of sending files over the networks
+% we developed two macros which should detect corrupted files. If one
+% places the lines
+% \begin{flushleft}
+% \small\ttfamily ^^A \ttfamily to get the blanks between "..."s
+% ^^A right
+%|%%\CharacterTable|\\
+%|%% {Upper-case |
+%|\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z|\\
+%|%% Lower-case |
+%|\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z|\\
+%|%% Digits \0\1\2\3\4\5\6\7\8\9|\\
+%|%% Exclamation \! Double quote "|
+%| Hash (number) \#|\\
+%|%% Dollar \$ Percent \% Ampersand \&|\\
+%|%% Acute accent \' Left paren \( Right paren \)|\\
+%|%% Asterisk \* Plus \+ Comma \,|\\
+%|%% Minus \- Point \. Solidus \/|\\
+%|%% Colon \: Semicolon \; Less than \<|\\
+%|%% Equals \= Greater than \> Question mark \?|\\
+%|%% Commercial at \@ Left bracket \[ Backslash \\|\\
+%|%% Right bracket \] Circumflex \^ Underscore \_|\\
+%|%% Grave accent \` Left brace \{ Vertical bar |\verb=|=\\
+%|%% Right brace \} Tilde \~}|\\
+%|%%|
+%\end{flushleft}
+% at the beginning of the file then character translation failures
+% will be detected, provided of course, that the used \DOC{}
+% package has a correct default table. The percent
+% signs\footnote{There are two percent signs in each line. This has
+% the effect that these lines are not removed by the
+% \texttt{docstrip.tex} program.} at the beginning of the lines should
+% be typed in, since only the \DOC{} package should look at this
+% command.
+%
+%
+% Another problem of mailing files is possible truncation. To detect
+% these sort of errors we provide a |\CheckSum| macro. The check-sum
+% of a file is simply the number of backslashes in the code, i.e.\ all
+% lines between the \env{macrocode} environments. But don't be
+% afraid: you don't have count the code-lines yourself; this is done
+% by the \DOC{} package for you. You simply have add
+% \begin{quote}
+% |% \CheckSum{0}|
+% \end{quote}
+% near the beginning of the file and use the |\MaybeStop| (which
+% starts looking for backslashes) and the |\Finale| command. The
+% latter will inform you either that your file has no check-sum
+% (telling you the right number) or that your number is incorrect if
+% you put in anything other than zero but guessed wrong (this time
+% telling you both the correct and the incorrect one). Then you go to
+% the top of your file again and change the line to the right number,
+% i.e., line
+% \begin{quote}
+% |% \CheckSum{|\meta{number}|}|
+% \end{quote}
+% and that's all.
+%
+% While |\CharacterTable| and |\CheckSum| have been important features
+% in the early days of the public internet when \DOC{} was written as
+% the mail gateways back then were rather unreliable and often mangled
+% files they are these days more a nuisance than any help. They are
+% therefore now fully optional and no longer recommended for use with
+% new files.
+%
+%
+
+
+
+% ^^A =============================================================
+
+
+
+% \begin{multicols}{2}[\medskip \noindent\rule{\textwidth}{.3pt}
+% \section{Introduction to previous releases}]
+%
+% \begin{quote}
+% \textbf{Original abstract:}
+% This package contains the definitions that are necessary to
+% format the documentation of package files. The package was
+% developed in Mainz in cooperation with the Royal Military College
+% of Science. This is an update which documents various changes
+% and new features in \DOC{} and integrates the features of
+% \env{newdoc}.
+% \end{quote}
+%
+% The \TeX{} macros which are described here allow definitions and
+% documentation to be held in one and the same file. This has the
+% advantage that normally very complicated instructions are made
+% simpler to understand by comments inside the definition. In addition
+% to this, updates are easier and only one source file needs to be
+% changed. On the other hand, because of this, the package files are
+% considerably longer: thus \TeX{} takes longer to load them. If this
+% is a problem, there is an easy remedy: one needs only to run the
+% \texttt{docstrip.tex} program that removes nearly all lines that begin
+% with a
+% percent sign.
+%
+% The idea of integrated documentation was born with the development
+% of the \TeX{} program; it was crystallized in Pascal with the \Web{}
+% system. The advantages of this method are plain to see (it's easy
+% to make comparisons \cite{art:Knuthliterat}). Since this
+% development, systems similar to \Web{} have been developed for other
+% programming languages. But for one of the most complicated
+% programming languages (\TeX) the documentation has however been
+% neglected. The \TeX{} world seems to be divided between:---
+% \begin{itemize} \item a couple of ``wizards'', who produce many
+% lines of completely unreadable code ``off the cuff'', and \item many
+% users who are amazed that it works just how they want it to do. Or
+% rather, who despair that certain macros refuse to do what is
+% expected of them.\end{itemize}
+%
+% I do not think that the \Web{} system is {\em the\/} reference work;
+% on the contrary, it is a prototype which suffices for the
+% development of programs within the \TeX{} world. It is sufficient,
+% but not totally sufficient.\footnote{I know that this will be seen
+% differently by a few people, but this product should not be seen as
+% the finished product, at least as far as applications concerning
+% \TeX{} are concerned. The long-standing debate over `multiple
+% change files' shows this well.} As a result of \Web, new programming
+% perspectives have been demonstrated; unfortunately, though, they
+% haven't been developed further for other programming languages.
+%
+% The method of documentation of \TeX{} macros which I have introduced
+% here should also only be taken as a first sketch. It is designed
+% explicitly to run under \LaTeX{} alone. Not because I was of the
+% opinion that this was the best starting point, but because from this
+% starting point it was the quickest to develop.\footnote{This
+% argument is a bad one, however, it is all too often trotted out.} As
+% a result of this design decision, I had to move away from the
+% concept of modularization; this was certainly a step backward.
+%
+% I would be happy if this article could spark off discussion over
+% \TeX\ documentation. I can only advise anyone who thinks that they
+% can cope without documentation to ``Stop Time'' until he or she
+% completely understands the \AmSTeX{} source code.
+%
+% \subsection*{Using the \DOC{} package}
+%
+% Just like any other package, invoke it by requesting it with a
+% |\usepackage| command in the preamble. \DOC's use of
+% |\reversemarginpars| may make it incompatible with some classes.
+% \changes{v1.7a}{1992/02/25}{Altered usage info}
+%
+%
+% \end{multicols}
+%
+%
+%
+%
+% \begin{multicols}{2}[\subsection*{Preface to version 1.7 (from
+% around 1992)}]
+%
+% This version of \texttt{doc.dtx} documents changes which have occurred
+% since the last published version \cite{art:doc} but which have been
+% present in distributed versions of \texttt{doc.sty} for some time. It
+% also integrates the (undocumented) features of the distributed
+% \texttt{newdoc.sty}.
+%
+% The following changes and additions have been made to the user
+% interface since the published version~\cite{art:doc}. See
+% \S\ref{sec:interface} for more details.
+% \begin{description}
+% \item[Driver mechanism] |\DocInput| is now used in the driver file
+% to input possibly multiple independent \DOC{} files and \DOC{} no
+% longer has to be the last package. |\IndexListing| is replaced
+% by |\IndexInput|;
+% \item[Indexing] is controlled by |\PageIndex| and |\CodelineIndex|,
+% one of which must be specified to produce an index---there is no
+% longer a |\makeindex| in the default |\DocstyleParms|;
+% \item[The \texttt{macro} environment] now takes as argument the
+% macro name {\em with\/} the backslash;
+% \item[Verbatim text] Newlines are now forbidden inside |\verb| and
+% commands |\MakeShortVerb| and |\DeleteShortVerb| are provided for
+% verbatim shorthand;
+% \item[\texttt{\bslash par}] can now be used in |\DoNotIndex|;
+% \item[Checksum/character table support] for ensuring the integrity
+% of distributions is added;
+% \item[\texttt{\bslash printindex}] becomes |\PrintIndex|;
+% \item[\texttt{multicol.sty}] is no longer necessary to use \DOC{} or
+% print the documentation (although it is recommended);
+% \item[`Docstrip' modules] are recognized and formatted specially.
+% \end{description}
+%
+% As well as adding some completely new stuff,
+% the opportunity has been taken to add some commentary to the code
+% formerly in \pkg{newdoc} and that added after version 1.5k of
+% \DOC. Since (as noted in the sections concerned) this
+% commentary wasn't written by Frank Mittelbach but the code was, it is
+% probably {\em not\/} true in this case that ``if the code and
+% comments disagree both are probably wrong''!
+%
+% \subsubsection*{Bugs}
+%
+% There are some known bugs in this version:
+% \begin{itemize}
+% \item The |\DoNotIndex| command doesn't work for some single
+% character commands most noticeable |\%|.
+% \item The `General changes' glossary entry would come out after
+% macro names with a leading |!| and possibly a leading |"|;
+% \item If you have an old version of \prg{makeindex} long |\changes|
+% entries will come out strangely and you may find the section
+% header amalgamated with the first changes entry. Try to get an
+% up-to-date one (see p.~\pageref{makeindex:version});
+% \item Because the accompanying \prg{makeindex} style files support
+% the inconsistent attribute specifications of older and newer
+% versions \prg{makeindex} always complains about three `unknown
+% specifier's when sorting the index and changes entries.
+% \item If |\MakeShortVerb| and |\DeleteShortVerb| are used with
+% single character arguments, e.g., \verb"{|}" instead of \verb"{\|}" chaos
+% may happen.
+% \end{itemize}
+% (Some `features' are documented below.)
+%
+% \subsubsection*{Wish list}
+%
+% \begin{itemize}
+% \item Hooks to allow |\DescribeMacro| and |\DescribeEnv| to write
+% out to a special file information about the package's `exported'
+% definitions which they describe. This could subsequently be
+% included in the \texttt{docstrip}ped \texttt{.sty} file in a
+% suitable form for use by smart editors in command completion,
+% spelling checking etc., based on the packages used in a document.
+% This would need agreement on a `suitable form'. \item Indexing of
+% the modules used in \texttt{docstrip}'s |%<| directives. I'm not
+% sure how to index directives containing module combinations; \item
+% Writing out bibliographic information about the package; \item Allow
+% turning off use of the special font for, say, the next guarded
+% block.
+% \end{itemize}
+%
+%
+% \end{multicols}
+
+
+% \subsection*{Acknowledgements}
%
% I would like to thank all folks at Mainz and at the Royal Military
% College of Science for their help in this project. Especially Brian
@@ -1158,14 +1796,14 @@
% \texttt{doc.dtx} after its publication in \textsl{TUGboat\/} have
% been never properly described. Beside this splendid work he kindly
% provided additional code (like ``docstrip'' module formatting) which
-% I think every \textsf{doc.dtx} user will be grateful for.
+% I think every \DOC user will be grateful for.
%
%
-% \StopEventually{
+% \MaybeStop{
% \begin{thebibliography}{1}
% \bibitem{book:Buerger} \textsc{G. A. B\"urger}.
-% \newblock Wunderbare Reisen zu Wasser und zu Lande, Feldz\"uge
-% und lustige Abenteuer des Freyherrn v.\ M\"unchhausen.
+% \newblock Wunderbare Reisen zu Wasser und zu Lande, Feldzüge
+% und lustige Abenteuer des Freyherrn v.\ Münchhausen.
% \newblock London, 1786 \& 1788.
% \bibitem{art:Knuthliterat} \textsc{D. E. Knuth}.
% \newblock Literate Programming.
@@ -1189,20 +1827,20 @@
% \newblock \texttt{docstrip.dtx} (to appear).
% \newblock The file is part of the DOC package.
% \bibitem{book:Raspe} \textsc{R. E. Raspe} (*1737, \dag 1797).
-% \newblock Baron M\"unchhausens narrative of his marvellous
+% \newblock Baron Münchhausens narrative of his marvelous
% travels and campaigns in Russia.
% \newblock Oxford, 1785.
-% \bibitem{art:verbatim} \textsc{Rainer Sch\"opf}.
+% \bibitem{art:verbatim} \textsc{Rainer Schöpf}.
% \newblock A New Implementation of \LaTeX's \texttt{verbatim} and
% \texttt{verbatim*} Environments.
% \newblock File \texttt{verbatim.doc}, version 1.4i.
% \end{thebibliography}
%
-% \ifmulticols
% \addtocontents{toc}{\protect\end{multicols}}
-% \fi
%
-% } ^^A end \StopEventually
+% \PrintIndex
+%
+% } ^^A end \MaybeStop
%
%
% \section{The Description of Macros}
@@ -1228,50 +1866,211 @@
\@ifundefined{macro@cnt}{}{\endinput}
% \end{macrocode}
%
-% \DescribeMacro\fileversion
-% \DescribeMacro\filedate
-% \DescribeMacro\docdate
+% \DescribeObsoleteInterfaceMacro\fileversion
+% \DescribeObsoleteInterfaceMacro\filedate
+% \DescribeObsoleteInterfaceMacro\docdate
% As you can see I used macros like |\fileversion| to denote the
% version number and the date. They are defined at the very beginning
-% of the package file (without a surrounding \textsf{macrocode}
+% of the package file (without a surrounding \env{macrocode}
% environment), so I don't have to search for this place here when I
% change the version number. You can see their actual outcome in a
% footnote to the title.
%
%
-% The first thing that we do next is to get ourselves a new comment
-% sign. Because all sensible signs are already occupied, we will
-% choose one that can only be entered indirectly:
+% The first thing that we do next is to get ourselves two alternative comment
+% signs. Because all sensible signs are already occupied, we will
+% choose some that can only be entered indirectly:
% {\DoNotIndex{\^}^^A avoid misinterpretation !!!!! VERIFY
% \begin{macrocode}
\catcode`\^^A=14
+\catcode`\^^X=14
% \end{macrocode}
% We repeat this statement at the beginning of the document in case
% the \texttt{inputenc} package is used disabling it again.
% \changes{v2.0b}{1998/05/19}{Init docs private comment char at begin
% of document again (pr2581)}
% \begin{macrocode}
-\AtBeginDocument{\catcode`\^^A=14\relax}
+\AtBeginDocument{\catcode`\^^A=14\relax\catcode`\^^X=14\relax}
% \end{macrocode}
% \SortIndex{\string^\string^A}{\string\verb\verbatimchar
% \string^\string^A\verbatimchar
+% \encapchar main}^^A
+% \SortIndex{\string^\string^X}{\string\verb\verbatimchar
+% \string^\string^X\verbatimchar
% \encapchar main}
% }
%
%
-% \subsection{Options supported by \DOC{}}
+% \subsection{Keys supported by \DOC{}}
+%
+% In the past this used \pkg{kvoptions} but this will be
+% replaced by using \texttt{l3keys} at some point in the future.
+% Right now this is only a lightweight shift---the code could and
+% should be altered further.
+% \fmi{cleanup replacement of kvoptions}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+% Some keys are available as options for use in \cs{usepackage} some are
+% for the generated item \api's:
+% \fmi{cleanup documentation (and code once the new key interface is there)}
+% \begin{macrocode}
+\newif \ifdoc@noprint
+\newif \ifdoc@noindex
+\newif \ifdoc@hyperref \doc@hyperreftrue
+\newif \ifdoc@multicol \doc@multicoltrue
+\newif \ifdoc@debugshow
+\newif \ifdoc@reportchangedates
+\keys_define:nn {doc}
+ {
+ noprint .choice:,
+ noprint / true .code:n = { \legacy_if_set_true:n { doc@noprint } },
+ noprint / false .code:n = { \legacy_if_set_false:n { doc@noprint } },
+ noprint .default:n = { true },
+ noindex .choice:,
+ noindex / true .code:n = { \legacy_if_set_true:n { doc@noindex } },
+ noindex / false .code:n = { \legacy_if_set_false:n { doc@noindex } },
+ noindex .default:n = { true },
+ hyperref .choice:,
+ hyperref / true .code:n = { \legacy_if_set_true:n { doc@hyperref } },
+ hyperref / false .code:n = { \legacy_if_set_false:n { doc@hyperref } },
+ hyperref .default:n = { true },
+% \end{macrocode}
+% \changes{v3.0h}{2022/06/01}{fix choice key name (gh/750)}
+% \begin{macrocode}
+ nohyperref .choice:,
+ nohyperref / true .code:n = { \legacy_if_set_false:n { doc@hyperref } },
+ nohyperref / false .code:n = { \legacy_if_set_true:n { doc@hyperref } },
+ nohyperref .default:n = { true },
+ multicol .choice:,
+ multicol / true .code:n = { \legacy_if_set_true:n { doc@multicol } },
+ multicol / false .code:n = { \legacy_if_set_false:n { doc@multicol } },
+ multicol .default:n = { true },
+ nomulticol .choice:,
+ nomulticol / true .code:n = { \legacy_if_set_false:n { doc@multicol } },
+ nomulticol / false .code:n = { \legacy_if_set_true:n { doc@multicol } },
+% \end{macrocode}
+% \changes{v3.0h}{2022/06/01}{fix default key name (gh/750)}
+% \begin{macrocode}
+ nomulticol .default:n = { true },
+ debugshow .choice:,
+ debugshow / true .code:n = { \legacy_if_set_true:n { doc@debugshow } },
+ debugshow / false .code:n = { \legacy_if_set_false:n { doc@debugshow } },
+ debugshow .default:n = { true },
+ reportchangedates .choice:,
+ reportchangedates / true .code:n = { \legacy_if_set_true:n { doc@reportchangedates } },
+ reportchangedates / false .code:n = { \legacy_if_set_false:n { doc@reportchangedates } },
+ reportchangedates .default:n = { true },
+ }
+% \end{macrocode}
+% This one is for \cs{usepackage} and \cs{NewDocElement}:
+% \begin{macrocode}
+\newif \ifdoc@toplevel \doc@topleveltrue
+\keys_define:nn {doc}
+ {
+ toplevel .choice:,
+ toplevel / true .code:n = { \legacy_if_set_true:n { doc@toplevel } },
+ toplevel / false .code:n = { \legacy_if_set_false:n { doc@toplevel } },
+ toplevel .default:n = { true },
+ notoplevel .choice:,
+ notoplevel / true .code:n = { \legacy_if_set_false:n { doc@toplevel } },
+ notoplevel / false .code:n = { \legacy_if_set_true:n { doc@toplevel } },
+ notoplevel .default:n = { true }
+ }
+% \end{macrocode}
+% These are for \cs{NewDocElement}:
+% \begin{macrocode}
+\newif \ifdoc@macrolike
+\keys_define:nn {doc}
+ {
+ macrolike .choice:,
+ macrolike / true .code:n = { \legacy_if_set_true:n { doc@macrolike } },
+ macrolike / false .code:n = { \legacy_if_set_false:n { doc@macrolike } },
+ macrolike .default:n = { true },
+ envlike .choice:,
+ envlike / true .code:n = { \legacy_if_set_false:n { doc@macrolike } },
+ envlike / false .code:n = { \legacy_if_set_true:n { doc@macrolike } },
+ envlike .default:n = { true }
+ }
+
+\keys_define:nn { doc }
+ {
+ idxtype .tl_set:N = \doc@idxtype,
+ idxgroup .tl_set:N = \doc@idxgroup,
+ printtype .tl_set:N = \doc@printtype
+ }
+% \end{macrocode}
+% And this one only for instances of doc elements in the document, it
+% covers the case where you want to document a macro which is
+% declared to be \cs{outer}. This is not a concept officially
+% supported by \LaTeX{} but there are cases when it gets used.
+% \begin{macrocode}
+\newif\ifdoc@outer
+\keys_define:nn {doc}
+ {
+ outer .choice:,
+ outer / true .code:n = { \legacy_if_set_true:n { doc@outer } },
+ outer / false .code:n = { \legacy_if_set_false:n { doc@outer } },
+ outer .default:n = { true },
+ }
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \subsection{Processing the package keys}
+%
+% \begin{macrocode}
+\ProcessKeyOptions
+% \end{macrocode}
%
-% Not options available at the moment
%
+% \begin{macro}{\ifscan@allowed}
+% \begin{macro}{\scan@allowedtrue}
+% \begin{macro}{\scan@allowedfalse}
+% |\ifscan@allowed| is the switch used to determine if
+% the |\active@escape@char|\SpecialIndex{\active@escape@char}
+% should start the macro scanning mechanism.
% \begin{macrocode}
+\newif\ifscan@allowed \scan@allowedtrue
% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{imacro}{\SetupDoc}
+%
+% We need to save the default value for some options because \DOC elements
+% can locally set them.
+% \fmi{Use 2e interface for \cs{keys\_set:nn} when available}
+% \begin{macrocode}
+\def\SetupDoc#1{%
+ \csname keys_set:nn\endcsname{doc}{#1}%
+ \edef\doc@noprintdefault{\ifdoc@noprint true\else false\fi}%
+ \ifdoc@noindex
+% \end{macrocode}
+% If we do not index by default then we should also turn off
+% \cs{scan@allowed}.
+% \begin{macrocode}
+ \def\doc@noindexdefault{true}%
+ \scan@allowedfalse
+ \else
+ \def\doc@noindexdefault{false}%
+ \fi
+}
+% \end{macrocode}
+% \end{imacro}
+%
+% \begin{macrocode}
+\SetupDoc{} % just save the default values
+% \end{macrocode}
+%
%
%
% \subsection{Macros surrounding the `definition parts'}
%
% \begin{environment}{macrocode}
% Parts of the macro definition will be surrounded by the
-% environment \textsf{macrocode}. Put more precisely, they will be
+% environment \env{macrocode}. Put more precisely, they will be
% enclosed by a macro whose argument (the text to be set
% `verbatim') is terminated by the string
% \verb*+% \end{macrocode}+. Carefully note the number of spaces.
@@ -1307,7 +2106,7 @@
% \begin{macrocode}
\def\macro@code{%
% \end{macrocode}
-% In theory it should consist of a \textsf{trivlist} environment, but
+% In theory it should consist of a \env{trivlist} environment, but
% the empty space before and after the environment should not be
% too large.
% \begin{macrocode}
@@ -1384,7 +2183,7 @@
% indexing by code lines is switched on the line number is incremented
% and set appropriately. We also check whether the start of the next
% line indicates a \texttt{docstrip} module directive and process it
-% appropriately if so using "\check@module".
+% appropriately if so using |\check@module|.
% \begin{macrocode}
\global\@newlistfalse
\global\@minipagefalse
@@ -1408,9 +2207,9 @@
% \begin{macro}{\blank@linetrue}
% \begin{macro}{\blank@linefalse}
% |\ifblank@line| is the switch used in the definition above.
-% In the original \textsf{verbatim} environment the |\if@tempswa|
+% In the original \env{verbatim} environment the |\if@tempswa|
% switch is used. This is dangerous because its value may change
-% while processing lines in the \textsf{macrocode} environment.
+% while processing lines in the \env{macrocode} environment.
% \begin{macrocode}
\newif\ifblank@line
% \end{macrocode}
@@ -1419,10 +2218,10 @@
% \end{macro}
%
% \begin{macro}{\endmacrocode}
-% Because we have begun a \textsf{trivlist} environment in the
-% \textsf{macrocode} environment, we must also end it. We must
-% also act on the value of the "pm@module" flag (see below) and
-% empty "\everypar".
+% Because we have begun a \env{trivlist} environment in the
+% \env{macrocode} environment, we must also end it. We must
+% also act on the value of the |pm@module| flag (see below) and
+% empty |\everypar|.
% \changes{v1.5r}{1989/11/04}{Support for code line no. (Undoc)}
% \begin{macrocode}
\def\endmacrocode{%
@@ -1439,7 +2238,7 @@
% \end{macro}
%
%
-% \begin{macro}{\MacroFont}
+% \begin{imacro}{\MacroFont}
% Here is the default definition for the |\MacroFont| macro.
% With the new math font handling in NFSS2 it isn't any longer
% correct to suppress the math font setup since this is now handled
@@ -1459,7 +2258,7 @@
% bothered since doc-sources should be up-to-date but since the
% request came from someone called David Carlisle \ldots :-)
% \changes{v1.9y}{1996/01/26}{Support compat mode}
-% \changes{v2.1l}{2019/12/16}{Use \cs{shapedefault} not
+% \changes{v2.1l}{2019/12/16}{Use \cs{shapedefault} not
% \cs{updefault} for extended NFSS}
% \begin{macrocode}
\def\MacroFont{\small
@@ -1477,9 +2276,9 @@
\fi
}{}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
-% \begin{macro}{\AltMacroFont}
+% \begin{imacro}{\AltMacroFont}
% \begin{macro}{\macro@font}
% \changes{v1.7a}{1992/03/12}{Added to support distinction of modules.}
% \changes{v1.7c}{1992/03/26}{Altered font change for OFSS.}
@@ -1487,9 +2286,9 @@
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different
% 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
+% 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
% same thing sensibly in OFSS as in NFSS.
% \begin{macrocode}
\@ifundefined{AltMacroFont}{%
@@ -1514,8 +2313,8 @@
\fi
}{}
% \end{macrocode}
-% To allow changing the "\MacroFont" in the preamble we defer
-% defining the internally used "\macro@font" until after the
+% To allow changing the |\MacroFont| in the preamble we defer
+% defining the internally used |\macro@font| until after the
% preamble.
% \changes{v2.0a}{1998/05/16}{Support changing \cs{MacroFont} in
% preamble}
@@ -1523,23 +2322,23 @@
\AtBeginDocument{\let\macro@font\MacroFont}
% \end{macrocode}
% \end{macro}
-% \end{macro}
+% \end{imacro}
%
% \begin{macro}{\check@module}
% \begin{macro}{\ifpm@module}
% \changes{v1.7a}{1992/03/12}{Added.}
-% This is inserted by "\everypar" at the start of each macrocode line to
+% This is inserted by |\everypar| at the start of each macrocode line to
% check whether it starts with module information. (Such information is
-% of the form "%<"\meta{switch}">", where the "%" must be at the
+% of the form |%<|\meta{switch}|>|, where the |%| must be at the
% start of the line and \meta{switch} comprises names with various
-% possible separators and a possible leading "+", "-", "*" or "/"
+% possible separators and a possible leading |+|, |-|, |*| or |/|
% \cite{art:docstrip}. All that concerns us here is what the first
-% character of \meta{switch} is.) First it checks the "pm@module"
+% character of \meta{switch} is.) First it checks the |pm@module|
% flag in case the previous line had a non-block module
-% directive i.e., not "%<*" or "%</"; if it did we need to close the
-% group it started and unset the flag. "\check@module" looks ahead at
-% the next token and then calls "\ch@percent" to take action depending
-% on whether or not it's a "%"; we don't want to expand the token at
+% directive i.e., not |%<*| or |%</|; if it did we need to close the
+% group it started and unset the flag. |\check@module| looks ahead at
+% the next token and then calls |\ch@percent| to take action depending
+% on whether or not it's a |%|; we don't want to expand the token at
% this stage. This is all done conditionally so it can be turned off
% if it causes problems with code that wasn't designed to be
% \texttt{docstrip}ped.
@@ -1553,25 +2352,27 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \begin{macro}{\DontCheckModules}
-% \begin{macro}{\CheckModules}
+% \begin{imacro}{\DontCheckModules}
+% \begin{imacro}{\CheckModules}
% \changes{v1.7a}{1992/03/12}{Added.}
% \begin{macro}{\ifcheck@modules}
% Here are two driver-file interface macros for turning the module
-% checking on and off using the "check@modules" switch.
+% checking on and off using the |check@modules| switch.
% \begin{macrocode}
\def\DontCheckModules{\check@modulesfalse}
\def\CheckModules{\check@modulestrue}
\newif\ifcheck@modules \check@modulestrue
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
+% \end{imacro}
+%
+%
% \begin{macro}{\ch@percent}
% \changes{v1.7a}{1992/03/12}{Added.}
-% If the lookahead token in "\next" is $"%"_{12}$ we go on to check
-% whether the following one is "<" and otherwise do nothing. Note the
-% "\expandafter" to get past the "\fi".
+% If the lookahead token in |\next| is $|%|_{12}$ we go on to check
+% whether the following one is |<| and otherwise do nothing. Note the
+% |\expandafter| to get past the |\fi|.
% \begin{macrocode}
\def\ch@percent{%
\if \percentchar\next
@@ -1582,7 +2383,7 @@
%
% \begin{macro}{\check@angle}
% \changes{v1.7a}{1992/03/12}{Added.}
-% Before looking ahead for the "<" the "%" is gobbled by the
+% Before looking ahead for the |<| the |%| is gobbled by the
% argument here.
% \begin{macrocode}
\def\check@angle#1{\futurelet\next\ch@angle}
@@ -1591,9 +2392,9 @@
% \begin{macro}{\ch@angle}
% \changes{v1.7a}{1992/03/12}{Added.}
% \changes{v1.9k}{1994/02/22}{Have \texttt{<} active}
-% If the current lookahead token is "<" we are defined to be
-% processing a module directive can go on to look for "+" etc.;
-% otherwise we must put back the gobbled "%". With \LaTeXe{}
+% If the current lookahead token is |<| we are defined to be
+% processing a module directive can go on to look for |+| etc.;
+% otherwise we must put back the gobbled |%|. With \LaTeXe{}
% \texttt{<} is active so we have to be a bit careful.
% \begin{macrocode}
\begingroup
@@ -1644,13 +2445,13 @@
% \end{macro}
% \begin{macro}{\pm@module}
% If we're not dealing with a block
-% directive ("*" or "/") i.e., it's a single special line, we set
-% everything up to the next ">" appropriately and then change to the
+% directive (|*| or |/|) i.e., it's a single special line, we set
+% everything up to the next |>| appropriately and then change to the
% special macro font inside a group which will be ended at the start
% of the next line. If the apparent module directive is missing the
-% terminating ">" this will lose, but then so will the \texttt{docstrip}
+% terminating |>| this will lose, but then so will the \texttt{docstrip}
% implementation. An alternative strategy would be to have
-% "\pm@module" make ">" active and clear a flag set here to indicate
+% |\pm@module| make |>| active and clear a flag set here to indicate
% processing the directive. Appropriate action could then be taken if
% the flag was found still to be set when processing the next line.
% \changes{v1.7a}{1992/03/12}{Added.}
@@ -1663,8 +2464,8 @@
\Module{#1}\begingroup
% \end{macrocode}
% We switch to a special font as soon the nesting is higher than
-% the current value of "\c@StandardModuleDepth". We do a local
-% update to the "\guard@level" here which will be restored after
+% the current value of |\c@StandardModuleDepth|. We do a local
+% update to the |\guard@level| here which will be restored after
% the current input line.
% \begin{macrocode}
\advance\guard@level\@ne
@@ -1706,8 +2507,7 @@
% \end{macro}
% \end{macro}
%
-%
-% \begin{macro}{\c@StandardModuleDepth}
+% \begin{lcounter}{StandardModuleDepth}
% \changes{v1.7i}{1992/07/11}{Counter added.}
% Counter defining up to which level modules are considered part of
% the main code. If, for example, the whole code is surrounded by
@@ -1716,38 +2516,39 @@
% \begin{macrocode}
\newcounter{StandardModuleDepth}
% \end{macrocode}
-% \end{macro}
+% \end{lcounter}
%
%
-% \begin{macro}{\guard@level}
+% \begin{tcounter}{\guard@level}
% \changes{v1.7f}{1992/05/16}{Added.}
% We need a counter to keep track of the guard nesting.
% \begin{macrocode}
\newcount \guard@level
% \end{macrocode}
-% \end{macro}
+% \end{tcounter}
+
% \begin{macro}{\Module}
% \changes{v1.7a}{1992/03/12}{Added.}
% \changes{v1.7d}{1992/04/25}{Use sans font for modules.}
% This provides a hook to determine the way the module directive is
% set. It gets as argument everything between the angle brackets.
% The default is to set the contents in sans serif text between
-% $\langle\,\rangle$ with the special characters suitably "\mathcode"d
-% by "\mod@math@codes". (You can't just set it in a sans text font
-% because normally "|" will print as an em-dash.) This is done
+% $\langle\,\rangle$ with the special characters suitably |\mathcode|d
+% by |\mod@math@codes|. (You can't just set it in a sans text font
+% because normally \verb"|" will print as an em-dash.) This is done
% differently depending on whether we have the NFSS or the old one. In
-% the latter case we can easily change "\fam" appropriately.
+% the latter case we can easily change |\fam| appropriately.
% \changes{v1.8c}{1993/10/25}{NFSS standard}
% \begin{macrocode}
\@ifundefined{Module}{%
% \end{macrocode}
% With NFSS what we probably {\em should\/} do is change to a new
-% "\mathversion" but I (Dave Love) haven't spotted an easy way to
+% |\mathversion| but I (Dave Love) haven't spotted an easy way to
% do so correctly if the document uses a version other than
-% "normal". (We need to know in what font to set the other
+% |normal|. (We need to know in what font to set the other
% groups.) This uses a new math alphabet rather than version and
% consequently has to worry about whether we're using
-% \textsf{oldlfnt} or not. I expect there's a better
+% \env{oldlfnt} or not. I expect there's a better
% way\ldots
% \begin{macrocode}
\def\Module#1{\mod@math@codes$\langle\mathsf{#1}\rangle$}
@@ -1759,11 +2560,11 @@
% \changes{v1.7c}{1992/03/26}{Added.}
% \changes{v2.1e}{2010/02/04}{Added mathcodes for +,-,:, and = (pr/4096)}
% As well as `words', the module
-% directive text might contain any of the characters "*/+-,&|!()"
-% for the current version of \textsf{docstrip}. We only need
+% directive text might contain any of the characters \verb"*/+-,&|!()"
+% for the current version of \prg{docstrip}. We only need
% special action for two of them in the math code changing required
-% above: "|" is changed to a "\mathop" (it's normally |"026A|) and
-% "&" is also made a "\mathop", but in family 0. Remember that "&"
+% above: \verb"|" is changed to a |\mathop| (it's normally |"026A|) and
+% |&| is also made a |\mathop|, but in family 0. Remember that |&|
% will not have a special catcode when it's encountered.
% \begin{macrocode}
\def\mod@math@codes{\mathcode`\|="226A \mathcode`\&="2026
@@ -1772,27 +2573,9 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\mathsf}
-% \changes{v1.7c}{1992/03/26}{Added.}
-% \changes{v1.7d}{1992/04/25}{Use sans font for modules.}
-% \changes{v1.7n}{1993/02/21}{\cs{sfmath} Renamed to \cs{mathsf}.}
-% \changes{v1.8c}{1993/10/25}{NFSS standard}
-% If NFSS is in use we need a new math alphabet which uses a sans serif
-% font. To support both the release one and two of NFSS the alphabet
-% was renamed to "\mathsf" which is defined in NFSS2.
-% \begin{macrocode}
-%\ifx\selectfont\undefined
-%\else
-% \ifx\mathsf\undefined
-% \newmathalphabet*{\mathsf}{\sfdefault}{m}{n}\fi
-%\fi
-% \end{macrocode}
-% \end{macro}
%
-%
-%
-% \begin{macro}{\MacrocodeTopsep}
-% \begin{macro}{\MacroIndent}
+% \begin{lskip}{\MacrocodeTopsep}
+% \begin{ldimen}{\MacroIndent}
% In the code above, we have used two registers. Therefore we have
% to allocate them. The default values might be overwritten with
% the help of the |\DocstyleParms| macro.
@@ -1805,22 +2588,22 @@
\newdimen\MacroIndent
\settowidth\MacroIndent{\rmfamily\scriptsize 00\ }
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{ldimen}
+% \end{lskip}
%
%
%
%
% \begin{environment}{macrocode*}
% \begin{macro}{\endmacrocode*}
-% Just as in the \textsf{verbatim} environment, there is also a
-% `star' variant of the \textsf{macrocode} environment in which a
+% Just as in the \env{verbatim} environment, there is also a
+% `star' variant of the \env{macrocode} environment in which a
% space is shown by the symbol \verb*+ +. Until this moment, I
% have not yet used it (it will be used in the description of the
% definition of |\xmacro@code| below) but it's exactly on this one
-% occasion {\em here\/} that you can't use it (cf.\ M\"unchhausens
+% occasion {\em here\/} that you can't use it (cf.\ Münchhausens
% Marsh problem)\footnote{Karl Friedrich Hieronymus Frhr.\ v.\
-% M\"unchhausen (*1720, \dag1797). Several books were written
+% Münchhausen (*1720, \dag1797). Several books were written
% about fantastic adventures supposedly told by him (see
% \cite{book:Raspe} or \cite{book:Buerger}). In one story he
% escaped from the marsh by pulling himself out by his hair.}
@@ -1865,7 +2648,7 @@
% \end{macrocode*}
% Additionally, we need to ensure that the symbols in the above
% string contain the |\catcode|$\,$s which are available
-% within the \textsf{macrocode} environment.
+% within the \env{macrocode} environment.
% \begin{macrocode*}
\catcode`\{=12 \catcode`\}=12
\catcode`\%=12 \catcode`\ =\active \catcode`\\=\active
@@ -1908,65 +2691,7 @@
% \subsection{Macros for the `documentation parts'}
%
%
-% \begin{macro}{\DescribeMacro}
-% \begin{macro}{\Describe@Macro}
-% \changes{v1.5v}{1990/01/28}{Macro added.}
-% \changes{v1.5j}{1989/06/09}{\cs{ignorespaces} added as a temporary
-% fix}
-% \begin{macro}{\DescribeEnv}
-% \begin{macro}{\Describe@Env}
-% \changes{v1.5v}{1990/01/28}{Macro added.}
-% \changes{v1.5j}{1989/06/09}{\cs{ignorespaces} added as a temporary
-% fix}
-% The |\DescribeMacro| and |\DescribeEnv| macros should
-% print their arguments in the margin and produce an index entry.
-% We simply use |\marginpar| to get the desired result. This
-% is however not the best solution because the labels might be
-% slightly misplaced. One also might get a lot of `marginpar moved'
-% messages which are hard-wired into the \LaTeX{} output
-% routine.\footnote{It might be better to change these macros into
-% environments like the \textsf{macro} environment.} First we change
-% to horizontal mode if necessary. The \LaTeX{} macros
-% |\@bsphack| and |\@esphack| are used to make those
-% commands invisible (i.e.\ to normalize the surrounding space and
-% to make the |\spacefactor| transparent).
-% \changes{v1.5v}{1990/01/28}{\cs{MakePrivateLetters} added.}
-% \begin{macrocode}
-\def\DescribeMacro{\leavevmode\@bsphack
-% \end{macrocode}
-% When documenting the code for the \texttt{amstex.sty} option we
-% encountered a bug: the |\catcode| of |@| was active and
-% therefore couldn't be used in command names. So we first have to
-% make sure that we get all |\catcode|s right by calling
-% |\MakePrivateLetters| inside a group. Then we call
-% |\Describe@Macro| to do the work.
-% \changes{v2.0g}{1999/03/22}{Parse backslash as letter in argument
-% to \cs{DescribeMacro}.}
-% \changes{v2.0h}{1999/03/25}{Correct errors introduced in v2.0g.}
-% \begin{macrocode}
- \begingroup\MakePrivateLetters\Describe@Macro}
-\def\Describe@Macro#1{\endgroup
- \marginpar{\raggedleft\PrintDescribeMacro{#1}}%
-% \end{macrocode}
-% Note the use of |\raggedleft| to place the output flushed
-% right. Finally we call a macro which produces the actual index
-% entry and finish with |\@esphack| to leave no
-% trace.\footnote{The whole mechanism won't work because
-% of the \texttt{\bslash leavevmode} in front.
-% As a temporary change \texttt{\bslash ignorespaces}
-% is added.}
-% \begin{macrocode}
- \SpecialUsageIndex{#1}\@esphack\ignorespaces}
-% \end{macrocode}
-% The |\DescribeEnv| macro is completely analogous.
-% \changes{v1.5v}{1990/01/28}{\cs{MakePrivateLetters} added.}
-% \begin{macrocode}
-\def\DescribeEnv{\leavevmode\@bsphack\begingroup\MakePrivateLetters
- \Describe@Env}
-\def\Describe@Env#1{\endgroup
- \marginpar{\raggedleft\PrintDescribeEnv{#1}}%
- \SpecialEnvIndex{#1}\@esphack\ignorespaces}
-% \end{macrocode}
+
% To put the labels in the left margin we have to use the
% |\reversemarginpar| declaration. (This means that the
% \texttt{doc.sty} can't be used with all classes or packages.)
@@ -1978,12 +2703,12 @@
\reversemarginpar
\setlength\marginparpush{0pt} \setlength\marginparwidth{8pc}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\bslash}
+% \begin{macrocode}
+\setlength\marginparsep{\labelsep}
+% \end{macrocode}
+%
+% \begin{imacro}{\bslash}
% \changes{v1.7a}{1992/02/26}{Moved \cs{bslash} documentation to `user
% interface' part}
% We start a new group in which to hide the alteration of
@@ -2000,14 +2725,14 @@
% \begin{macrocode}
|gdef|bslash{\}}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
%
% \begin{environment}{verbatim}
% \begin{environment}{verbatim*}
% \changes{v1.7i}{1992/07/12}{Added changed definition for verbatim!*.}
-% The \textsf{verbatim} environment holds no secrets; it consists of
+% The \env{verbatim} environment holds no secrets; it consists of
% the normal \LaTeX{} environment. We also set the
% |\@beginparpenalty| and change to the font given by
% |\MacroFont|.
@@ -2032,7 +2757,7 @@
% \begin{macro}{\@verbatim}
% Additionally we redefine the |\@verbatim| macro so that it
% suppresses |%| characters at the beginning of the line. The
-% first lines are copied literally from the \LaTeX{} format.
+% first lines are copied literally from \texttt{latex.tex}.
% \changes{v1.7i}{1992/07/12}{Added \cs{@@par} to clear possible
% \cs{parshape}.}
% \begin{macrocode}
@@ -2056,7 +2781,7 @@
% \begin{macrocode}
\check@percent}%
% \end{macrocode}
-% The rest is again copied literally from the \LaTeX{} format (less
+% The rest is again copied literally from \texttt{latex.tex} (less
% "\tt").
% \changes{v1.7a}{1992/02/26}{Removed redundant \cs{tt}.}
% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim,
@@ -2074,7 +2799,7 @@
% percent's |\catcode| so that it is seen by \TeX. The definition
% itself is nearly trivial: grab the following character, check if
% it is a |%|, and insert it again if not. At the end of the
-% \textsf{verbatim} environment this macro will peek at the next
+% \env{verbatim} environment this macro will peek at the next
% input line. In that case the argument to |\check@percent| might
% be a |\par| or a macro with arguments. Therefore we make the
% definition |\long| (|\par| allowed) and use the normal |\next|
@@ -2093,16 +2818,16 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\verb}
+% \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
+% 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"
+% 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}
@@ -2111,24 +2836,27 @@
\ttfamily \verb@eol@error \let\do\@makeother \dospecials
\@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}}
% \end{macrocode}
-% \end{macro}
+% \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.}
-% \changes{v2.1n}{2021/05/28}{Use same error message text as in format}
% \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 ended by end of line}\@ehc}}%
+ \noexpand\verb command ended by end of line}\@ehc}}%
\endgroup
% \end{macrocode}
% \end{macro}
@@ -2155,7 +2883,7 @@
%
% \begin{macro}{\verbatim@nolig@list}
% \begin{macro}{\do@noligs}
-% These macros replace the old "\@noligs" mechanism by an
+% 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\-}
@@ -2168,240 +2896,29 @@
% \end{macro}
% \end{macro}
%
-%
-% \begin{macro}{\macro}
-% \begin{macro}{\m@cro@}
-% \changes{v1.5v}{1990/01/28}{\cs{macro@} renamed to \cs{m@cro@}
-% since AmSTeX
-% defines another macro of the same name.}
-% \begin{macro}{\macro@cnt}
-% \label{page:macro} The \textsf{macro} environment is implemented as
-% a \textsf{trivlist} environment, whereby in order that the macro
+% \begin{tcounter}{\macro@cnt}
+% \label{page:macro} The \env{macro} environment is implemented as
+% a \env{trivlist} environment, whereby in order that the macro
% names can be placed under one another in the margin
% (corresponding to the macro's nesting depth), the macro
% |\makelabel| must be altered. In order to store the nesting
% depth, we use a counter. We also need a counter to count the
-% number of nested \textsf{macro} environments.
+% number of nested \env{macro} environments.
% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
% \changes{v1.9k}{1994/02/22}{Fix probably no longer necessary}
% \begin{macrocode}
\newcount\macro@cnt \macro@cnt=0
% \end{macrocode}
-% The environment takes an argument---the macro name to be
-% described. Since this name may contain special `letters' we have
-% to re-|\catcode| them before scanning the argument. This is done
-% by the |\MakePrivateLetters| macro.
-% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
-% \changes{v1.7a}{1992/02/26}{Catcode backslash to other (from newdoc).}
-% \changes{v1.9k}{1994/02/22}{Don't omit extra group}
-% \begin{macrocode}
-\def\macro{\begingroup
- \catcode`\\12
- \MakePrivateLetters \m@cro@ \iftrue}
-% \end{macrocode}
-%
-% \begin{environment}{environment}
-% \changes{v1.8c}{1993/10/25}{Environment added}
-% The ``environment'' environment will be implemented just like the
-% ``macro'' environment flagging any differences in the code by
-% passing |\iffalse| or |\iftrue| to the |\m@cro@| environment
-% doing the actual work.
-% \begin{macrocode}
-\def\environment{\begingroup
- \catcode`\\12
- \MakePrivateLetters \m@cro@ \iffalse}
-% \end{macrocode}
-% \end{environment}
-%
-% After scanning the argument we close the group to get the normal
-% |\catcode|$\,$s back. Then we assign a special value to
-% |\topsep| and start a \textsf{trivlist} environment.
-% \changes{v1.5f}{1989/05/07}{MacroTopsep parameter added.}
-% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
-% \changes{v1.8c}{1993/10/25}{Support ``environment'' env}
-% \changes{v1.9k}{1994/02/22}{Remove \cs{macro@level}}
-% \begin{macrocode}
-\long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist
-% \end{macrocode}
-% We also save the name being described in |\saved@macroname| for
-% use in conjunction with the |\changes| macro.
-% \begin{macrocode}
- \edef\saved@macroname{\string#2}%
- #1
-% \end{macrocode}
-% If documenting an environment we put is name in |\saved@indexname|
-% otherwise the name without the backslash.
-% \changes{v2.1g}{2016/02/15}{Use \cs{saved@indexname}}
-% \begin{macrocode}
- \let\saved@indexname\saved@macroname
- \else
- \edef\saved@indexname{\expandafter\@gobble\string#2}%
- \fi
-% \end{macrocode}
-% Now there follows a variation of |\makelabel| which is used
-% should the environment not be nested, or should it lie between
-% two successive |\begin{macro}| instructions or explanatory
-% text. One can recognize this with the switch |\if@inlabel|
-% which will be |true| in the case of successive |\item|
-% commands.
-% \begin{macrocode}
- \def\makelabel##1{\llap{##1}}%
-% \end{macrocode}
-% If |@inlabel| is |true| and if $\verb=\macro@cnt= > 0$
-% then the above definition needs to be changed, because in this
-% case \LaTeX{} would otherwise put the labels all on the same line
-% and this would lead to them being overprinted on top of each
-% other. Because of this |\makelabel| needs to be redefined
-% in this case.
-% \begin{macrocode}
- \if@inlabel
-% \end{macrocode}
-% If |\macro@cnt| has the value $1$, then we redefine
-% |\makelabel| so that the label will be positioned in the
-% second line of the margin. As a result of this, two macro names
-% appear correctly, one under the other. It's important whilst
-% doing this that the generated label box is not allowed to have
-% more depth than a normal line since otherwise the distance
-% between the first two text lines of \TeX{} will be incorrectly
-% calculated. The definition should then look like:
-%\begin{verbatim}
-% \def\makelabel##1{\llap{\vtop to \baselineskip
-% {\hbox{\strut}\hbox{##1}\vss}}}
-%\end{verbatim}
-% Completely analogous to this is the case where labels need to be
-% placed one under the other. The lines above are only an example
-% typeset with the \textsf{verbatim} environment. To produce the real
-% definition we save the value of |\macro@cnt| in
-% |\count@| and empty the temp macro |\@tempa| for later
-% use.
-% \begin{macrocode}
- \let\@tempa\@empty \count@\macro@cnt
-% \end{macrocode}
-% In the following loop we append for every already typeset label
-% an |\hbox{\strut}| to the definition of |\@tempa|.
-% \begin{macrocode}
- \loop \ifnum\count@>\z@
- \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
-% \end{macrocode}
-% Now be put the definition of |\makelabel| together.
-% \changes{v1.5b}{1989/04/27}{vbox to vtop changed in makelabel (test)}
-% \changes{v1.5e}{1989/04/28}{ht strutbox changed to baselineskip
-% (test)}
-% \begin{macrocode}
- \edef\makelabel##1{\llap{\vtop to\baselineskip
- {\@tempa\hbox{##1}\vss}}}%
-% \end{macrocode}
-% Next we increment the value of the nesting depth counter. This
-% value inside the \textsf{macro} environment is always at least one
-% after this point, but its toplevel definition is zero. Provided
-% this environment has been used correctly, $|\macro@cnt|=0$
-% should not occur when |@inlabel|=\textsf{true}. It is
-% however possible if this environment is used within other list
-% environments (but this would have little point).
-% \begin{macrocode}
- \advance \macro@cnt \@ne
-% \end{macrocode}
-% If |@inlabel| is false we reset |\macro@cnt| assuming
-% that there is enough room to print the macro name without
-% shifting.
-% \begin{macrocode}
- \else \macro@cnt\@ne \fi
-% \end{macrocode}
-% Now the label will be produced using |\item|. The following
-% line is only a hack saving the day until a better solution is
-% implemented. We have to face two problems: the argument might be
-% a |\par| which is forbidden in the argument of other macros
-% if they are not defined as |\long|, or it is something like
-% |\iffalse| or |\else|, i.e.\ something which will be
-% misinterpreted when \TeX{} is skipping conditional text. In both
-% cases |\item| will bomb, so we protect the argument by using
-% |\string|.
-% \begin{macrocode}
- \edef\@tempa{\noexpand\item[%
-% \end{macrocode}
-% Depending on whether we are inside a ``macro'' or ``environment''
-% environment we use |\PrintMacroName| or |\PrintEnvName| to
-% display the name.
-% \begin{macrocode}
- #1%
- \noexpand\PrintMacroName
- \else
- \noexpand\PrintEnvName
- \fi
- {\string#2}]}%
- \@tempa
-% \end{macrocode}
-% At this point we also produce an index entry. Because it is not
-% known which index sorting program will be used, we do not use the
-% command |\index|, but rather a command
-% |\SpecialMainIndex| after advancing the counter for indexing
-% by line number. This may be redefined by the user in
-% order to generate an index entry which will be understood by the
-% index program in use (note the definition of
-% |\SpecialMainIndex| for our installation).
-% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
-% \changes{v1.9u}{1995/08/06}{Removed brace group which
-% killed \cs{DoNotIndex}}
-% We advance the current codeline number and after producing an
-% index entry revert to the original value
-% \begin{macrocode}
- \global\advance\c@CodelineNo\@ne
-% \end{macrocode}
-% Again the macro to call depends on the environment we are
-% actually in.
-% \begin{macrocode}
- #1%
- \SpecialMainIndex{#2}\nobreak
- \DoNotIndex{#2}%
- \else
- \SpecialMainEnvIndex{#2}\nobreak
- \fi
- \global\advance\c@CodelineNo\m@ne
-% \end{macrocode}
-% The |\nobreak| is needed to prevent a page break after the
-% |\write| produced by the |\SpecialMainIndex| macro. We
-% exclude the new macro in the cross-referencing feature, to
-% prevent spurious non-main entry references. Regarding possibly
-% problematic arguments, the implementation takes
-% care of |\par| and the conditionals are uncritical.
-% \changes{v1.7a}{1992/03/02}{Removed redundant code checking for
-% \cs{par}.}^^A
-%
-% Because the space symbol should be ignored between the
-% |\begin{macro}{...}| and the following text we must take
-% care of this with |\ignorespaces|.
-% \begin{macrocode}
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+% \end{tcounter}
%
%
-%
-% \begin{macro}{\endmacro}
-% \begin{macro}{\endenvironment}
-% Older releases of this environment omit the |\endgroup| token,
-% when being nested. This was done to avoid unnecessary stack usage.
-% However it does not work if \textsf{macro} and
-% \textsf{environment} environments are mixed, therefore we now
-% use a simpler approach.
-% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.}
-% \changes{v1.9k}{1994/02/22}{Don't checkfor nesting}
-% \begin{macrocode}
-\let\endmacro \endtrivlist
-\let\endenvironment\endmacro
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\MacroTopsep}
+% \begin{lskip}{\MacroTopsep}
% Here is the default value for the |\MacroTopsep| parameter
% used above.
% \begin{macrocode}
\newskip\MacroTopsep \MacroTopsep = 7pt plus 2pt minus 2pt
% \end{macrocode}
-% \end{macro}
+% \end{lskip}
%
%
%
@@ -2413,49 +2930,15 @@
% Therefore we define those macros only if they have not already
% been defined.
%
-% \begin{macro}{\PrintMacroName}
-% \begin{macro}{\PrintEnvName}
-% \begin{macro}{\PrintDescribeMacro}
-% \begin{macro}{\PrintDescribeEnv}
-% The formatting of the macro name in the left margin is done by
-% these macros. We first set a |\strut| to get the height and
-% depth of the normal lines. Then we change to the
-% |\MacroFont| using |\string| to |\catcode| the
-% argument to other (assuming that it is a macro name). Finally we
-% print a space. The font change remains local since this macro
-% will be called inside an |\hbox|.
-% \begin{macrocode}
-\@ifundefined{PrintMacroName}
- {\def\PrintMacroName#1{\strut \MacroFont \string #1\ }}{}
-% \end{macrocode}
-% We use the same formatting conventions when describing a macro.
-% \begin{macrocode}
-\@ifundefined{PrintDescribeMacro}
- {\def\PrintDescribeMacro#1{\strut \MacroFont \string #1\ }}{}
-% \end{macrocode}
-% To format the name of a new environment there is no need to use
-% |\string|.
-% \begin{macrocode}
-\@ifundefined{PrintDescribeEnv}
- {\def\PrintDescribeEnv#1{\strut \MacroFont #1\ }}{}
-\@ifundefined{PrintEnvName}
- {\def\PrintEnvName#1{\strut \MacroFont #1\ }}{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
%
% \subsection{Creating index entries by scanning `macrocode'}
%
% The following macros ensure that index entries are created for each
% occurrence of a \TeX-like command (something starting with
-% `|\|') providing indexing has been turned on with "\PageIndex"
-% or "\CodelineIndex". With the default definitions of
-% |\SpecialMainIndex|, etc., the index file generated is
-% intended to be processed by Chen's \textsf{makeindex} program
+% `|\|') providing indexing has been turned on with |\PageIndex|
+% or |\CodelineIndex|. With the default definitions of
+% |\specialMainMacroIndex|, etc., the index file generated is
+% intended to be processed by Chen's \prg{makeindex} program
% \cite{art:Chen}.
%
%
@@ -2464,15 +2947,15 @@
% introduce command names at places where |\| has to belong to
% some other category. Therefore, we may also need to recognize
% \verb+|+ as the introducer for a command when setting the text
-% inside the \textsf{macrocode} environment. Other users may have the
+% inside the \env{macrocode} environment. Other users may have the
% need to make similar reassignments for their macros.
%
%
-% \begin{macro}{\SpecialEscapechar}\label{sect:specialescapechar}
+% \begin{imacro}{\SpecialEscapechar}\label{sect:specialescapechar}
% \begin{macro}{\active@escape@char}
% \begin{macro}{\special@escape@char}
% The macro |\SpecialEscapechar| is used to denote a special escape
-% character for the next \textsf{macrocode} environment. It has one
+% character for the next \env{macrocode} environment. It has one
% argument---the new escape character given as a `single-letter'
% control sequence. Its main purpose is defining
% |\special@escape@char| to produce the chosen escape character
@@ -2528,7 +3011,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
+% \end{imacro}
%
%
%
@@ -2564,7 +3047,7 @@
% `|\|' 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
-% `|\|' has |\catcode| 13 within the \textsf{macrocode}
+% `|\|' has |\catcode| 13 within the \env{macrocode}
% environment. Otherwise the delimiter for the argument of
% |\xmacro@code| would not be found (parameter matching
% depends on |\catcode|$\,$s).
@@ -2574,7 +3057,7 @@
\begingroup \catcode`\|=\z@ \catcode`\\=\active
% \end{macrocode}
% We carry out tasks 2) and 3b) first.
-% \SpecialEscapechar{\|}
+% \SpecialEscapechar\|
% \begin{macrocode}
|gdef|init@crossref{|catcode`|\|active |let\|bslash
% \end{macrocode}
@@ -2613,7 +3096,7 @@
%
%
%
-% \begin{macro}{\MakePrivateLetters}
+% \begin{imacro}{\MakePrivateLetters}
% Here is the default definition of this command, which makes just
% the |@| into a letter. The user may change it if he/she
% needs more or other characters masquerading as letters.
@@ -2621,7 +3104,7 @@
\@ifundefined{MakePrivateLetters}
{\let\MakePrivateLetters\makeatletter}{}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
% \begin{macro}{\close@crossref}
% At the end of a cross-referencing part we prepare ourselves for
@@ -2642,10 +3125,10 @@
% The |\init@crossref| will have made |\active| our
% |\special@escape@char|, so that each
% |\active@escape@char| will invoke |\scan@macro| when
-% within the \textsf{macrocode} environment. By this means, we can
+% within the \env{macrocode} environment. By this means, we can
% automatically add index entries for every \TeX-like command which
% is met whilst setting (in verbatim) the contents of
-% \textsf{macrocode} environments.
+% \env{macrocode} environments.
% \begin{macrocode}
\def\scan@macro{%
% \end{macrocode}
@@ -2658,7 +3141,7 @@
\special@escape@char
\step@checksum
% \end{macrocode}
-% If the \textsf{macrocode} environment contains, for example, the
+% If the \env{macrocode} environment contains, for example, the
% command |\\|, the second |\| should not start the
% scanning mechanism. Therefore we use a switch to decide if
% scanning of macro names is allowed.
@@ -2689,22 +3172,9 @@
% \end{macro}
%
%
-% \begin{macro}{\ifscan@allowed}
-% \begin{macro}{\scan@allowedtrue}
-% \begin{macro}{\scan@allowedfalse}
-% |\ifscan@allowed| is the switch used above to determine if
-% the |\active@escape@char|\SpecialIndex{\active@escape@char}
-% should start the macro scanning mechanism.
-% \begin{macrocode}
-\newif\ifscan@allowed \scan@allowedtrue
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
%
-% \begin{macro}{\EnableCrossrefs}
-% \begin{macro}{\DisableCrossrefs}
+% \begin{imacro}{\EnableCrossrefs}
+% \begin{imacro}{\DisableCrossrefs}
% At this point we might define two macros which allow the user to
% disable or enable the cross-referencing mechanism. Processing of
% files will be faster if only main index entries are generated
@@ -2718,8 +3188,8 @@
\def\EnableCrossrefs{\@bsphack\scan@allowedtrue
\def\DisableCrossrefs{\@bsphack\@esphack}\@esphack}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
+% \end{imacro}
%
%
%
@@ -2750,6 +3220,10 @@
%
%
% \begin{macro}{\short@macro}
+%
+% \fmi{this needs cleaning up too, the results in the index are
+% currently wrong for cases like `\cs{ }' and the like.}
+%
% \changes{v1.5c}{1989/04/27}{Corrected bad bug by putting the
% scan@allowedfalse macro before printing
% the argument.}
@@ -2757,7 +3231,7 @@
% \cs{macro@namepart} as `letter' so index exclusion works.}
% This macro will be invoked (with a single character as parameter)
% when a single-character macro name has been spotted whilst
-% scanning within the \textsf{macrocode} environment.
+% scanning within the \env{macrocode} environment.
%
% First we take a look at the |\index@excludelist| to see
% whether this macro name should produce an index entry. This is
@@ -2775,14 +3249,14 @@
\uccode`\&=\expandafter`\string#1%
\uppercase{\def\x{\def\macro@namepart{&}}}%
\expandafter\endgroup\x
- \ifnot@excluded
% \end{macrocode}
-% If necessary the index entry is produced by the macro
-% |\produce@index|. Depending on the actual character seen,
-% this macro has to do different things, so we pass the character
-% as an argument.
+% Any indexing is then delegated to
+% |\maybe@index@short@macro|. Depending on the actual character seen,
+% this macro has to do different things, which is why we keep it separate from
+% |\maybe@index@macro| to avoid the special tests in the more
+% common case of a multi-letter macro name.
% \begin{macrocode}
- \produce@index{#1}\fi
+ \maybe@index@short@macro\macro@namepart
% \end{macrocode}
% Then we disable the cross-referencing mechanism with
% |\scan@allowedfalse| and print the actual character. The
@@ -2803,104 +3277,6 @@
%
%
%
-% \begin{macro}{\produce@index}
-% \changes{v1.4s}{1989/04/23}{Added noexpand to all
-% \cs{if} tests
-% to avoid garbage produced by new active chars}
-% \changes{v1.4s}{1989/04/23}{Used \texttt{\protect\bslash string} for
-% the same reason.}
-% \changes{v1.5c}{1989/04/27}{Corrected bad bug by placing the
-% scan@allowedfalse macro into short@macro}
-% This macro is supposed to generate a suitable |\SortIndex|
-% command for a given single-letter control sequence. We test
-% first for the cases which involve active characters (i.e.\ the
-% backslash, the special escape character (if any), the space and
-% the |^^M|). Using the |\if| test (testing for
-% character codes), we have to ensure that the argument isn't
-% expanded.
-% \begin{macrocode}
-\def\produce@index#1{%
- \if\noexpand#1\special@escape@char
-% \end{macrocode}
-% If the character is the special escape character (or the
-% `|\|' in case there was none) the |\it@is@a| macro is
-% used to produce the actual |\SortIndex| call.
-% \begin{macrocode}
- \scan@allowedfalse \it@is@a\special@escape@char \else
-% \end{macrocode}
-% Next comes the test for a `|\|' which must be the
-% $|\|_{13}$ expanding to |\bslash|.
-% \begin{macrocode}
- \if\noexpand#1\bslash \it@is@a\bslash \else
-% \end{macrocode}
-% Another possibility is \verb*+ +$_{13}$. Recall that |\space|
-% produces a \verb*+ +$_{10}$.
-% \begin{macrocode}
- \if\noexpand#1\space \it@is@a\space \else
-% \end{macrocode}
-% The last\footnote{Well, it isn't the last active character after
-% all. I added \texttt{\bslash @noligs} some days ago and now
-% \texttt{`} too is active. So we have to make sure that such
-% characters don't get expanded in the index.} possibility of an
-% active character is |^^M|\@. In this case we don't test for
-% character codes, since it is easier to look if the character is
-% equal to |\par|. (We are inside the \textsf{macrocode}
-% environment.)
-% \begin{macrocode}
- \ifx#1\par
-% \end{macrocode}
-% If we end up here we have just scanned a |\^^M| or something
-% similar. Since this will be treated like \verb*+\ + by \TeX{} we
-% produce a corresponding index entry.
-% \begin{macrocode}
- \it@is@a\space \else
-% \end{macrocode}
-% If it is the token |\relax| we do nothing. This can't happen
-% when the `doc' package is used in the way described here, but was
-% added to allow extensions like the \texttt{idxverb} option.
-% \changes{v1.5t}{1989/11/14}{Added \cs{relax} as a possible token to
-% allow extensions.}
-% \begin{macrocode}
- \ifx#1\relax \else
-% \end{macrocode}
-% The next three branches are needed because of bugs in
-% our \textsf{makeindex} program. You can't produce unbalanced index
-% entries\footnote{This is possible for \TeX{} if you use
-% \texttt{\string{$_{12}$ \rmfamily or
-% \ttfamily\string}$_{12}$},
-% but \textsf{makeindex} will complain.}
-% and you have to double a percent character. To get around these
-% restrictions we use special macros to produce the |\index|
-% calls.\footnote{Brian \textsc{Hamilton Kelly} has written fixes for
-% all three
-% bugs. When they've found their way through all
-% installations,
-% the lines above will be removed. See
-% page~\pageref{bug:fixes} if you already have them.
-% (I'm not sure which versions incorporate these, but
-% 2.11 is OK. See also
-% \pageref{makeindex:version}.)}
-% \begin{macrocode}
- \if\noexpand#1\bgroup \LeftBraceIndex \else
- \if\noexpand#1\egroup \RightBraceIndex \else
- \if\noexpand#1\percentchar \PercentIndex \else
-% \end{macrocode}
-% All remaining characters are used directly to produce their index
-% entries. This is possible even for the characters which have
-% special meanings in the index program, provided we quote the
-% characters. (This is correctly done in |\it@is@a|.)
-% \begin{macrocode}
- \it@is@a{\string#1}%
-% \end{macrocode}
-% We now need a whole pile of |\fi|$\,$s to match up with
-% the |\if|$\,$s.
-% \begin{macrocode}
- \fi \fi \fi \fi \fi \fi \fi \fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
% \begin{macro}{\macro@name}
% We now come to the macro which assembles command names which
% consist of one or more `letters' (which might well include
@@ -2968,9 +3344,11 @@
% routine. At this time \texttt{\bslash macro@namepart} might have a
% new value.}
% \begin{macrocode}
- \ifnot@excluded
- \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}%
- \@tempa \fi}
+% \ifnot@excluded
+% \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}%
+% \@tempa \fi
+ \maybe@index@macro \macro@namepart
+}
% \end{macrocode}
% \end{macro}
%
@@ -2980,155 +3358,525 @@
%
% \subsection[The index exclude list]{The index exclude
% list\footnotemark}
-% \footnotetext{Warning: the incomplete commentary on
+% \footnotetext{Info: the incomplete commentary on
% \texttt{\bslash DoNotIndex} and the macros it calls
% was written by Dave Love.}
%
-% The internal form of the index exclude list is
-% \begin{quote}
-% \meta{macro name}|,|\meta{macro name}|,|
-% \ldots|,|
-% \end{quote}
-% where \meta{macro name} is a macro name like
-% $"\"_{12}"p"{_{11}}"@"_{11}$ or $"\"_{12}"$"_{11}$. Note that the "\"
-% has category `other' and the other characters in the name are all
-% `letter', regardless of their normal category.
%
-% \begin{macro}{\DoNotIndex}
-% This macro is used to suppress macro names in the index. It
-% starts off with a new group because we have to change the
-% |\catcode|$\,$s of all characters which belong to `letters'
-% while macros are defined.
+%
+
+% \def\MakePrivateLetters{%
+% \makeatletter
+% \catcode`\_11
+% \catcode`\:11}
+%
+%
+% The following part of the code is a new implementation using the
+% \LaTeX3 programming layer as the constructs and types
+% provided therein are making programming much easier. Over time I
+% will probably replace the rest of that \DOC code too.
% \begin{macrocode}
-\def\DoNotIndex{\begingroup \MakePrivateLetters
- \catcode`\\12
+\ExplSyntaxOn
% \end{macrocode}
-% Then we call the macro which actually reads the argument given by
-% the user.
+%
+%
+% \DescribeMacro\l__doc_donotindex_seq
+% Local sequence that holds names (as strings) of commands that
+% should not be indexed. Within a \DOC element environment that
+% element is placed into the sequence so that it isn't
+% 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.
+%
+% \DescribeMacro\g__doc_idxtype_prop
+% Global property list that holds for all commands that are special
+% \DOC elements the type of the element. The key is the command
+% name without backslash and the value is \DOC element type
+% identifier, e.g., |\texttt{Length}| for length registers if that
+% type has been set up. \DOC only indexes commands, that is things
+% starting with an escape character, i.e., a backslash (by
+% default). \DOC elements that do not start with an escape
+% character, e.g., environments are not identified when parsing
+% code so that aren't indexed automatically inside. Thus for them
+% there is no point in keeping them in that property list.
+%
+% \DescribeMacro{\doc_dont_index:n}
+% \DescribeInterfaceMacro{\DoNotIndex}
+% Takes a clist of commands (with backslash) as input and exclude
+% all of them from the index. User facing we make this available as
+% |\DoNotIndex|.
+%
+%
+% \DescribeInterfaceMacro\ShowIndexingState
+% Displays the current list of the exclude index list in a fairly
+% low-level form.
+%
+% \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
+% 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
+% generated earlier will be listing the wrong type. Therefore this
+% information is also placed into the \texttt{.aux} file so that it
+% will be available at the beginning of further runs.
+%
+% This command is internally executed as part of any \DOC element
+% environment so it only needs to be explicitly given if for some
+% reason a command with a special type has no corresponding environment.
+%
+%
+%
+%
+% \begin{macro}{\l__doc_donotindex_seq}
+% \begin{macro}{\g__doc_idxtype_prop}
+% Declarations.
% \begin{macrocode}
- \do@not@index}
+\seq_new:N \l__doc_donotindex_seq
+\prop_new:N \g__doc_idxtype_prop
% \end{macrocode}
-% \end{macro}
+% \end{macro}
+% \end{macro}
%
+% ^^A --------------------------------------------------
%
%
-% \begin{macro}{\do@not@index}
-% We make the |\do@not@index| macro |\long|
-% since the user might want to exclude the |\par|
-% macro.
+% \begin{macro}{\__doc_trace:x}
+% A helper for tracing\ldots
% \begin{macrocode}
-\long\def\do@not@index#1{%
+\cs_new:Npn\__doc_trace:x {
+ \legacy_if:nTF{ doc@debugshow }{ \iow_term:x } { \use_none:n }
+}
% \end{macrocode}
-% It just adds to a token list after finishing the group in which
-% the catcodes were changed.
-% \changes{v1.7a}{1992/02/26}{Replaced with newdoc version.}
+% \end{macro}
+%
+%
+% ^^A --------------------------------------------------
+%
+% \begin{macro}{\doc_dont_index:n}
+% \begin{macro}{\__doc_dont_index:n}
+% \begin{macro}{\__doc_dont_index_aux:n}
+%
+% Parses the argument a clist of commands with
+% |\MakePrivateLetters| in force (so that special characters are
+% recognized as being part of command names) and puts each command
+% without is backslash as a string into the sequence
+% |\l__doc_donotindex_seq|.
% \begin{macrocode}
- \endgroup
- \addto@hook\index@excludelist{#1,}}
+\cs_new:Npn \doc_dont_index:n {
+ \group_begin:
+ \MakePrivateLetters
+ \__doc_dont_index:n
+}
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\addto@hook}
-% The code for adding tokens (the second argument) to a token list
-% (the first argument) is taken from~\cite{art:verbatim}, but it needs
-% to be "\long" in case "\par" is amongt the tokens.
% \begin{macrocode}
-\long\def\addto@hook#1#2{#1\expandafter{\the#1#2}}
+\cs_new:Npn \__doc_dont_index:n #1 {
+ \group_end:
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\index@excludelist}
-% We need an initially-empty register for the excluded list.
% \begin{macrocode}
-\newtoks\index@excludelist
-\index@excludelist{}
+ \__doc_trace:x{Disable~ indexing~ for~ '\tl_to_str:n{#1}' }
% \end{macrocode}
-% \end{macro}
+% Adding the commands to the |\l__doc_donotindex_seq| sequence is
+% done by mapping the function |\__doc_dont_index_aux:n| on each
+% element in the clist.
+% \begin{macrocode}
+ \clist_map_function:nN {#1} \__doc_dont_index_aux:n
+}
+% \end{macrocode}
+% We record each command by using its name as a string.
+% This means more tokens in the sequence but it allows
+% to compare names not ``action'' which is important as different
+% commands may have the same meaning (e.g., they may not be defined
+% at all),
+% \begin{macrocode}
+\cs_new:Npn \__doc_dont_index_aux:n #1 {
+ \seq_put_right:Nx \l__doc_donotindex_seq {\expandafter\@gobble \string#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\ifnot@excluded}
-% \changes{v1.7a}{1992/02/26}{Replaced with newdoc version.}
-% \begin{macro}{\expanded@notin}
-% Now we take a look at the |\index@excludelist| to see
-% whether a macro name saved in |\macro@namepart| should
-% produce an index entry. This macro is a pseudo |\if|; it
-% should expand to |\iftrue| or |\iffalse| depending on
-% the contents of |\index@excludelist|.
+% \begin{macro}{\DoNotIndex}
+% The document-level interface
% \begin{macrocode}
-\begingroup
+\cs_set_eq:NN \DoNotIndex \doc_dont_index:n
% \end{macrocode}
-% First we change "\catcode"s so that "\" is `other' and "|" a
-% temporary for the escape character. This is necessary since our
-% macro names are stored that way in the "\index@excludelist".
+% \end{macro}
+%
+%
+% \begin{macro}{\ShowIndexingState}
+% Some tracing information that may be helpful.
% \begin{macrocode}
-\catcode`\|=0%
-\catcode`\\=12
+\def \ShowIndexingState {
+ \__doc_trace:x{Show~ doc~ indexing~ state:}
+ \seq_show:N \l__doc_donotindex_seq
+% \tl_analysis_show:N\l__doc_donotindex_seq
+ \prop_show:N \g__doc_idxtype_prop
+}
% \end{macrocode}
-% Then we define "\ifnot@excluded" to call "\expanded@notin" with
-% two arguments: the first is the string "\" followed by the
-% contents of "\macro@namepart" followed by a "," and the second is
-% "\the" followed by "\index@excludelist". To achieve the expansion
-% of "\macro@namepart", i.e.\ to pass its contents, we need a
-% suitable number of "\expandafter"s.
-% \SpecialEscapechar{\|}
+% \end{macro}
+
+
+
+% ^^A --------------------------------------------------
+%
+%
+% \begin{macro}{\__doc_idxtype_put:Nn}
+% \begin{imacro}{\RecordIndexType}
+% \fmi{Change name of interface command!}
+% \begin{macro}{\RecordIndexTypeAux}
+% This is the internal form for |\RecordIndexType|. The first
+% argument is turned into a string and the rest of the processing
+% is then done by |\__doc_idxtype_put:nn|
+% \begin{macrocode}
+\cs_new:Npn \__doc_idxtype_put:Nn #1#2 {
+ \exp_args:Nx \__doc_idxtype_put:nn { \cs_to_str:N #1 }{#2}
+% \end{macrocode}
+% We also make an entry in the \texttt{.aux} file so that this
+% declaration becomes immediately available in the next
+% run. However, for this we aren't reusing |\__doc_idxtype_put:N|
+% (a.k.a.\ |\RecordIndexType|) since that would result in doubling
+% such lines each time the document is run. Instead we use
+% |\RecordIndexTypeAux| which is only updating the data structures
+% without writing to the \texttt{.aux} file.
+% \begin{macrocode}
+ \protected@write\@auxout{}
+ {\string\RecordIndexTypeAux {\string#1 }{#2} }
+}
+% \end{macrocode}
+% When we execute this code from the \texttt{.aux} we better not
+% generate a new line in the \texttt{.aux}. Otherwise those would
+% cumulate over time.
% \begin{macrocode}
-|gdef|ifnot@excluded{|expandafter
- |expanded@notin|expandafter{|expandafter
- \|macro@namepart,}{|the|index@excludelist}}
-|endgroup
+\cs_new:Npn \RecordIndexTypeAux #1#2 {
+ \exp_args:Nx \__doc_idxtype_put:nn { \cs_to_str:N #1 }{#2}
+}
% \end{macrocode}
-% The macro "\expanded@notin" now does the dirty work. It first
-% defines a macro "\in@@" with a very special parameter text. If
-% you look closely "\in@@" has three arguments, the first one is
-% delimited by the first argument of "\expanded@notin" (i.e.\ by
-% the string starting with a "\" and ending with a "," above), the
-% second is undelimited (which means that it will get the next
-% token after our string, and the third is delimited again and will
-% get the rest up to the token "\in@@". In other words the token
-% "\in@@" is also used as a delimiter.
-% \begin{macrocode}
-\def\expanded@notin#1#2{%
- \def\in@@##1#1##2##3\in@@{%
-% \end{macrocode}
-% Now the replacement text simply compares the second argument
-% (i.e.\ the undelimited one after our string) to the token
-% "\expanded@notin". This is an unclosed "\ifx" statement which
-% means that this macro behaves similar to a normal \TeX{}
-% conditional.
-% \begin{macrocode}
- \ifx\expanded@notin##2}%
-% \end{macrocode}
-% After all these preparations we call "\in@@". First we expand the
-% token after "\in@@" (which is "\the" from the second argument to
-% "\expanded@notin"). As a result we get the contents of the
-% "\index@excludelist" inserted after "\in@@". After this contents
-% we add once more the string we are looking for, then the token
-% "\expanded@notin" and finally the token "\in@@".
-% \begin{macrocode}
- \expandafter\in@@#2#1\expanded@notin\in@@}
-% \end{macrocode}
-% Now what happens when the macro "\in@@" above gets called? The
-% first argument to "\in@@" is delimited by our string. In other
-% words it will get everything from the contents of
-% "\index@excludelist" before this string. If the string is not in
-% "\index@excludelist" then it gets the whole contents, since after
-% it we had inserted the string one more. In this case the next
-% token is "\expanded@notin" which gets assigned to the second
-% argument and the third argument will be empty. If, on the other
-% hand, the string was inside "\index@excludelist" then the second
-% argument will not be the token "\expanded@notin" and the third
-% argument will be all the garbage up to "\in@@". Therefore testing
-% the seconded argument, as done in the definition of "\in@@" will
-% tell us whether or not the string is in "\index@includelist" and
-% this was exactly what we wanted. (Deep breath.) You got
-% that?\footnote{\TeX{}book page 125. The code described above is
-% originally due to Michael Spivak who used a similar method within
-% the \AmSTeX{} macros.}
-% \end{macro}
-% \end{macro}
+% Similarly, when the \texttt{.aux} is read at the end of the run we
+% should disable that command to avoid unnecessary processing.
+% \begin{macrocode}
+\AtEndDocument{
+ \cs_set_eq:NN \RecordIndexTypeAux \use_none:nn
+}
+% \end{macrocode}
+% Finally, we provide the user-level interface
+% \begin{macrocode}
+\cs_set_eq:NN \RecordIndexType \__doc_idxtype_put:Nn
+% \end{macrocode}
+% \end{macro}
+% \end{imacro}
+% \end{macro}
+%
+%
+% \begin{macro}{\__doc_idxtype_put_scan:nn}
+% When we want to record an index type for a scanned name we can't
+% turn that into a csname and then call |\__doc_idxtype_put:Nn|
+% because turning it into a csname may change the meaning of the
+% name from ``undefined'' to |\relax|. Got bitten by that when
+% processing the kernel sources containing |\@undefined| within the
+% code: suddenly that wasn't undefined any longer.
+% So here is another version that works only on characters as
+% input. As we don't know whether or not they are proper strings
+% already we first make sure that this is the case.
+% \begin{macrocode}
+\cs_new:Npn \__doc_idxtype_put_scan:nn #1#2 {
+ \exp_args:Nf \__doc_idxtype_put:nn { \tl_to_str:n {#1} }{#2}
+% \end{macrocode}
+% In this case we also have to append a backslash when writing to
+% the \texttt{.aux} file.
+% \begin{macrocode}
+ \protected@write\@auxout{}
+ {\string\RecordIndexTypeAux {\bslash #1 }{#2} }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\__doc_idxtype_put_scan:on}
+% And here is the one we really need since the characters are
+% stored in some macro.
+% \begin{macrocode}
+\cs_generate_variant:Nn \__doc_idxtype_put_scan:nn {o}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\record@index@type@save}
+% And here is the interface to the rest of the code:
+% \begin{macrocode}
+\cs_set_eq:NN \record@index@type@save \__doc_idxtype_put_scan:on
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \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
+% |\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
+% the command is later marked for exclusion from the index the
+% property list setting remains unchanged but as long as no index
+% is produced for the command it will not be consulted.
+%
+% Note: the command assumes that |#1| is already in string form
+% \begin{macrocode}
+\cs_new:Npn \__doc_idxtype_put:nn #1#2 {
+% \end{macrocode}
+% No mystery here: if the command is not marked for exclusion from
+% the index add the property. The extra |\tl_to_str:n| is a safety
+% measure in case the input wasn't already in that form (should
+% only be the case with broken input but \ldots)
+% \begin{macrocode}
+ \exp_args:NNf
+ \seq_if_in:NnTF \l__doc_donotindex_seq {\tl_to_str:n{#1}}
+% \end{macrocode}
+% Some tracing info \ldots{}
+% \begin{macrocode}
+ {
+ \__doc_trace:x{Not~ recording~ index~ type~ for~ '\bslash #1' }
+ }
+ {
+ \__doc_trace:x{Recording~ index~ type~ for~ '\bslash #1' ~ as~ #2 }
+% \end{macrocode}
+% Stick the data into the property list:
+% \begin{macrocode}
+ \prop_gput:Nnn \g__doc_idxtype_prop {#1}{#2}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% ^^A --------------------------------------------------
+%
+%
+% \begin{macro}{\exp_args:co}
+% A helper: construct a function and call it with its first argument
+% expanded once:
+% \begin{macrocode}
+\cs_new:Npn \exp_args:co #1#2
+ { \cs:w #1 \exp_after:wN \cs_end:\exp_after:wN {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tl_to_str:o}
+% Another helper: take some token list variable, expand it and turn
+% it into a string.
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_to_str:n {o}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% ^^A --------------------------------------------------
+%
+%
+%
+% \DescribeMacro\maybe@index@macro
+%
+% This takes a macro name (without backslash) as parsed within a
+% \env{macrocode} environment and checks if it should get indexed
+% (i.e., is not on the exclude list) and if so how (i.e., gets it
+% index type property and makes the right choice depending on that.
+%
+
+
+% \begin{macro}{\maybe@index@macro}
+% \begin{macro}{\__doc_maybe_index:o}
+% We first make sure that the argument is really a string (so that
+% we have a defined situation) and then
+% pass it on to |\__doc_maybe_index_aux:nN| to do the work.
+% The second argument defines the indexing operation
+% \cs{SpecialIndex} for multi-letter macros and below
+% \cs{SpecialShortIndex} for single character macros.
+% \begin{macrocode}
+\cs_new:Npn \__doc_maybe_index:o #1 {
+ \exp_args:Nf \__doc_maybe_index_aux:nN { \tl_to_str:o {#1} }
+ \SpecialIndex
+}
+% \end{macrocode}
+% And here is what we call it in the older non-expl3 code:
+% \begin{macrocode}
+\cs_set_eq:NN \maybe@index@macro \__doc_maybe_index:o
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\maybe@index@short@macro}
+% \begin{macro}{\__doc_maybe_index_short:o}
+% Single character macros are handled similarly but there the
+% indexing is done by \cs{SpecialShortIndex}.
+% \begin{macrocode}
+\cs_new:Npn \__doc_maybe_index_short:o #1 {
+ \exp_args:Nf \__doc_maybe_index_aux:nN { \tl_to_str:o {#1} }
+ \SpecialShortIndex
+}
+\cs_set_eq:NN \maybe@index@short@macro \__doc_maybe_index_short:o
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\__doc_maybe_index_aux:nN}
+% Take a string (representing a macro without backslash) and make
+% the right choices with respect to indexing.
+% \begin{macrocode}
+\cs_new:Npn \__doc_maybe_index_aux:nN #1#2 {
+% \end{macrocode}
+% A bit of tracing:
+% \begin{macrocode}
+ \__doc_trace:x{Searching~ for~ '\bslash #1'}
+% \end{macrocode}
+% If the name is on the exclude list do nothing.
+% \begin{macrocode}
+ \seq_if_in:NnTF \l__doc_donotindex_seq {#1}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ {
+ \__doc_trace:x{Not~ indexing~ '\bslash #1' }
+ }
+% \end{macrocode}
+% Otherwise check if this name has an index type property attached
+% to it.
+% \begin{macrocode}
+ {
+ \prop_get:NnNTF \g__doc_idxtype_prop {#1} \l__doc_idxtype_tl
+% \end{macrocode}
+% If so construct and execute
+% |\Code|\meta{idxtype}|Index|\footnote{I guess this should really
+% be an internal name not a user-level one.} which is done inside
+% |\__doc_maybe_index_aux|
+% \begin{macrocode}
+ {
+ \exp_args:Ncno \__doc_maybe_index_aux:Nnn
+ { Code \tl_use:N \l__doc_idxtype_tl Index }
+ {code} {\bslash #1}
+ }
+% \end{macrocode}
+% Otherwise execute |\SpecialIndex| which is a short form for
+% |\CodeMacroIndex{code}| or execute \cs{SpecialShortIndex} which
+% deals with some special cases for single letter macros.
+% \begin{macrocode}
+ {
+ \__doc_trace:x{Indexing~ '\bslash #1'\space (\string #2)}
+ \exp_args:No #2 {\bslash #1}
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
%
%
%
+% \begin{macro}{\SpecialShortIndex}
+% \fmi{to be documented; also needs cleaning up as it is a mix of
+% old and new right now}
+% \begin{macrocode}
+\cs_new:Npn \SpecialShortIndex #1 {
+ \@SpecialIndexHelper@ #1\@nil
+ \@bsphack
+ \ifdoc@noindex \else
+ \str_case_e:nnF {\@gtempa }
+ {
+ {\cs_to_str:N \^^M } {\def\reserved@a{ \string \space \actualchar }
+ \def\reserved@b { \space }
+ \let\reserved@c \@empty }
+ { } {\def\reserved@a{ \string \space \actualchar }
+ \def\reserved@b { \space }
+ \let\reserved@c \@empty }
+ {\c_left_brace_str} { \def\reserved@a{ \bgroup \actualchar }
+ \def\reserved@b { \c_left_brace_str }
+ \def\reserved@c { \noexpand\iffalse
+ \c_right_brace_str
+ \noexpand\fi } }
+ {\c_right_brace_str} { \def\reserved@a{ \egroup \actualchar
+ \noexpand\iffalse
+ \c_left_brace_str
+ \noexpand\fi }
+ \def\reserved@b { \c_right_brace_str }
+ \let\reserved@c \@empty }
+% \end{macrocode}
+% The case of \cs{verbatimchar} is tricky. We can't stick it into
+% the normal \cs{verb} because we would then get something like
+% \verb=\verb+\++= which would comes out as ``\verb+\++'' instead
+% of \verb=\+=. So we use the \cs{verb} to only generate the
+% backslash and then use \cs{texttt} on the \cs{verbatimchar}
+% itself. However, that is not enough if we are unlucky and
+% somebody (like Will :-)) has used something like \verb=&= with a
+% special catcode for the \cs{verbatimchar}. We therefore also
+% apply \cs{string} to it when we read it back.
+% \begin{macrocode}
+ {\verbatimchar} { \def\reserved@a{ \quotechar\verbatimchar
+ \actualchar }
+ \let\reserved@b \@empty
+ \def\reserved@c
+ { \string\texttt{\string\string\verbatimchar} } }
+ }
+ { \def\reserved@a {\quotechar \@gtempa \actualchar }
+ \def\reserved@b {\quotechar \@gtempa }
+ \let\reserved@c \@empty }
+ \special@index {
+ \reserved@a
+ \string\verb
+ \quotechar *\verbatimchar \quotechar \bslash
+ \reserved@b
+ \verbatimchar
+ \reserved@c
+ \encapchar code}
+ \fi
+ \@esphack
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+
+% \begin{macro}{\__doc_maybe_index_aux:Nnn}
+% Execute the function passed on as first argument taking argument
+% 2 and 3 as input.
+% \begin{macrocode}
+\cs_new:Npn \__doc_maybe_index_aux:Nnn #1#2#3 {
+% \end{macrocode}
+% We have to be a little careful: as that function name is
+% constructed it may not actually exist (as constructions generate
+% |\relax| in \TeX{} in that case). In that case we raise an error,
+% otherwise we execute (with a little bit of tracing info):
+% \begin{macrocode}
+ \cs_if_exist:NTF #1
+ {
+ \__doc_trace:x{Indexing~ '#3'\space as~
+ \tl_use:N \l__doc_idxtype_tl }
+ #1{#2}{#3}
+ }
+ {
+ \PackageError{doc}{Doc~ element~
+ '\tl_use:N \l__doc_idxtype_tl'~ unknown}%
+
+ {When~ using~ '\string\RecordIndexType'~ the~ type~ must~
+ be~ known~\MessageBreak
+ to~ the~ system,~ i.e.,~ declared~ via~
+ '\string\NewDocElement'\MessageBreak
+ before~ it~ can~ be~ used~ in~ indexing.}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
%
+% Back to old style coding \ldots
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
%
%
%
@@ -3138,20 +3886,20 @@
% index entries; these are either invoked explicitly, or automatically
% by |\scan@macro|. As already mentioned, the definitions given
% here presuppose that the |.idx| file will be processed by
-% Chen's \textsf{makeindex} program --- they may be redefined for use
-% with the user's favourite such program.
+% Chen's \prg{makeindex} program --- they may be redefined for use
+% with the user's favorite such program.
%
% To assist the reader in locating items in the index, all such
% entries are sorted alphabetically {\em ignoring\/} the initial
% `|\|'; this is achieved by issuing an |\index| command which
-% contains the `actual' operator for \textsf{makeindex}. The default
+% contains the `actual' operator for \prg{makeindex}. The default
% value for the latter operator is `|@|', but the latter character is
% so popular in \LaTeX\ package files that it is necessary to substitute
-% another character. This is indicated to \textsf{makeindex} by means
+% another character. This is indicated to \prg{makeindex} by means
% of an `index style file'; the character selected for this function
% is |=|, and therefore this character too must be specially treated
% when it is met in a \TeX\ command. A suitable index style file is
-% provided amongt the supporting files for this style file in
+% provided amongst the supporting files for this style file in
% \texttt{gind.ist} and is generated from this source by processing
% with \texttt{docstrip} to extract the module \textbf{gind}. A
% similar style file \texttt{gglo.ist} is supplied for sorting the
@@ -3172,12 +3920,12 @@
%<+gind|gglo>
% \end{macrocode}
%
-% \begin{macro}{\actualchar}
-% \begin{macro}{\quotechar}
-% \begin{macro}{\levelchar}
+% \begin{imacro}{\actualchar}
+% \begin{imacro}{\quotechar}
+% \begin{imacro}{\levelchar}
% First come the definitions of |\actualchar|,
% |\quotechar| and |\levelchar|. Note, that our defaults
-% are not the ones used by the \textsf{makeindex} program without a
+% are not the ones used by the \prg{makeindex} program without a
% style file.
% \begin{macrocode}
%<*package>
@@ -3190,85 +3938,39 @@
%<+gind|gglo>level '>'
%<*package>
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
+% \end{imacro}
+% \end{imacro}
%
%
-% \begin{macro}{\encapchar}
-% The \textsf{makeindex} default for the |\encapchar| isn't
+% \begin{imacro}{\encapchar}
+% The \prg{makeindex} default for the |\encapchar| isn't
% changed.
% \begin{macrocode}
\@ifundefined{encapchar}{\def\encapchar{|}}{}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\verbatimchar}
+% \begin{imacro}{\verbatimchar}
% We also need a special character to be used as a delimiter for
% the |\verb*| command used in the definitions below.
% \begin{macrocode}
\@ifundefined{verbatimchar}{\def\verbatimchar{+}}{}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\SpecialIndex}
-% The |\SpecialIndex| command creates index entries for
-% macros. If the argument is |\|$xyz$, the command produces
-% \verb|\indexentry{|$xyz$\verb|=\verb!*+\|$xyz$\verb|+}{|$n$\verb|}|
-% given the above defined defaults for |\actualchar|,
-% |\quotechar| and |\verbatimchar|. We first remove the
-% initial `|\|' to get a better index.
-% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
-% \begin{macrocode}
-\def\SpecialIndex#1{\@bsphack\special@index{\expandafter\@gobble
- \string#1\actualchar
-% \end{macrocode}
-% Then follows the actual entry. A |\quotechar| is placed
-% before the |*| to allow its use as a special \textsf{makeindex}
-% character. Again |\@bsphack| and |\@esphack| are used
-% to make the macros invisible.
-% \begin{macrocode}
- \string\verb\quotechar*\verbatimchar\string#1\verbatimchar}%
- \@esphack}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\SpecialMainIndex}
-% \begin{macro}{\SpecialMainEnvIndex}
-% \begin{macro}{\SpecialUsageIndex}
-% The |\SpecialMainIndex| macro is used to cross-reference the
-% names introduced by the \textsf{macro} environment. The action is
-% as for |\SpecialIndex|, except that \textsf{makeindex} is
-% instructed to `encap'sulate the entry with the string
-% \verb=|main= to cause it to generate a call of the |\main|
-% macro.
-% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
-% \changes{v2.0c}{1998/08/22}{Correctly handle single character
-% control sequences like \cs{<}.}
%
-% |\SpecialMainIndex| passes the macro name to be indexed on to the
-% macro |\SpecialIndex@|.
-% \begin{macrocode}
-\def\SpecialMainIndex#1{\@bsphack\SpecialIndex@{#1}{\encapchar main}%
- \@esphack}
-% \end{macrocode}
-%
-% \begin{macro}{\SpecialIndex@}
-% \changes{v2.0c}{1998/08/22}{Macro added.}
-% \changes{v2.0f}{1999/02/27}{Temp fix to allow strange code in arg 1
-% (PR 2968)}
-% The macro |\SpecialIndex@| does the real work for |\SpecialMainIndex|
-% and |\SpecialUsageIndex|. It takes two arguments: the macro to be
-% indexed (as a control sequence or list of character tokens) and the
-% additional text for the index.
-% \changes{v2.0g}{1999/03/22}{Correct so-called temp fix. I'm not going to
-% explain this.}
+% \begin{macro}{\@SpecialIndexHelper@}
+% \fmi{doc or drop}
% \begin{macrocode}
\begingroup
\catcode`\|=0
\catcode`\\=12
+% \end{macrocode}
+% \SpecialEscapechar\|
+% \begin{macrocode}
|gdef|@SpecialIndexHelper@#1#2|@nil{%
|if |noexpand#1\%
|gdef|@gtempa{#2}%
@@ -3279,137 +3981,13 @@
|endgroup
|fi}
|endgroup
-\def\SpecialIndex@#1#2{%
% \end{macrocode}
-% The first thing it does is to convert the macro into a list of
-% characters. Note that a character token list remains (mostly) unchanged.
-% \begin{macrocode}
- \@SpecialIndexHelper@#1\@nil
-% \end{macrocode}
-% The macro name \verb*|\ | has to handled in a special way. The reason
-% is that the space token is skipped when \TeX\ is scanning macro
-% parameters, so that the trick used below will not work.
-% So, we check whether the replacement text of |\@tempa| starts with
-% a space token and write the appropriate index entry.
-% \begin{macrocode}
- \def\@tempb{ }%
- \ifcat \@tempb\@gtempa
- \special@index{\quotechar\space\actualchar
- \string\verb\quotechar*\verbatimchar
- \quotechar\bslash\quotechar\space\verbatimchar#2}%
- \else
-% \end{macrocode}
-% Having handled this special case we have to distinguish control
-% sequences consisting of one or more
-% letters and those that consists of exactly one nonletter. As character
-% tokens in the replacement text of the macro |\@gtempa| have all
-% category code $12$ (other), this is difficult. For simplicity, we treat
-% all single character control sequences alike, irregardless of whether
-% the character is a letter or not. This has the advantage that it works
-% even for strange settings of the category codes.
%
-% We define a utility macro |\@tempb| with two arguments, the second
-% delimited by |\relax|.
-% It will be called later so that the first argument is the first character
-% of the macro name, and the second argument receives the rest of the
-% characters. So we distinguish the two cases above by checking whether
-% the second argument is empty.
-% \begin{macrocode}
- \def\@tempb##1##2\relax{\ifx\relax##2\relax
-% \end{macrocode}
-% If so, we define the helper macro |\@tempc| in a way that it
-% adds quotechars in critical places.
-% \begin{macrocode}
- \def\@tempc{\special@index{\quotechar##1\actualchar
- \string\verb\quotechar*\verbatimchar
- \quotechar\bslash\quotechar##1\verbatimchar#2}}%
-% \end{macrocode}
-% Otherwise we write the characters as in |\SpecialIndex|.
-% \begin{macrocode}
- \else
- \def\@tempc{\special@index{##1##2\actualchar
- \string\verb\quotechar*\verbatimchar
- \bslash##1##2\verbatimchar#2}}%
- \fi}%
-% \end{macrocode}
-% Now pass the list of characters to \@tempb and call \@tempc to do the
-% work.
-% \begin{macrocode}
- \expandafter\@tempb\@gtempa\relax
- \@tempc
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% Slightly simpler is the main entry for environments
-% \changes{v1.9e}{1994/02/03}{use \cs{ttfamily} with \cs{string}}
-% \changes{v1.9f}{1994/02/07}{should have used \cs{noexpand}, sigh}
-% \changes{v1.9i}{1994/02/11}{should have used \cs{protect}}
-% \changes{v1.9j}{1994/02/16}{Back to string:-)}
-% \changes{v1.9s}{1994/10/14}{Added missing percent and changed to
-% \cs{ttfamily}}
-% \changes{v2.0d}{1998/12/20}{Correctly handle second index entry
-% by using \cs{special@index} not \cs{index} (PR/2928).}
-% \changes{v2.0e}{1998/12/28}{Use \cs{string}, not \cs{protect} in argument to
-% \cs{special@index}.}
-% \changes{v2.1c}{2004/07/23}{environment names incorrectly sorted in
-% index (pr/3615)}
-% \begin{macrocode}
-\def\SpecialMainEnvIndex#1{\@bsphack\special@index{%
- #1\actualchar
- {\string\ttfamily\space#1}
- (environment)%
- \encapchar main}%
- \special@index{environments:\levelchar#1\actualchar{%
- \string\ttfamily\space#1}\encapchar
- main}\@esphack}
-% \end{macrocode}
-% The |\SpecialUsageIndex| is similar to |\SpecialMainIndex|, except
-% that it uses the standard |\index| command.
-% \texttt{usage} instead of \texttt{main}.
-% \begin{macrocode}
-\def\SpecialUsageIndex#1{\@bsphack
- {\let\special@index\index\SpecialIndex@{#1}{\encapchar usage}}%
- \@esphack}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-% \begin{macro}{\SpecialEnvIndex}
-% Indexing environments is done a little bit differently; we produce
-% two index entries with the |\SpecialEnvIndex| macro:
-% \changes{v1.9e}{1994/02/03}{The index needs protecting}
-% \changes{v1.9g}{1994/02/08}{should have used \cs{noexpand}, sigh}
-% \changes{v1.9i}{1994/02/11}{should have used \cs{protect}}
-% \begin{macrocode}
-\def\SpecialEnvIndex#1{\@bsphack
-% \end{macrocode}
-% First we sort the environment under its own name stating in the
-% actual entry that this is an environment.
-% \begin{macrocode}
- \index{#1\actualchar{\protect\ttfamily#1}
- (environment)\encapchar usage}%
-% \end{macrocode}
-% The second entry is sorted as a subitem under the key
-% `environments:'.
-% \changes{v2.1b}{2004/02/09}{environment names incorrectly sorted in
-% index (pr/3615)}
-% \begin{macrocode}
- \index{environments:\levelchar#1\actualchar
- {\protect\ttfamily#1}\encapchar usage}\@esphack}
-% \end{macrocode}
-% Because both entries correspond to `descriptions' of the
-% environment, we encapsulate the page numbers with the
-% |\usage| macro.
% \end{macro}
%
%
%
-% \begin{macro}{\SortIndex}
+% \begin{imacro}{\SortIndex}
% This macro is used to generate the index entries for any
% single-character command that |\scan@macro| encounters. The
% first parameter specifies the lexical order for the character,
@@ -3417,76 +3995,87 @@
% the entry. It can also be used directly to generate index entries
% which differ in sort key and actual entry.
% \begin{macrocode}
-\def\SortIndex#1#2{\index{#1\actualchar#2}}
+\def\SortIndex#1#2{%
+ \ifdoc@noindex\else
+ \index{#1\actualchar#2}%
+ \fi
+}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
%
-% \begin{macro}{\it@is@a}
-% This macro is supposed to produce a correct |\SortIndex|
-% entry for a given character. Since this character might be
-% recognised as a `command' character by the index program used,
-% all characters are quoted with the |\quotechar|.
-% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
-% \begin{macrocode}
-\def\it@is@a#1{\special@index{\quotechar #1\actualchar
- \string\verb\quotechar*\verbatimchar
- \quotechar\bslash\quotechar#1\verbatimchar}}
-% \end{macrocode}
-% \end{macro}
-%
-%
%
-% \begin{macro}{\LeftBraceIndex}
+% \begin{imacro}{\LeftBraceIndex}
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
-% \begin{macro}{\RightBraceIndex}
+% \begin{imacro}{\RightBraceIndex}
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} These
-% two macros fix the problems with \textsf{makeindex}. Note the
+% two macros fix the problems with \prg{makeindex}. Note the
% `hack' with |\iffalse}\fi| to satisfy both \TeX{} and the
-% \textsf{makeindex} program. When this is written to the
+% \prg{makeindex} program. When this is written to the
% \texttt{.idx} file \TeX{} will see both braces (so we get a
-% balanced text). \textsf{makeindex} will also see balanced braces
+% balanced text). \prg{makeindex} will also see balanced braces
% but when the actual index entry is again processed by \TeX{} the
% brace in between |\iffalse| |\fi| will vanish.
% \begin{macrocode}
\@ifundefined{LeftBraceIndex}{\def\LeftBraceIndex{%
- \special@index{\bgroup\actualchar\string\verb\quotechar*\verbatimchar
- \quotechar\bslash{\verbatimchar\string\iffalse}\string\fi}}}{}
+ \special@index{\bgroup\actualchar
+ \string\verb% % to fool emacs highlighting
+ \quotechar*\verbatimchar
+ \quotechar\bslash{\verbatimchar\string\iffalse}\string\fi}}}{}
\@ifundefined{RightBraceIndex}{\def\RightBraceIndex{%
- \special@index{\egroup\actualchar\string\iffalse{\string\fi\string\verb
+ \special@index{\egroup\actualchar\string\iffalse{\string\fi
+ \string\verb% % to fool emacs highlighting
\quotechar*\verbatimchar\quotechar\bslash}\verbatimchar}}}{}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
+% \end{imacro}
%
%
-% \begin{macro}{\PercentIndex}
+% \begin{imacro}{\PercentIndex}
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \changes{v1.7c}{1992/03/25}{Default now for bug-fixed makeindex}
-% By default we assume a version of \textsf{makeindex} without the
+% By default we assume a version of \prg{makeindex} without the
% percent bug is being used.
% \begin{macrocode}
\@ifundefined{PercentIndex}
{\def\PercentIndex{\it@is@a\percentchar}}{}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\OldMakeindex}
+% \end{imacro}
+%
+%
+% \begin{omacro}{\OldMakeindex}
% \changes{v1.7c}{1992/03/26}{Replaced \cs{NewMakeIndex}.}
-% \begin{macro}{\percentchar}
-% Here is one solution for the percent bug in \textsf{makeindex}.
+% \begin{imacro}{\percentchar}
+% Here is one solution for the percent bug in \prg{makeindex}.
% The macro |\percentchar| denotes a |%|$_{12}$. Calling this from
% a package or the driver file sets things up
% appropriately.\label{bug:fixes}
% \begin{macrocode}
\def\OldMakeindex{\def\PercentIndex{%
- \special@index{\quotechar\percentchar\actualchar\string\verb
+ \special@index{\quotechar\percentchar\actualchar
+ \string\verb% % to fool emacs highlighting
\quotechar*\verbatimchar\quotechar\bslash
\percentchar\percentchar\verbatimchar}}}
{\catcode`\%=12 \gdef\percentchar{%}}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
+% \end{omacro}
+%
+%
+% \begin{macro}{\it@is@a}
+% This macro is supposed to produce a correct |\SortIndex|
+% entry for a given character. Since this character might be
+% recognized as a `command' character by the index program used,
+% all characters are quoted with the |\quotechar|.
+% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
+% \begin{macrocode}
+\def\it@is@a#1{\special@index{\quotechar #1\actualchar
+ \string\verb% % to fool emacs highlighting
+ \quotechar*\verbatimchar
+ \quotechar\bslash\quotechar#1\verbatimchar}}
+% \end{macrocode}
% \end{macro}
%
%
@@ -3494,7 +4083,7 @@
%
%
%
-% \subsection{Redefining the \textsf{index} environment}
+% \subsection{Redefining the \env{index} environment}
%
%\changes{v1.4r}{1989/04/22}{twocols env. placed into separate file}
%\changes{v1.4?}{1989/04/19}{use DEK's algorithm and implement
@@ -3502,34 +4091,10 @@
%\changes{v1.4?}{1989/04/16}{changes to the index env.}
%\changes{v1.5a}{1989/04/26}{Now input multicol.sty instead of
% multcols.sty}
-% \begin{macro}{\ifhave@multicol}
-% \changes{v1.7a}{1992/03/04}{Added to support avoiding multicol.sty} By
-% default the index is set in three columns, and will start on the
-% same page as, and underneath, the last part of the text of the
-% documented package file, if possible. The last page will be
-% reformatted with balanced columns. This requires the
-% \textsf{multicols} environment which is described elsewhere. So
-% that \DOC{} can be run independently of
-% \texttt{multicol.sty} we first check for its existence and set
-% the "have@multicol" flag appropriately for use below.
-% \changes{v1.9a}{1993/12/02}{Use \cs{IfFileExists}}
-% \changes{v1.9m}{1994/04/28}{Use \cs{RequirePackage} to load multicol}
-% \begin{macrocode}
-\newif\ifhave@multicol
-% \end{macrocode}
-% If we found \texttt{multicol.sty} we use it. It would be nice to
-% delay this (and the re-definition of "theindex") until we knew
-% whether an index was actually required \ldots
-% \begin{macrocode}
-\IfFileExists{multicol.sty}{\have@multicoltrue
- \RequirePackage{multicol}%
- }{}
-% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\IndexMin}
-% \begin{macro}{\c@IndexColumns}
+% \begin{ldimen}{\IndexMin}
+% \begin{lcounter}{IndexColumns}
% \changes{v1.4t}{1989/04/24}{Counter added.}
% If \texttt{multicol} is in use,
% when the index is started we compute the remaining space on the
@@ -3542,8 +4107,9 @@
\newdimen\IndexMin \IndexMin = 80pt
\newcount\c@IndexColumns \c@IndexColumns = 3
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{lcounter}
+% \end{ldimen}
+%
%
%
% \begin{environment}{theindex}
@@ -3557,7 +4123,14 @@
% \changes{v1.6e}{1991/04/03}{Turned into env definition.}
% \changes{v1.7a}{1992/03/04}{Include test for multicols.}
% \begin{macrocode}
-\ifhave@multicol
+\ifdoc@multicol
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \RequirePackage{multicol}
+% \end{macrocode}
+%
+% \begin{macrocode}
\renewenvironment{theindex}
{\begin{multicols}\c@IndexColumns[\index@prologue][\IndexMin]%
% \end{macrocode}
@@ -3570,17 +4143,15 @@
%
% \begin{macro}{\endtheindex}
% \changes{v1.4t}{1989/04/24}{Incorporated new multicols env.}
-% At the end of the index, we have only to end the \textsf{multicols}
+% At the end of the index, we have only to end the \env{multicols}
% environment.
% \begin{macrocode}
{\end{multicols}}
% \end{macrocode}
-% If we can't use \textsf{multicols} we warn the user and use an
+% If we can't use \env{multicols} we warn the user and use an
% environment that's basically the one from \texttt{article.sty}.
% \begin{macrocode}
\else
- \typeout{Can't find multicol.sty -- will use normal index layout if
- necessary.}
\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
\columnseprule \z@ \columnsep 35\p@
\twocolumn[\index@prologue]%
@@ -3591,8 +4162,8 @@
% \end{macro}
% \end{environment}
%
-% Here are the necessary \textsf{makeindex} declarations. We disable
-% scanning of macro names inside the index with "\scan@allowedfalse\n"
+% Here are the necessary \prg{makeindex} declarations. We disable
+% scanning of macro names inside the index with |\scan@allowedfalse\n|
% to avoid recursion.
% \begin{macrocode}
%</package>
@@ -3604,7 +4175,7 @@
% \end{macrocode}
%
%
-% \begin{macro}{\IndexPrologue}
+% \begin{imacro}{\IndexPrologue}
% \begin{macro}{\index@prologue}
% \changes{v1.9w}{1995/12/27}{Text changed}
% \changes{v1.9x}{1996/01/11}{Text depends on code lines used}
@@ -3639,11 +4210,11 @@
}}{}
% \end{macrocode}
% \end{macro}
-% \end{macro}
+% \end{imacro}
%
%
%
-% \begin{macro}{\IndexParms}
+% \begin{imacro}{\IndexParms}
% These are some last-minute assignments for formatting the index
% entries. They are defined in a separate macro so that a user can
% substitute different definitions. We start by defining the
@@ -3678,7 +4249,7 @@
\def\subsubitem{\@idxitem\hspace*{25pt}}%
% \end{macrocode}
% \begin{macro}{\indexspace}
-% The \textsf{makeindex} program generates an |\indexspace|
+% The \prg{makeindex} program generates an |\indexspace|
% before each new alphabetic section commences. After this final
% definition we end the |\@ifundefined| and the definition of
% |\IndexParms|.
@@ -3690,10 +4261,10 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\efill}
+% \begin{imacro}{\efill}
% This definition of |\efill| is intended to be used after index
% items which have no following text (for example, ``\textit{
% see\/}'' entries). It just ensures that the current line is
@@ -3706,104 +4277,96 @@
%<+gind>item_x2 "\\efill \n \\subsubitem "
%<*package>
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
%
-% \begin{macro}{\pfill}
-% \begin{macro}{\dotfil}
-% \begin{macro}{\dotfill}
+% \begin{imacro}{\pfill}
% The following definitions provide the |\pfill| command; if
-% this is specified in the index style file to \textsf{makeindex} as
+% this is specified in the index style file to \prg{makeindex} as
% the delimiter to appear after index items, then the intervening
% space before the referenced page numbers will be filled with
% dots, with a little white space interpolated at each end of the
% dots. If the line is broken the dots will show up on both lines.
-% \changes{v2.1i}{2018/09/25}{Guard against following \cs{unskip} (git/23)}
% \begin{macrocode}
-\def\dotfill{\leaders\hbox to.6em{\hss .\hss}\hskip\z@ plus 1fill\kern\z@}%
-\def\dotfil{\leaders\hbox to.6em{\hss .\hss}\hfil\kern\z@}%
-\def\pfill{\unskip~\dotfill\penalty500\strut\nobreak
- \dotfil~\ignorespaces}%
+\def\pfill{\unskip~%
+ \leaders\hbox to.6em{\hss .\hss}\hfill
+ \penalty500\strut\nobreak
+ \leaders\hbox to.6em{\hss .\hss}\hfil
+ ~\ignorespaces}%
%</package>
%<+gind|gglo>delim_0 "\\pfill "
%<+gind|gglo>delim_1 "\\pfill "
%<+gind|gglo>delim_2 "\\pfill "
%<*package>
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
%
%
%
-% \begin{macro}{\*}
+% \begin{imacro}{\*}
% Here is the definition for the |\*| macro. It isn't used in
% this set of macros.
% \begin{macrocode}
\def\*{\leavevmode\lower.8ex\hbox{$\,\widetilde{\ }\,$}}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\main}
+% \begin{imacro}{\main}
% The \textit{defining\/} entry for a macro name is flagged with
% the string \texttt{\encapchar main}\footnote{With the current
% definition of \texttt{\bslash encapchar} substituted for
-% \texttt{\encapchar}} in the |\index| command; \textsf{makeindex}
+% \texttt{\encapchar}} in the |\index| command; \prg{makeindex}
% processes this so that the |\main| macro will be invoked to
% underline the page number(s) on which the {\em definition\/} of
% the macro will be found.
% \begin{macrocode}
\@ifundefined{main}{\def\main#1{\underline{#1}}}{}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
-% \begin{macro}{\usage}
+% \begin{imacro}{\usage}
% The |\usage| macro is used to indicate entries describing
% the usage of a macro. The corresponding page number(s) will be
% set in \textit{italics}.
% \begin{macrocode}
\@ifundefined{usage}{\def\usage#1{\textit{#1}}}{}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
+%
+% \begin{imacro}{\code}
+% The |\code| macro is used to indicate index entries to code lines
+% that aren't main entries.
+% By default we do nothing special with them
+% the usage of a macro.
+% \begin{macrocode}
+\@ifundefined{code}{\def\code#1{#1}}{}
+% \end{macrocode}
+% \end{imacro}
%
%
-% \begin{macro}{\PrintIndex}
+% \begin{imacro}{\PrintIndex}
% \changes{v1.5k}{1989/09/04}{\cs{printindex} changed to
% \cs{PrintIndex}}
% \changes{v1.7a}{1992/02/26}{Documentation moved to interface section.}
% \changes{v1.9h}{1994/02/10}{Use \cs{@input@} instead of \cs{@input}.}
% \changes{v1.9w}{1995/12/29}{Turn the cmd into a noop after use.}
-% This is the same as "\printindex" in the \textsf{makeidx} package.
+% This is the same as |\printindex| in the \pkg{makeidx} package.
% \begin{macrocode}
\def\PrintIndex{\@input@{\jobname.ind}%
\global\let\PrintIndex\@empty}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
-% \begin{macro}{\printindex}
-% Since the above macro was called |\printindex| in older versions
-% of \texttt{doc.sty} the following definition was provided up to
-% version 1.9y.
-% \changes{v1.9z}{1996/04/17}{Commented out}
-% \begin{macrocode}
-%\def\printindex{\typeout{\string\printindex\space is obsolete!}%
-% \typeout{Please use \string\PrintIndex\space
-% if you are a macro implementor^^J
-% or get a newer version of the documented
-% software if you are a user}%
-% \PrintIndex}
-% \end{macrocode}
-% \end{macro}
%
% We want headings in the index (and changes list) according to the
% initial character of the next block of entries and have to instruct
-% \textsf{makeindex} appropriately. Unfortunately the specification
+% \prg{makeindex} appropriately. Unfortunately the specification
% for this changed sometime between versions 2.4 and 2.11 of
-% \textsf{makeindex}. We provide both ways of doing it but
+% \prg{makeindex}. We provide both ways of doing it but
% unfortunately this will always produce a warning message from
-% \textsf{makeindex}. This is for older versions:
+% \prg{makeindex}. This is for older versions:
% \changes{v1.7h}{1992/07/01}{Turn off headings in gls file}
% \begin{macrocode}
%</package>
@@ -3839,13 +4402,13 @@
% is otherwise ignored, but the others are written out and may be used
% to generate a history of changes, to be printed at the end of the
% document. However, note that older versions of Chen's standard
-% \textsf{makeindex}
+% \prg{makeindex}
% program limit any textual field to just 64 characters; therefore,
% is important that the number of characters in the second and third
% parameters should not exceed 61 altogether (to allow for the
% parentheses placed around the date).
%
-% \begin{macro}{\changes}
+% \begin{imacro}{\changes}
% \changes{BHK}{1989/04/26}{Documented \texttt{\protect\bslash changes}
% command.}
% \changes{BHK}{1989/04/26}{Changed definition of
@@ -3855,9 +4418,9 @@
% change in \LaTeX{} 2.09 changed the command name in the
% \texttt{.glo} file from \texttt{\bslash indexentry} to
% \texttt{\bslash glossaryentry}. It is therefore necessary to
-% have a special \textsf{makeindex} style file called
+% have a special \prg{makeindex} style file called
% \texttt{gglo.ist} to process this file correctly.} Thus
-% \textsf{makeindex} or a similar program can be used to process
+% \prg{makeindex} or a similar program can be used to process
% the output into a sorted ``glossary''. The |\changes| command
% commences by taking the usual measures to hide its spacing, and
% then redefines |\protect| for use within the argument of the
@@ -3880,42 +4443,57 @@
\catcode`\\\z@ \catcode`\ 10 \MakePercentIgnore
\changes@}
\def\changes@#1#2#3{%
- \protected@edef\@tempa{\noexpand\glossary{#1\levelchar
+ \protected@edef\@tempa{\noexpand\glossary{#1%
+% \end{macrocode}
+% If asked for we also show the date of in the change log (after
+% the version).
+% \changes{v3.0g}{2022/06/01}{Show change dates if asked for (gh/531)}
+% \begin{macrocode}
+ \ifdoc@reportchangedates
+ \space -- #2\fi
+ \levelchar
% \end{macrocode}
% \changes{v1.9u}{1995/08/06}{Use value of \cs{saved@macroname} to
% find out about change entries at outer level}
-% If the macro "\saved@macroname" doesn't contain any macro name
+% If the macro |\saved@macroname| doesn't contain any macro name
% (ie is empty) the current changes entry was done at top-level.
-% In this case we precede it by "\generalname".
+% In this case we precede it by |\generalname|.
% \begin{macrocode}
- \ifx\saved@macroname\@empty
- \space
- \actualchar
- \generalname
- \else
+ \ifx\saved@macroname\@empty
+% \end{macrocode}
+% Putting a |!| at the beginning of the entry hopefully moves this
+% entry to the very beginning during sorting.
+% \begin{macrocode}
+ \quotechar!%
+ \actualchar
+ \generalname
+ \else
% \end{macrocode}
% \changes{v2.1g}{2016/02/15}{Use \cs{saved@indexname}}
% \begin{macrocode}
- \saved@indexname
- \actualchar
- \string\verb\quotechar*%
- \verbatimchar\saved@macroname
- \verbatimchar
- \fi
- :\levelchar #3}}%
+ \saved@indexname
+ \actualchar
+ \string\verb% % to fool emacs highlighting
+ \quotechar*%
+ \verbatimchar\saved@macroname
+ \verbatimchar
+ \fi
+ :\levelchar #3}}%
\@tempa\endgroup\@esphack}
% \end{macrocode}
+% \end{imacro}
+%
%
% \begin{macro}{\saved@macroname}
-% \changes{BHK}{1989/04/26}{Provided for sorting outside \textsf{macro}
+% \changes{BHK}{1989/04/26}{Provided for sorting outside \env{macro}
% environment} The entries are sorted for convenience by the name
% of the most recently introduced macroname (i.e., that in the most
% recent |\begin{macro}| command). We therefore provide
% |\saved@macroname| to record that argument, and provide a default
-% definition in case |\changes| is used outside a \textsf{macro}
+% definition in case |\changes| is used outside a \env{macro}
% environment. (This is a {\em wicked\/} hack to get such entries
% at the beginning of the sorted list! It works providing no macro
-% names start with "!" or |"|.) \changes{v1.7a}{1992/03/02}{Changed
+% names start with |!| or |"|.) \changes{v1.7a}{1992/03/02}{Changed
% string used for better sorting.}
% \changes{v1.9u}{1995/08/06}{Now empty by default}
% \begin{macrocode}
@@ -3932,17 +4510,17 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\generalname}
+% \begin{imacro}{\generalname}
% \changes{v1.9u}{1995/08/06}{Macro added}
% This macro holds the string placed before changes entries on
% top-level.
% \begin{macrocode}
\def\generalname{General}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\RecordChanges}
+% \begin{imacro}{\RecordChanges}
% \changes{BHK}{1989/04/26}{Renames former \texttt{\protect\bslash
% PrintChanges} command.}
% To cause the changes to be written (to a \texttt{.glo}) file, we
@@ -3951,17 +4529,16 @@
% \begin{macrocode}
\let\RecordChanges\makeglossary
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\GlossaryMin}
+% \begin{ldimen}{\GlossaryMin}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
-% \begin{macro}{\c@GlossaryColumns}
+% \begin{lcounter}{GlossaryColumns}
% \changes{BHK}{1989/04/26}{Added to support \texttt{\protect\bslash
% changes}.} The remaining macros are all analogues of those used
-% for the \textsf{theindex} environment. When the glossary is
+% for the \env{theindex} environment. When the glossary is
% started we compute the space which remains at the bottom of the
% current page; if this is greater than |\GlossaryMin| then the
% first part of the glossary will be placed in the available space.
@@ -3972,8 +4549,8 @@
\newdimen\GlossaryMin \GlossaryMin = 80pt
\newcount\c@GlossaryColumns \c@GlossaryColumns = 2
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{lcounter}
+% \end{ldimen}
%
%
% \begin{environment}{theglossary}
@@ -3983,13 +4560,12 @@
% \changes{v1.6e}{1991/04/03}{Turned into env definition.}
% \changes{v1.7a}{1992/03/10}{Changed to work without multicols if
% necessary.}
-% \begin{macro}{\endglossary}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
-% The environment \textsf{theglossary} is defined in the same manner
-% as the \textsf{theindex} environment.
+% The environment \env{theglossary} is defined in the same manner
+% as the \env{theindex} environment.
% \begin{macrocode}
-\ifhave@multicol
+\ifdoc@multicol
\newenvironment{theglossary}{%
\begin{multicols}\c@GlossaryColumns
[\glossary@prologue][\GlossaryMin]%
@@ -4004,10 +4580,9 @@
{\if@restonecol\onecolumn\else\clearpage\fi}
\fi
% \end{macrocode}
-% \end{macro}
% \end{environment}
%
-% Here are the necessary \textsf{makeindex} declarations with scanning
+% Here are the necessary \prg{makeindex} declarations with scanning
% disabled as for the index.
% \begin{macrocode}
%</package>
@@ -4025,7 +4600,7 @@
% \end{macrocode}
%
%
-% \begin{macro}{\GlossaryPrologue}
+% \begin{imacro}{\GlossaryPrologue}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% \begin{macro}{\glossary@prologue}
@@ -4050,9 +4625,9 @@
}}{}
% \end{macrocode}
% \end{macro}
-% \end{macro}
+% \end{imacro}
%
-% \begin{macro}{\GlossaryParms}
+% \begin{imacro}{\GlossaryParms}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% Unless the user specifies otherwise, we set the change history
@@ -4067,19 +4642,20 @@
\parfillskip -15pt plus -1fil\relax}
}{}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\PrintChanges}
+% \end{imacro}
+%
+% \begin{imacro}{\PrintChanges}
% \changes{BHK}{1989/04/26}{Added to support
% \texttt{\protect\bslash changes}.}
% To read in and print the sorted change history, just put the
% |\PrintChanges| command as the last (commented-out, and thus
% executed during the documentation pass through the file) command
% in your package file. Alternatively, this command may form one of
-% the arguments of the |\StopEventually| command, although a
+% the arguments of the |\MaybeStop| command, although a
% change history is probably {\em not\/} required if only the
% description is being printed.
%
-% The command assumes that \textsf{makeindex} or some other program
+% The command assumes that \prg{makeindex} or some other program
% has processed the \texttt{.glo} file to generate a sorted
% \texttt{.gls} file.
% \changes{v1.9h}{1994/02/10}{Use \cs{@input@} instead of \cs{@input}.}
@@ -4088,7 +4664,7 @@
\def\PrintChanges{\@input@{\jobname.gls}%
\global\let\PrintChanges\@empty}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
%
@@ -4096,25 +4672,25 @@
%
% \subsection{Bells and whistles}
%
-% \begin{macro}{\StopEventually}
+% \begin{imacro}{\MaybeStop}
% \changes{v1.5k}{1989/09/04}{Support for checksum.}
-% \begin{macro}{\Finale}
+% \begin{imacro}{\Finale}
% \changes{v1.5k}{1989/09/04}{Support for checksum.}
% \changes{v1.5z}{1990/04/22}{Define \cs{Finale} globally.}
-% \begin{macro}{\AlsoImplementation}
+% \begin{imacro}{\AlsoImplementation}
% \changes{v1.9w}{1995/12/27}{Macro added}
-% \begin{macro}{\OnlyDescription}
+% \begin{imacro}{\OnlyDescription}
% If |\AlsoImplementation| is in force the whole documentation
% including the code part will be typeset. This is the default.
% \begin{macrocode}
\newcommand\AlsoImplementation{%
% \end{macrocode}
% To make this happen we have to define
-% |\StopEventually| in a way that its argument is typeset at the
+% |\MaybeStop| in a way that its argument is typeset at the
% very end or more exactly at |\Finale|. For this we
% save its argument in the macro |\Finale|.
% \begin{macrocode}
- \long\def\StopEventually##1{\@bsphack\gdef\Finale{##1%
+ \long\def\MaybeStop##1{\@bsphack\gdef\Finale{##1%
% \end{macrocode}
% But |\Finale| will be called at the very end of a file. This
% is exactly the point were we want to know if the file is
@@ -4123,7 +4699,7 @@
% \begin{macrocode}
\check@checksum}%
% \end{macrocode}
-% On the other hand: |\StopEventually| is more or less a
+% On the other hand: |\MaybeStop| is more or less a
% dividing point between description and code. So we start to look
% for the check-sum of the documented file by calling
% |\init@checksum|.
@@ -4134,35 +4710,44 @@
% \end{macrocode}
%
% Since |\AlsoImplementation| should be the default we execute it
-% and thus |\StopEventually| gets the desired meaning.
+% and thus |\MaybeStop| gets the desired meaning.
% \begin{macrocode}
\AlsoImplementation
% \end{macrocode}
% When the user places an |\OnlyDescription| declaration in
% the driver file the document should only be typeset up to
-% |\StopEventually|. We therefore have to redefine this macro.
+% |\MaybeStop|. We therefore have to redefine this macro.
% \begin{macrocode}
-\def\OnlyDescription{\@bsphack\long\def\StopEventually##1{%
+\def\OnlyDescription{\@bsphack\long\def\MaybeStop##1{%
% \end{macrocode}
-% In this case the argument of |\StopEventually| should be set
+% In this case the argument of |\MaybeStop| should be set
% and afterwards \TeX{} should stop reading from this file.
% Therefore we finish this macro with
% \begin{macrocode}
##1\endinput}\@esphack}
% \end{macrocode}
-% If no |\StopEventually| command is given we silently ignore a
+% If no |\MaybeStop| command is given we silently ignore a
% |\Finale| issued.
% \changes{v1.9n}{1994/04/28}{Ignore \cs{Finale} if no
-% \cs{StopEventually} is given}
+% \cs{MaybeStop} is given}
% \begin{macrocode}
\let\Finale\relax
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
+% \end{imacro}
+% \end{imacro}
+% \end{imacro}
+%
+%
+% \begin{omacro}{\StopEventually}
+% The old wrong name for |\MaybeStop|. We need to use |\def|
+% (i.e., expansion) as |\MaybeStop| gets redefined once in a while.
+% \begin{macrocode}
+\def\StopEventually{\MaybeStop}
+% \end{macrocode}
+% \end{omacro}
%
-% \begin{macro}{\meta}
+% \begin{imacro}{\meta}
% \changes{v1.4t}{1989/04/24}{Macro added.}
% \changes{v1.5w}{1990/02/03}{Breaks at space allowed.}
% \changes{v1.6a}{1990/05/24}{Extra space bug corrected.}
@@ -4216,7 +4801,7 @@
}\ensuremath\rangle
}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
% \begin{macro}{\meta@font@select}
@@ -4228,7 +4813,7 @@
% \end{macro}
%
%
-% \begin{macro}{\IndexInput}
+% \begin{imacro}{\IndexInput}
% This next macro may be used to read in a separate file (possibly
% a package file that is {\em not\/} documented by this means) and
% set it verbatim, whilst scanning for macro names and indexing the
@@ -4243,7 +4828,7 @@
% \begin{macrocode}
\begingroup \macro@code
% \end{macrocode}
-% We also make spacing behave as in the \textsf{macrocode}
+% We also make spacing behave as in the \env{macrocode}
% environment, because otherwise all the spaces will be shown
% explicitly.
% \begin{macrocode}
@@ -4260,10 +4845,10 @@
% \begin{macrocode}
\endgroup}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\maketitle}
+% \begin{imacro}{\maketitle}
% The macro to generate titles is easily altered in order that it
% can be used more than once (an article with many titles). In the
% original, diverse macros were concealed after use with
@@ -4299,56 +4884,56 @@
\gdef\@date{\today}\gdef\@thanks{}%
\gdef\@author{}\gdef\@title{}}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\ps@titlepage}
+% \begin{imacro}{\ps@titlepage}
% \changes{v1.5k}{1989/09/04}{Added \texttt{\protect\bslash
% ps@titlepage}} When a number of articles are concatenated into a
% journal, for example, it is not usual for the title pages of such
% documents to be formatted differently. Therefore, a class
-% such as \textsf{ltugboat} can define this macro in advance.
+% such as \cls{ltugboat} can define this macro in advance.
% However, if no such definition exists, we use pagestyle
% \texttt{plain} for title pages.
% \begin{macrocode}
\@ifundefined{ps@titlepage}
{\let\ps@titlepage=\ps@plain}{}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
-% \begin{macro}{\MakeShortVerb}
+% \begin{imacro}{\MakeShortVerb}
% \changes{v1.7a}{1992/02/27}{Added (from newdoc but now alters
% \cs{dospecials}, \cs{@sanitize}).}
-% This arranges an abbreviation for "\verb" such that if you say
-% "\MakeShortVerb{\"\meta{c}"}" subsequently using
+% This arranges an abbreviation for |\verb| such that if you say
+% |\MakeShortVerb{\|\meta{c}|}| subsequently using
% \meta{c}\meta{text}\meta{c} is equivalent to
-% "\verb"\meta{c}\meta{text}\meta{c}.\footnote{Warning:
+% |\verb|\meta{c}\meta{text}\meta{c}.\footnote{Warning:
% the commentary in the rest of this section was written by Dave
% Love.} In addition, the fact
% that \meta{c} is made active is recorded for the benefit of the
-% \textsf{verbatim} and \textsf{macrocode} environments.
+% \env{verbatim} and \env{macrocode} environments.
% Note particularly that the definitions below are global.
% The first thing we do (it needn't be first) is to record
-% the---presumably new---special character in "\dospecials" and
-% "\@sanitize" using "\add@special".
+% the---presumably new---special character in |\dospecials| and
+% |\@sanitize| using |\add@special|.
%
% \changes{v1.9e.2}{1994/02/07}{-js: Check if \protect\meta{c} is
% already an
% abbreviation for \cs{verb}.}
-% Some unwary user might issue "\MakeShortVerb" for a second time, we
+% Some unwary user might issue |\MakeShortVerb| for a second time, we
% better protect against this. We assume that this happened if a
-% control sequence "\cc\"\meta{c} is bound, the probability that this
+% control sequence |\cc\|\meta{c} is bound, the probability that this
% name is used by another module is low. We will output a warning
% below, so that a possible error might be noticed by the programmer
-% if he reads the "LOG" file. (Should have used module internal names,
+% if he reads the |LOG| file. (Should have used module internal names,
% 'though.)
%
-% \begin{macro}{\MakeShortVerb*}
+% \begin{imacro}{\MakeShortVerb*}
% \changes{v2.1a}{2003/12/09}{(HjG) Added \texttt{*} form}
-% This arranges an abbreviation for "\verb*" such that if you say
-% "\MakeShortVerb*{\"\meta{c}"}" subsequently using
+% This arranges an abbreviation for |\verb*| such that if you say
+% |\MakeShortVerb*{\|\meta{c}|}| subsequently using
% \meta{c}\meta{text}\meta{c} is equivalent to
-% "\verb*"\meta{c}\meta{text}\meta{c}.
+% |\verb*|\meta{c}\meta{text}\meta{c}.
% \begin{macrocode}
%</package>
%<*package|shortvrb>
@@ -4357,7 +4942,10 @@
{\def\@shortvrbdef{\verb*}\@MakeShortVerb}%
{\def\@shortvrbdef{\verb}\@MakeShortVerb}}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
+% \end{imacro}
+%
+% \begin{macro}{\@MakeShortVerb}
% \begin{macrocode}
\def\@MakeShortVerb#1{%
\expandafter\ifx\csname cc\string#1\endcsname\relax
@@ -4367,19 +4955,19 @@
\@shortvrbinfo{Made }{#1}\@shortvrbdef
\add@special{#1}%
% \end{macrocode}
-% Then the character's current catcode is stored in "\cc\"\meta{c}.
+% Then the character's current catcode is stored in |\cc\|\meta{c}.
% \begin{macrocode}
\expandafter
\xdef\csname cc\string#1\endcsname{\the\catcode`#1}%
% \end{macrocode}
% The character is spliced into the definition using the same trick as
-% used in "\verb" (for instance), having activated "~" in a group.
+% used in |\verb| (for instance), having activated |~| in a group.
% \begin{macrocode}
\begingroup
\catcode`\~\active \lccode`\~`#1%
\lowercase{%
% \end{macrocode}
-% The character's old meaning is recorded in "\ac\"\meta{c} prior to
+% The character's old meaning is recorded in |\ac\|\meta{c} prior to
% assigning it a new one.
% \begin{macrocode}
\global\expandafter\let
@@ -4398,20 +4986,24 @@
% \end{macrocode}
% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}}
% \begin{macrocode}
- \@shortvrbinfo\@empty{#1 already}{\@empty\verb(*)}%
+ \@shortvrbinfo\@empty{#1 already}%
+ {\@empty\verb% % to fool emacs highlighting
+ (*)}%
\fi}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\DeleteShortVerb}
+%
+%
+% \begin{imacro}{\DeleteShortVerb}
% \changes{v1.7a}{1992/02/27}{Added (from newdoc but now alters
% \cs{dospecials}, \cs{@sanitize}).}
-% Here's the means of undoing a "\MakeShortVerb", for instance in a
+% Here's the means of undoing a |\MakeShortVerb|, for instance in a
% region where you need to use the character outside a verbatim
-% environment. It arranges for "\dospecials" and "\@sanitize" to be
+% environment. It arranges for |\dospecials| and |\@sanitize| to be
% altered appropriately, restores the saved catcode and, if necessary,
% the character's meaning (as stored by
-% "\MakeShortVerb"). If the catcode wasn't stored in
-% "\cc\"\meta{c} (by "\MakeShortVerb") the command is silently
+% |\MakeShortVerb|). If the catcode wasn't stored in
+% |\cc\|\meta{c} (by |\MakeShortVerb|) the command is silently
% ignored.
% \changes{v1.7a}{1992/02/28}{Check for previous matched
% \cs{MakeShortVerb}
@@ -4423,19 +5015,24 @@
% \changes{v2.1a}{2003/12/10}{(HjG) Notify user
% if it's not a short verb character}
% \begin{macrocode}
- \@shortvrbinfo\@empty{#1 not}{\@empty\verb(*)}%
+ \@shortvrbinfo\@empty{#1 not}%
+ {\@empty\verb% % to fool emacs highlighting
+ (*)}%
\else
% \end{macrocode}
% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}}
% \begin{macrocode}
- \@shortvrbinfo{Deleted }{#1 as}{\@empty\verb(*)}%
+ \@shortvrbinfo{Deleted }{#1 as}%
+ {\@empty\verb% % to fool emacs
+ % highlighting
+ (*)}%
\rem@special{#1}%
\global\catcode`#1\csname cc\string#1\endcsname
% \end{macrocode}
% \changes{v1.9e.2}{1994/02/07}{-js: Reset `cc`\protect\meta{c} in
-% \cs{DeleteShortVerb}}
-% We must not forget to reset "\cc\"\meta{c}, otherwise the check in
-% "\MakeShortVerb" for a repeated definition will not work.
+% in \cs{DeleteShortVerb}}
+% We must not forget to reset |\cc\|\meta{c}, otherwise the check in
+% |\MakeShortVerb| for a repeated definition will not work.
% \begin{macrocode}
\global \expandafter\let \csname cc\string#1\endcsname \relax
\ifnum\catcode`#1=\active
@@ -4446,7 +5043,7 @@
\csname ac\string#1\endcsname}%
\endgroup \fi \fi}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
% \begin{macro}{\@shortvrbinfo}
% \changes{v1.9v}{1995/11/03}{(DPC) Macro added}
@@ -4465,12 +5062,12 @@
% \begin{macro}{\add@special}
% \changes{v1.7a}{1992/02/27}{Added for short verb facility.}
% This helper macro adds its argument to the
-% "\dospecials" macro which is conventionally used by verbatim macros
+% |\dospecials| macro which is conventionally used by verbatim macros
% to alter the catcodes of the currently active characters. We need
-% to add "\do\"\meta{c} to the expansion of "\dospecials" after
+% to add |\do\|\meta{c} to the expansion of |\dospecials| after
% removing the character if it was already there to avoid multiple
-% copies building up should "\MakeShortVerb" not be balanced by
-% "\DeleteShortVerb" (in case anything that uses "\dospecials" cares
+% copies building up should |\MakeShortVerb| not be balanced by
+% |\DeleteShortVerb| (in case anything that uses |\dospecials| cares
% about repetitions).
% \begin{macrocode}
\def\add@special#1{%
@@ -4478,29 +5075,31 @@
\expandafter\gdef\expandafter\dospecials\expandafter
{\dospecials \do #1}%
% \end{macrocode}
-% Similarly we have to add "\@makeother\"\meta{c} to "\@sanitize"
-% (which is used in things like "\index" to re-catcode all special
+% Similarly we have to add |\@makeother\|\meta{c} to |\@sanitize|
+% (which is used in things like |\index| to re-catcode all special
% characters except braces).
% \begin{macrocode}
\expandafter\gdef\expandafter\@sanitize\expandafter
{\@sanitize \@makeother #1}}
% \end{macrocode}
% \end{macro}
+%
+%
% \begin{macro}{\rem@special}
% \changes{v1.7a}{1992/02/27}{Added for short verb facility.}
-% The inverse of "\add@special" is slightly trickier. "\do" is
+% The inverse of |\add@special| is slightly trickier. |\do| is
% re-defined to expand to nothing if its argument is the character of
% interest, otherwise to expand simply to the argument. We can then
-% re-define "\dospecials" to be the expansion of itself. The space
-% after "=`##1" prevents an expansion to "\relax"!
+% re-define |\dospecials| to be the expansion of itself. The space
+% after |=`##1| prevents an expansion to |\relax|!
% \begin{macrocode}
\def\rem@special#1{%
\def\do##1{%
\ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
\xdef\dospecials{\dospecials}%
% \end{macrocode}
-% Fixing "\@sanitize" is the same except that we need to re-define
-% "\@makeother" which obviously needs to be done in a group.
+% Fixing |\@sanitize| is the same except that we need to re-define
+% |\@makeother| which obviously needs to be done in a group.
% \begin{macrocode}
\begingroup
\def\@makeother##1{%
@@ -4511,19 +5110,6 @@
%<*package>
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\MakeShortverb}
-% \begin{macro}{\DeleteShortverb}
-% \changes{v1.7a}{1992/02/27}{Added (from newdoc).}
-% These commands from \textsf{newdoc} are now obsolete.
-% \begin{macrocode}
-\def\MakeShortverb{\typeout{*** Switch to \noexpand\MakeShortVerb
- syntax, this is obsolete ***}\MakeShortVerb}
-\def\DeleteShortverb{\typeout{*** Switch to \noexpand\DeleteShortVerb
- syntax, this is obsolete ***}\DeleteShortVerb}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
%
%
% \subsection[Providing a checksum and character table]
@@ -4535,7 +5121,7 @@
% \begin{macro}{\init@checksum}
% The checksum mechanism works by counting backslashes in the
% macrocode. This initializes the count (when called from
-% "\StopEventually").
+% |\MaybeStop|).
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
% \begin{macrocode}
\def\init@checksum{\relax
@@ -4546,8 +5132,8 @@
%
% \begin{macro}{\check@checksum}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
-% This reports the sum compared with the value ("\bslash@cnt") the
-% file advertises. It's called from "\Finale" (if that hasn't been
+% This reports the sum compared with the value (|\bslash@cnt|) the
+% file advertises. It's called from |\Finale| (if that hasn't been
% re-defined).
% \changes{v2.1f}{2016/02/12}{Suppress \cs{CheckSum} check if no checksum
% is specified in the file}
@@ -4581,12 +5167,12 @@
% \end{macro}
%
%
-% \begin{macro}{\check@sum}
+% \begin{tcounter}{\check@sum}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
-% \begin{macro}{\bslash@cnt}
+% \begin{tcounter}{\bslash@cnt}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
-% We need to define counters, "\bslash@cnt" for the number of
-% backslashes counted and "\check@sum" for the value advertised by the
+% We need to define counters, |\bslash@cnt| for the number of
+% backslashes counted and |\check@sum| for the value advertised by the
% file if any. A negative value means there is no checksum checking which is the default.
% \changes{v2.1f}{2016/02/12}{Suppress \cs{CheckSum} check if no checksum
% is specified in the file}
@@ -4594,17 +5180,17 @@
\newcount\check@sum \check@sum = \m@ne
\newcount\bslash@cnt \bslash@cnt = \z@
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{tcounter}
+% \end{tcounter}
%
%
-% \begin{macro}{\CheckSum}
+% \begin{omacro}{\CheckSum}
% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.}
-% This is the interface to setting "\check@sum".
+% This is the interface to setting |\check@sum|.
% \begin{macrocode}
\def\CheckSum#1{\@bsphack\global\check@sum#1\relax\@esphack}
% \end{macrocode}
-% \end{macro}
+% \end{omacro}
%
%
%
@@ -4617,13 +5203,13 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\CharacterTable}
+% \begin{omacro}{\CharacterTable}
% The user interface to the character table-checking does some
-% "\catcode"ing and then compares the following table with the
-% stored version. We need to have "@" of type ``other'' within the
+% |\catcode|ing and then compares the following table with the
+% stored version. We need to have |@| of type ``other'' within the
% table since this is the way it is usually returned when reading
% in a normal document. To nevertheless have a private letter we
-% use "~" for this purpose. "~" does no harm as a ``letter'' as it
+% use |~| for this purpose. |~| does no harm as a ``letter'' as it
% comes last in the table and therefore will not gobble following
% space.
% \changes{v1.5m}{1989/09/20}{Macro added to check character translation
@@ -4635,12 +5221,14 @@
% \begin{macrocode}
\def\CharacterTable{\begingroup \CharTableChanges \character@table}
% \end{macrocode}
-% \end{macro}
+% \end{omacro}
+%
% \def\MakePrivateLetters{\catcode`\~=11\makeatletter}
+%
% \begin{macro}{\character@table}
% This does the work of comparing the tables and reporting the result.
% Note that the following code is enclosed in a group
-% with "~" catcoded to letter.
+% with |~| catcoded to letter.
% \begin{macrocode}
\begingroup
\catcode`\~=11
@@ -4659,22 +5247,22 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\CharTableChanges}
+% \begin{omacro}{\CharTableChanges}
% When the character table is read in we need to scan it with a
-% fixed set of "\catcode"s. The reference table below was defined by
-% assuming the normal "\catcode"s of \TeX{}, i.e.\ "@" is of type
+% fixed set of |\catcode|s. The reference table below was defined by
+% assuming the normal |\catcode|s of \TeX{}, i.e.\ |@| is of type
% other and the only token of type ``letter'' are the usual letters
% of the alphabet. If, for some reason, other characters are made
-% ``letters'' then their "\catcode"s need to be restored before
+% ``letters'' then their |\catcode|s need to be restored before
% checking the table. Otherwise spaces in the table are gobbled and
% we get the information that the tables are different, even if
-% they are actually equal. For this reason "\CharTableChanges" can
-% be set up to locally restore the "\catcode"s of such ``letters''
+% they are actually equal. For this reason |\CharTableChanges| can
+% be set up to locally restore the |\catcode|s of such ``letters''
% to ``other''.
% \begin{macrocode}
\global\let\CharTableChanges\@empty
% \end{macrocode}
-% \end{macro}
+% \end{omacro}
%
% \begin{macro}{\default~table}
% Here's what the table {\em should\/} look like (modulo spaces).
@@ -4719,34 +5307,40 @@
%
% The code in this section allows index entries to refer to code line
% numbers---the number of the first line of macrocode in the
-% \textsf{macro} environment.
+% \env{macro} environment.
%
%
% \begin{macro}{\codeline@index}
-% Indexing by code line is controlled by the "codeline@index" switch.
+% Indexing by code line is controlled by the |codeline@index| switch.
% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)}
% \changes{v1.7a}{1992/02/24}{Documented code line no. support.}
-% \begin{macro}{\CodelineNumbered}
+% \begin{imacro}{\CodelineNumbered}
% \changes{v1.8a}{1993/05/19}{Macro added}
% \begin{macrocode}
\newif\ifcodeline@index \codeline@indexfalse
\let\CodelineNumbered\codeline@indextrue
% \end{macrocode}
+% \end{imacro}
% \end{macro}
-% \end{macro}
+%
% \begin{macro}{\codeline@wrindex}
-% The code index entries are written out by "\special@index". If
-% indexing is by code line this is "\let" to "\codeline@wrindex";
-% if indexing is by page it is just "\index". However, if
-% "\nofiles" is given, we omit writing such an index entry at all.
+% The code index entries are written out by |\special@index|. If
+% indexing is by code line this is |\let| to |\codeline@wrindex|;
+% if indexing is by page it is just |\index|. However, if
+% |\nofiles| is given, we omit writing such an index entry at all.
% \changes{v1.7j}{1992/08/14}{Added \cs{if@filesw}.}
% \begin{macrocode}
\def\codeline@wrindex#1{\if@filesw
+ \begingroup
+ \set@display@protect
\immediate\write\@indexfile
{\string\indexentry{#1}%
- {\number\c@CodelineNo}}\fi}
+ {\number\c@CodelineNo}}%
+ \endgroup
+ \fi}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\special@index}
% By default no index entries are written out.
% \begin{macrocode}
@@ -4756,8 +5350,8 @@
% \begin{macro}{\CodelineIndex}
% \changes{v1.5u}{1989/11/14}{Added \cs{PageIndex} and
% \cs{CodelineIndex} (Undoc)}
-% This switches on use of the index file with "\makeindex", sets the
-% switch to indicate code line numbering and defines "\special@index"
+% This switches on use of the index file with |\makeindex|, sets the
+% switch to indicate code line numbering and defines |\special@index|
% appropriately.
% \begin{macrocode}
\def\CodelineIndex{\makeindex
@@ -4765,17 +5359,17 @@
\let\special@index\codeline@wrindex}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\PageIndex}
-% "\PageIndex" is similar.
+% \begin{imacro}{\PageIndex}
+% |\PageIndex| is similar.
% \begin{macrocode}
\def\PageIndex{\makeindex
\codeline@indexfalse
\let\special@index\index}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
%
-% \begin{macro}{\c@CodelineNo}
+% \begin{lcounter}{CodelineNo}
% \changes{v1.5l}{1989/09/10}{Counter added to support code line
% numbers}
% \changes{v1.5y}{1990/02/24}{Default changed.}
@@ -4785,7 +5379,8 @@
% \begin{macrocode}
\newcount\c@CodelineNo \c@CodelineNo\z@
% \end{macrocode}
-% \end{macro}
+% \end{lcounter}
+%
% \begin{macro}{\theCodelineNo}
% \changes{v1.7a}{1992/02/25}{Existing definition not overwritten.}
% \changes{v1.7a}{1992/03/12}{Use \cs{reset@font} for NFSS.}
@@ -4817,7 +5412,6 @@
% \end{macrocode}
% \end{macro}
%
-% \DeleteShortVerb{\"}
%
% The following |\mathcode| definitions allow the characters
% `|\|'
@@ -4835,9 +5429,9 @@
% \texttt{\bslash mathcode}$\,$s
% to work with any family assignments. For an example
% see the article about the new font selection scheme.}
-% particularly for something like $|\@abc|=1$.
+% particularly for something like |\@abc=1|.
%
-% If an {\em old\/} version of the \textsf{german} package is in
+% If an {\em old\/} version of the \pkg{german} package is in
% force, then the `|"|' character is active and would upset the
% definition of the \meta{16-bit number} quantities below, therefore
% we change the |\catcode| of |"| inside a group, and use
@@ -4907,8 +5501,8 @@
%
% \subsection{Changing the \texttt{\protect\bslash catcode} of \%}
%
-% \begin{macro}{\MakePercentIgnore}
-% \begin{macro}{\MakePercentComment}
+% \begin{imacro}{\MakePercentIgnore}
+% \begin{imacro}{\MakePercentComment}
% And finally the most important bit: we change the |\catcode|
% of `|%|' so that it is ignored (which is how we are able to
% produce this document!). We provide two commands to do the actual
@@ -4919,10 +5513,10 @@
\def\MakePercentIgnore{\catcode`\%9\relax}
\def\MakePercentComment{\catcode`\%14\relax}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+% \end{imacro}
+% \end{imacro}
%
-% \begin{macro}{\DocInput}
+% \begin{imacro}{\DocInput}
% The two macros above are now used to define the |\DocInput| macro
% which was introduced in version v1.5l (or so) of the \DOC{}
% package. In older versions |\MakePercentIgnore| was placed
@@ -4930,7 +5524,7 @@
% \begin{macrocode}
\def\DocInput#1{\MakePercentIgnore\input{#1}\MakePercentComment}
% \end{macrocode}
-% \end{macro}
+% \end{imacro}
%
% \subsection{GetFileInfo}
%
@@ -4951,6 +5545,779 @@
% \end{macrocode}
% \end{macro}
%
+
+
+
+
+% \section{Integrating hypdoc}
+%
+% If the option \texttt{hyperref} is selected (which is the
+% default), then we load the \pkg{hypdoc} package. We do that as
+% late as possible so that we don't generate option clashes if it
+% is also loaded in the preamble. That package currently changes
+% more commands than it should (not knowing about their new
+% definitions defined below) so we have to save and restore a few.
+%
+% Midterm all this code in \pkg{hypdoc} should be directly included
+% in \DOC. For now, while they are separate we have to do this
+% juggling.
+% \begin{macrocode}
+\AddToHook{begindocument/before}[doc/hyperref]{%
+ \ifdoc@hyperref
+% \end{macrocode}
+% Annoying to code around issue \#22
+% \begin{macrocode}
+ \expandafter\let\expandafter\doc@eoph@@k\csname doc.sty-h@@k\endcsname
+% \end{macrocode}
+% We require the package without any option so if it was already
+% loaded there is no option clash.
+% \begin{macrocode}
+ \RequirePackage{hypdoc}
+ \expandafter\let\csname doc.sty-h@@k\endcsname\doc@eoph@@k
+% \end{macrocode}
+% After \pkg{hypdoc} got loaded we need to undefine those macros
+% again so that later on \texttt{Macro} and \texttt{Env} \DOC items
+% appear to be undefined.
+% \begin{macrocode}
+ \let\PrintDescribeMacro \@@PrintDescribeMacro
+ \let\PrintDescribeEnv \@@PrintDescribeEnv
+ \let\PrintMacroName \@@PrintMacroName
+ \let\PrintEnvName \@@PrintEnvName
+ \let\SpecialUsageIndex \@@SpecialUsageIndex
+ \let\SpecialEnvIndex \@@SpecialEnvIndex
+ \let\SortIndex \@@SortIndex
+ \let\DescribeMacro \@@DescribeMacro
+ \let\DescribeEnv \@@DescribeEnv
+% \end{macrocode}
+% The package adds new definitions for \cs{special@index} into
+% \cs{CodelineIndex} and \cs{PageIndex} but since we are loading it
+% very late we are already past them (in the preamble). So we test
+% the final state and do it here, if necessary.
+% \begin{macrocode}
+ \ifx\special@index\@gobble % do we write index entries at all?
+ \else
+ \ifcodeline@index
+ \let\special@index\HD@codeline@wrindex
+ \else
+ \let\special@index\HD@page@wrindex
+ \fi
+ \fi
+% \end{macrocode}
+% The \pkg{amsmath} documentation uses \cs{env} in headings and
+% with \pkg{hyperref} enabled this causes trouble in bookmarks.
+% \fmi{fix elsewhere eventually}
+% \begin{macrocode}
+ \AddToHook{class/amsdtx/after}{%
+ \pdfstringdefDisableCommands{\let\env\@empty }}%
+% \end{macrocode}
+% That package also adds extra code into |\index| entries but it doesn't
+% know about all the stuff that \DOC does (now). So we need to provide
+% us with two helpers that handle the |\encapchar| case in some entries.
+% \begin{macrocode}
+ \def\doc@providetarget{\HD@target}%
+ \def\doc@handleencap#1{\encapchar hdclindex{\the\c@HD@hypercount}{#1}}%
+% \end{macrocode}
+% If that package is not loaded these helpers do little to nothing.
+% \begin{macrocode}
+ \else
+ \let\doc@providetarget\@empty
+ \def\doc@handleencap#1{\encapchar #1}%
+% \end{macrocode}
+% We define the next commands just in case the user changed the option
+% \texttt{hyperref} from \texttt{true} to \texttt{false} without
+% removing the auxiliary files.
+% \begin{macrocode}
+ \def\hdclindex#1#2{\ifx\@nil#2\@nil\else\csname #2\expandafter\endcsname\fi}%
+ \def\hdpindex #1{\ifx\@nil#1\@nil\else\csname #1\expandafter\endcsname\fi}%
+\fi
+}
+% \end{macrocode}
+%
+%
+%
+%
+%
+% \section{Integrating the \DOX package code}
+%
+% The code in this section is largely taken over from the \DOX package
+% by Didier with only minor modifications (so far). This means it is a
+% bit back and forth and both the code and the documentation need
+% further updates.
+%
+% \subsection{\DOX environments}
+
+% \begin{macro}{\@doc@env,\@doc@env@}
+% \fmi{original doc -- fix}
+% \marg{are-we-macrolike}\marg{item}\marg{indextype}\marg{name}\\
+% In \texttt{doc.sty}, the \texttt{macro} and \texttt{environment}
+% environments go through the \cs{m@cro@} macro which implements specific
+% parts by testing a boolean condition as its first argument. This mechanism
+% is not extensible, so I have to hack away a more generic version that
+% would work for any new \texttt{dox} item, only which looks pretty much
+% like the original one (with the addition of options management).
+%
+% First step is to see if we have a comma-separated list of names
+% in |#3| and if so we call the macro doing the work individually
+% for each
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\long\def\@doc@env#1#2#3{
+% \end{macrocode}
+% The |\endgroup| here closes the scanning of names (using special catcodes.
+% \begin{macrocode}
+ \endgroup
+ \clist_map_inline:nn {#3} { \@doc@env@{#1}{#2}{##1} }
+}
+
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% And here is the payload for each name from the given list:
+% \begin{macrocode}
+\long\def\@doc@env@#1#2#3{%
+ \topsep\MacroTopsep
+ \trivlist
+ \edef\saved@macroname{\string#3}%
+% \end{macrocode}
+% Since version 2.1g, \texttt{doc} creates a \cs{saved@indexname} command
+% which in used by \cs{changes}. We now support that as well. The expansion of
+% this command depends on whether the documented item is macrolike or not,
+% which we don't know here (it's only know by \cs{NewDocElement}). That's why we
+% need one specific command generating \cs{saved@indexname} the right way for
+% every single item. These commands are
+% named\cs{@Save\meta{item}IndexName};
+% 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}
+%
+% |#1| is either \texttt{TT} (for true = macrolike) or \texttt{TF}.
+% If true then we drop the first char from |\saved@macroname| and
+% store the result in |\saved@indexname| and use the latter for
+% sorting in the index.
+% \begin{macrocode}
+ \if #1%
+ \edef\saved@indexname{\expandafter\@gobble\saved@macroname}%
+%
+% \end{macrocode}
+% 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
+% 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
+% equivalent to \cs{CodeMacroIndex}.
+% \begin{macrocode}
+ \expandafter\ifx
+ \csname Code#2Index\endcsname
+ \CodeMacroIndex
+ \else
+ \record@index@type@save
+ {\saved@indexname}{#2}%
+ \fi
+ \else
+ \let\saved@indexname\saved@macroname
+ \fi
+%
+ \def\makelabel##1{\llap{##1}}%
+ \if@inlabel
+ \let\@tempa\@empty
+ \count@\macro@cnt
+ \loop\ifnum\count@>\z@
+ \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne
+ \repeat
+ \edef\makelabel##1{\llap{\vtop to\baselineskip{\@tempa\hbox{##1}\vss}}}%
+ \advance\macro@cnt\@ne
+ \else
+ \macro@cnt\@ne
+ \fi
+ \ifdoc@noprint
+ \item
+ \else
+ \edef\@tempa{%
+ \noexpand\item[%
+% \end{macrocode}
+% The second notable modification to the original macro involves dynamically
+% constructing the name of the print macro:
+% \begin{macrocode}
+ \noexpand\doc@providetarget
+ \noexpand\strut
+ \noexpand\@nameuse{Print#2Name}{\saved@macroname}]}%
+ \@tempa
+ \fi
+ \ifdoc@noindex\else
+ \global\advance\c@CodelineNo\@ne
+% \end{macrocode}
+% and the third one involves dynamically constructing the name of the index
+% macro:
+% \begin{macrocode}
+ \csname SpecialMain#2Index\expandafter\endcsname
+ \expandafter{\saved@macroname}\nobreak
+ \global\advance\c@CodelineNo\m@ne
+ \fi
+% \end{macrocode}
+% Suppress further |\index| entries when we are within a
+% \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}
+% \begin{macrocode}
+ \if#1\expandafter\DoNotIndex \expandafter {\saved@macroname}\fi
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \begin{macro}{\doc@env}
+% \marg{true-value}\marg{item}\oarg{options}\\
+% Handle optional arguments and call \cs{@doc@env}. Because environments can
+% be nested, we can't rely on grouping for getting options default values.
+% Hence, we need to reset the options at every call.
+% \fmi{Use 2e interface for \cs{keys\_set:nn} when available}
+% \begin{macrocode}
+\def\doc@env#1#2[#3]{%
+ \@nameuse{doc@noprint\doc@noprintdefault}%
+ \@nameuse{doc@noindex\doc@noindexdefault}%
+ \csname keys_set:nn\endcsname{doc}{#3}%
+ \begingroup
+ \ifdoc@outer
+ \catcode`\\12
+ \fi
+ \MakePrivateLetters
+ \@doc@env{#1}{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \subsection{\DOC descriptions}
+%
+% \begin{macro}{\@doc@describe}
+% \marg{item}\marg{name}\\
+% \begin{macrocode}
+\def\@doc@describe#1#2{%
+ \ifdoc@noprint\else
+ \marginpar{\raggedleft
+% \end{macrocode}
+% The hyperref target has to be in horizontal mode (which is the
+% case if it is after the \cs{strut}).
+% \begin{macrocode}
+ \strut
+ \doc@providetarget
+ \@nameuse{PrintDescribe#1}{#2}}%
+ \fi
+ \ifdoc@noindex\else
+ \@nameuse{Special#1Index}{#2}%
+ \fi
+ \@esphack
+ \endgroup
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\doc@describe}
+% \marg{item}\oarg{options}\\
+% Handle optional arguments and call \cs{@doc@describe}.
+% \fmi{Use 2e interface for \cs{keys\_set:nn} when available}
+% \begin{macrocode}
+\def\doc@describe#1[#2]{%
+ \leavevmode\@bsphack
+ \csname keys_set:nn\endcsname{doc}{#2}%
+ \@doc@describe{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{API construction}
+%
+%
+% \begin{macro}{\@temptokenb}
+% A scratch register (which may have been defined elsewhere)
+% \begin{macrocode}
+\@ifundefined{temptokenb}{\newtoks\@temptokenb}{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\doc@createspecialmainindex}
+% \marg{item}\marg{idxtype}\marg{idxcat}
+% \begin{macro}{\doc@createspecialmainmacrolikeindex}
+% \marg{item}\marg{idxtype}\marg{idxcat}\\
+% \fmi{original doc -- fix}
+% The ``macrolike'' version does something similar to |doc|'s
+% \cs{SpecialIndex@} macro, but simplified. Let's just hope nobody will ever
+% define \verb*|\ | or nonletter macros as macrolike \DOC elements\ldots
+% \begin{macrocode}
+\def\doc@createspecialindexes#1#2#3{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@temptokena{\space (#2)}%
+ \@temptokenb{#3:}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@nameedef{SpecialMain#1Index}##1{%
+ \noexpand\@bsphack
+ \ifdoc@toplevel
+ \noexpand\special@index{##1\noexpand\actualchar
+ {\string\ttfamily\space##1}%
+ \ifx\@nil#2\@nil\else \the\@temptokena \fi
+ \noexpand\encapchar main}%
+ \fi
+ \ifx\@nil#3\@nil\else
+ \noexpand\special@index{\the\@temptokenb\noexpand\levelchar
+ ##1\noexpand\actualchar{\string\ttfamily\space##1}%
+ \noexpand\encapchar main}%
+ \fi
+ \noexpand\@esphack}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@nameedef{Special#1Index}##1{%
+ \noexpand\@bsphack
+ \ifdoc@toplevel
+ \noexpand\doc@providetarget
+ \noexpand\index{##1\noexpand\actualchar{\string\ttfamily\space##1}%
+ \ifx\@nil#2\@nil\else \the\@temptokena \fi
+ \noexpand\doc@handleencap{usage}}%
+ \fi
+ \ifx\@nil#3\@nil\else
+ \noexpand\index{\the\@temptokenb\noexpand\levelchar
+ ##1\noexpand\actualchar{\string\ttfamily\space##1}%
+ \noexpand\doc@handleencap{usage}}%
+ \fi
+ \noexpand\@esphack}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\doc@createspecialmacrolikeindexes#1#2#3{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@temptokena{\space (#2)}%
+ \@temptokenb{#3:}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@nameedef{Code#1Index}##1##2{%
+ \noexpand\@SpecialIndexHelper@##2\noexpand\@nil
+ \noexpand\@bsphack
+ \noexpand\ifdoc@noindex\noexpand\else
+ \ifdoc@toplevel
+ \noexpand\special@index{\noexpand\@gtempa\noexpand\actualchar
+ \string\verb% % to fool emacs highlighting
+ \noexpand\quotechar*\noexpand\verbatimchar
+ \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
+ \ifx\@nil#2\@nil\else \the\@temptokena \fi
+ \noexpand\encapchar ##1}%
+ \fi
+ \ifx\@nil#3\@nil\else
+ \noexpand\special@index{\the\@temptokenb\noexpand\levelchar
+ \noexpand\@gtempa\noexpand\actualchar
+ \string\verb% % to fool emacs highlighting
+ \noexpand\quotechar*\noexpand\verbatimchar
+ \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
+ \noexpand\encapchar ##1}%
+ \fi
+ \noexpand\fi
+ \noexpand\@esphack}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@nameedef{SpecialMain#1Index}##1{%
+ \expandafter\noexpand\csname Code#1Index\endcsname
+ {main}{##1}}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@nameedef{Special#1Index}##1{%
+ \noexpand\@SpecialIndexHelper@##1\noexpand\@nil
+ \noexpand\@bsphack
+ \noexpand\ifdoc@noindex\noexpand\else
+ \ifdoc@toplevel
+ \noexpand\doc@providetarget
+ \noexpand\index{\noexpand\@gtempa\noexpand\actualchar
+ \string\verb% % to fool emacs highlighting
+ \noexpand\quotechar*\noexpand\verbatimchar
+ \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
+ \ifx\@nil#2\@nil\else \the\@temptokena \fi
+ \noexpand\doc@handleencap{usage}}%
+ \fi
+ \ifx\@nil#3\@nil\else
+ \noexpand\index{\the\@temptokenb\noexpand\levelchar
+ \noexpand\@gtempa\noexpand\actualchar
+ \string\verb% % to fool emacs highlighting
+ \noexpand\quotechar*\noexpand\verbatimchar
+ \noexpand\bslash\noexpand\@gtempa\noexpand\verbatimchar
+ \noexpand\doc@handleencap{usage}}%
+ \fi
+ \noexpand\fi
+ \noexpand\@esphack}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+
+
+% \begin{macro}{\doc@createdescribe}
+% \marg{item}
+% \begin{macrocode}
+\def\doc@createdescribe#1{%
+ \@namedef{Describe#1}{%
+% \end{macrocode}
+% Because of the optional argument we have to set
+% |\MakePrivateLetters| already before parsing that (fingers
+% crossed). Otherwise incorrect but quite common usage, such as
+% |\DescribeMacro\foo@bar| will break because the scan for the
+% optional argument will tokenize the following input (i.e., |\foo|
+% in that case) before the |@| sign becomes a letter. As a result
+% |DescribeMacro| would receive only |\foo| as its argument.
+% \begin{macrocode}
+ \begingroup
+ \MakePrivateLetters
+ \@ifnextchar[%]
+ {\doc@describe{#1}}{\doc@describe{#1}[]}}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\doc@createenv}
+% \marg{item}\marg{envname}
+% \begin{macrocode}
+\def\doc@createenv#1#2#3{%
+ \@namedef{#3}{%
+ \@ifnextchar[%]
+ {\doc@env{#1}{#2}}{\doc@env{#1}{#2}[]}}%
+% \end{macrocode}
+% Instead of |\let|ting the end of the environment to
+% |\endtrivlist| we use one level of expansion. This way any
+% possible change in that environment (if that ever happens) is
+% properly reflected.
+% \begin{macrocode}
+ \@namedef{end#3}{\endtrivlist}%
+% \expandafter\let\csname end#3\endcsname\endtrivlist
+}
+% \end{macrocode}
+% \end{macro}
+
+
+%
+% \begin{macro}{\@nameedef}
+%
+% \begin{macrocode}
+\def\@nameedef#1{\expandafter\edef\csname #1\endcsname}
+% \end{macrocode}
+% \end{macro}
+
+%
+% \subsection{API creation}
+%
+% The whole user interface is created in one macro call.
+%
+%\begin{verbatim}
+% defaults:
+%
+% idxtype = #3
+% idxgroup = #3s
+% printtype =
+%\end{verbatim}
+
+
+
+% \begin{macro}{\doc@declareerror}
+%
+% \begin{macrocode}
+\def\doc@declareerror#1#2{%
+ \PackageError{doc}{Doc element '#1/#2' already defined?\@gobble}%
+ {There is already a definition for
+ '\string\Print#1Name',\MessageBreak
+ '\string\PrintDescribe#1'
+ or the environment '#2'.\MessageBreak
+ Maybe you are overwriting something by mistake!\MessageBreak
+ Otherwise use '\string\RenewDocElement' instead.}%
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\doc@notdeclarederror}
+%
+% \begin{macrocode}
+\def\doc@notdeclarederror#1#2{%
+ \PackageError{doc}{Doc element '#1/#2' unknown}%
+ {I expected an existing definition for
+ '\string\Print#1Name',\MessageBreak
+ '\string\PrintDescribe#1' and
+ the environment '#2' but\MessageBreak
+ not all of them are defined.\MessageBreak
+ Maybe you wanted to use
+ '\string\NewDocElement'?}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{imacro}{\NewDocElement}
+% \oarg{options}\marg{name}\marg{envname}
+%
+% \begin{macrocode}
+\newcommand\NewDocElement[3][]{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@ifundefined{Print#2Name}%
+ {\@ifundefined{PrintDescribe#2}%
+ {\@ifundefined{#3}%
+ {\@ifundefined{end#3}%
+ {\@NewDocElement{#1}}%
+ \doc@declareerror
+ }\doc@declareerror
+ }\doc@declareerror
+ }\doc@declareerror
+ {#2}{#3}%
+}
+% \end{macrocode}
+% \end{imacro}
+%
+% \begin{imacro}{\RenewDocElement}
+% \oarg{options}\marg{name}\marg{envname}
+%
+% \begin{macrocode}
+\newcommand\RenewDocElement[3][]{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@ifundefined{Print#2Name}\doc@notdeclarederror
+ {\@ifundefined{PrintDescribe#2}\doc@notdeclarederror
+ {\@ifundefined{#3}\doc@notdeclarederror
+ {\@ifundefined{end#3}\doc@notdeclarederror
+ {\@NewDocElement{#1}}%
+ }%
+ }%
+ }%
+ {#2}{#3}%
+}
+% \end{macrocode}
+% \end{imacro}
+%
+%
+% \begin{macro}{\@NewDocElement}
+% \marg{options}\marg{name}\marg{envname}
+%
+% \begin{macrocode}
+\def\@NewDocElement#1#2#3{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \doc@macrolikefalse
+ \doc@topleveltrue
+% \end{macrocode}
+%
+% \fmi{Use 2e interface for \cs{keys\_set:nn} when available}
+% \begin{macrocode}
+ \def\doc@idxtype{#3}%
+ \def\doc@idxgroup{#3s}%
+ \let\doc@printtype\@empty
+ \csname keys_set:nn\endcsname{doc}{#1}%
+% \end{macrocode}
+% \begin{imacro}{\Print...Name}
+% \marg{name}
+% \fmi{extremely messy this with so many \cs{expandafter}s \ldots{}
+% should reimplement in expl3}
+% \begin{macrocode}
+ \ifx\doc@printtype\@empty
+ \@temptokena{}%
+ \else
+ \@temptokena\expandafter{\expandafter
+ \textnormal\expandafter{\expandafter
+ \space\expandafter
+ (\doc@printtype)}}%
+ \fi
+ \@nameedef{Print#2Name}##1{%
+ {\noexpand\MacroFont
+ \ifdoc@macrolike
+ \noexpand\string
+ \fi
+ ##1%
+ \the\@temptokena
+ }}%
+% \end{macrocode}
+% \end{imacro}
+%
+% \begin{imacro}{\PrintDescribe...}
+% \marg{name}
+% \begin{macrocode}
+ \expandafter\let\csname PrintDescribe#2\expandafter\endcsname
+ \csname Print#2Name\endcsname
+% \end{macrocode}
+% \end{imacro}
+%
+% \begin{imacro}{\SpecialMain...Index}
+% \marg{name}
+% \begin{imacro}{\Special...Index}
+% \marg{name}
+% \begin{macrocode}
+ \edef\doc@expr{%
+ \ifdoc@macrolike
+ \noexpand\doc@createspecialmacrolikeindexes
+ \else
+ \noexpand\doc@createspecialindexes
+ \fi
+ {#2}%
+ }%
+ \expandafter\expandafter\expandafter
+ \doc@expr
+ \expandafter\expandafter\expandafter
+ {\expandafter\doc@idxtype\expandafter}\expandafter
+ {\doc@idxgroup}%
+% \end{macrocode}
+% \end{imacro}
+% \end{imacro}
+%
+% \begin{imacro}{\Describe...}
+% \oarg{options}\marg{name}
+% \begin{macrocode}
+ \doc@createdescribe{#2}%
+% \end{macrocode}
+% \end{imacro}
+%
+% \begin{environment}{\meta{DocElement}}
+% \fmi{can't have formatting in argument -- fix}
+% \oarg{options}\marg{name}
+% \begin{macrocode}
+ \ifdoc@macrolike
+ \doc@createenv{TT}{#2}{#3}%
+ \else
+ \doc@createenv{TF}{#2}{#3}%
+ \fi
+}
+% \end{macrocode}
+% \end{environment}
+% \end{macro}
+
+
+
+
+
+% \subsection{Setting up the default \DOC elements}
+
+% \subsubsection{Macro facilities}
+%
+% Macros get only a single index entry (no index group, no index
+% type) and they do not get any label either when printing in the margin.
+% \begin{macrocode}
+\NewDocElement[macrolike = true ,
+ idxtype = ,
+ idxgroup = ,
+ printtype =
+ ]{Macro}{macro}
+% \end{macrocode}
+
+
+% \begin{macro}{SpecialMainIndex}
+%
+% In \DOC v2 we had \cs{SpecialMainIndex} and
+% \cs{SpecialMainEnvIndex} but now with additional \DOC elements we
+% always add the element name after ``\texttt{Main}'' so this would
+% be \cs{SpecialMainMacroIndex}. We use |\def| not |\let| so any
+% redefinition of |\SpecialMainMacroIndex| will be transparent.
+% \begin{macrocode}
+\def\SpecialMainIndex{\SpecialMainMacroIndex}
+% \end{macrocode}
+% \end{macro}
+
+% \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|.
+%
+% In fact the documentation of \DOC v2 claimed that one can use
+% this for both macros and environments but that was never true as
+% for environments the result was that the first character was
+% dropped in sorting of the index. The correct way is to use
+% \cs{SpecialEnvIndex} for this.
+% \begin{macrocode}
+\def\SpecialUsageIndex{\SpecialMacroIndex}
+% \end{macrocode}
+% \end{macro}
+%
+
+% \begin{macro}{\SpecialIndex}
+% \begin{macrocode}
+\def\SpecialIndex {\CodeMacroIndex{code}}
+% \end{macrocode}
+% \end{macro}
+
+
+%
+% \subsubsection{Environment facilities}
+%
+% Providing documentation support for environments. Here we differ
+% from \DOC V2 by marking the environments with ``(\textit{env.})''
+% when printing the name in the margin.
+% \begin{macrocode}
+\NewDocElement[macrolike = false ,
+ idxtype = env. ,
+ idxgroup = environments ,
+ printtype = \textit{env.}
+ ]{Env}{environment}
+% \end{macrocode}
+%
+%
+%
+% To be able to restore the definition after \pkg{hypdoc} is loaded
+% we better save them here. We only load the package at the end of
+% the preamble, but the user might do this earlier and then chaos
+% is ensured.
+% \begin{macrocode}
+ \let\@@PrintDescribeMacro \PrintDescribeMacro
+ \let\@@PrintDescribeEnv \PrintDescribeEnv
+ \let\@@PrintMacroName \PrintMacroName
+ \let\@@PrintEnvName \PrintEnvName
+ \let\@@SpecialUsageIndex \SpecialUsageIndex
+ \let\@@SpecialEnvIndex \SpecialEnvIndex
+ \let\@@SortIndex \SortIndex
+ \let\@@DescribeMacro \DescribeMacro
+ \let\@@DescribeEnv \DescribeEnv
+% \end{macrocode}
+%
+%
+% \section{Misc additions}
+
+% \begin{imacro}{\cs}
+% \begin{macrocode}
+\DeclareRobustCommand\cs[1]{\texttt{\bslash #1}}
+% \end{macrocode}
+% \cls{amsdtx} has its own definition for \cs{cs} but that now
+% gets overwritten because the class loads \pkg{doc} afterwards. So
+% for now we reinstall it here.
+% \fmi{fix elsewhere}
+% \begin{macrocode}
+\AddToHook{class/amsdtx/after}{%
+ \DeclareRobustCommand\cs[1]{%
+ \@boxorbreak{%
+ \ntt
+ \addbslash#1\@empty
+ \@xp\@xp\@xp\@indexcs\@xp\@nobslash\string#1\@nil
+ }%
+ }%
+ \def\cn{\cs}%
+}
+% \end{macrocode}
+% \end{imacro}
+
+
% We can now finish the \texttt{docstrip} main module.
% \begin{macrocode}
%</package>
@@ -4958,5 +6325,15 @@
%
%
% \Finale
-% \PrintIndex \PrintChanges
+% \PrintChanges
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput
+
+^^A Needed for emacs
+^^A
+^^A Local Variables:
+^^A mode: latex
+^^A coding: utf-8-unix
+^^A End:
diff --git a/macros/latex/base/doc.pdf b/macros/latex/base/doc.pdf
index 0c04b70a25..c649645b07 100644
--- a/macros/latex/base/doc.pdf
+++ b/macros/latex/base/doc.pdf
Binary files differ
diff --git a/macros/latex/base/docstrip.dtx b/macros/latex/base/docstrip.dtx
index c7480988b4..22c1f69aa0 100644
--- a/macros/latex/base/docstrip.dtx
+++ b/macros/latex/base/docstrip.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -935,7 +935,7 @@
% using*strange@programming<language>
%\end{verbatim}
%
-%\StopEventually{%
+%\MaybeStop{%
%^^A \section{Conclusion}
% \PrintIndex
% \PrintChanges
diff --git a/macros/latex/base/docstrip.ins b/macros/latex/base/docstrip.ins
index e34281fc36..e2187594a4 100644
--- a/macros/latex/base/docstrip.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -98,6 +98,7 @@ extension .ins) which are part of the distribution.
\generate{\file{ltxdoc.cls}{\from{ltxdoc.dtx}{class}}
+ \file{ltxdoc.cfg}{\from{ltxdoc.dtx}{cfg}}
}
\generate{\file{doc.sty}{\from{doc.dtx}{package}}
diff --git a/macros/latex/base/docstrip.pdf b/macros/latex/base/docstrip.pdf
index e738466196..07457cea0d 100644
--- a/macros/latex/base/docstrip.pdf
+++ b/macros/latex/base/docstrip.pdf
Binary files differ
diff --git a/macros/latex/base/ec.ins b/macros/latex/base/ec.ins
index 90b7b2e61f..47823e7edf 100644
--- a/macros/latex/base/ec.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/encguide.pdf b/macros/latex/base/encguide.pdf
index 34db11a39e..fca0d5c611 100644
--- a/macros/latex/base/encguide.pdf
+++ b/macros/latex/base/encguide.pdf
Binary files differ
diff --git a/macros/latex/base/encguide.tex b/macros/latex/base/encguide.tex
index d70233eab4..3c95cf30cc 100644
--- a/macros/latex/base/encguide.tex
+++ b/macros/latex/base/encguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/exscale.dtx b/macros/latex/base/exscale.dtx
index ea67cb6fb7..bc884c4db0 100644
--- a/macros/latex/base/exscale.dtx
+++ b/macros/latex/base/exscale.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -106,7 +106,7 @@
% they are printed on another installation whereas when using the
% package file they would come out the same on both sites.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{Implementation}
diff --git a/macros/latex/base/exscale.ins b/macros/latex/base/exscale.ins
index cfd2c535a7..d202aad7cf 100644
--- a/macros/latex/base/exscale.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/exscale.pdf b/macros/latex/base/exscale.pdf
index 59ff05aa27..ac3162238a 100644
--- a/macros/latex/base/exscale.pdf
+++ b/macros/latex/base/exscale.pdf
Binary files differ
diff --git a/macros/latex/base/fix-cm.dtx b/macros/latex/base/fix-cm.dtx
index 1be2e16cc0..5f8983ed34 100644
--- a/macros/latex/base/fix-cm.dtx
+++ b/macros/latex/base/fix-cm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -216,7 +216,7 @@
%
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Implementation}
%
diff --git a/macros/latex/base/fix-cm.ins b/macros/latex/base/fix-cm.ins
index 95931970f4..b688cd66cf 100644
--- a/macros/latex/base/fix-cm.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/fix-cm.pdf b/macros/latex/base/fix-cm.pdf
index 1d0a7e432b..ffe0337c9b 100644
--- a/macros/latex/base/fix-cm.pdf
+++ b/macros/latex/base/fix-cm.pdf
Binary files differ
diff --git a/macros/latex/base/fntguide.pdf b/macros/latex/base/fntguide.pdf
index 04f2a069c0..34bae59bea 100644
--- a/macros/latex/base/fntguide.pdf
+++ b/macros/latex/base/fntguide.pdf
Binary files differ
diff --git a/macros/latex/base/fntguide.tex b/macros/latex/base/fntguide.tex
index a4b872a261..62d3538304 100644
--- a/macros/latex/base/fntguide.tex
+++ b/macros/latex/base/fntguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -12,7 +12,7 @@
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
-% http://www.latex-project.org/lppl.txt
+% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008 or later.
%
@@ -33,16 +33,21 @@
\documentclass{ltxguide}[1995/11/28]
-\usepackage{varioref}
+
+\setcounter{totalnumber}{8}
+\setcounter{topnumber}{8}
+
+\usepackage[trace]{fewerfloatpages}
+\usepackage{booktabs,varioref}
\title{\LaTeXe{} font selection}
\author{\copyright~Copyright 1995--2021, \LaTeX\ Project
Team.\thanks{Thanks to Arash Esbati for documenting the
newer NFSS features of 2020}\\
- All rights reserved.}
+ All rights reserved.}
-\date{March 2021}
+\date{December 2021}
\begin{document}
@@ -160,7 +165,7 @@ For more information about \TeX{} and \LaTeX{}, please contact your
local \TeX{} Users Group, or the international \TeX{} Users Group.
Addresses and other details can be found at:
\begin{quote}\small\label{addrs}
- \texttt{http://www.tug.org/lugs.html}
+ \texttt{https://www.tug.org/lugs.html}
\end{quote}
@@ -288,6 +293,9 @@ naming scheme to allow for sensible default substitutions if necessary,
e.g., ``demi-bold'' is normally just another name for ``semi-bold'', so
should get |sb| assigned, etc.
+
+\newpage
+
\NEWdescription{2020/02/02}
The most common values for the font shape are:
\begin{center}
@@ -343,27 +351,29 @@ box warning, for example:
Overfull \hbox (3.80855pt too wide) in paragraph at lines 314--318
[]\OT1/cmr/m/n/10 Normally [] and [] will be iden-ti-cal,
\end{verbatim}
-The author commands for fonts set the five attributes:
-\begin{center}
- \hspace*{-1em}%
- \begin{tabular}{rcl}
- \emph{Author command} & \emph{Attribute}
+The author commands for fonts set the five attributes as shown in table~\vref{tab:attributes}.
+\begin{table}[!tbp]
+ \centering
+ \begin{tabular}{@{}r@{\hspace{3pt}}c@{\hspace{1pt}}c@{}}
+ \toprule
+ \multicolumn{1}{c}{\emph{Author command}} & \emph{Attribute}
& \emph{Value in} |article| \emph{class} \\
+ \midrule
|\textnormal{..}| or |\normalfont| & family & |cmr| \\
& series & |m| \\
- & shape & |n| \\[1pt]
+ & shape & |n| \\ \midrule%[2pt]
|\textrm{..}| or |\rmfamily| & family & |cmr| \\
|\textsf{..}| or |\sffamily| & family & |cmss| \\
|\texttt{..}| or |\ttfamily| & family & |cmtt| \\
|\textmd{..}| or |\mdseries| & series & |m| \\
- |\textbf{..}| or |\bfseries| & series & |bx| \\[1pt]
+ |\textbf{..}| or |\bfseries| & series & |bx| \\ \midrule%[2pt]
|\textit{..}| or |\itshape| & shape & |it| \\
|\textsl{..}| or |\slshape| & shape & |sl| \\
|\textsc{..}| or |\scshape| & shape & |sc| \\
|\textssc{..}| or |\sscshape| & shape & |ssc| \\
|\textsw{..}| or |\swshape| & shape & |sw| \\
- |\textulc{..}| or |\ulcshape| & shape & |ulc| (virtual) $\to$ |n|, |it|, |sl| or |ssc| \\
- |\textup{..}| or |\upshape| & shape & |up| (virtual) $\to$ |n| or |sc| \\[1pt]
+ |\textulc{..}| or |\ulcshape| & shape & |ulc| (virtual) $\to$ |n|, |it|, |sl| or |ssc| \\
+ |\textup{..}| or |\upshape| & shape & | up| (virtual) $\to$ |n| or |sc |\phantom{, , } \\\midrule%[2pt]
|\tiny| & size & |5pt| \\
|\scriptsize| & size & |7pt| \\
|\footnotesize| & size & |8pt| \\
@@ -373,9 +383,11 @@ The author commands for fonts set the five attributes:
|\Large| & size & |14.4pt| \\
|\LARGE| & size & |17.28pt| \\
|\huge| & size & |20.74pt| \\
- |\Huge| & size & |24.88pt|
+ |\Huge| & size & |24.88pt| \\
+ \bottomrule
\end{tabular}
-\end{center}
+ \caption{Author font commands and their effects (article class)}\label{tab:attributes}
+\end{table}
The values used by these commands are determined by the document class,
using the parameters defined in Section~\ref{Sec:text.param}.
@@ -386,16 +398,20 @@ This section does not explain how \LaTeX{} font specifications are
turned into \TeX{} font names. This is described in
Section~\ref{Sec:install}.
+
+\newpage
+
+
\subsection{Selection commands}
The low-level commands used to select a text font are as follows.
\begin{decl}
|\fontencoding| \arg{encoding} \\
- |\fontfamily| \arg{family} \\
- |\fontseries| \arg{series} \\
+ |\fontfamily| \arg{family} \qquad
+ |\fontseries| \arg{series} \qquad
|\fontshape| \arg{shape} \\
- |\fontsize| \arg{size} \arg{baselineskip} \\
+ |\fontsize| \arg{size} \arg{baselineskip} \qquad
|\linespread| \arg{factor}
\end{decl}
@@ -439,14 +455,14 @@ to |\selectfont|.
The current values of the font attributes are held in internal macros.
\begin{decl}
- |\f@encoding| \\
- |\f@family| \\
- |\f@series| \\
- |\f@shape| \\
- |\f@size| \\
+ |\f@encoding| \quad
+ |\f@family| \quad
+ |\f@series| \quad
+ |\f@shape| \quad
+ |\f@size| \quad
|\f@baselineskip| \\
- |\tf@size| \\
- |\sf@size| \\
+ |\tf@size| \quad
+ |\sf@size| \quad
|\ssf@size|
\end{decl}
@@ -482,9 +498,9 @@ specifies:
\end{verbatim}
\begin{decl}
- |\encodingdefault| \\
- |\familydefault| \\
- |\seriesdefault| \\
+ |\encodingdefault| \qquad
+ |\familydefault| \qquad
+ |\seriesdefault| \qquad
|\shapedefault|
\end{decl}
The encoding, family, series and shape of the main body font. By
@@ -493,8 +509,8 @@ default family is |\rmdefault|, this means that changing |\rmdefault|
will change the main body font of the document.
\begin{decl}
- |\rmdefault| \\
- |\sfdefault| \\
+ |\rmdefault| \qquad
+ |\sfdefault| \qquad
|\ttdefault|
\end{decl}
The families selected by |\textrm|, |\rmfamily|, |\textsf|, |\sffamily|,
@@ -502,7 +518,7 @@ The families selected by |\textrm|, |\rmfamily|, |\textsf|, |\sffamily|,
|cmtt|.
\begin{decl}
- |\bfdefault| \\
+ |\bfdefault| \qquad
|\mddefault|
\end{decl}
The series selected by |\textbf|, |\bfseries|, |\textmd| and
@@ -516,12 +532,12 @@ the fonts provided by |psnfss|) is to define silent substitutions from
and the |ssub| size function, see Section~\ref{sec:sizefunct}.
\begin{decl}
- |\itdefault| \\
- |\sldefault| \\
- |\scdefault| \\
- |\sscdefault| \\
+ |\itdefault| \qquad
+ |\sldefault| \qquad
+ |\scdefault| \qquad
+ |\sscdefault| \qquad
|\swdefault| \\
- |\ulcdefault| \\
+ |\ulcdefault| \qquad
|\updefault|
\end{decl}
\NEWfeature{2020/02/02}
@@ -611,6 +627,8 @@ This declaration is useful for setting up commands like |\rm| to behave
as they did in \LaTeX~2.09. We strongly urge you \emph{not} to misuse
this declaration to invent new font commands.
+\newpage
+
The following example defines |\it| to produce the italic shape of the
main document font if used in text and to switch to the font that would
normally be produced by the math alphabet |\mathit| if used in a
@@ -714,13 +732,13 @@ selected indirectly through symbol commands like |\oplus|.
Section~\ref{Sec:math.commands} explains how to define symbol commands.
\begin{decl}
- |\mathnormal{<math>}| \\
- |\mathcal{<math>}| \\
- |\mathrm{<math>}| \\
- |\mathbf{<math>}| \\
- |\mathsf{<math>}| \\
+ |\mathnormal{<math>}| \quad
+ |\mathcal{<math>}| \quad
+ |\mathbf{<math>}| \quad
|\mathit{<math>}| \\
- |\mathtt{<math>}|
+ |\mathrm{<math>}| \qquad
+ |\mathsf{<math>}| \qquad
+ |\mathtt{<math>}|
\end{decl}
Each math alphabet is a command which can only be used inside math mode.
For example, |$x + \mathsf{y} + \mathcal{Z}$| produces
@@ -799,6 +817,8 @@ Checks that \m{math-alph} has been declared as a math alphabet,
\m{version} is a known math version and \m{encoding} is a known encoding
scheme.
+\newpage
+
This example defines |\baz| for the `normal' math version only:
\begin{verbatim}
\SetMathAlphabet{\baz}{normal}{OT1}{cmss}{m}{n}
@@ -868,6 +888,8 @@ alphabet with command \m{math-alph} in \emph{all} math versions.
Checks that the command \m{math-alph} is either already a math alphabet
command or is undefined; and that \m{sym-font} is a symbol font.
+\newpage
+
Example:
\begin{verbatim}
\DeclareSymbolFontAlphabet{\mathrm}{operators}
@@ -928,6 +950,8 @@ Example:
\DeclareMathSymbol{\alphld}{\mathalpha}{AMSb}{"0C}
\end{verbatim}
+\newpage
+
\begin{decl}
|\DeclareMathDelimiter| \arg{cmd} \arg{type}
\arg{sym-font-1} \arg{slot-1}\\
@@ -1021,6 +1045,7 @@ Example:
This section explains how \LaTeX's font attributes are turned into
\TeX{} font specifications.
+
\subsection{Font definition files}
\NEWdescription{1997/12/01}
@@ -1043,6 +1068,8 @@ and font substitutions are made.
The declarations in the font definition file are responsible for telling
\LaTeX{} how to load fonts for that encoding/family combination.
+
+
\subsection{Font definition file commands}
\emph{Note}: A font definition file should contain only commands from
@@ -1056,7 +1083,11 @@ of a document.
|\ProvidesFile{<file-name>}[<release-info>]|
\end{decl}
The file should announce itself with a |\ProvidesFile| command, as
-described in \emph{\clsguide}. For example:
+described in \emph{\clsguide}.
+
+\newpage
+
+For example:
\begin{verbatim}
\ProvidesFile{t1ptm.fd}[1994/06/01 Adobe Times font definitions]
\end{verbatim}
@@ -2017,12 +2048,17 @@ glyphs from the math fonts instead of the current text font (this means
they always keep the same shape and do not nicely blend in with the text
font).
+\newpage
+
The following tables show the macros available. The next commands are
`constructed' accents and are built via \TeX{} macros:
\begin{center}
\begin{tabular}[t]{@{}ll}
\verb*|\capitalcedilla A| & \capitalcedilla A \\
\verb*|\capitalogonek A| & \capitalogonek A \\
+ \end{tabular}
+ \quad
+ \begin{tabular}[t]{@{}ll}
\verb*|\textcircled a| & \textcircled a
\end{tabular}
\end{center}
@@ -2052,12 +2088,21 @@ show the slot number:
\end{tabular}
\end{center}
-Table~\vref{tab:textcomp} contains macros to access text symbols. Again,
+Table~\vref{tab:textcomp}
+contains the full list of commands to access the text symbols.
+%
+% Tables~\vrefrange{tab:ts1-subset-always}{tab:ts1-subset-9-disable}
+% contain the commands to access the text symbols.
+%
+Again,
the numbers are the slots in the encoding.
-\begin{table}
-\centering\footnotesize
+\iftrue
+\begin{table}[!tp]
+ \centering\footnotesize
+ \renewcommand\arraystretch{1.07}
\begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
\verb|\textcapitalcompwordmark| & \textcapitalcompwordmark & 23 \\
\verb|\textascendercompwordmark| & \textascendercompwordmark & 31 \\
\verb|\textquotestraightbase| & \textquotestraightbase & 13 \\
@@ -2112,9 +2157,11 @@ the numbers are the slots in the encoding.
\verb|\textbullet| & \textbullet & 136 \\
\verb|\textcelsius| & \textcelsius & 137 \\
\verb|\textdollaroldstyle| & \textdollaroldstyle & 138 \\
- \verb|\textcentoldstyle| & \textcentoldstyle & 139
+ \verb|\textcentoldstyle| & \textcentoldstyle & 139 \\
+ \bottomrule
\end{tabular}\qquad
\begin{tabular}[t]{lp{1.5em}l}
+ \toprule
\verb|\textflorin| & \textflorin & 140 \\
\verb|\textcolonmonetary| & \textcolonmonetary & 141 \\
\verb|\textwon| & \textwon & 142 \\
@@ -2168,12 +2215,371 @@ the numbers are the slots in the encoding.
\verb|\textthreequarters| & \textthreequarters & 190 \\
\verb|\texteuro| & \texteuro & 191 \\
\verb|\texttimes| & \texttimes & 214 \\
- \verb|\textdiv| & \textdiv & 246
+ \verb|\textdiv| & \textdiv & 246 \\
+ \null \\
+ \bottomrule
+ \end{tabular}
+ \caption{Text symbols formerly from the \textsf{textcomp} package}
+ \label{tab:textcomp}
+\end{table}
+
+\fi
+
+The |TS1| encoding contains a rich set of symbols which means that
+several symbols are only available in a few \TeX{} fonts and some, such
+as the capital accents, not available at all but developed as part of
+the reference font implementation. In reality, many existing fonts
+don't provide a full set of glyphs defined in |TS1| encoding and the
+question arises: ``Which glyphs of the |TS1| encoding are implemented by
+which font?''
+
+\NEWfeature{2021/06/01}
+Fonts can be ordered in sub-encodings with the |\DeclareEncodingSubset|
+macro:
+\begin{decl}
+ |\DeclareEncodingSubset| \arg{encoding}
+ \arg{font family}
+ \arg{subset number}
+\end{decl}
+The macro takes 3 mandatory arguments: An \m{encoding} for which a
+subsetting is wanted (currently only |TS1|), the \m{font family} for
+which we declare the subset and finally the \m{subset number} between
+|0| (all of the encoding is supported) and |9| (many glyphs are
+missing). Hence, it is assumed that some symbols are always available
+by all fonts and each sub-encoding defines macros which become
+unavailable (i.e., they are not provided in the sub-encoding with that
+number and all sub-encodings with higher numbers.)
+
+\begin{table}[tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textquotestraightbase| & \textquotestraightbase & 13 \\
+ \verb|\textquotestraightdblbase| & \textquotestraightdblbase & 18 \\
+ \verb|\textcapitalcompwordmark| & \textcapitalcompwordmark & 23 \\
+ \verb|\textascendercompwordmark| & \textascendercompwordmark & 31 \\
+ \verb|\textdollar| & \textdollar & 36 \\
+ \verb|\textquotesingle| & \textquotesingle & 39 \\
+ \verb|\textasteriskcentered| & \textasteriskcentered & 42 \\
+ \verb|\textdagger| & \textdagger & 132 \\
+ \verb|\textdaggerdbl| & \textdaggerdbl & 133 \\
+ \verb|\textperthousand| & \textperthousand & 135 \\
+ \verb|\textbullet| & \textbullet & 136 \\
+ \verb|\texttrademark| & \texttrademark & 151 \\
+ \verb|\textcent| & \textcent & 162 \\
+ \verb|\textsterling| & \textsterling & 163 \\
+ \verb|\textyen| & \textyen & 165 \\
+ \verb|\textbrokenbar| & \textbrokenbar & 166 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textsection| & \textsection & 167 \\
+ \verb|\textcopyright| & \textcopyright & 169 \\
+ \verb|\textordfeminine| & \textordfeminine & 170 \\
+ \verb|\textlnot| & \textlnot & 172 \\
+ \verb|\textregistered| & \textregistered & 174 \\
+ \verb|\textdegree| & \textdegree & 176 \\
+ \verb|\textpm| & \textpm & 177 \\
+ \verb|\textparagraph| & \textparagraph & 182 \\
+ \verb|\textperiodcentered| & \textperiodcentered & 183 \\
+ \verb|\textordmasculine| & \textordmasculine & 186 \\
+ \verb|\textonequarter| & \textonequarter & 188 \\
+ \verb|\textonehalf| & \textonehalf & 189 \\
+ \verb|\textthreequarters| & \textthreequarters & 190 \\
+ \verb|\texttimes| & \texttimes & 214 \\
+ \verb|\textdiv| & \textdiv & 246 \\
+ \null \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols available in all \texttt{TS1} sub-encodings}
+ \label{tab:ts1-subset-always}
+\end{table}
+
+
+
+\begin{table}[!tbp]
+ \centering
+ \begin{tabular}[t]{@{}lll@{}}
+ \toprule
+ \verb*|\textcircled| & \textcircled{} & acc \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbol unavailable in \texttt{TS1} sub-encoding \texttt{1}
+ and higher}
+ \label{tab:ts1-subset-1-disable}
+\end{table}
+
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\capitalcedilla| & \capitalcedilla{} & acc \\
+ \verb|\capitalogonek| & \capitalogonek{} & acc \\
+ \verb|\capitalgrave| & \capitalgrave{} & 0 \\
+ \verb|\capitalacute| & \capitalacute{} & 1 \\
+ \verb|\capitalcircumflex| & \capitalcircumflex{} & 2 \\
+ \verb|\capitaltilde| & \capitaltilde{} & 3 \\
+ \verb|\capitaldieresis| & \capitaldieresis{} & 4 \\
+ \verb|\capitalhungarumlaut| & \capitalhungarumlaut{} & 5 \\
+ \verb|\capitalring| & \capitalring{} & 6 \\
+ \verb|\capitalcaron| & \capitalcaron{} & 7 \\
+ \verb|\capitalbreve| & \capitalbreve{} & 8 \\
+ \verb|\capitalmacron| & \capitalmacron{} & 9 \\
+ \verb|\capitaldotaccent| & \capitaldotaccent{} & 10 \\
+ \verb|\capitaltie| & \capitaltie{} & 27 \\
+ \verb|\newtie| & \newtie{} & 28 \\
+ \verb|\capitalnewtie{}| & \capitalnewtie{} & 29 \\
+ \verb|\textdblhyphen| & \textdblhyphen & 45 \\
+ \verb|\textzerooldstyle| & \textzerooldstyle & 48 \\
+ \verb|\textoneoldstyle| & \textoneoldstyle & 49 \\
+ \verb|\texttwooldstyle| & \texttwooldstyle & 50 \\
+ \verb|\textthreeoldstyle| & \textthreeoldstyle & 51 \\
+ \verb|\textfouroldstyle| & \textfouroldstyle & 52 \\
+ \verb|\textfiveoldstyle| & \textfiveoldstyle & 53 \\
+ \verb|\textsixoldstyle| & \textsixoldstyle & 54 \\
+ \verb|\textsevenoldstyle| & \textsevenoldstyle & 55 \\
+ \verb|\texteightoldstyle| & \texteightoldstyle & 56 \\
+ \verb|\textnineoldstyle| & \textnineoldstyle & 57 \\
+ \verb|\textmho| & \textmho & 77 \\
+ \verb|\textbigcircle| & \textbigcircle & 79 \\
+ \verb|\textlbrackdbl| & \textlbrackdbl & 91 \\
+ \verb|\textrbrackdbl| & \textrbrackdbl & 93 \\
+ \verb|\textasciigrave| & \textasciigrave & 96 \\
+ \verb|\textborn| & \textborn & 98 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textdivorced| & \textdivorced & 99 \\
+ \verb|\textdied| & \textdied & 100 \\
+ \verb|\textleaf| & \textleaf & 108 \\
+ \verb|\textmarried| & \textmarried & 109 \\
+ \verb|\textmusicalnote| & \textmusicalnote & 110 \\
+ \verb|\texttildelow| & \texttildelow & 126 \\
+ \verb|\textdblhyphenchar| & \textdblhyphenchar & 127 \\
+ \verb|\textasciibreve| & \textasciibreve & 128 \\
+ \verb|\textasciicaron| & \textasciicaron & 129 \\
+ \verb|\textacutedbl| & \textacutedbl & 130 \\
+ \verb|\textgravedbl| & \textgravedbl & 131 \\
+ \verb|\textdollaroldstyle| & \textdollaroldstyle & 138 \\
+ \verb|\textcentoldstyle| & \textcentoldstyle & 139 \\
+ \verb|\textnaira| & \textnaira & 143 \\
+ \verb|\textguarani| & \textguarani & 144 \\
+ \verb|\textpeso| & \textpeso & 145 \\
+ \verb|\textrecipe| & \textrecipe & 147 \\
+ \verb|\textpertenthousand| & \textpertenthousand & 152 \\
+ \verb|\textpilcrow| & \textpilcrow & 153 \\
+ \verb|\textbaht| & \textbaht & 154 \\
+ \verb|\textdiscount| & \textdiscount & 156 \\
+ \verb|\textopenbullet| & \textopenbullet & 158 \\
+ \verb|\textservicemark| & \textservicemark & 159 \\
+ \verb|\textlquill| & \textlquill & 160 \\
+ \verb|\textrquill| & \textrquill & 161 \\
+ \verb|\textasciidieresis| & \textasciidieresis & 168 \\
+ \verb|\textcopyleft| & \textcopyleft & 171 \\
+ \verb|\textcircledP| & \textcircledP & 173 \\
+ \verb|\textasciimacron| & \textasciimacron & 175 \\
+ \verb|\textasciiacute| & \textasciiacute & 180 \\
+ \verb|\textreferencemark| & \textreferencemark & 184 \\
+ \verb|\textsurd| & \textsurd & 187 \\
+ \null \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{2}
+ and higher}
+ \label{tab:ts1-subset-2-disable}
+\end{table}
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|textlangle| & \textlangle & 60 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textrangle| & \textrangle & 62 \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{3}
+ and higher}
+ \label{tab:ts1-subset-3-disable}
+\end{table}
+
+
+Thus, the symbols that are available in sub-encoding $x$ are the symbols
+in table~\ref{tab:ts1-subset-always} (always available) and the symbols
+that only become unavailable in sub-encodings $> x$. The tables
+\vrefrange{tab:ts1-subset-1-disable}{tab:ts1-subset-9-disable} show the symbols that
+become unavailable in the different sub-encodings. Again, the numbers
+are the slots in the |TS1| encoding, |acc| indicates a `constructed'
+accent.
+
+\newpage
+
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textleftarrow| & \textleftarrow & 24 \\
+ \verb|\textrightarrow| & \textrightarrow & 25 \\
+ \verb|\textuparrow| & \textuparrow & 94 \\
+ \verb|\textdownarrow| & \textdownarrow & 95 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textcolonmonetary| & \textcolonmonetary & 141 \\
+ \verb|\textwon| & \textwon & 142 \\
+ \verb|\textlira| & \textlira & 146 \\
+ \verb|\textdong| & \textdong & 150 \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{4}
+ and higher}
+ \label{tab:ts1-subset-4-disable}
+\end{table}
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textnumero| & \textnumero & 155 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textestimated| & \textestimated & 157 \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{5}
+ and higher}
+ \label{tab:ts1-subset-5-disable}
+\end{table}
+
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textflorin| & \textflorin & 140 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textcurrency| & \textcurrency & 164 \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{6}
+ and higher}
+ \label{tab:ts1-subset-6-disable}
+\end{table}
+
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textfractionsolidus| & \textfractionsolidus & 47 \\
+ \verb|\textminus| & \textminus & 61 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textohm| & \textohm & 87 \\
+ \verb|\textmu| & \textmu & 181 \\
+ \bottomrule
\end{tabular}
-\caption{Text symbols formerly from the \textsf{textcomp} package}
-\label{tab:textcomp}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{7}
+ and higher}
+ \label{tab:ts1-subset-7-disable}
\end{table}
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textblank| & \textblank & 32 \\
+ \verb|\textinterrobang| & \textinterrobang & 148 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\textinterrobangdown| & \textinterrobangdown & 149 \\
+ \null \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{8}
+ and higher}
+ \label{tab:ts1-subset-8-disable}
+\end{table}
+
+
+\begin{table}[!tbp]
+ \centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\texttwelveudash| & \texttwelveudash & 21 \\
+ \verb|\textthreequartersemdash| & \textthreequartersemdash & 22 \\
+ \verb|\textbardbl| & \textbardbl & 134 \\
+ \verb|\textcelsius| & \textcelsius & 137 \\
+ \bottomrule
+ \end{tabular}\qquad
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \toprule
+ \verb|\texttwosuperior| & \texttwosuperior & 178 \\
+ \verb|\textthreesuperior| & \textthreesuperior & 179 \\
+ \verb|\textonesuperior| & \textonesuperior & 185 \\
+ \null \\
+ \bottomrule
+ \end{tabular}
+ \caption{Symbols unavailable in \texttt{TS1} sub-encoding \texttt{9}}
+ \label{tab:ts1-subset-9-disable}
+\end{table}
+
+
+
+As an example,
+%\begin{verbatim}
+ \verb=\DeclareEncodingSubset{TS1}{foo}{5}=
+%\end{verbatim}
+indicates that the font family |foo| contains the always available
+symbols (table~\vref{tab:ts1-subset-always}) and the ones disabled
+in sub-encodings 6--9, i.e.,
+tables~\vrefrange{tab:ts1-subset-6-disable}{tab:ts1-subset-9-disable}.
+
+As these days many font families are set up to end in |-LF| (lining
+figures), |-OsF| (oldstyle figures), etc. the declaration supports a
+shortcut: if the \m{font family} name ends in |-*| then the star gets
+replaced by these common ending, e.g.,
+\begin{verbatim}
+ \DeclareEncodingSubset{TS1}{Alegreya-*}{2}
+\end{verbatim}
+is the same as writing
+\begin{verbatim}
+ \DeclareEncodingSubset{TS1}{Alegreya-LF} {2}
+ \DeclareEncodingSubset{TS1}{Alegreya-OsF} {2}
+ \DeclareEncodingSubset{TS1}{Alegreya-TLF} {2}
+ \DeclareEncodingSubset{TS1}{Alegreya-TOsF}{2}
+\end{verbatim}
+If only some are needed then one can define them individually but in
+many cases all four are wanted, hence the shortcut.
+
+
+
+
\section{If you need to know more \ldots}
\NEWdescription{1996/06/01}
diff --git a/macros/latex/base/fontdef.dtx b/macros/latex/base/fontdef.dtx
index 581cfeb789..06af8feefd 100644
--- a/macros/latex/base/fontdef.dtx
+++ b/macros/latex/base/fontdef.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -164,7 +164,7 @@
% \end{quote}
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The \texttt{docstrip} modules}
%
diff --git a/macros/latex/base/format.ins b/macros/latex/base/format.ins
index eece2f57ef..369f01a7c5 100644
--- a/macros/latex/base/format.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
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-2021
+Copyright (C) 2015-2022
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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -174,6 +174,7 @@ the system are in the document `cfgguide.tex'.
\from{lterror.dtx}{2ekernel}
\from{ltpar.dtx}{2ekernel}
\from{ltpara.dtx}{2ekernel} % L3 layer module
+ \from{ltmeta.dtx}{2ekernel} % L3 layer module
\from{ltspace.dtx}{2ekernel}
\from{ltlogos.dtx}{2ekernel}
\from{ltfiles.dtx}{2ekernel}
@@ -201,8 +202,10 @@ the system are in the document `cfgguide.tex'.
\from{ltfloat.dtx}{2ekernel}
\from{ltidxglo.dtx}{2ekernel}
\from{ltbibl.dtx}{2ekernel}
+ \from{ltmarks.dtx}{trace,2ekernel} % L3 layer module
\from{ltpage.dtx}{2ekernel}
\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}
diff --git a/macros/latex/base/graphpap.dtx b/macros/latex/base/graphpap.dtx
index cc9f4da3cb..78bb688f83 100644
--- a/macros/latex/base/graphpap.dtx
+++ b/macros/latex/base/graphpap.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -65,7 +65,7 @@
% The default value of \emph{N} is 10.
% The arguments must all be integers.
%
-% \StopEventually
+% \MaybeStop
%
% First, we define three counters. The first two are defined
% as raw TeX counters since multiplication and division must be
diff --git a/macros/latex/base/graphpap.ins b/macros/latex/base/graphpap.ins
index 65156ad917..d82cbd6670 100644
--- a/macros/latex/base/graphpap.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/graphpap.pdf b/macros/latex/base/graphpap.pdf
index fe611d36d6..2caa28232f 100644
--- a/macros/latex/base/graphpap.pdf
+++ b/macros/latex/base/graphpap.pdf
Binary files differ
diff --git a/macros/latex/base/idx.tex b/macros/latex/base/idx.tex
index 8257396f81..bc0dd71021 100644
--- a/macros/latex/base/idx.tex
+++ b/macros/latex/base/idx.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ifthen.dtx b/macros/latex/base/ifthen.dtx
index acb5cf1967..d36042990d 100644
--- a/macros/latex/base/ifthen.dtx
+++ b/macros/latex/base/ifthen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -42,7 +42,7 @@
%<driver>\ProvidesFile{ifthen.drv}
% \fi
% \ProvidesFile{ifthen.dtx}
- [2020/11/24 v1.1c Standard LaTeX ifthen package (DPC)]
+ [2022/04/13 v1.1d Standard LaTeX ifthen package (DPC)]
%
% \iffalse
%<*driver>
@@ -80,6 +80,7 @@
% \changes{v1.0k}{1995/04/25}{Fix `driver' docstrip guards.}
% \changes{v1.0n}{1997/11/03}{Documentation fix.}
% \changes{v1.0o}{1998/08/17}{Documentation fix.}
+% \changes{v1.1d}{2022/04/13}{Make reference command locally expandable.}
%
% \section{Introduction}
%
@@ -164,7 +165,7 @@
% With \meta{test} as above, repeatedly executes \meta{while clause}
% while the test remains true.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Implementation}
%
@@ -263,6 +264,14 @@
% macros expanding to |T| or |F| has been completely replaced by a
% simpler system using |\iftrue|, which furthermore allows lazy
% evaluation on the second pass.
+% With a LaTeX 2022/06/01 we have to ensure that |\pageref| is expandable.
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2022/06/01}
+ {\def\TE@ref@exp{\let\pageref\@kernel@pageref@exp
+ \let\ref\@kernel@ref@exp}}
+ {\def\TE@ref@exp{\def\@setref##1##2##3{%
+ \ifx##1\relax\z@\else\expandafter##2##1\fi}}}
+% \end{macrocode}
% \begin{macrocode}
\long\def\ifthenelse#1{%
% \end{macrocode}
@@ -295,11 +304,11 @@
% \changes{v1.0l}{1996/03/22}
% {Use \cs{begingroup} not \cs{bgroup} for latex/2105}
% \changes{v1.1a}{1999/01/07}{\cs{isundefined} added for /2824}
+% \changes{v1.1d}{2022/04/13}{changed method to make \cs{pageref} and \cs{ref} locally expandable.}
% \begin{macrocode}
\begingroup
\let\protect\@unexpandable@protect
- \def\@setref##1##2##3{%
- \ifx##1\relax\z@\else\expandafter##2##1\fi}%
+ \TE@ref@exp
\def\value##1{\the\csname c@##1\endcsname}%
\let\equal\TE@equal \let\(\TE@lparen \let\)\TE@rparen
\let\isodd\TE@odd \let\lengthtest\TE@length
diff --git a/macros/latex/base/ifthen.ins b/macros/latex/base/ifthen.ins
index 42e1d3f5d9..88047e94f0 100644
--- a/macros/latex/base/ifthen.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/ifthen.pdf b/macros/latex/base/ifthen.pdf
index d080e4da13..fe7349820d 100644
--- a/macros/latex/base/ifthen.pdf
+++ b/macros/latex/base/ifthen.pdf
Binary files differ
diff --git a/macros/latex/base/inputenc.dtx b/macros/latex/base/inputenc.dtx
index 1b8691d30f..e056f8ffd7 100644
--- a/macros/latex/base/inputenc.dtx
+++ b/macros/latex/base/inputenc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -379,8 +379,8 @@
% as these commands haven't been available in \textsf{inputenc} distributed
% with older releases of \LaTeX{}.
%
-
-% \StopEventually{}
+%
+% \MaybeStop{}
%
% \section{Announcing the files}
%
diff --git a/macros/latex/base/inputenc.ins b/macros/latex/base/inputenc.ins
index 920a585bff..adacf9efce 100644
--- a/macros/latex/base/inputenc.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/inputenc.pdf b/macros/latex/base/inputenc.pdf
index af91c17d2a..274e06fbc0 100644
--- a/macros/latex/base/inputenc.pdf
+++ b/macros/latex/base/inputenc.pdf
Binary files differ
diff --git a/macros/latex/base/lablst.tex b/macros/latex/base/lablst.tex
index da2d7dbceb..0821b0e4f0 100644
--- a/macros/latex/base/lablst.tex
+++ b/macros/latex/base/lablst.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/lamport-manual.pdf b/macros/latex/base/lamport-manual.pdf
index 2cbc7f31f4..a39bb10333 100644
--- a/macros/latex/base/lamport-manual.pdf
+++ b/macros/latex/base/lamport-manual.pdf
Binary files differ
diff --git a/macros/latex/base/latex209.dtx b/macros/latex/base/latex209.dtx
index bf92f8ef1e..768f7237a5 100644
--- a/macros/latex/base/latex209.dtx
+++ b/macros/latex/base/latex209.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -166,7 +166,7 @@
% \changes{v0.11}{1994/01/21}{Split package into head and tail.}
% \changes{v0.23}{1994/05/11}{Added bezier option.}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Driver}
%
diff --git a/macros/latex/base/latex209.ins b/macros/latex/base/latex209.ins
index 33ebc2488c..f530347a3c 100644
--- a/macros/latex/base/latex209.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/latexchanges.pdf b/macros/latex/base/latexchanges.pdf
deleted file mode 100644
index f606f9abb5..0000000000
--- a/macros/latex/base/latexchanges.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/base/latexchanges.tex b/macros/latex/base/latexchanges.tex
deleted file mode 100644
index 933ea48ddb..0000000000
--- a/macros/latex/base/latexchanges.tex
+++ /dev/null
@@ -1,1025 +0,0 @@
-% \iffalse meta-comment
-%
-% Copyright (C) 2015-2021
-% 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
-% http://www.latex-project.org/lppl.txt
-% and version 1.3c or later is part of all distributions of LaTeX
-% version 2008 or later.
-%
-% This file 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: latexchanges.tex
-
-\NeedsTeXFormat{LaTeX2e}
-
-\documentclass{ltxguide}
-
-\usepackage[T1]{fontenc}
-
-\usepackage{url}
-
-\title{Changes to the \LaTeXe{} format}
-
-\author{\copyright~Copyright 2015--2021, \LaTeX\ Project Team.\\
- All rights reserved.}
-
-\date{2021-06-08}
-
-% a few commands from doc
-\newcommand\Lpack[1]{\mbox{\textsf{#1}}}
-\newcommand\DescribeMacro[1]{\texttt{\string#1}}
-
-\newcommand\pkg[1]{\texttt{#1}}
-\newcommand\cs[1]{\texttt{\textbackslash #1}}
-
-\makeatletter % -- provide command introduced in new release
- % so this typesets with an old format
-
-\DeclareTextCommandDefault\textcommabelow[1]
- {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex
- \hbox{\check@mathfonts\fontsize\ssf@size\z@
- \math@fontsfalse\selectfont,}\hidewidth}\egroup}
-
-\makeatother
-
-
-
-\ifx\href\undefined
- \newcommand\ghissue[1]{github #1}
- \newcommand\gnatsissue[1]{gnats #1}
- \newcommand\ltnewsissue[1]{\LaTeX\ News~#1}
- \newcommand\sxanswer[1]{\url{https://tex.stackexchange.com\slash a\slash #1}}
- \newcommand\sxquestion[1]{\url{https://tex.stackexchange.com\slash q\slash #1}}
-\else
- \newcommand\ghissue[1]{%
- \href{https://github.com/latex3/latex2e/issues/#1}{github #1}}
- \newcommand\gnatsissue[1]{%
- \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=latex/#1}{gnats #1}}
- \newcommand\ltnewsissue[1]{%
- \href{https://www.latex-project.org/news/latex2e-news/ltnews#1.pdf}{\LaTeX\ News~#1}}
- \newcommand\sxanswer[1]{%
- \url{https://tex.stackexchange.com/a/#1}}
- \newcommand\sxquestion[1]{%
- \url{https://tex.stackexchange.com/q/#1}}
-\fi
-
-
-\setcounter{tocdepth}{1} % don't show subsections
-
-
-\begin{document}
-
-\maketitle
-
-\begin{abstract}
-This document describes changes that were made to the
-\LaTeX\ format since the 2014-05-01 \LaTeX\ releases.
-
-
-As announced in \ltnewsissue{22}, the 2015 \LaTeX{} release adopts a new
-policy. Improvements and bug fixes will be made to the format sources,
-with the \Lpack{latexrelease} package being available to revert
-changes to use definitions from an earlier format.
-
-As a summary of changes for a main release will always be available in
-\LaTeX\ News, detailed changes are not repeated in this document,
-but changes in any patch releases will be listed in more
-detail here.
-
-More detailed change logs are available as
-\texttt{changes.txt} in the base distribution, and full code
- differences may be browsed via the code repository on GitHub
-see for example
-\url{https://github.com/latex3/latex2e/commits/master}.
-\end{abstract}
-
-\tableofcontents
-
-\newpage
-
-%\section{Introduction}
-
-\section{Changes introduced in 2021-06-01 patch~1}
-
-A further refinement to the handling of ``raw'' option lists added
-in the last release, see \ghissue{508}.
-
-Fixes an issue with rollback when \pkg{latexrelease} is loaded by some
-other package (as done for \texttt{platex} (\ghissue{577}).
-
-First aid for \pkg{ulem} and \pkg{varwidth} got added to help them
-along until they get corrected. \pkg{ulem} has a problem with the
-improved definition of \cs{hspace} and \pkg{varwidth} chokes on a
-newly introduced glue item in vertical lists, which is needed for
-paragraph hook handling (\ghissue{583}).
-
-
-\section{Changes introduced in 2021-06-01}
-
-The focus of this release is to provide further important building
-blocks for the future production of reliable tagged PDF output. Many
-other improvements have been made. Please see \ltnewsissue{33} for an
-overview of the new features and the change log in
-\texttt{changes.txt} for a more detailed list of individual changes.
-
-\section{Changes introduced in 2020-10-01 patch~4}
-
-This patch fixed two bugs in the hook management: if debugging for the
-L3 programming layer was turned on it reported inconsistent use of
-local/global variables. This was a spurious warning but nevertheless
-disconcerting (\ghissue{463}). The other bug was more serious, in some
-situations a wrong value of \verb=\CurrentFile= inside of file-related hooks
-could lead to errors (\ghissue{464}).
-
-We also added the documentation file \texttt{usrguide3.pdf} which
-will become the main home for documenting new features of \LaTeX. At
-this point in time it covers the \Lpack{xparse} functionality that has
-been added to the kernel.
-
-\section{Changes introduced in 2020-10-01 patch~3}
-
-This patch fixed some rollback issues that prevented successful
-rollback to other release levels in some cases. It also fixed an issue
-with file hooks involving files with explicit paths (\ghissue{422}).
-
-One important change was to handle hook declarations done in the
-document preamble in a special way, e.g., those done with
-\verb=\AtBeginDocument=. They are now always executed last and are not
-subject to the normal code sorting for hooks, because they are nearly always
-needed to overwrite earlier settings made in packages.
-
-Finally, the NFSS series handling was slightly changed to
-automatically drop surplus ``\texttt{m}''s from series specifications
-when needed (and warn about them when encountered), e.g.,
-``\texttt{mc}'' automatically becomes ``\texttt{c}'' which is the
-official NFSS name for a \emph{medium compact} series (\ghissue{453}).
-This was done to improve the fix in 2020-02-02 PL~5.
-
-\section{Changes introduced in 2020-10-01 patch~2}
-
-This patch fixed the passing of options to packages and classes when
-they are stored in a special place (denoted by \verb=\input@path=)
-instead of their normal location (\ghissue{414}). In that case the
-options got lost.
-
-\section{Changes introduced in 2020-10-01 patch~1}
-
-This patch fixed a file handling issue: to allow for spaces in file
-names quotes were used but this upsets Bib\TeX{} (\ghissue{400}). In
-addition, two rollback issues got corrected.
-
-\section{Changes introduced in 2020-10-01}
-
-Major enhancements in this release include pre-loading of the
-\Lpack{xparse} package for producing document-level commands with more
-complicated argument signatures and the new hook management system for
-\LaTeX{} documented in \texttt{lthooks-doc.pdf},
-\texttt{ltfilehook-doc.pdf} and \texttt{ltshipout-doc.pdf}.
-
-In addition there have been many smaller fixes and enhancements.
-Please see \ltnewsissue{32} for an overview of the new features and
-the change log in \texttt{changes.txt} for a more detailed list of
-individual changes.
-
-\section{Changes introduced in 2020-02-02 patch~5}
-
-The patch~4 dropped a bit too much in certain situations, e.g., it
-changed a series value of \texttt{semibold} (as used by
-\texttt{autoinst}) to \texttt{seibold}, rendering it useless. So we
-now only correct series values if they are a member of the
-following list: \texttt{ulm}, \texttt{elm}, \texttt{lm}, \texttt{slm},
-\texttt{mm}, \texttt{sbm}, \texttt{bm}, \texttt{ebm}, \texttt{ubm},
-\texttt{muc}, \texttt{mec}, \texttt{mc}, \texttt{msc}, \texttt{msx},
-\texttt{mx}, \texttt{mex} or \texttt{mux}. Here we assume that people
-intended to follow the NFSS convention but somehow got it wrong. So we
-drop one ``m'' and also add a warning that the
-\verb=\DeclareFontShape= declaration in question should be updated
-(\ghissue{293}).
-
-
-\section{Changes introduced in 2020-02-02 patch~4}
-
-In some cases the \texttt{filecontents} environment was opening the
-file for writing without quoting it, so that files with spaces failed
-(\ghissue{284}).
-
-Ensure that \verb=\DeclareFontShape= drops surplus ``m'' in situations
-where an \texttt{.fd} incorrectly specifies \texttt{mc} instead of
-\texttt{c}, etc.\ (\ghissue{289}).
-
-\section{Changes introduced in 2020-02-02 patch~3}
-
-Support the following scenario:
-\begin{verbatim}
-\fontfamily{ptm}\selectfont text \textbf{\sffamily bold sans text}
-\end{verbatim}
-The default bold series for \texttt{ptm} is \texttt{b} so
-\verb=\textbf= switches to that. The \verb=\sffamily= then tried to
-find \texttt{OT1/cmss/b/n} which doesn't exist instead of first
-altering the series default to use \texttt{bx} as needed for Computer
-Modern Sans Serif. This has now been corrected (\ghissue{277}).
-
-
-\section{Changes introduced in 2020-02-02 patch~2}
-
-Correct \verb=\capitalacute=, etc.\ so that they work in
-\texttt{tabbing} (\ghissue{271}). Provide \verb=\@defaultfamilyhook= to
-support CJK packages (\ghissue{269}). Provide a list of \texttt{fontenc}
-loads with their options in \verb=\@fontenc@load@list= so that Babel
-can determine the right \verb=\latinencoding= value (\ghissue{273}).
-
-
-\section{Changes introduced in 2020-02-02 patch~1}
-
-Fixed a misspelled command name that caused trouble (\ghissue{264}). Make
-\texttt{textcomp} package issue only info messages about glyph
-substitutions (\ghissue{262}) and warn if it attempts to run in an old format (\ghissue{260}).
-
-\section{Changes introduced in 2020-02-02}
-
-Major enhancements in this release include pre-loading \Lpack{expl3}
-to improve startup times, especially with Lua\TeX\ and Xe\TeX, and
-extra features in the font selection mechanism. Please see
-\ltnewsissue{31} for an overview of the new features and the change
-log in \texttt{changes.txt} for a more detailed list of individual
-changes.
-
-
-\section{Changes introduced in 2019-10-01 patch~3}
-
-Further fixes to the handling of filenames, expand macros (and
-\verb|\jobname| \emph{before} removing \verb|"|, not after.
-
-\section{Changes introduced in 2019-10-01 patch~2}
-
-Further fixes to the handling of filenames, \ghissue{204}: non-ascii
-filenames and filenames with spaces and multiple dots should now work
-in \verb|\includegraphics|.
-
-Reclassify some luatex callbacks. Other fixes for Issues raised:
-\ghissue{198}, \ghissue{201}, \ghissue{202}, \ghissue{205}.
-
-\section{Changes introduced in 2019-10-01 patch~1}
-
-Adjustments to \verb|\set@curr@file|, and \verb|\@extracolsep|.
-
-Added missing \verb=\else= branch in \texttt{nfssfont} so that
-\verb=\action= is executed if provided.
-
-\section{Changes introduced in 2019-10-01}
-
-Introduced \LaTeX\texttt{-dev} formats for pre testing future \LaTeX{}
-releases. Now there's a \texttt{latex-base-dev} package on CTAN which
-contains a pre-release of the \LaTeXe{} kernel and both \TeX Live and
-MiK\TeX{} include the standard \LaTeX{} executables (\texttt{pdflatex},
-\texttt{lualatex}, etc.) with \texttt{-dev} appended, which use the
-pre-release format.
-
-The handling of Unicode characters was improved by making them safe
-inside \verb|\ref|s and \verb|\label|s, by using \verb|\ifincsname|
-to make these characters safe in these contexts (\ghissue{95}).
-
-In line with the better handling of Unicode characters, file names
-can now contain any Unicode character plus spaces, as these cases
-are now correctly handled by the kernel.
-
-An optional argument was added to the \texttt{filecontents} environment,
-to which a comma-separated list of options can be given. The options
-include \texttt{overwrite} (or \texttt{force}), \texttt{nosearch}, and
-\texttt{noheader} (which has the same effect as the starred form of the
-environment). The environment is now allowed anywhere in the document.
-
-A plethora of \LaTeX{} commands was made robust so that fewer
-\verb|\protect| are needed when using some commands in moving arguments.
-There are a few border cases where it's tricker to make the command
-robust or where it's not worth it to do so, but most reasonable use
-cases are covered. The most notable change was \verb|\begin| and
-\verb|\end|, which are now robust and won't break when used in moving
-arguments.
-
-An extra \verb|\hskip 1sp| was added to \verb|c|-column table cells to
-protect against the presence of an \verb|\unskip| in the table cell
-(\ghissue{102}).
-
-\texttt{U+012F} which is ``i with ogonek'' should produce an
-``i'' and not a ``dotless i''. This has been corrected
-(\ghissue{122}).
-
-The Unicode slots \texttt{27E8} and \texttt{27E9} have been mapped to
-\verb|textlangle| and \verb|textrangle| which is the recommended mapping
-(\ghissue{110}).
-
-Basic ligatures (ff, fi, fl, ffi, ffl, ft, st) can now be input as a
-single unicode character in pdf\TeX, which is useful when copy-pasting
-(\ghissue{154}).
-
-\verb|\InputIfFileExists{foo}{\input{bar}}{}|
-did not load the files \texttt{foo.tex} and \texttt{bar.tex} but
-would load \texttt{bar.tex} twice. This has been corrected (\ghissue{109}).
-
-The \textsf{fncylab} and \textsf{varioref} packages changed \LaTeX's internal
-counter prefix commands \verb|p@...| so that they would take the counter
-value as an argument instead of just acting as a prefix to them. These
-packages also provided the \verb|\labelformat| macro to change the prefix
-macro and \verb|\Ref| so that using counters defined that way in the
-beginning of sentences would have the proper capitalization. These features
-were added to the \LaTeXe{} kernel.
-
-The kernel now says ``Trying to load\ldots''
-instead of ``Try loading \ldots'' in one of its informal
-messages to match style of similar messages (\ghissue{107}).
-
-\verb|\DeclareErrorFont| would change the font size to 10\,pt which, when
-used in the wrong place, would make incorrect font settings in the document.
-This has now been fixed (\gnatsissue{4399}).
-
-The default action of the file \texttt{nfssfont.tex} was set to produce a
-font table, so that one can simply hit enter instead of having to write
-\verb=\table\bye=.
-
-The \LaTeX{} kernel now provides dummy (empty) definitions for the two
-commands \verb|\conditionally@traceoff| and
-\verb|\conditionally@traceon| from the \texttt{trace} package so they
-can be used by package developers without worrying about them being
-defined or not (\ghissue{164}).
-
-
-
-
-
-\section{Changes introduced in 2018-12-01}
-
-Further additions to the characters supported by default in UTF-8.
-The commands \verb|\guillemetleft| and \verb|\guillemetright| are
-provided as alias for the names based on the Adobe font names
-(\ghissue{65}).
-
-The use of potrusion in tables of contents is suppressed by default,
-see \sxquestion{172785}.
-
-The handling of visible space in verbatim was adjusted for
-\ghissue{69} and \ghissue{70}.
-
-Spaces are removed from the argument passed to BiBTeX, \ghissue{88}.
-
-New commands \verb|\Hwithstroke| and \verb|\hwithstroke| added to T1 encoding support.
-
-The internal box structure for floats is adjusted to preserve box
-levels of split hyperlinks, avoiding a fatal pdftex error. \ghissue{94}.
-
-
-\section{Changes introduced in 2018-04-01 patch~5}
-Improved support for non ASCII filenames on the command line on
-filesystems using legacy encodings.
-
-Adjusted the new package rollback code so that some edge cases where rollback
-can not be guaranteed become a warning not an error.
-
-\section{Changes introduced in 2018-04-01 patch~4}
-No changes to the format, but \texttt{docstrip} adjusted so that non-ASCII
-\texttt{.ins} files work with the new UTF-8 defaults.
-
-\section{Changes introduced in 2018-04-01 patch~3}
-Additional adjustments for GitHub issues \ghissue{34} and \ghissue{38}, adjustment to the
-location of some documentation files, such as \texttt{source2e.tex} to
-be installed in the documentation sources not the default \TeX\ input
-tree.
-
-
-\section{Changes introduced in 2018-04-01 patch~2}
-Additional adjustments for GitHub issues \ghissue{32} and \ghissue{33}.
-
-\section{Changes introduced in 2018-04-01 patch~1}
-Make \verb|\UseRawInputEncoding| and \Lpack{latexrelease} reset \verb|\inputencodingname|
-when disabling the UTF-8 input handling.
-
-\section{Changes introduced in 2018-04-01}
-Further details of changes at this release are given in \ltnewsissue{28}, but in brief
-the main changes are as listed below.
-
-The default encoding for files has been changed to UTF-8.
-
-A new possibility to refer to older versions of packages has been added.
-
-New commands previously available in \Lpack{remreset} and
-\Lpack{chngcntr} packages for controlling counters have been added.
-
-The definition of \verb|\@ifundefined| has been refined to use the e-\TeX \verb|\ifcsname|
-primitive when available, and to avoid defining the command being tested to be \verb|\relax|
-in the case that it was previously undefined.
-
-\section{Changes introduced in 2017-04-15}
-Optionally, \LaTeX{} format and package dates may use ISO style dates with
-\texttt{-} rather than \texttt{/}.
-
-For Unicode \TeX{}s, made further adjustments to the composite accent
-code in \texttt{tuenc.def}, and further updates tracking changes in
-Lua\TeX, now at 1.04.
-
-Previously defining an encoding-specific composite with an undeclared
-accent (or an accent declared later) gave no error, but did nothing useful.
-\LaTeX\ will now detect this and give the accent command a default definition
-as an error, allowing the declared composite to work as intended.
-
-The definition of \verb|\-| is adjusted to match the comments in
-\gnatsissue{3855} to accommodate non standard settings of \verb|\hyphenchar|.
-
-In parboxes and similar settings, \verb|\lineskiplimit| is now
-reset (to the existing default value, \verb|\normallineskiplimit|).
-See \sxanswer{359934}.
-
- The code for \verb|\newpage| has been adjusted to add a test on the value of
-\verb|\prevdepth| so that the depth of the last line is preserved in
-forced page breaks.
-
-\section{Changes introduced in 2017/01/01 patch~3}
-Emergency patch to correct a typo in a change introduced in patch~2.
-
-\section{Changes introduced in 2017/01/01 patch~2}
-More adjustments for TU encoding, allowing for characters missing in
-common system fonts. Additional \texttt{fd} files
-for Latin Modern variants are included in the documented sources.
-
-\section{Changes introduced in 2017/01/01 patch~1}
-Fixes to TU encoding definitions for Lua\TeX\ and Xe\TeX.
-
-\section{Changes introduced in 2017/01/01}
-
-A new test is added during format making that e\TeX\ extensions are
-available. As noted in \LaTeX\ news, e\TeX\ will now be required to
-build \LaTeX.
-
-Further updates tracking changes for Lua\TeX~1.0.
-
-The definition of \verb|\showhyphens| is changed in formats built
-with Xe\TeX, as the original version, inherited from plain \TeX\ does
-not work with Xe-\TeX.
-
-Changes to the default encoding used by Lua\TeX\ and Xe\TeX\ formats to
-be TU (Unicode) rather than OT1 (7 bit legacy \TeX\ encoding).
-
-\section{Changes introduced in 2016/03/31 patch~3}
-Fixes to \verb|\newinsert| and \verb|\extrafloats|.
-
-\section{Changes introduced in 2016/03/31 patch~2}
-Adjustments to \verb|\c{g}| in OT1 encoding.
-
-\section{Changes introduced in 2016/03/31 patch~1}
-Adjust the upper limit for Character Class allocation in Xe-\TeX\ to
-4096 to match a change in Xe-\TeX.
-
-\section{Changes introduced in 2016/03/31}
-Modify picture mode as suggested in latex/4452 to avoid leaders of
-almost zero length.
-
-Modify the checks in \verb|\DeclareMathSymbol| and related commands
-so that they do not give errors with new Lua\TeX\ releases.
-
-\section{Changes introduced in 2016/02/01}
-Adjustments to Lua\TeX\ support to match changes to the Lua\TeX\ engine,
-and to the character class allocation in Xe\TeX.
-
-Load Unicode data from new generic \texttt{unicode-data} distribution.
-
-\section{Changes introduced in 2015/10/01 patch~2}
-
-This release fixes the behavior of the allocation mechanism if the switch
-from the standard to extended pool takes place within a group.
-
-\section{Changes introduced in 2015/10/01 patch~1}
-This release allows \Lpack{latexrelease} to revert the
-Lua\TeX{}-specific
-changes, in particular fixing an incorrect date in part of the mechanism and
-adding a method to disable callback management entirely.
-
-\section{Changes introduced in \LaTeX\ 2015/10/01}
-
-\subsection{LuaTeX allocation}
-Almost all changes at this release relate to incorporating allocation macros for luatex into the format
-as done for etex and xetex in 2015/01/01. For details see |ltluatex.dtx| or \ltnewsissue{22}.
-|ltluatex.dtx| now forms a new chapter (N) in the documented sources, |source2e.tex|.
-
-
-\subsection{Increased number of floats}
-The default float list has been increased from 18 to 52 registers if
-e\TeX\ is available.
-The list can be increased further using |\extrafloats| however this
-default allocation uses classic registers below 256 so the registers are
-also available for |\newinsert| as described below.
-
-\subsection{Improved \texttt{\textbackslash newinsert}}
-The command |\newinsert| has been extended to take registers from the lists of free float
-registers once the classic register allocation is used up. This should make it highly unlikely
-to get ``no room'' errors on register allocation assuming the format is used with
-an e-\TeX\ based \TeX\ engine.
-
-\subsection{New accent, \texttt{\textbackslash textcommabelow} (pr/4414)}
-The command |\textcommabelow| has been added. This is mainly intended for Romanian letters
-\textcommabelow{S}\,\textcommabelow{s}\,\textcommabelow{T}\,\textcommabelow{t}.
-
-\subsection{Unicode 8}
-The file |unicode-letters.def| used to initialize character data in
-Unicode \TeX\ variants has been regenerated from data files updated
-to Unicode~8.
-
-\section{Changes introduced in 2015/01/01 patch~2}
-There were no changes to the format at this release, but the sources were fixed to fix bug latex/4434
-affecting bottom float positioning if the \Lpack{latexrelease} package was used.
-
-\section{Changes introduced in 2015/01/01 patch~1}
-This release re-introduces the ``Patch Level'' scheme for identifying
-releases between main ``dated'' releases. Early \LaTeXe\ releases
-included a mechanism whereby updates could be provided by a
-\emph{patch
- file}. This was mainly intended to allow updates to be made without
-downloading the full sources again, which was an important
-consideration with download speeds and costs at the time.
-
-The new mechanism incorporates any changes directly into the sources,
-but having the patch level identified in the banner allows the
-\LaTeX\ release to be identified, even if (as in this case) most of the
-changes do not affect the format but affect other base packages such
-as \Lpack{latexrelease} and \Lpack{inputenc}. The patch level is shown
-in the banner at the start of the job, but does not affect the date
-handling of the |\IncludeInRelease| mechanism.
-
-Apart from re-arranging the version banner, the only change in the
-format is that |\newtoks| was accidentally defined twice, using the
-old and new allocation scheme described in Section \ref{e@alloc}.
-The old definition is now only in the \Lpack{latexrelease} package,
-for use when emulating old formats.
-
-
-
-
-\section
-[Changes between \LaTeX\ releases 2014/05/01 and 2015/01/01]
-{Changes between \LaTeX\ releases 2014/05/01 and 2015/01/01\footnote{Much of this text
-is taken from \Lpack{fixltx2e} package which was formerly used to make such changes available separately.}}
-
-\subsection{Support for \LaTeX\ version changes}
-\DescribeMacro{\includeInRelease}\arg{date}\oarg{date}\arg{label}\arg{message}\arg{code}
-
-\smallskip
-
-The |\includeInRelease| command has been added to support backward and
-forward compatibility for the \LaTeX\ format. It supports the
-declaration of conditional code that can be loaded based on options
-given to the \Lpack{latexrelease} package. Its use is described in
-detail in the \Lpack{latexrelease} package documentation.
-
-\subsection{New Allocation Code\label{e@alloc}}
-Previously |\newcount| and related commands were based on classic TeX
-and only allocated in the range 0--255. This was extended (in
-different ways) for e-\TeX\ in the |etex| package and in the
-|xelatex.ini| and |lualatex.ini| files used in those formats. Related
-to this the number of boxes allocated to store floats was
-limited. This was extended to a certain extent in the |morefloats|
-package (by Don Hosek and H.-Martin Muench) but the new allocation
-incorporates float allocation directly and supports much larger float
-lists using the extended registers.
-
-The new code allocates registers in the full extended range (
-$2^{15}-1$ for etex and xelatex, $2^{16}-1$ for lualatex.
-In addition a new command |\extrafloats| is provided.
-
-\DescribeMacro{\extrafloats}\arg{number}
-\smallskip
-
-This allocates additional registers for the \LaTeX\ float system to
-hold figures and tables etc. Similar functionality has been
-available via the \Lpack{morefloats} package but this is a different
-implementation using extended e-\TeX\ registers when available so
-allows many more registers to be reserved for floats as they are
-allocated from a pool of 32 or 64 thousand rather than 256 registers,
-depending on the engine in use.
-
-\DescribeMacro{\newmarks}\arg{command}
-\smallskip
-
-e-\TeX\ only, previously available via the \Lpack{etex} package.
-Allocates commands to use the extended e-\TeX\ mark mechanism.
-
-\DescribeMacro{\newXeTeXintercharclass}\arg{command}
-\smallskip
-
-Xe-\TeX\ only, previously in the Xe-\LaTeX\ format, but added via
-|xelatex.ini| not part of the core release.
-Allocates commands to use the Xe-\TeX\ character class mechanism.
-
-
-\subsection{e-\TeX\ tracing if available}
-|\loggingall| (Usually used via |\tracingall|) is extended to enable
-additional e-\TeX\ tracing if e-\TeX\ is available. (|\tracingall|
-extension has been available as part of the |etex| package previously).
-
-Also based on code from the |etex| package, a command |\tracingnone|
-is added to reverse the effects of |\tracingall| and turn off all primitive
-\TeX\ tracing. A new command |\hideoutput| has been added which resets the
-tracing parameters set by |\showoutput|.
-
-
-
-
-\subsection{\texttt{\textbackslash textsubscript} not defined in
- latex.ltx (pr/3492)}
-
-\begin{verbatim}
->>Number: 3492
->>Category: latex
->>Synopsis: \textsubscript not defined in latex.ltx
->>Arrival-Date: Tue Jan 14 23:01:00 CET 2003
->>Originator: Ionel Mugurel Ciobica
-
-I use \textsubscript much more often than \textsuperscript, and
-\textsubscript it is not defined in latex.ltx. Could you please
-consider including the definition of \textsubscript in the latex.ltx
-for the next versions of LaTeX. Thank you.
-\end{verbatim}
-
-\subsection{\texttt{\textbackslash @} discards spaces when moving
- (pr/3039)}
-
-\begin{verbatim}
->>Number: 3039
->>Category: latex
->>Synopsis: \@ discards spaces when moving
->>Arrival-Date: Sat May 22 09:01:06 1999
->>Originator: Donald Arseneau
->>Description:
-The \@ command expands to \spacefactor\@m in auxiliary files,
-which then ignores following spaces when it is reprocessed.
-\end{verbatim}
-
-\subsection{1-col fig can come before earlier 2-col fig
- (pr/2346)}
-
-\begin{verbatim}
->>Number: 2346
->>Category: latex
->>Synopsis: 2-col: 1-col fig can come before earlier 2-col fig
->>Arrival-Date: Wed Dec 18 15:41:07 1996
->>Originator: bil kleb
->>Description:
-as documented in Lamport's book, p. 198, concerning figure
-placement, "a figure will not be printed before an earlier
-figure, and a table will not be printed before an earlier
-table." however, there is a footnote stating, "However,
-in two-column page style, a single-column figure can come before
-an earlier double-column figure, and vice versa."
-
-This twocolumn behavior is undesirable---at least by me and
-most professional organizations i publish in. ed snyzter developed
-a hack fix for 2.09 several years ago which links the two
-counters, but i have not run across a similar "fix" for 2e...
-\end{verbatim}
-
-Originally fixed in package \Lpack{fix2col} which was merged into
-this package. Documentation and code from this package have been
-merged into this file.
-
-\subsubsection{Notes on the Implementation Strategy}
-
-The standard output routine maintains two lists of floats that have
-been `deferred' for later consideration. One list for single column
-floats, and one for double column floats (which are always
-immediately put onto their deferred list). This mechanism means
-that \LaTeX\ `knows' which type of float is contained in each box
-by the list that it is processing, but having two lists means
-that there is no mechanism for preserving the order between the
-floats in each list.
-
-The solution to this problem consists of two small changes to
-the output routine.
-
-Firstly, abandon the `double column float list' |\@dbldeferlist|
-and change every command where it is used so that instead the
-same |\@deferlist| is used as for single column floats.
-That one change ensures that double and single column floats
-stay in the same sequence, but as \LaTeX\ no longer `knows'
-whether a float is double or single column, it will happily
-insert a double float into a single column, overprinting the
-other column, or the margin.
-
-The second change is to provide an alternative mechanism for
-recording the two column floats. \LaTeX\ already has a compact
-mechanism for recording float information, an integer count register
-assigned to each float records information about the `type' of float
-`figure', `table' and the position information `htp' etc.
-
-The type information is stored in the `high' bits, one bit position
-(above `32') allocated to each float type. The `low' bits store
-information about the allowed positions, one bit each allocated for
-|h t b p|. In the \LaTeX2.09 system, the bit corresponding to `16'
-formed a `boundary' between these two sets of information, and it
-was never actually used by the system. Ed Sznyter's
-\Lpack{fixfloats} package not unreasonably used this position to
-store the double column information, setting the bit for double
-column floats. Then at each point in the output routine at which a
-float is committed to a certain region, an additional check must be
-made to check that the float is (or is not) double column. If it
-spans the wrong number of columns it is deferred rather than being
-added.
-
-Unfortunately the bit `16' is not available in \LaTeXe. It is used
-to encode the extra float position possibility `|!|' that was added
-in that system. It would be possible to use position `32' and to
-move the flags for `table', `figure',\ldots\ up one position, to
-start at 64, but this would mean that in principle one less float
-type would be supported, and more importantly is likely to break
-any other packages that assume anything about the output routine
-internals. So here I instead use another mechanism for flagging
-double column floats: By default all floats have depth 0pt.
-This package arranges that double column ones have depth 1sp.
-This information may then be used in the same manner as in
-the \Lpack{fixfloats} package, to defer any floats that are not of
-the correct column spanning type.
-
-
-
-\subsection{Infinite glue found (pr/4023 and pr/2346)}
-
-The fix for pr/2346 did not work as intended when used in conjunction
-with |\enlargethispage| as the latter introduced an infinite negative
-glue at the bottom of the page. That in turn make a |\vsplit|
-operation to get at the column marks invalid.
-
-\subsection{Wrong header for twocolumn (pr/2613)}
-
-\begin{verbatim}
->>Number: 2613
->>Category: latex
->>Synopsis: wrong headline for twocolumn
->>Arrival-Date: Mon Sep 22 16:41:09 1997
->>Originator: Daniel Reischert
->>Description:
-When setting the document in two columns
-the headline shows the top mark of the second column,
-but it should show the top mark of the first column.
-\end{verbatim}
-
-Originally fixed in package \Lpack{fix2col} which was merged into
-this package. Documentation and code from this package have been
-merged into this file.
-
-\subsubsection{Notes on the Implementation Strategy}
-
-The standard \LaTeX\ twocolumn system works internally by making
-each column a separate `page' that is passed independently to \TeX's
-page breaker. (Unlike say the \Lpack{multicol} package, where all
-columns are gathered together and then split into columns later,
-using |\vsplit|.) This means that the primitive \TeX\ marks that are
-normally used for header information, are globally reset after the
-first column. By default \LaTeX\ does nothing about this.
-A good solution is provided by Piet van Oostrum (building on earlier
-work of Joe Pallas) in his \Lpack{fixmarks} package.
-
-After the first column box has been collected the mark information
-for that box is saved, so that any |\firstmark| can be
-`artificially' used to set the page-level marks after the second
-column has been collected. (The second column |\firstmark| is not
-normally required.) Unfortunately \TeX\ does not provide a direct
-way of knowing if any marks are in the page, |\firstmark| always has a
-value from previous pages, even if there is no mark in this page.
-The solution is to make a copy of the box and then |\vsplit| it
-so that any marks show up as |\splitfirstmark|.
-
-The use of |\vsplit| does mean that the output routine will globally
-change the value of |\splitfirstmark| and
-|\splitbotmark|. The \Lpack{fixmarks} package goes to some trouble
-to save and restore these values so that the output routine does
-\emph{not} change the values. This part of \Lpack{fixmarks} is not
-copied here as it is quite costly (having to be run on every page) and
-there is no reason why anyone writing code using |\vsplit| should
-allow the output routine to be triggered before the split marks have
-been accessed.
-
-
-
-\subsection{\texttt{\textbackslash setlength} produces error if
- used with registers like \texttt{\textbackslash dimen0} (pr/3066)}
-
-\begin{verbatim}
->>Number: 3066
->>Category: latex
->>Synopsis: \setlength{\dimen0}{10pt}
->>Arrival-Date: Tue Jul 6 15:01:06 1999
->>Originator: Heiko Oberdiek
->>Description:
-The current implementation of \setlength causes an error,
-because the length specification isn't terminated properly.
-More safe:
-\def\setlength#1#2{#1=#2\relax}
-\end{verbatim}
-
-\subsection{Fewer fragile commands}
-
-\begin{verbatim}
->>Number: 3816
->>Category: latex
->>Synopsis: Argument of \@sect has an extra }.
->>Arrival-Date: Sat Oct 22 23:11:01 +0200 2005
->>Originator: Susanne Wunsch
-
-Use of a \raisebox in \section{} produces the error message
-mentioned in the subject.
-
-PR latex/1738 described a similar problem, which has been solved
-10 years ago. Protecting the \raisebox with \protect solved my
-problem as well, but wouldn't it make sense to have a similar fix
-as in the PR?
-
-It is particularly confusing, that an unprotected \raisebox in a
-\section*-environment works fine, while in a \section-environment
-produces error.
-\end{verbatim}
-
-While not technically a bug, in this day and age there are few
-reasons why commands taking optional arguments should not be robust.
-
-\subsubsection{Notes on the implementation strategy}
-
-Rather than changing the kernel macros to be robust, we have decided
-to add the macro \DescribeMacro{\MakeRobust}|\MakeRobust| in
-\Lpack{fixltx2e} so that users can easily turn fragile macros into
-robust ones. A macro |\foo| is made robust by doing the simple
-|\MakeRobust{\foo}|. \Lpack{fixltx2e} makes the following kernel
-macros robust: |\(|, |\)|, |\[|, |\]|,
- |\makebox|, |\savebox|,
-|\framebox|, |\parbox|, |\rule| and |\raisebox|.
-
-\ldots TODO \ldots fleqn vesion of |\[\]|
-
-\subsection{\texttt{\textbackslash addpenalty} ruins flush-bottom (pr/3073)}
-
-\begin{verbatim}
->>Number: 3073
->>Category: latex
->>Synopsis: \addpenalty ruins flush-bottom
->>Arrival-Date: Sat Jul 17 05:11:05 1999
->>Originator: Donald Arseneau
->>Description:
-Just to keep in mind for further development eh?
-A page break at an \addpenalty after \vspace does *not*
-give a flush-bottom page. (The intent of \addpenalty is
-apparently just to preserve the flush bottom by putting
-the breakpoint `above' the skip.)
-\end{verbatim}
-
-\subsection{Within counters only reset next level down (pr4393)}
-
-This is actually implicitly documented behavior in the \LaTeX{}
-Manual that states that |\stepcounter| resets all counters marked
-``within''. However it means that if, for example, theorems are
-numbered within sections and you start a new chapter in a book, the
-section counter is reset to zero but the theorem counter is not
-until the first section appears. Thus a theorem directly within the
-chapter body (without a new section) would show an incremented
-number relative to the last theorem of the previous chapter.
-
-
-For this reason we are now resetting all levels of within in one go
-even if that means that some of these resets may happen several times
-unnecessarily.
-
-
-\subsection{Check the optional arguments of floats}
-
-By default LaTeX silently ignores unknown letters in the optional
-arguments of floats. |\begin{figure}[tB]| the |B| is ignored so it
-acts like |\begin{figure}[t]| However |\begin{figure}[B]| does
-\emph{not} act like |\begin{figure}[]| as the check for an empty
-argument, or unsupplied argument, is earlier. |[]| causes the
-default float placement to be used, but |[B]| means that \emph{no}
-float area is allowed and so the float will not be placed until the
-next |\clearpage| or end of document, no warning is given.
-
-This package adds a check on each letter, and if it not one of
-|!tbhp| then an error is given and the code acts as if |p| had been
-used, so that the float may be placed somewhere.
-
-\subsection{\texttt{\textbackslash DeclareMathSizes} only take pts.
- (pr/3693)}
-
-\begin{verbatim}
->>Number: 3693
->>Category: latex
->>Synopsis: \DeclareMathSizes only take pts.
->>Arrival-Date: Fri Jun 11 16:21:00 CEST 2004
->>Originator: Morten Hoegholm
-
-The last three arguments of \@DeclareMathSizes cannot take a dimension
-as argument, making it inconsistent with the rest of the font changing
-commands and itself, as the second argument can take a dimension
-specification.
-\end{verbatim}
-
-\subsection{No hyphenation in first word after float environment (pr/3498)}
-
-\begin{verbatim}
->>Number: 3498
->>Category: latex
->>Synopsis: No hyphenation in first word after float environment
->>Arrival-Date: Thu Jan 30 13:21:00 CET 2003
->>Originator: Harald Harders
-
-If a float environment (figure, table) is written within a paragraph,
-the first word after the environment is not hyphenated.
-\end{verbatim}
-
-\subsection{\texttt{\textbackslash fnsymbol} should use text symbols
- (pr/3400)}
-
-\begin{verbatim}
->>Number: 3400
->>Category: latex
->>Synopsis: \fnsymbol should use text symbols if possible
->>Arrival-Date: Fri Jan 04 20:41:00 CET 2002
->>Originator: Walter Schmidt
-
-The \fnsymbol command can be used in both text and math
-mode. The symbols produced are, however, always taken from
-the math fonts. As a result, they may not match the text
-fonts, even if the symbols are actually available, for
-instance from the TS1 encoding. Since \fnsymbol is
-primarily used for footnotes in text, this should be fixed,
-IMO.
-\end{verbatim}
-
-
-
-
-
-\subsection{\texttt{\textbackslash footnotemark}[x] crashes with fixltx2e.sty
- (pr/3752)}
-
-\begin{verbatim}
->>Number: 3752
->>Category: tools
->>Synopsis: feature \footnotemark[x] crashes with fixltx2e.sty
->>Arrival-Date: Fri Dec 17 10:11:00 +0100 2004
->>Originator: Stefan Pofahl
-
- If I use /fnsymbol together with fixltx2e.sty I can not use
- optional parameter [num]
- \footnotemark[1] is not showing the mark number 1 but
- the mark \value{footnote}.
-\end{verbatim}
-This bug was related to pr/3400, where |\@fnsymbol| was made robust.
-
-\subsubsection{Notes on the implementation strategy}
-
-Pr/3400 made |\@fnsymbol| decide between text-mode and math-mode,
-which requires a certain level of robustness somewhere as the
-decision between text and math must be made at typesetting time and
-not when inside |\protected@edef| or similar commands. One way of
-dealing with this is to make sure the value seen by |\@fnsymbol| is
-a fully expanded number, which could be handled by code such as
-\begin{verbatim}
-\def\fnsymbol#1{\expandafter\@fnsymbol
- \expandafter{\the\csname c@#1\endcsname}}
-\end{verbatim}
-This would be a good solution if everybody used the high level
-commands only by writing code like |\fnsymbol{footnote}|. Unfortunately
-many classes (including the standard classes) and packages use the
-internal forms directly as in |\@fnsymbol\c@footnote| so the easy
-solution of changing |\fnsymbol| would break code that had worked for
-the past 20~years.
-
-Therefore the implementation here makes |\@fnsymbol| itself a
-non-robust command again and instead uses a new robust command
-\DescribeMacro{\TextOrMath}|\TextOrMath|, which will take care of
-typesetting either the math or the text symbol. In order to do so,
-we face an age old problem and unsolvable problem in \TeX: A
-reliable test for math mode that doesn't destroy
-kerning. Fortunately this problem can be solved when using e\TeX\ so
-if you use this as engine for your \LaTeX\ format, as recommended by
-the \LaTeX\ Project, you will get a fully functioning |\TextOrMath|
-command with no side effects. If you use regular \TeX\ as engine for
-your \LaTeX\ format then we have to choose between the lesser of two
-evils: 1)~breaking ligatures and preventing kerning or 2)~face the
-risk of choosing text-mode at the beginning of an alignment cell,
-which was supposed to be math-mode. We have decided upon 1) as is
-customary for regular robust commands in \LaTeX.
-
-
-
-\end{document}
diff --git a/macros/latex/base/latexrelease.dtx b/macros/latex/base/latexrelease.dtx
index 7d2290f4d8..294007553d 100644
--- a/macros/latex/base/latexrelease.dtx
+++ b/macros/latex/base/latexrelease.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -40,7 +40,7 @@
%<*latexrelease>
% \fi
% \ProvidesFile{latexrelease.dtx}
- [2021/04/29 v1.0n LaTeX release emulation and tests
+ [2022/02/28 v1.0o LaTeX release emulation and tests
(including releases up to \latexreleaseversion)]
% \iffalse
%</latexrelease>
@@ -471,7 +471,7 @@
%
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Implementation}
%
@@ -487,10 +487,9 @@
% \begin{macro}{\sourceLaTeXdate}
% \changes{v1.0l}{2021/01/23}{\cs{sourceLaTeXdate} added}
% \changes{v1.0m}{2021/03/18}{Define \cs{sourceLaTeXdate} conditionally}
-% Store the original \LaTeX{} format version
-% as a number in the format |YYYYMMDD|. This macro has to
-% be defined conditionally, so that it isn't changed in case
-% \file{latexrelease.sty} is loaded twice (for tests), but it
+% Store the original \LaTeX{} format version as a number in the format
+% |YYYYMMDD |. This macro has to be defined conditionally, so that it
+% isn't changed in case \file{latexrelease.sty} is reloaded, but it
% can't be defined in the kernel only, otherwise
% \file{latexrelease.sty} wouldn't work in older \LaTeX{} due
% to the missing macro.
@@ -619,7 +618,7 @@ of this package available from CTAN}
\catcode58=11 % :
\catcode126=10 % ~
\catcode32=09 % <space>
- \xdef\latexrelease@postexpl{\unexpanded{%
+ \xdef\latexrelease@postltexpl{\unexpanded{%
%<@@=latexrelease>
% \end{macrocode}
%
@@ -691,14 +690,13 @@ of this package available from CTAN}
% store each in \cs{l_@@_restores_tl}, save a copy, and redefine each.
% \begin{macrocode}
\tl_clear_new:N \l_@@_restores_tl
-\cs_gset:Npn \@@_tmp:w #1 #2
+\cs_gset:Npn \@@_redefines:w #1 #2
{
- \quark_if_recursion_tail_stop_do:Nn #1
- { \cs_undefine:N \@@_tmp:w }
+ \quark_if_recursion_tail_stop:N #1
\tl_put_right:Nn \l_@@_restores_tl {#1}
\cs_set_eq:cN { @@_ \cs_to_str:N #1 } #1
\cs_set_eq:NN #1 #2
- \@@_tmp:w
+ \@@_redefines:w
}
% \end{macrocode}
%
@@ -731,12 +729,12 @@ of this package available from CTAN}
% \end{description}
% And here we go:
% \begin{macrocode}
-\@@_tmp:w
+\@@_redefines:w
\__kernel_chk_if_free_cs:N \use_none:n
\e@alloc \@@_e@alloc:NnnnnN
\__kernel_msg_error:nnx \use_none:nnn
\msg_new:nnnn \msg_gset:nnnn
- \NewDocumentCommand \DeclareDocumentCommand
+ % \NewDocumentCommand \DeclareDocumentCommand % after ltcmd.dtx
\newcommand \@@_declare_command:w
% \end{macrocode}
% Temp addition \ldots
@@ -752,6 +750,22 @@ of this package available from CTAN}
\msg_redirect_name:nnn { hooks } { exists } { none }
% \end{macrocode}
%
+% Now a one-off for |ltcmd.dtx|: we need to make \cs{NewDocumentCommand}
+% not complain on an already existing command, but it has to be done
+% after \cs{NewDocumentCommand} is defined, so this is separate from
+% the \cs{latexrelease@postltexpl} actions above:
+% \changes{v1.0o}{2022/02/28}
+% {Move most redefinitions to right after ltexpl.dtx}
+% \begin{macrocode}
+\cs_gset_protected:Npn \latexrelease@postltcmd
+ {
+ \@@_redefines:w
+ \NewDocumentCommand \DeclareDocumentCommand
+ \q_recursion_tail \q_recursion_tail
+ \q_recursion_stop
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
}}%
\endgroup
diff --git a/macros/latex/base/latexrelease.ins b/macros/latex/base/latexrelease.ins
index 0b65114a2f..b5e97a9479 100644
--- a/macros/latex/base/latexrelease.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
@@ -93,7 +93,7 @@ extension .ins) which are part of the distribution.
\from{ltluatex.dtx} {latexrelease}% empty
\from{ltexpl.dtx} {latexrelease}% empty
\from{ltdefns.dtx} {latexrelease}%
- \from{ltcmd.dtx} {latexrelease}%
+ \from{ltcmd.dtx} {latexrelease}% L3 layer module
\from{lthooks.dtx} {latexrelease}% L3 layer module
\from{ltcmdhooks.dtx} {latexrelease}% L3 layer module
\from{ltalloc.dtx} {latexrelease}% empty
@@ -101,6 +101,7 @@ extension .ins) which are part of the distribution.
\from{lterror.dtx} {latexrelease}% empty
\from{ltpar.dtx} {latexrelease}% empty
\from{ltpara.dtx} {latexrelease}% empty
+ \from{ltmeta.dtx} {latexrelease}% L3 layer module
\from{ltspace.dtx} {latexrelease}%
\from{ltlogos.dtx} {latexrelease}% L3 layer module
\from{ltfiles.dtx} {latexrelease}%
@@ -128,6 +129,7 @@ extension .ins) which are part of the distribution.
\from{ltfloat.dtx} {latexrelease}%
\from{ltidxglo.dtx} {latexrelease}% empty
\from{ltbibl.dtx} {latexrelease}% empty
+ \from{ltmarks.dtx} {latexrelease}% L3 layer module
\from{ltpage.dtx} {latexrelease}% empty
\from{ltclass.dtx} {latexrelease,tracerollback}%
\from{ltfilehook.dtx} {latexrelease}% empty % L3 layer module
diff --git a/macros/latex/base/latexrelease.pdf b/macros/latex/base/latexrelease.pdf
index df5139abe0..8724a65da4 100644
--- a/macros/latex/base/latexrelease.pdf
+++ b/macros/latex/base/latexrelease.pdf
Binary files differ
diff --git a/macros/latex/base/latexsym.dtx b/macros/latex/base/latexsym.dtx
index 7a97aa4318..62fb097c0d 100644
--- a/macros/latex/base/latexsym.dtx
+++ b/macros/latex/base/latexsym.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -84,7 +84,7 @@
% |\unrhd|~$\unrhd$
% \end{quote}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The \dst{} modules}
%
diff --git a/macros/latex/base/latexsym.ins b/macros/latex/base/latexsym.ins
index 902bbfc9e8..468afddd67 100644
--- a/macros/latex/base/latexsym.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/latexsym.pdf b/macros/latex/base/latexsym.pdf
index d9711ea51c..91835c6c0a 100644
--- a/macros/latex/base/latexsym.pdf
+++ b/macros/latex/base/latexsym.pdf
Binary files differ
diff --git a/macros/latex/base/lb2.err b/macros/latex/base/lb2.err
index 53148e2833..46958ae3a5 100644
--- a/macros/latex/base/lb2.err
+++ b/macros/latex/base/lb2.err
@@ -419,7 +419,7 @@ Ende der Wettbewerbsperiode & Gewinner \\[4pt]
2006/04 & Jens Mandavid & 121 \\
2006/10 & Ralf Heckmann & 61 \\
2008/04 & --- \\
-\ldots & Termin einer weiteren Verlosung offen
+\ldots & keine weitere Verlosung
%2008/10 & \\
\end{tabular}
\end{center}
diff --git a/macros/latex/base/lb2.pdf b/macros/latex/base/lb2.pdf
index 695121e993..b192987d57 100644
--- a/macros/latex/base/lb2.pdf
+++ b/macros/latex/base/lb2.pdf
Binary files differ
diff --git a/macros/latex/base/letter.dtx b/macros/latex/base/letter.dtx
index 6beee81735..4052c260c8 100644
--- a/macros/latex/base/letter.dtx
+++ b/macros/latex/base/letter.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -45,7 +45,7 @@
%<*driver>
\ProvidesFile{letter.drv}
%</driver>
- [2021/03/05 v1.3c
+ [2021/12/07 v1.3c
%<+letter> Standard LaTeX document class]
% \end{macrocode}
%
@@ -178,7 +178,7 @@
% \maketitle
% \tableofcontents
%
-% \StopEventually
+% \MaybeStop{}
%
%
% \section{Initial Code}
diff --git a/macros/latex/base/letter.ins b/macros/latex/base/letter.ins
index 44777393eb..c078dc59ce 100644
--- a/macros/latex/base/letter.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/letter.pdf b/macros/latex/base/letter.pdf
index 8e9974e32f..cc9cc990ff 100644
--- a/macros/latex/base/letter.pdf
+++ b/macros/latex/base/letter.pdf
Binary files differ
diff --git a/macros/latex/base/lgc2.err b/macros/latex/base/lgc2.err
index 96fd378fe9..45b440a7f4 100644
--- a/macros/latex/base/lgc2.err
+++ b/macros/latex/base/lgc2.err
@@ -10,7 +10,7 @@
%
% The current version of this file can be found at:
%
-% https://www.latex-project.org/guides/books.html
+% https://www.latex-project.org/help/books
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -351,12 +351,12 @@ You can customize this list to only show errata related to the printing
you own by changing the configuration in the file \texttt{\jobname.cfg}.
\begin{center}
- \Large \bfseries To Err is Human --- Bug Contest
+ \Large \bfseries To Err is Human --- Bug Contest (no longer open)
\end{center}
Any mistake found and reported is a gain for all readers of our book.
-For this reason Addison-Wesley and the authors offer a prize (for 6
-periods) to the eligible person who finds the largest
+For this reason Addison-Wesley and the authors offer a prize to the
+eligible person who finds the largest
number of bugs during that period (in case of a draw a random choice
will be made between all those with the largest number of findings).
A person can receive at most one prize, ever; errors found by any of
@@ -378,7 +378,7 @@ Good luck!
Contest period ends & Winner \\[4pt]
2008/05 & Milan Vujtek & 16 suggestions\\
2010/05 & & \\
-\ldots
+\ldots & contest no longer open
\end{tabular}
\end{center}
\end{list}
diff --git a/macros/latex/base/lgc2.pdf b/macros/latex/base/lgc2.pdf
index aa4dfc4d15..885057e32b 100644
--- a/macros/latex/base/lgc2.pdf
+++ b/macros/latex/base/lgc2.pdf
Binary files differ
diff --git a/macros/latex/base/lppl.pdf b/macros/latex/base/lppl.pdf
index 0ba46a391a..1e9a4ce081 100644
--- a/macros/latex/base/lppl.pdf
+++ b/macros/latex/base/lppl.pdf
Binary files differ
diff --git a/macros/latex/base/ltalloc.dtx b/macros/latex/base/ltalloc.dtx
index 59c492836f..4530d4b07b 100644
--- a/macros/latex/base/ltalloc.dtx
+++ b/macros/latex/base/ltalloc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -62,7 +62,7 @@
%
% This section deals with counter and other variable allocation.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
diff --git a/macros/latex/base/ltbibl.dtx b/macros/latex/base/ltbibl.dtx
index cda0fa160a..4c219657b8 100644
--- a/macros/latex/base/ltbibl.dtx
+++ b/macros/latex/base/ltbibl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltbibl.dtx}
- [2020/12/10 v1.1s LaTeX Kernel (Bibliography)]
+ [2022/03/10 v1.1t LaTeX Kernel (Bibliography)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltbibl.dtx}
@@ -106,7 +106,7 @@
% |\nocite{*}| is special: it tells \BibTeX{} to put the whole of a
% collection of references into the bibliography.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v1.0a}{1994/03/31}{Initial version of ltidxbib.dtx,
@@ -199,8 +199,41 @@
% \begin{macro}{\cite}
% \changes{v1.1j}{1995/10/16}{(DPC) Make robust}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\cite}{check for blank}%
\DeclareRobustCommand\cite{%
- \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
+ \@ifnextchar [{\@tempswatrue\@citex@checkblank}{\@tempswafalse\@citex@checkblank[]}}
+% \end{macrocode}
+% Due to the way \cs{@for} as used in \cs{@citex} behaves an empty
+% argument to \cs{cite} did not produce any warning for a missing
+% citation. So we now inject a command before calling \cs{@citex} that
+% does the checking for us. It is not done in \cs{@citex} directly,
+% because that command is altered by a number of packages/classes
+% and this way it is more likely that the check survives.
+% \changes{v1.1t}{2022/03/10}{Ensure that an empty argument generates
+% a warning (gh/790)}
+% \begin{macrocode}
+\def\@citex@checkblank[#1]#2{%
+ \IfBlankTF {#2}%
+ {\@citex[#1]{\space}}%
+ {\@citex[#1]{#2}}%
+}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\cite}{check for blank}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\cite{%
+%<latexrelease> \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
+%<latexrelease>\let\@citex@checkblank\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/base/ltboxes.dtx b/macros/latex/base/ltboxes.dtx
index 92d9228a8a..43db541b98 100644
--- a/macros/latex/base/ltboxes.dtx
+++ b/macros/latex/base/ltboxes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltboxes.dtx}
- [2021/10/14 v1.4c LaTeX Kernel (Box Commands)]
+ [2022/01/31 v1.4c LaTeX Kernel (Box Commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltboxes.dtx}
@@ -212,7 +212,7 @@
% \meta{height} \& \meta{depth} = actual height and depth of box in new
% position.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v0.1e}{1994/03/02}{Remove need for drv file}
% \changes{v0.1e}{1994/03/02}{Add 2ekernel module}
@@ -987,7 +987,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\parboxrestore}
+% \begin{macro}{\@parboxrestore}
% Restore various paragraph parameters, and also |\\|.
% \begin{macrocode}
\def\@parboxrestore{\@arrayparboxrestore\let\\\@normalcr}
diff --git a/macros/latex/base/ltclass.dtx b/macros/latex/base/ltclass.dtx
index 06e0f437af..20e59353ec 100644
--- a/macros/latex/base/ltclass.dtx
+++ b/macros/latex/base/ltclass.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltclass.dtx}
- [2021/08/25 v1.4f LaTeX Kernel (Class & Package Interface)]
+ [2022/04/16 v1.5b LaTeX Kernel (Class & Package Interface)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltclass.dtx}
@@ -338,7 +338,7 @@
% or the old name \cs{@ifpackagelater}.
% \DescribeMacro\IfFormatAtLeastTF
-% To test the format date use
+% To test the format date use
% \begin{quote}
% |\IfFormatAtLeastTF{|\meta{date}|}{|^^A
% \meta{true}|}{|\meta{false}|}|
@@ -434,7 +434,7 @@
% standard (and other non-standard) distributions can put informative
% strings in this argument.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Implementation}
%
@@ -1833,7 +1833,7 @@
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
-%
+%
% \begin{macrocode}
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\RequirePackageWithOptions}{Unused options issue}%
@@ -2175,27 +2175,22 @@
% \begin{macrocode}
\@ifl@aded\@currext\@currname
% \end{macrocode}
-% If the package is already loaded, check that there were no option
-% clashes:
-% \changes{v1.1b}{1998/05/07}
-% {Modify help message for latex/2805}
-% \begin{macrocode}
- {\@if@ptions\@currext{\@currname}{#2}{}%
- {\@latex@error
- {Option clash for \@cls@pkg\space \@currname}%
- {The package \@currname\space has already been loaded
- with options:\MessageBreak
- \space\space[\@ptionlist{\@currname.\@currext}]\MessageBreak
- There has now been an attempt to load it
- with options\MessageBreak
- \space\space[#2]\MessageBreak
- Adding the global options:\MessageBreak
- \space\space
- \@ptionlist{\@currname.\@currext},#2\MessageBreak
- to your \noexpand\documentclass declaration may fix this.%
- \MessageBreak
- Try typing \space <return> \space to proceed.}}%
- \@firstofone}%
+% \changes{v1.5b}{2022/03/18}{Switch to \cs{ProcessKeyOptions}}
+% In the current preferred approach, a key family name will exist for
+% processing using \pkg{ltkeys}. In that case, we replace the previous
+% package options with the new ones, then call the key handler.
+% Otherwise, we use the more classical clash handler.
+% \begin{macrocode}
+ {%
+ \@ifundefined{opt@fam@\@currname.\@currext}
+ {\@onefilewithoptions@clashchk{#2}}
+ {%
+ \@namedef{opt@\@currname.\@currext}{#2}%
+ \expandafter\expandafter\expandafter\ProcessKeyOptions
+ \expandafter\expandafter\expandafter
+ [\csname opt@fam@\@currname.\@currext\endcsname]%
+ }%
+ }%
{\makeatletter
% \end{macrocode}
% The next line seems to be necessary for 2.09 compatibility (the
@@ -2298,6 +2293,34 @@
\@reset@ptions}
% \end{macrocode}
%
+% \begin{macro}{\@onefilewithoptions@clashchk}
+% If the package is already loaded, check that there were no option
+% clashes.
+% \changes{v1.1b}{1998/05/07}
+% {Modify help message for latex/2805}
+% \changes{v1.5a}{2021/11/30}
+% {Separated out from \cs{@onefilewithoptions}}
+% \begin{macrocode}
+\def\@onefilewithoptions@clashchk#1{%
+ \@if@ptions\@currext{\@currname}{#1}{}%
+ {\@latex@error
+ {Option clash for \@cls@pkg\space \@currname}%
+ {The package \@currname\space has already been loaded
+ with options:\MessageBreak
+ \space\space[\@ptionlist{\@currname.\@currext}]\MessageBreak
+ There has now been an attempt to load it
+ with options\MessageBreak
+ \space\space[#1]\MessageBreak
+ Adding the global options:\MessageBreak
+ \space\space
+ \@ptionlist{\@currname.\@currext},#1\MessageBreak
+ to your \noexpand\documentclass declaration may fix this.%
+ \MessageBreak
+ Try typing \space <return> \space to proceed.}}%
+ \@firstofone}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
\let\@currpkg@reqd\@empty
% \end{macrocode}
@@ -2622,7 +2645,7 @@
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
-%
+%
% \begin{macrocode}
\@onlypreamble\AtBeginDocument
% \end{macrocode}
@@ -2826,7 +2849,7 @@
% \end{macrocode}
%
% \changes{v1.3m}{2020-08-08}{define \cs{q@curr@file} directly as the
-% quotes have already been removed (gh/220)}
+% quotes have already been removed (gh/220)}
% \begin{macrocode}
\gdef\filec@ntents#1{%
\set@curr@file{\filec@ntents@checkdir#1}%
diff --git a/macros/latex/base/ltcmd.dtx b/macros/latex/base/ltcmd.dtx
index d2f184c3f7..59aa5bf475 100644
--- a/macros/latex/base/ltcmd.dtx
+++ b/macros/latex/base/ltcmd.dtx
@@ -2,7 +2,7 @@
%
% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
% Copyright (C) 2004-2008 Frank Mittelbach, The LaTeX3 Project
-% Copyright (C) 2009-2021
+% Copyright (C) 2009-2022
% 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.0i}
-\def\ltcmddate{2021-12-02}
+\def\ltcmdversion{v1.0l}
+\def\ltcmddate{2022-03-18}
% \end{macrocode}
%
%<*driver>
@@ -67,7 +67,7 @@
% documentation for \pkg{ltcmd} is provided as part of \texttt{usrguide3}. Here,
% additional material aimed at programmers is provided
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<@@=cmd>
@@ -2352,15 +2352,17 @@
% Now just print everything in the required format. The auxiliary
% \cs{@@_split_signature:n} stores a ready-to-print token list in
% \cs{l_@@_tmpa_tl}, so we ust use that here:
+% \changes{v1.0j}{2021/13/31}
+% {Make \cs{ShowCommand} stop for interaction}
% \begin{macrocode}
\cs_new_protected:Npn \@@_show_command_aux:nNNn #1 #2 #3 #4
{
\@@_split_signature:n {#4}
- \iow_term:x
+ \tl_show:x
{
- > ~ \token_to_str:N #2 = #1: \iow_newline:
+ \token_to_str:N #2 = #1: \iow_newline:
\tl_use:N \l_@@_tmpa_tl
- -> \cs_replacement_spec:N #3 .
+ -> \cs_replacement_spec:N #3
}
}
% \end{macrocode}
@@ -2371,15 +2373,17 @@
% |\ShowCommand\foo| is used (if |foo| is an environment), we show
% |\endfoo| as well, and when |\ShowCommand\endfoo| is used, change
% that to |\ShowCommand\foo| and do the same.
+% \changes{v1.0j}{2021/13/31}
+% {Make \cs{ShowCommand} stop for interaction}
% \begin{macrocode}
\cs_new_protected:Npn \@@_show_environment:N #1
{
\exp_after:wN \@@_show_environment:Nnnw #1 \q_@@
- \iow_term:x
+ \tl_show:x
{
- > ~ \token_to_str:N \end { \cs_to_str:N #1 } : \iow_newline:
+ \token_to_str:N \end { \cs_to_str:N #1 } : \iow_newline:
-> \exp_args:Nc \cs_replacement_spec:N
- { environment~ \cs_to_str:N #1 ~end~aux~ } .
+ { environment~ \cs_to_str:N #1 ~end~aux~ }
}
}
\cs_new_protected:Npn \@@_show_environment:Nnnw #1 #2 #3 #4 \q_@@
@@ -4093,8 +4097,10 @@
% \begin{macro}{\@@_cmd_type_cases:Nnnnn}
% \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:Nnnnn} for
+% \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)}
% \begin{macro}{\@@_cmd_if_xparse_aux:N}
%
% To determine whether the command is an \pkg{xparse} command check
@@ -4113,22 +4119,14 @@
\exp_args:Ne \str_case_e:nnF
{
\exp_args:Nf \tl_if_empty:nT { \cs_argument_spec:N #1 }
- {
- \token_if_macro:NT #1
- {
- \exp_after:wN \exp_after:wN
- \exp_after:wN \token_to_str:N
- \exp_after:wN \use_i_delimit_by_q_stop:nw
- #1 \scan_stop: \q_stop
- }
- }
+ { \exp_not:N \exp_not:n { \exp_not:e { \tl_head:N #1 } } }
}
{
- { \token_to_str:N \@@_start:nNNnnn } {#2}
- { \token_to_str:N \@@_start_expandable:nNNNNn } {#3}
- { \token_to_str:N \@@_start_env:nnnnn } {#4}
+ { \exp_not:N \@@_start:nNNnnn } {#2}
+ { \exp_not:N \@@_start_expandable:nNNNNn } {#3}
+ { \exp_not:N \@@_start_env:nnnnn } {#4}
{
- \exp_after:wN \token_to_str:N
+ \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:
@@ -4712,6 +4710,27 @@
% \end{macrocode}
% \end{macro}
%
+%
+% \begin{macro}{\IfBlankT, \IfBlankF, \IfBlankTF}
+% Another simple re-naming.
+% \changes{v1.0k}{2022/02/19}{Added \cs{IfBlankTF} and friends}
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\IfBlankTF}{Testing~for~empty~or~blank}%
+\cs_new_eq:NN \IfBlankF \tl_if_blank:nF
+\cs_new_eq:NN \IfBlankT \tl_if_blank:nT
+\cs_new_eq:NN \IfBlankTF \tl_if_blank:nTF
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2021/11/15}%
+%<latexrelease> {\IfBlankTF}{Testing~for~empty~or~blank}%
+%<latexrelease>\cs_undefine:N \IfBlankF
+%<latexrelease>\cs_undefine:N \IfBlankT
+%<latexrelease>\cs_undefine:N \IfBlankTF
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\ProcessedArgument}
% Processed arguments are returned using this name, which is reserved
% here although the definition will change.
@@ -4775,7 +4794,14 @@
%<latexrelease>
%<latexrelease>\EndModuleRelease
\ExplSyntaxOff
-%<latexrelease>\@ifundefined{ExplSyntaxOff}{}{\latexrelease@postexpl}
+% \end{macrocode}
+%
+% Now in |latexrelease| mode, redefine \cs{NewDocumentCommand} to not
+% complain on commands already defined.
+% \changes{v1.0k}{2022-02-28}
+% {Move latexrelease redefinitions from ltcmd.dtx}
+% \begin{macrocode}
+%<latexrelease>\@ifundefined{ExplSyntaxOff}{}{\latexrelease@postltcmd}
%<latexrelease>\catcode`\^^@=\@latexrelease@catcode@null\relax
%</2ekernel|latexrelease>
% \end{macrocode}
diff --git a/macros/latex/base/ltcmdhooks-code.pdf b/macros/latex/base/ltcmdhooks-code.pdf
index b93038c6ac..70eeb7d4dd 100644
--- a/macros/latex/base/ltcmdhooks-code.pdf
+++ b/macros/latex/base/ltcmdhooks-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltcmdhooks-doc.pdf b/macros/latex/base/ltcmdhooks-doc.pdf
index 92c73d0ab1..9bb4f81784 100644
--- a/macros/latex/base/ltcmdhooks-doc.pdf
+++ b/macros/latex/base/ltcmdhooks-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltcmdhooks-doc.tex b/macros/latex/base/ltcmdhooks-doc.tex
index 1efae5f229..acbb880e72 100644
--- a/macros/latex/base/ltcmdhooks-doc.tex
+++ b/macros/latex/base/ltcmdhooks-doc.tex
@@ -2,5 +2,6 @@
\AtBeginDocument{\OnlyDescription
\let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
}
\input{ltcmdhooks.dtx}
diff --git a/macros/latex/base/ltcmdhooks.dtx b/macros/latex/base/ltcmdhooks.dtx
index 208f7c3d22..ccb5a35a71 100644
--- a/macros/latex/base/ltcmdhooks.dtx
+++ b/macros/latex/base/ltcmdhooks.dtx
@@ -270,7 +270,7 @@
% If you do that then both hooks automatically work and are patched
% into the right places.
%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
%
%
@@ -1394,3 +1394,12 @@
%
% \Finale
%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+
+^^A Needed for emacs
+^^A
+^^A Local Variables:
+^^A mode: latex
+^^A coding: utf-8-unix
+^^A End:
diff --git a/macros/latex/base/ltcntrl.dtx b/macros/latex/base/ltcntrl.dtx
index d65b3aee94..5ebe256c75 100644
--- a/macros/latex/base/ltcntrl.dtx
+++ b/macros/latex/base/ltcntrl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -66,7 +66,7 @@
% This section defines a number of control structure macros, such as
% while-loops and for-loops.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{oldcomments}
% \begin{macrocode}
diff --git a/macros/latex/base/ltcounts.dtx b/macros/latex/base/ltcounts.dtx
index 39fb47728d..ffe2265ac3 100644
--- a/macros/latex/base/ltcounts.dtx
+++ b/macros/latex/base/ltcounts.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -124,7 +124,7 @@
% the default for \meta{format}.
% Star form omits redefining the print representation.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
diff --git a/macros/latex/base/ltdefns.dtx b/macros/latex/base/ltdefns.dtx
index 6c85ca915d..9e1fa43fad 100644
--- a/macros/latex/base/ltdefns.dtx
+++ b/macros/latex/base/ltdefns.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
- [2021/06/04 v1.5q LaTeX Kernel (definition commands)]
+ [2022/05/13 v1.5q LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
@@ -96,7 +96,7 @@
%
% This section contains commands used in defining other macros.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
@@ -1601,7 +1601,7 @@
% But more importantly, the most common use case of copying a command is to
% redefine it later, while preserving the old definition, as in:
% \begin{verbatim}
-% \ProvideComandCopy \A \B
+% \ProvideCommandCopy \A \B
% \renewcommand \B { ... \A ... }
% \end{verbatim}
% then, if \verb=\A= is already defined the first line is skipped, an in this
diff --git a/macros/latex/base/ltdirchk.dtx b/macros/latex/base/ltdirchk.dtx
index 36a1ca616c..16a2ed9e68 100644
--- a/macros/latex/base/ltdirchk.dtx
+++ b/macros/latex/base/ltdirchk.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -37,7 +37,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdirchk.dtx}
- [2021/01/15 v1.3a LaTeX Kernel (System Dependent Parts)]
+ [2021/12/11 v1.3a LaTeX Kernel (System Dependent Parts)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdirchk.dtx}
@@ -206,12 +206,26 @@
% error messages that use the default settings with a current version of
% \TeX, but this should not cause any confusion we hope.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Initialization}
% As this file is read at a very early stage, some definitions that
% are normally considered to be part of the format must be made here.
%
+% Most such definitions are repeated later in the ``right'' place,
+% usually (but not always) with different implementations. To be able
+% to spot this more easily if you look into the file
+% \texttt{latex.ltx} (which is stripped of comments) we add some
+% comment lines to that effect that survive the stripping process by
+% \texttt{docstrip}.
+% \changes{v1.3a}{2021/12/11}{Add comment lines into latex.ltx to
+% indicate temp definitions that are later overwritten (gh/725)}
+% \begin{macrocode}
+%<*dircheck>
+%% ---- START temporary definitions for bootstrapping; later overwritten ----
+%</dircheck>
+% \end{macrocode}
+%
% \subsection{INITEX}
% \changes{v0.2i}{1994/01/25}
% {Protect against looping on \cs{@@input} and \cs{@@end}.}
@@ -1007,6 +1021,7 @@
% \end{macro}
%
% \begin{macrocode}
+%% ---- END temporary definitions for bootstrapping ----
%</dircheck>
% \end{macrocode}
%
diff --git a/macros/latex/base/lterror.dtx b/macros/latex/base/lterror.dtx
index 10d93a1dbd..b302a9a74c 100644
--- a/macros/latex/base/lterror.dtx
+++ b/macros/latex/base/lterror.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -91,7 +91,7 @@
%
% This section defines \LaTeX's error commands.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \begin{macrocode}
diff --git a/macros/latex/base/ltexpl.dtx b/macros/latex/base/ltexpl.dtx
index 021edc644c..aab189bec2 100644
--- a/macros/latex/base/ltexpl.dtx
+++ b/macros/latex/base/ltexpl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2021
+% Copyright (C) 2019-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltexpl.dtx}
- [2021/04/20 v1.3c LaTeX Kernel (expl3-dependent code)]
+ [2022/02/28 v1.3f LaTeX Kernel (expl3-dependent code)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltexpl.dtx}
@@ -57,7 +57,7 @@
%
% \section{\pkg{expl3}-dependent code}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v0.0}{2019-10-02}{Initial version}
%
@@ -288,6 +288,14 @@
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
+% Now in |latexrelease| mode, redefine a few commands to avoid ``already
+% defined'' errors.
+% \changes{v1.3f}{2022/02/28}
+% {Move latexrelease redefinitions from ltcmd.dtx}
+% \begin{macrocode}
+%<latexrelease>\@ifundefined{ExplSyntaxOff}{}{\latexrelease@postltexpl}
+% \end{macrocode}
+%
% \changes{v1.3a}{2021/01/21}
% {Move \pkg{xparse} rollback code to \texttt{ltcmd.dtx}}
%
@@ -387,4 +395,125 @@
% \end{macrocode}
%
%
+%
+%
+%
+%
+% \section{Document-level command names for \pkg{expl3} functions}
+%
+% Current home for L3 programing layer functions that we make
+% directly available at the document level. This section may need
+% to be moved later (after \cs{NewDocumentCommand} is defined in
+% case we want to use that in the setup).
+%
+%
+% \DescribeMacro\fpeval
+% The expandable command \cs{fpeval} takes as its argument a
+% floating point expression and produces a result using the normal
+% rules of mathematics. As this command is expandable it can be
+% used where \TeX{} requires a number and for example within a
+% low-level \cs{edef} operation to give a purely numerical
+% result. See \texttt{usrguide3} for further explanation.
+%
+% \DescribeMacro\inteval
+% \DescribeMacro\dimeval
+% \DescribeMacro\skipeval
+% The expandable command \cs{inteval} takes as its argument an
+% integer expression and produces a result using the normal rules
+% of mathematics. The operations recognised are |+|, |-|, |*| and
+% |/| plus parentheses. Division occurs with \emph{rounding}, and
+% ties are rounded away from zero. As this command is expandable it
+% can be used where \TeX{} requires a number and for example within
+% a low-level \cs{edef} operation to give a purely numerical
+% result. See \texttt{usrguide3} for further explanation.
+% \cs{dimeval} and \cs{skipeval} are similar, but generate fixed and
+% rubber length values, respectively.
+%
+%
+%
+% \begin{macro}{\fpeval,\inteval,\dimeval,\skipeval}
+% A document level wrapper around the code level function for
+% floating point calculations.
+% \changes{v1.3d}{2021/11/30}{Moved over from \texttt{xfp} package (gh/711)}
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\fpeval}{fp and int calculations}%
+\ExplSyntaxOn
+\cs_new_eq:NN \fpeval \fp_eval:n
+% \end{macrocode}
+% And a few more, this time wrappers around the e\TeX{} primitives.
+% \begin{macrocode}
+\cs_new_eq:NN \inteval \int_eval:n
+% \end{macrocode}
+%
+% \changes{v1.3d}{2021/12/07}{Added \cs{dimeval} and \cs{skipeval} (gh/711)}
+% \begin{macrocode}
+\cs_new_eq:NN \dimeval \dim_eval:n
+\cs_new_eq:NN \skipeval \skip_eval:n
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\fpeval}{fp and int calculations}%
+%<latexrelease>
+%<latexrelease>\let\fpeval\@undefined
+%<latexrelease>\let\inteval\@undefined
+%<latexrelease>\let\dimeval\@undefined
+%<latexrelease>\let\skipeval\@undefined
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+%
+% \DescribeMacro\UseName
+% \DescribeMacro\ExpandArgs
+% When declaring new commands with \cs{NewDocumentCommand} or
+% \cs{NewCommandCopy} or similar, it is sometimes necessary to
+% ``construct'' the csname. As a general mechanism the L3
+% programming layer has \cs{exp\_args:N...} for this, but there is
+% no mechanism for it if \cs{ExplSyntaxOn} is not active. We
+% therefore offer a few of these commands also with CamelCase names.
+%
+%
+% \begin{macro}{\UseName,\ExpandArgs}
+% A document wrapper for changing arguments to cs names for use
+% with \cs{NewDocumentCommand} and similar functions.
+%
+% \changes{v1.3d}{2021/12/28}{Added document level names for \cs{exp\_args:Nc} and the like (gh/735)}
+% \changes{v1.3e}{2022/01/06}{Adjust document level names for \cs{exp\_args:Nc} and the like (gh/735)}
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\ExpandArgs}{Some pre-expansion commands}%
+\ExplSyntaxOn
+\cs_new_eq:NN \UseName \use:c
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new:Npn \ExpandArgs #1
+ {
+ \cs_if_exist_use:cF { exp_args:N #1 }
+ { \msg_expandable_error:nnn { kernel } { unknown-arg-expansion } {#1} }
+ }
+\msg_new:nnn { kernel } { unknown-arg-expansion }
+ { Unknown~arg~expansion~"#1" }
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\ExpandArgs}{Some pre-expansion commands}%
+%<latexrelease>
+%<latexrelease>\let\UseName\@undefined
+%<latexrelease>\let\ExpandArgs\@undefined
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
% \Finale
diff --git a/macros/latex/base/ltfilehook-code.pdf b/macros/latex/base/ltfilehook-code.pdf
index 1f083a0c1d..1c2731b68b 100644
--- a/macros/latex/base/ltfilehook-code.pdf
+++ b/macros/latex/base/ltfilehook-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltfilehook-doc.pdf b/macros/latex/base/ltfilehook-doc.pdf
index 70c1bd459c..b41f835379 100644
--- a/macros/latex/base/ltfilehook-doc.pdf
+++ b/macros/latex/base/ltfilehook-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltfilehook-doc.tex b/macros/latex/base/ltfilehook-doc.tex
index 220de94188..c9287dfb2f 100644
--- a/macros/latex/base/ltfilehook-doc.tex
+++ b/macros/latex/base/ltfilehook-doc.tex
@@ -3,5 +3,6 @@
\AtBeginDocument{\OnlyDescription
% \let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
}
\input{ltfilehook.dtx}
diff --git a/macros/latex/base/ltfilehook.dtx b/macros/latex/base/ltfilehook.dtx
index 000f4d8c2a..8b5e982591 100644
--- a/macros/latex/base/ltfilehook.dtx
+++ b/macros/latex/base/ltfilehook.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2020-2021
+% Copyright (C) 2020-2022
% Frank Mittelbach, Phelype Oleinik & LaTeX Team
%
% This file is part of the LaTeX base system.
@@ -31,29 +31,14 @@
%%% From File: ltfilehook.dtx
%
% \begin{macrocode}
-\providecommand\ltfilehookversion{v1.0l}
-\providecommand\ltfilehookdate{2021/08/27}
+\providecommand\ltfilehookversion{v1.0m}
+\providecommand\ltfilehookdate{2022/04/01}
% \end{macrocode}
%
%<*driver>
\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
\providecommand\InternalDetectionOff{}
\providecommand\InternalDetectionOn{}
@@ -73,9 +58,10 @@
%
% \long\def\fmi#1{\begin{quote}\itshape Todo: #1\end{quote}}
%
-% \let\hook\texttt
+% \providecommand\hook[1]{\texttt{#1}}
+%
%
-% \title{The \texttt{ltfilehook} package\thanks{This package has version
+% \title{The \texttt{ltfilehook} documentation\thanks{This code has version
% \ltfilehookversion\ dated \ltfilehookdate, \copyright\ \LaTeX\
% Project.}}
%
@@ -120,7 +106,7 @@
% }
% These are:
% \begin{description}
-% \item[\texttt{file/before}, \texttt{file/\meta{file-name}/before}]
+% \item[\hook{file/before}, \hook{file/\meta{file-name}/before}]
%
% These hooks are executed in that order just before the file is
% loaded for reading. The code of the first hook is used
@@ -128,16 +114,16 @@
% file with matching \meta{file-name} allowing you to specify
% code that only applies to one file.
%
-% \item[\texttt{file/\meta{file-name}/after}, \texttt{file/after}]
+% \item[\hook{file/\meta{file-name}/after}, \hook{file/after}]
%
% These hooks are after the file with name \meta{file-name} has
% been fully consumed. The order is swapped (the specific one
-% comes first) so that the \texttt{before} and \texttt{after}
+% comes first) so that the \hook{/before} and \hook{/after}
% hooks nest properly, which is important if any of them involve
% grouping (e.g., contain environments, for example).
% Furthermore both hooks are reversed hooks to support correct
% nesting of different packages adding code to both
-% \texttt{/before} and \texttt{/after} hooks.
+% \hook{/before} and \hook{/after} hooks.
%
% \end{description}
% \end{variable}
@@ -216,7 +202,7 @@
% \cs{RequirePackage}, \cs{LoadPackageWithOptions}, etc.) offer the
% hooks from section~\ref{sec:general-file-hooks} when they are
% used to load a package or class file, e.g.,
-% \texttt{file/array.sty/after} would be called after the
+% \hook{file/array.sty/after} would be called after the
% \pkg{array} package got loaded. But as packages and classes form as special group
% of files, there are some additional hooks available that only
% apply when a package or class is loaded.
@@ -230,21 +216,21 @@
% }
% These are:
% \begin{description}
-% \item[\texttt{package/before}, \texttt{package/after}]
+% \item[\hook{package/before}, \hook{package/after}]
%
% These hooks are called for each package being loaded.
%
-% \item[\texttt{package/\meta{name}/before},
-% \texttt{package/\meta{name}/after}]
+% \item[\hook{package/\meta{name}/before},
+% \hook{package/\meta{name}/after}]
%
% These hooks are additionally called if the package name is
% \meta{name} (without extension).
%
-% \item[\texttt{class/before}, \texttt{class/after}]
+% \item[\hook{class/before}, \hook{class/after}]
%
% These hooks are called for each class being loaded.
%
-% \item[\texttt{class/\meta{name}/before}, \texttt{class/\meta{name}/after}]
+% \item[\hook{class/\meta{name}/before}, \hook{class/\meta{name}/after}]
%
% These hooks are additionally called if the class name is
% \meta{name} (without extension).
@@ -269,8 +255,8 @@
% \>\cs{UseHook}\marg{\hook{package/\meta{package name}/after}} \\
% \>\cs{UseHook}\marg{\hook{package/after}}
% \end{tabbing}
-% and similar for class file loading, except that \texttt{package/}
-% is replaced by \texttt{class/} and \cs{AtEndOfPackage} by
+% and similar for class file loading, except that \hook{package/}
+% is replaced by \hook{class/} and \cs{AtEndOfPackage} by
% \cs{AtEndOfClass}.
%
% If a package or class is not loaded (or it was loaded before the
@@ -321,7 +307,7 @@
% These are:
% \begin{description}
%
-% \item[\texttt{include/before}, \texttt{include/\meta{name}/before}]
+% \item[\hook{include/before}, \hook{include/\meta{name}/before}]
%
% These hooks are executed (in that order) after the initial
% \cs{clearpage} and after \texttt{.aux} file is changed to use
@@ -331,14 +317,14 @@
% file.
%
%
-% \item[\texttt{include/\meta{name}/end}, \texttt{include/end}]
+% \item[\hook{include/\meta{name}/end}, \hook{include/end}]
%
% These hooks are executed (in that order) after \LaTeX{} has
% stopped reading from the \cs{include} file, but before it has
% issued a \cs{clearpage} to output any deferred floats.
%
%
-% \item[\texttt{include/\meta{name}/after}, \texttt{include/after}]
+% \item[\hook{include/\meta{name}/after}, \hook{include/after}]
%
% These hooks are executed (in that order) after \LaTeX{} has
% issued the \cs{clearpage} but before is has switched back
@@ -349,6 +335,19 @@
% included material and bypassed if it is not loaded because of
% some \cs{includeonly} statement.\footnotemark
%
+% \item[\hook{include/excluded}, \hook{include/\meta{name}/excluded}]
+%
+% The above hooks for \cs{include} files are only executed when
+% the file is loaded (or more exactly the load is attempted). If,
+% however, the \cs{include} file is explicitly excluded (through
+% an \cs{includeonly} statement) the above
+% hooks are bypassed and instead the \hook{include/excluded}
+% hook followed by the \hook{include/\meta{name}/excluded} hook
+% are executed. This happens after
+% \LaTeX{} has loaded the \texttt{.aux} file for this include file,
+% i.e., after \LaTeX{} has updated its counters to pretend that the file
+% was seen.
+%
% \end{description}
% \end{variable}\footnotetext{For that reason
% another \cs{clearpage} is executed after these hooks which
@@ -359,6 +358,9 @@
% All \hook{include} hooks involving the name of the included file are implemented as
% one-time hooks (whereas all other such hooks are normal hooks).
%
+% If you want to execute code that is run for every \cs{include}
+% regardless of whether or not it is excluded, use the
+% \hook{cmd/include/before} or \hook{cmd/include/after} hooks.
%
%
%
@@ -471,7 +473,7 @@
% the level value and search further for \texttt{LEVEL} with that value
% which should then be the \texttt{START} level of the file you are in.
%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
%
% \section{The Implementation}
@@ -728,7 +730,7 @@
% this declaration is done for you automatically and, indeed, they should
% not be declared explicitly.
%
-% Those named \hook{.../after} and \texttt{include/.../end}
+% Those named \hook{.../after} and \hook{include/.../end}
% are, when code is added, declared as reversed hooks.
%
%
@@ -742,8 +744,8 @@
% \begin{macro}{\@input@file@exists@with@hooks}
% \begin{macro}{\unqu@tefilef@und}
% \cs{InputIfFileExists} loads any file if it is available so we
-% have to add the hooks \texttt{file/before} and
-% \texttt{file/after} in the right places. If the file doesn't
+% have to add the hooks \hook{file/before} and
+% \hook{file/after} in the right places. If the file doesn't
% exist no hooks should be executed.
% \begin{macrocode}
%</2ekernel>
@@ -783,7 +785,7 @@
% can't rely on that still being true after the file has been
% processed. Thus for using the name in the file hooks we need to
% preserve the name and then restore it for the
-% \texttt{file/.../after} hook.
+% \hook{file/.../after} hook.
%
% The hook always refers to the file requested by the user. The hook
% is \emph{always} loaded for \cs{CurrentFile} which usually is the
@@ -1046,7 +1048,8 @@
%
% \subsection{Selecting a file (\cs{set@curr@file})}
%
-% \begin{macro}{\set@curr@file,\@curr@file,\@curr@file@reqd}
+% \begin{macro}{\set@curr@file,\set@curr@file@nosearch}
+% \begin{macro}{\@curr@file,\@curr@file@reqd}
% \changes{v1.0f}{2021/01/31}{set \cs{protect} to \cs{string} gh/481}
% Now we hook into \cs{set@curr@file} to resolve a possible file
% substitution, and add \cs{@expl@@@filehook@set@curr@file@@nNN}
@@ -1070,13 +1073,23 @@
% control sequence.
% \changes{v1.0i}{2021/04/20}
% {Make \string~ expand to a string (tracks change in l3kernel)}
+% \changes{v1.0m}{2022/03/10}
+% {Add \cs{set@curr@file@nosearch} for \pkg{graphicx}}
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2021/06/01}%
+%<latexrelease>\IncludeInRelease{2022/06/01}%
%<latexrelease> {\set@curr@file}{Setting current file name}%
-\def\set@curr@file#1{%
+\def\set@curr@file{%
+ \begingroup
+ \set@curr@file@aux}
+\edef\set@curr@file@nosearch{%
\begingroup
+ \let\noexpand\input@path\noexpand\@empty
+ \csname seq_clear:N\endcsname
+ \expandafter\noexpand\csname l_file_search_path_seq\endcsname
+ \noexpand\set@curr@file@aux}
+\def\set@curr@file@aux#1{%
\escapechar\m@ne
\let\protect\string
\edef~{\string~}%
@@ -1117,6 +1130,32 @@
% \end{macrocode}
%
% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2021/06/01}%
+%<latexrelease> {\set@curr@file}{Setting current file name}%
+%<latexrelease>\def\set@curr@file#1{%
+%<latexrelease> \begingroup
+%<latexrelease> \escapechar\m@ne
+%<latexrelease> \let\protect\string
+%<latexrelease> \edef~{\string~}%
+%<latexrelease> \expandafter\def\csname\expandafter\endcsname
+%<latexrelease> \expandafter{\csname\endcsname}%
+%<latexrelease> \@expl@@@filehook@if@no@extension@@nTF{#1}%
+%<latexrelease> {\@tempswatrue}{\@tempswafalse}%
+%<latexrelease> \@kernel@make@file@csname\@curr@file
+%<latexrelease> \@expl@@@filehook@resolve@file@subst@@w {#1}%
+%<latexrelease> \@expl@@@filehook@if@file@replaced@@TF
+%<latexrelease> {\@kernel@make@file@csname\@curr@file@reqd
+%<latexrelease> \@expl@@@filehook@normalize@file@name@@w{#1}%
+%<latexrelease> \if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file@reqd \fi}%
+%<latexrelease> {\if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file \fi
+%<latexrelease> \global\let\@curr@file@reqd\@curr@file}%
+%<latexrelease> \@expl@@@filehook@clear@replacement@flag@@
+%<latexrelease> \endgroup}
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease> {\set@curr@file}{Setting current file name}%
%<latexrelease>\def\set@curr@file#1{%
@@ -1136,6 +1175,7 @@
%<latexrelease> \global\let\@curr@file@reqd\@curr@file}%
%<latexrelease> \@expl@@@filehook@clear@replacement@flag@@
%<latexrelease> \endgroup}
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
@@ -1152,6 +1192,7 @@
%<latexrelease> \csname\@firstofone#1\@empty\endcsname}}%
%<latexrelease> \endgroup
%<latexrelease>}
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
@@ -1159,10 +1200,12 @@
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\set@curr@file}{Setting current file name}%
%<latexrelease>\let\set@curr@file\@undefined
+%<latexrelease>\let\set@curr@file@nosearch\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
%
%
diff --git a/macros/latex/base/ltfiles.dtx b/macros/latex/base/ltfiles.dtx
index 4c24716df6..d99dfdcd48 100644
--- a/macros/latex/base/ltfiles.dtx
+++ b/macros/latex/base/ltfiles.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfiles.dtx}
- [2021/10/14 v1.2p LaTeX Kernel (File Handling)]
+ [2022/05/27 v1.2r LaTeX Kernel (File Handling)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfiles.dtx}
@@ -106,7 +106,7 @@
% If the file exists on the system, execute \emph{then} and input
% \emph{NAME} otherwise execute \emph{else}.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v1.0a}{1994/03/07}{Initial version, split from latex.dtx}
% \changes{v1.0a}{1994/03/07}{Long lines wrapped to 72 columns}
@@ -817,7 +817,7 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease>\IncludeInRelease{2022/06/01}%
%<latexrelease> {\@include}{Spaces in file names and hooks}%
% \end{macrocode}
%
@@ -899,6 +899,16 @@
% \begin{macrocode}
\deadcycles\z@
\@nameuse{cp@#1}%
+% \end{macrocode}
+% We also execute a hook in this case, first a general used for
+% every include file that is exclude and then a specific one that
+% contains the name of the include file.
+% \changes{v1.2q}{2022/04/01}{Process some hooks is an include file is bypassed}
+% \begin{macrocode}
+%-----------------------------------------
+ \UseHook{include/excluded}%
+ \UseOneTimeHook{include/#1/excluded}%
+%-----------------------------------------
\fi
\let\@auxout\@mainaux
% \end{macrocode}
@@ -917,13 +927,66 @@
\NewHook{include/before}
\NewReversedHook{include/end}
\NewReversedHook{include/after}
+\NewHook{include/excluded}
%<latexrelease>\EndIncludeInRelease
%</2ekernel|latexrelease>
% \end{macrocode}
%
% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@include}{Spaces in file names and hooks}%
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\def\@include#1 {%
+%<latexrelease>\ifx\@nodocument\relax
+%<latexrelease> \clearpage
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\write\@mainaux{\string\@input{#1.aux}}%
+%<latexrelease> \fi
+%<latexrelease> \@tempswatrue
+%<latexrelease> \if@partsw
+%<latexrelease> \@tempswafalse
+%<latexrelease> \edef\reserved@b{#1}%
+%<latexrelease> \@for\reserved@a:=\@partlist\do
+%<latexrelease> {\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
+%<latexrelease> \fi
+%<latexrelease> \if@tempswa
+%<latexrelease> \let\@auxout\@partaux
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\openout\@partaux "#1.aux"
+%<latexrelease> \immediate\write\@partaux{\relax}%
+%<latexrelease> \fi
+%<latexrelease> \@filehook@set@CurrentFile
+%<latexrelease> \UseHook{include/before}%
+%<latexrelease> \UseOneTimeHook{include/#1/before}%
+%<latexrelease> \@input@{#1.tex}%
+%<latexrelease> \UseOneTimeHook{include/#1/end}%
+%<latexrelease> \UseHook{include/end}%
+%<latexrelease> \clearpage
+%<latexrelease> \UseOneTimeHook{include/#1/after}%
+%<latexrelease> \UseHook{include/after}%
+%<latexrelease> \clearpage
+%<latexrelease> \@writeckpt{#1}%
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\closeout\@partaux
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \deadcycles\z@
+%<latexrelease> \@nameuse{cp@#1}%
+%<latexrelease> \fi
+%<latexrelease> \let\@auxout\@mainaux
+%<latexrelease>\else
+%<latexrelease>\@latex@warning{%
+%<latexrelease> \noexpand\include should only be used after \string\begin{document}}%
+%<latexrelease>\@input@{#1}%
+%<latexrelease>\fi}
+%<latexrelease>\NewHook{include/before}
+%<latexrelease>\NewReversedHook{include/end}
+%<latexrelease>\NewReversedHook{include/after}
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\@include}{Spaces in file names}%
+%<latexrelease> {\@include}{Spaces in file names and hooks}%
%<latexrelease>\def\@include#1 {%
%<latexrelease> \clearpage
%<latexrelease> \if@filesw
@@ -1577,6 +1640,7 @@
%
% \changes{v1.0o}{1994/11/30}
% {Use \cs{@dofilelist}}
+% \changes{v1.2r}{2022/05/27}{Try saved version string, if ver@.. is \cs{relax} (gh/825)}
% \begin{macrocode}
\def\@dofilelist{%
\typeout{^^J *File List*}%
@@ -1587,6 +1651,15 @@
\ifx\filename@ext\relax tex\else\filename@ext\fi}%
\expandafter\let\expandafter\reserved@b
\csname ver@\reserved@a\endcsname
+% \end{macrocode}
+% Packages that \cs{relax} their \cs{ver@...} string to allow for
+% multiple loading (e.g., \pkg{fontenc}) can use \cs{ver@@...} to
+% store the version information instead.
+% \begin{macrocode}
+ \ifx\reserved@b\relax
+ \expandafter\let\expandafter\reserved@b
+ \csname ver@@\reserved@a\endcsname
+ \fi
\expandafter\expandafter\expandafter\@listfiles\expandafter
\filename@area\filename@base\\\\\\\\\\\\\\\\\\\@@
\typeout{%
diff --git a/macros/latex/base/ltfinal.dtx b/macros/latex/base/ltfinal.dtx
index 40017a205a..b1b8ff953b 100644
--- a/macros/latex/base/ltfinal.dtx
+++ b/macros/latex/base/ltfinal.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfinal.dtx}
- [2021/09/06 v2.2q LaTeX Kernel (Final Settings)]
+ [2022/06/02 v2.2u LaTeX Kernel (Final Settings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfinal.dtx}
@@ -57,11 +57,14 @@
%
%
% \section{Final settings}
-% This section contains the final settings for \LaTeX. It initializes
-% some debugging and typesetting parameters, sets the default
-% |\catcode|s and uc/lc codes, and inputs the hyphenation file.
%
-% \StopEventually{}
+% This section contains the final settings for \LaTeX. It initializes
+% some debugging and typesetting parameters, sets the default
+% |\catcode|s and uc/lc codes, and inputs the hyphenation file.
+%
+%
+%
+% \MaybeStop{}
%
% \changes{v0.1a}{1994/03/07}{Initial version, split from latex.dtx}
% \changes{v0.1a}{1994/03/07}{Remove oldcomments environment}
@@ -150,6 +153,34 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+% Allocate 3 mark classes to be used in \cs{markboth} and
+% \cs{markright}. Should be done earlier but for that definition of
+% \cs{newmarks} needs moving (which it should I guess).
+% \changes{v2.2s}{2022/04/03}{Integration of new mark management interface}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {2e-left}{Delayed legacy marks}%
+\NewMarkClass {2e-left}
+\NewMarkClass {2e-right}
+\NewMarkClass {2e-right-nonempty}
+% \end{macrocode}
+% No rollback really, the marks will remain.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {2e-left}{Delayed legacy marks}%
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+
+
+%
%\begin{macro}{\newXeTeXintercharclass}
% \changes{v2.0a}{2014/12/30}{macro added}
% \changes{v2.0b}{2015/01/23}{use reserved count 257}
@@ -242,9 +273,9 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{trace_stack_levels}
+% \begin{macro}{trace\string_stack\string_levels}
% Now define the Lua function to emulate \cs{tracingstacklevels} and
-% install it in the \texttt{input_level_string} callback.
+% install it in the |input_level_string| callback.
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
@@ -1033,11 +1064,16 @@
%
% \begin{macro}{\MakeUppercase}
% \begin{macro}{\MakeUppercase}
+% \begin{macro}{\NoCaseChange}
+% \begin{macro}{\@uclclist}
+% \begin{macro}{\@expl@text@lowercase@@n}
+% \begin{macro}{\@expl@text@uppercase@@n}
% \begin{macro}{\@uclclist}
%
+%
% \changes{v1.1a}{1997/10/20}{Removed \cs{aa} and \cs{AA} from
% \cs{@uclclist} as these are macros.}
-%
+% \changes{v2.2r}{2022/02/20}{use \cs{text_lowercase:n}}%
% And whilst we're doing things with uc/lc tables, here are two
% commands to upper- and lower-case a string.
%
@@ -1048,6 +1084,24 @@
% mathematics, environment names, labels, etc. A much better
% long-term solution is to use all-caps fonts, but these aren't
% generally available.
+%
+% Two wrappers around the L3 case changing functions.
+% |\protected| to make them mostly safe as replacements for |uppercase|
+% and |\lowercase|.
+% \begin{macrocode}
+\ExplSyntaxOn
+\protected\def\@expl@text@lowercase@@n{\text_lowercase:n}
+\protected\def\@expl@text@uppercase@@n{\text_uppercase:n}
+% \end{macrocode}
+%
+% \changes{v2.2u}{2022/06/02}{Add \cs{NoCaseChange}}
+% |\NoCaseChange| protects its argument from the case change functions.
+% \begin{macrocode}
+\tl_put_right:Nn \l_text_case_exclude_arg_tl { \NoCaseChange }
+\cs_new_protected:Npn \NoCaseChange #1 {#1}
+\ExplSyntaxOff
+% \end{macrocode}
+%
% \begin{macrocode}
\DeclareRobustCommand{\MakeUppercase}[1]{{%
\def\i{I}\def\j{J}%
@@ -1056,20 +1110,17 @@
% \end{macrocode}
% Tell UTF-8 processing to process chars even though we are in an \cs{protected@edef}.
% \changes{v2.1h}{2019/09/14}{Expand UTF8 chars when case changing (github/177)}
+% \changes{v2.2r}{2022/02/20}
+% {Use \cs{@expl@text@uppercase@@n}, removing local redefinition of \cs{UTF@two@octets@noexpand}}%
+% \changes{v2.2t}{2022/04/21}{Support \cs{noexpand} in argument of \cs{@expl@text@uppercase@@n}}
% \begin{macrocode}
- \let\UTF@two@octets@noexpand\@empty
- \let\UTF@three@octets@noexpand\@empty
- \let\UTF@four@octets@noexpand\@empty
- \protected@edef\reserved@a{\uppercase{#1}}%
+ \protected@edef\reserved@a{\@expl@text@uppercase@@n{\noexpand\unexpanded{#1}}}%
\reserved@a
}}
\DeclareRobustCommand{\MakeLowercase}[1]{{%
\def\reserved@a##1##2{\let##2##1\reserved@a}%
\expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
- \let\UTF@two@octets@noexpand\@empty
- \let\UTF@three@octets@noexpand\@empty
- \let\UTF@four@octets@noexpand\@empty
- \protected@edef\reserved@a{\lowercase{#1}}%
+ \protected@edef\reserved@a{\@expl@text@lowercase@@n{\noexpand\unexpanded{#1}}}%
\reserved@a
}}
% \end{macrocode}
@@ -1105,6 +1156,10 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \changes{v1.0h}{1994/05/13}{Added output enc stuff}
% \changes{v1.0i}{1994/05/16}{moved output enc stuff to lfonts}
diff --git a/macros/latex/base/ltfloat.dtx b/macros/latex/base/ltfloat.dtx
index ac3b641817..8b5b92759a 100644
--- a/macros/latex/base/ltfloat.dtx
+++ b/macros/latex/base/ltfloat.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -83,7 +83,7 @@
% For example, `pht' specifies that the float can appear in any of
% three locations: page, here or top.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v1.0a}{1994/03/04}{Initial version, split from latex.dtx}
diff --git a/macros/latex/base/ltfntcmd.dtx b/macros/latex/base/ltfntcmd.dtx
index 6c4ec4b3d1..64064abcb5 100644
--- a/macros/latex/base/ltfntcmd.dtx
+++ b/macros/latex/base/ltfntcmd.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -271,7 +271,7 @@
% amstex.sty} is used as this version can cause space to be removed
% immediately before the |\/|.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{The implementation}
diff --git a/macros/latex/base/ltfssaxes.dtx b/macros/latex/base/ltfssaxes.dtx
index 86c84b111f..843e8b544c 100644
--- a/macros/latex/base/ltfssaxes.dtx
+++ b/macros/latex/base/ltfssaxes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2021
+% Copyright (C) 2019-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -66,7 +66,7 @@
%
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v1.0h}{2020/12/04}{Reorganized the rollback data}
%
diff --git a/macros/latex/base/ltfssbas.dtx b/macros/latex/base/ltfssbas.dtx
index 1f30372d06..d013ec0ecb 100644
--- a/macros/latex/base/ltfssbas.dtx
+++ b/macros/latex/base/ltfssbas.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -76,7 +76,7 @@
% completely accurate.
% \end{quote}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v3.0v}{1998/08/17}{(RmS) Documentation fixes.}
% \changes{v3.0j}{1995/10/22}{(RmS) New size function macro
@@ -2257,3 +2257,13 @@
%
% \Finale
%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+
+^^A Needed for emacs
+^^A
+^^A Local Variables:
+^^A mode: latex
+^^A coding: utf-8-unix
+^^A End:
+
diff --git a/macros/latex/base/ltfsscmp.dtx b/macros/latex/base/ltfsscmp.dtx
index 03be855127..09f43a0d94 100644
--- a/macros/latex/base/ltfsscmp.dtx
+++ b/macros/latex/base/ltfsscmp.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -82,7 +82,7 @@
% kernel and made available via \textsf{latexrelease} package so that
% backward compatibility remains ensured for very old documents.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v3.0b}{1995/06/15}
diff --git a/macros/latex/base/ltfssdcl.dtx b/macros/latex/base/ltfssdcl.dtx
index 4f2cabd613..65bc40803e 100644
--- a/macros/latex/base/ltfssdcl.dtx
+++ b/macros/latex/base/ltfssdcl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -77,7 +77,7 @@
% completely accurate.
% \end{quote}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Interface Commands}
%
diff --git a/macros/latex/base/ltfssini.dtx b/macros/latex/base/ltfssini.dtx
index f817fdd847..12e3b6289b 100644
--- a/macros/latex/base/ltfssini.dtx
+++ b/macros/latex/base/ltfssini.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -70,7 +70,7 @@
% distribution, or \emph{The \LaTeX\ Companion} for higher level
% documentation of these commands.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v3.0i}{1998/08/17}{(RmS) Minor documentation fixes.}
diff --git a/macros/latex/base/ltfsstrc.dtx b/macros/latex/base/ltfsstrc.dtx
index f562a4fa90..699fd2c594 100644
--- a/macros/latex/base/ltfsstrc.dtx
+++ b/macros/latex/base/ltfsstrc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -138,7 +138,7 @@
% \end{description}
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{A driver for this document}
%
diff --git a/macros/latex/base/lthooks-code.pdf b/macros/latex/base/lthooks-code.pdf
index 7bad3dd37f..244eed91e2 100644
--- a/macros/latex/base/lthooks-code.pdf
+++ b/macros/latex/base/lthooks-code.pdf
Binary files differ
diff --git a/macros/latex/base/lthooks-doc.pdf b/macros/latex/base/lthooks-doc.pdf
index fb7da9f5b2..266cd976ac 100644
--- a/macros/latex/base/lthooks-doc.pdf
+++ b/macros/latex/base/lthooks-doc.pdf
Binary files differ
diff --git a/macros/latex/base/lthooks-doc.tex b/macros/latex/base/lthooks-doc.tex
index a51e2cd6e0..b5f3622a17 100644
--- a/macros/latex/base/lthooks-doc.tex
+++ b/macros/latex/base/lthooks-doc.tex
@@ -3,5 +3,6 @@
\AtBeginDocument{\OnlyDescription
% \let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
}
\input{lthooks.dtx}
diff --git a/macros/latex/base/lthooks.dtx b/macros/latex/base/lthooks.dtx
index 5b3d80e984..06a0e8258f 100644
--- a/macros/latex/base/lthooks.dtx
+++ b/macros/latex/base/lthooks.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2020-2021
+% Copyright (C) 2020-2022
% Frank Mittelbach, Phelype Oleinik & LaTeX Team
%
% This file is part of the LaTeX base system.
@@ -31,28 +31,13 @@
%%% From File: lthooks.dtx
%
% \begin{macrocode}
-\def\lthooksversion{v1.0s}
-\def\lthooksdate{2021/09/28}
+\def\lthooksversion{v1.0u}
+\def\lthooksdate{2022/05/19}
% \end{macrocode}
%
%<*driver>
\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
\providecommand\InternalDetectionOff{}
\providecommand\InternalDetectionOn{}
@@ -798,6 +783,7 @@
% \begin{function}{\ShowHook,\LogHook}
% \begin{syntax}
% \cs{ShowHook} \Arg{hook}
+% \cs{LogHook} \Arg{hook}
% \end{syntax}
% Displays information about the \meta{hook} such as
% \begin{itemize}
@@ -1096,6 +1082,7 @@
% \begin{function}{\hook_show:n,\hook_log:n}
% \begin{syntax}
% \cs{hook_show:n} \Arg{hook}
+% \cs{hook_log:n} \Arg{hook}
% \end{syntax}
% Displays information about the \meta{hook} such as
% \begin{itemize}
@@ -1391,7 +1378,7 @@
% in real documents.
%
% For example, \pkg{babel} may want to provide hooks such as
-% \hook{babel/afterextras/\meta{language}}. Language support in
+% \hook{babel/\meta{language}/afterextras}. Language support in
% \pkg{babel} is often done through external language
% packages. Thus doing the activation for all languages inside the
% core \pkg{babel} code is not a viable approach. Instead it needs
@@ -1417,7 +1404,7 @@
% hook management (by adding various rules to ensure the
% appropriate ordering with respect to other code added by
% packages). However, this makes every document unnecessary
-% slow, because there has to be sorting even through the result is
+% slow, because there has to be sorting even though the result is
% predetermined. Furthermore it forces package writers to
% unnecessarily add such rules if they add further code to the hook
% (or break \LaTeX{}).
@@ -1502,9 +1489,6 @@
% Like \cs{AtBeginDocument} but for the \hook{enddocument} hook.
% \end{function}
%
-% There is also \cs{AtBeginDvi} which is discussed in conjunction
-% with the shipout hooks.
-%
% \bigskip
%
% The few hooks that existed previously in \LaTeXe{} used internally
@@ -1962,7 +1946,21 @@
% \end{description}
%
%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+% \subsection{Hook provided by the mark mechanism}
+%
+% See \texttt{ltmarks-doc.pdf} for details.
+% \begin{description}
+%
+% \item[\hook{insertmark}]
+%
+% This hook allows for a special setup while \cs{InsertMark}
+% inserts a mark. It is executed in group so local changes only
+% apply to the mark being inserted.
+%
+% \end{description}
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
%
% \section{The Implementation}
@@ -2198,7 +2196,6 @@
% \end{macro}
%
%
-%
% \subsection{Providing new hooks}
%
% \subsubsection{The data structures of a hook}
@@ -2219,7 +2216,7 @@
% A token list holding the relation between \meta{label1} and
% \meta{label2} in the \meta{hook}. The \meta{labels} are lexically
% (reverse) sorted to ensure that two labels always point to the same
-% token list. For global rules, the \meta{hook} name is |??|.
+% token list. For global rules, the \meta{hook} name is \texttt{??}.
%
% \item[\cs{@@\textvisiblespace\meta{hook}}] The code that is actually executed
% when the hook is called in the document is stored in this token
@@ -3458,7 +3455,12 @@
}
\tl_const:cn { c_@@_generic_env/./begin_tl } { + }
\tl_const:cn { c_@@_generic_env/./end_tl } { + }
+% \end{macrocode}
+%
+% \changes{v1.0t}{2022/04/01}{Support generic \texttt{include/.../excluded} hooks}
+% \begin{macrocode}
\tl_const:cn { c_@@_generic_include/./end_tl } { - }
+\tl_const:cn { c_@@_generic_include/./excluded_tl } { + }
% \end{macrocode}
%
% Deprecated generic hooks:
@@ -3589,7 +3591,7 @@
% expansion in the code later on.
%
% \cs{@@\textvisiblespace??} isn't used, but it has to be defined to trick
-% the code into thinking that \verb=??= is actually a hook.
+% the code into thinking that \texttt{??} is actually a hook.
% \begin{macrocode}
\prop_new:c {g_@@_??_code_prop}
\prop_new:c {@@~??}
@@ -3624,6 +3626,11 @@
% \end{macrocode}
%
% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2022/06/01}{\@@_gset_rule:nnnn}
+%<latexrelease> {Refuse~setting~rule~for~one-time~hooks}
+% \end{macrocode}
+%
+% \begin{macrocode}
\cs_new_protected:Npn \@@_gset_rule:nnnn #1#2#3#4
{
\@@_if_deprecated_generic:nT {#1}
@@ -3631,7 +3638,13 @@
\@@_deprecated_generic_warn:n {#1}
\@@_do_deprecated_generic:Nn \@@_gset_rule:nnnn {#1}
{#2} {#3} {#4}
- \exp_after:wN \use_none:nnnnnnnnn \use_none:n
+ \@@_clean_to_scan:w
+ }
+ \@@_if_execute_immediately:nT {#1}
+ {
+ \msg_error:nnnnnn { hooks } { rule-too-late }
+ {#1} {#2} {#3} {#4}
+ \@@_clean_to_scan:w
}
% \end{macrocode}
% First we ensure the basic data structure of the hook exists:
@@ -3650,10 +3663,41 @@
{#1} {#2} {#4}
\@@_update_hook_code:n {#1}
}
- { \msg_error:nnnnnn { hooks } { unknown-rule }
- {#1} {#2} {#3} {#4} }
+ {
+ \msg_error:nnnnnn { hooks } { unknown-rule }
+ {#1} {#2} {#3} {#4}
+ }
+ \s_@@_mark
}
% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_gset_rule:nnnn}
+%<latexrelease> {Refuse~setting~rule~for~one-time~hooks}
+%<latexrelease>\cs_new_protected:Npn \@@_gset_rule:nnnn #1#2#3#4
+%<latexrelease> {
+%<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> \exp_after:wN \use_none:nnnnnnnnn \use_none:n
+%<latexrelease> }
+%<latexrelease> \@@_init_structure:n {#1}
+%<latexrelease> \@@_rule_gclear:nnn {#1} {#2} {#4}
+%<latexrelease> \cs_if_exist_use:cTF { @@_rule_#3_gset:nnn }
+%<latexrelease> {
+%<latexrelease> {#1} {#2} {#4}
+%<latexrelease> \@@_update_hook_code:n {#1}
+%<latexrelease> }
+%<latexrelease> {
+%<latexrelease> \msg_error:nnnnnn { hooks } { unknown-rule }
+%<latexrelease> {#1} {#2} {#3} {#4}
+%<latexrelease> }
+%<latexrelease> }
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
% \end{macro}
% \end{macro}
%
@@ -3831,7 +3875,6 @@
% \end{macro}
%
%
-%
% \begin{macro}{\@@_initialize_hook_code:n}
% Initializing or reinitializing the fast execution hook code. In
% the preamble this is selectively done in case a hook gets used
@@ -3840,8 +3883,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_initialize_hook_code:n #1
{
- \@@_debug:n{ \iow_term:x{^^JUpdate~ code~ for~ hook~
- '#1' \on@line :^^J} }
+ \@@_debug:n
+ { \iow_term:x { ^^J Update~code~for~hook~'#1' \on@line :^^J } }
% \end{macrocode}
% This does the sorting and the updates.
% First thing we do is to check if a legacy hook macro exists and
@@ -3859,6 +3902,7 @@
% \cs{@@_initialize_single:NNn} and pass to it ready made csnames
% as they are needed several times inside. This way we save a bit
% on processing time if we do that up front.
+% \changes{v1.0u}{2022/05/17}{Refuse sorting one-time hooks (gh/818).}
% \begin{macrocode}
\@@_if_usable:nT {#1}
{
@@ -3873,7 +3917,7 @@
{
% \end{macrocode}
% By default the algorithm sorts the code chunks and then saves the
-% result in a token list for fast execution; this is done by adding the code chunks
+% result in a token list for fast execution; this is done by adding the code chunks
% one after another, using \cs{tl_gput_right:NV}. When we sort code for
% a reversed hook, all we have to do is to add the code chunks in
% the opposite order into the token list. So all we have to do
@@ -3902,8 +3946,8 @@
% i.e., we are only interested in storing the keys and the value is
% arbitrary.
% \begin{macrocode}
- \@@_debug:n{ \exp_args:NNx \prop_gput:Nnn
- \g_@@_used_prop {#1}{} }
+ \@@_debug:n
+ { \exp_args:NNx \prop_gput:Nnn \g_@@_used_prop {#1} { } }
}
}
}
@@ -4169,7 +4213,7 @@
% \meta{hook-code-plist}. We are about to apply the next rule and
% enter it into the data structure. \cs{@@_apply_label_pair:nnn} will
% just call \cs{@@_label_if_exist_apply:nnnF} for the \meta{hook}, and
-% if no rule is found, also try the \meta{hook} name \verb=??=
+% if no rule is found, also try the \meta{hook} name \texttt{??}
% denoting a default hook rule.
%
% \cs{@@_label_if_exist_apply:nnnF} will check if the rule exists for
@@ -4286,7 +4330,7 @@
% out to be a real issue, we can improve the code.
%
% Here the code is removed from \cs{l_@@_cur_hook_tl} rather than
-% \verb=#3= because the latter may be \verb=??=, and the default
+% \verb=#3= because the latter may be \texttt{??}, and the default
% hook doesn't store any code. Removing it instead from \cs{l_@@_cur_hook_tl}
% makes the default rules \verb=->= and \verb=<-= work properly.
% \begin{macrocode}
@@ -4320,16 +4364,17 @@
% \@@_apply_-rule_>:nnn,
% \@@_apply_-rule_<-:nnn,
% \@@_apply_-rule_->:nnn,
-% \@@_apply_-rule_x:nnn,
+% \@@_apply_-rule_xW:nnn,
+% \@@_apply_-rule_xE:nnn,
% }
% Reversed rules.
% \begin{macrocode}
-\cs_new_eq:cc { @@_apply_-rule_<:nnn } { @@_apply_rule_>:nnn }
-\cs_new_eq:cc { @@_apply_-rule_>:nnn } { @@_apply_rule_<:nnn }
+\cs_new_eq:cc { @@_apply_-rule_<:nnn } { @@_apply_rule_>:nnn }
+\cs_new_eq:cc { @@_apply_-rule_>:nnn } { @@_apply_rule_<:nnn }
\cs_new_eq:cc { @@_apply_-rule_<-:nnn } { @@_apply_rule_<-:nnn }
\cs_new_eq:cc { @@_apply_-rule_->:nnn } { @@_apply_rule_->:nnn }
-\cs_new_eq:cc { @@_apply_-rule_xE:nnn } { @@_apply_rule_xE:nnn }
-\cs_new_eq:cc { @@_apply_-rule_xW:nnn } { @@_apply_rule_xW:nnn }
+\cs_new_eq:cc { @@_apply_-rule_xE:nnn } { @@_apply_rule_xE:nnn }
+\cs_new_eq:cc { @@_apply_-rule_xW:nnn } { @@_apply_rule_xW:nnn }
% \end{macrocode}
% \end{macro}
%
@@ -4535,7 +4580,7 @@
% \meta{inline function} is executed with |#1|${}={}$\meta{relation},
% |#2|${}={}$\meta{label_1}\verb=|=\meta{label_2},
% and |#3|${}={}$\meta{hook} (the latter may be the argument |#1| to
-% \cs{@@_list_rules:nn}, or |??| if it is a default rule).
+% \cs{@@_list_rules:nn}, or \texttt{??} if it is a default rule).
% \begin{macrocode}
\cs_new_protected:Npn \@@_list_rules:nn #1 #2
{
@@ -4847,6 +4892,7 @@
% clears the hook so that any further call to \cs{hook_use:n} or
% \cs{hook_use_once:n} will expand to nothing.
% \changes{v1.0r}{2021/09/06}{Clean up after \cs{UseOneTimeHook} (gh/606)}
+% \changes{v1.0u}{2022/05/13}{Check if prop exists to avoid l3debug error}
% \begin{macrocode}
\cs_new_protected:Npn \@@_use_once_set:n #1
{ \@@_tl_gset:cn { g_@@_#1_reversed_tl } { I } }
@@ -4855,7 +4901,7 @@
\@@_tl_gclear:c { @@~#1 }
\@@_tl_gclear:c { @@_next~#1 }
\@@_tl_gclear:c { @@_toplevel~#1 }
- \prop_gclear:c { g_@@_#1_code_prop }
+ \prop_gclear_new:c { g_@@_#1_code_prop }
}
% \end{macrocode}
% \end{macro}
@@ -4872,7 +4918,7 @@
% empty.
% \changes{v1.0r}{2021/09/06}{Macro added (gh/606)}
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_if_execute_immediately:n #1 { F, TF }
+\prg_new_conditional:Npnn \@@_if_execute_immediately:n #1 { T, F, TF }
{
\@@_if_usable:nTF {#1}
{
@@ -5113,7 +5159,8 @@
%
% \begin{macrocode}
\msg_new:nnnn { hooks } { unknown-rule }
- { Unknown~ relationship~ '#3'~
+ {
+ Unknown~ relationship~ '#3'~
between~ labels~ '#2'~ and~ '#4'~
\str_if_eq:nnF {#1} {??} { ~in~hook~'#1' }. ~
Perhaps~ a~ misspelling?
@@ -5130,6 +5177,22 @@
% \end{macrocode}
%
% \begin{macrocode}
+\msg_new:nnnn { hooks } { rule-too-late }
+ {
+ Sorting~rule~for~'#1'~hook~applied~too~late.\\
+ Try~setting~this~rule~earlier.
+ }
+ {
+ You~tried~to~set~the~ordering~of~hook~'#1'~using\\
+ \ \ \iow_char:N\\DeclareHookRule{#1}{#2}{#3}{#4}\\
+ but~hook~'#1'~was~already~used~as~a~one-time~hook,~
+ thus~sorting~is\\
+ no~longer~possible.~Declare~the~rule~
+ before~the~hook~is~used.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\msg_new:nnnn { hooks } { misused-top-level }
{
Illegal~use~of~\iow_char:N \\AddToHook{#1}[top-level]{...}.\\
@@ -5596,4 +5659,10 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+^^A Needed for emacs
+^^A
+^^A Local Variables:
+^^A mode: latex
+^^A coding: utf-8-unix
+^^A End:
diff --git a/macros/latex/base/lthyphen.dtx b/macros/latex/base/lthyphen.dtx
index 9244db0642..b7cede1175 100644
--- a/macros/latex/base/lthyphen.dtx
+++ b/macros/latex/base/lthyphen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -65,7 +65,7 @@
% of \texttt{hyphen.ltx}. See the comments below for additional
% information.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% To produce the printed version of this file the following code
% is used. It can be extracted with the \dst{} program, or one can run
diff --git a/macros/latex/base/ltidxglo.dtx b/macros/latex/base/ltidxglo.dtx
index 75a80cd439..395fe83975 100644
--- a/macros/latex/base/ltidxglo.dtx
+++ b/macros/latex/base/ltidxglo.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -68,7 +68,7 @@
%
% \DescribeMacro{\glossary} Make a glossary entry for |#1|.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v1.0a}{1994/03/31}{Initial version of ltidxbib.dtx,
diff --git a/macros/latex/base/ltkeys.dtx b/macros/latex/base/ltkeys.dtx
new file mode 100644
index 0000000000..00c2600289
--- /dev/null
+++ b/macros/latex/base/ltkeys.dtx
@@ -0,0 +1,518 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2021-2022
+% 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: ltkeys.dtx
+%
+%<*driver>
+% \fi
+\ProvidesFile{ltkeys.dtx}
+ [2022/02/21 v1.0f LaTeX Kernel (Kevyal options)]
+% \iffalse
+\documentclass{l3doc}
+\GetFileInfo{ltkeys.dtx}
+\title{\filename}
+\date{\filedate}
+\author{%
+ \LaTeX{} Team}
+
+\begin{document}
+ \maketitle
+ \DocInput{ltkeys.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \section{Creating and using keyval options}
+%
+% As with any key--value input, using key--value pairs as package or
+% class options has two parts: creating the key options and setting (using)
+% them. Options created in this way \emph{may} be used after package loading
+% as general key--value settings: this will depend on the nature of the
+% underlying code.
+%
+% \begin{function}{\DeclareKeys}
+% \begin{syntax}
+% \cs{DeclareKeys} \oarg{family} \marg{declarations}
+% \end{syntax}
+% Creates a series of options from a comma-separated \meta{declarations} list.
+% Each entry in this list is a key--value pair, with the \meta{key} having one
+% or more \meta{properties}. A small number of \enquote{basic}
+% \meta{properties} are described below. The full range of properties,
+% provided by \pkg{l3keys}, can also be used for more powerful processing.
+% See \texttt{interface3} for the full details.
+%
+% The basic properties provided here are
+% \begin{itemize}
+% \item \texttt{.code} --- execute arbitrary code
+% \item \texttt{.if} --- sets a \TeX{} \cs{if...} switch
+% \item \texttt{.store} --- stores a value in a macro
+% \item \texttt{.usage} -- defines whether the option can be given only
+% when loading (\texttt{load}), in the preamble (\texttt{preamble}) or
+% has no limitation on scope (\texttt{general})
+% \end{itemize}
+% The part of the \meta{key} before the \meta{property} is the \meta{name},
+% with the \meta{value} working with the \meta{property} to define the
+% behaviour of the option.
+%
+% For example, with
+% \begin{verbatim}
+% \DeclareKeys[mypkg]
+% {
+% draft.if = @mypkg@draft ,
+% draft.usage = preamble ,
+% name.store = \@mypkg@name ,
+% name.usage = load ,
+% second-name.store = \@mypkg@other@name
+% }
+% \end{verbatim}
+% three options would be create. The option \texttt{draft} can be given
+% anywhere in the preamble, and will set a switch called \cs{if@mypkg@draft}.
+% The option \texttt{name} can only be given during package loading, and will
+% save whatever value it is given in \cs{@mypkg@name}. Finally, the option
+% \texttt{second-name} can be given anywhere, and will save its value in
+% \cs{@mypkg@other@name}.
+%
+% Keys created \emph{before} the use of \cs{ProcessKeyOptions}act as
+% package options.
+% \end{function}
+%
+% \begin{function}{\DeclareUnknownKeyHandler}
+% \begin{syntax}
+% \cs{DeclareUnknownKeyHandler} \oarg{family} \marg{code}
+% \end{syntax}
+% The function \cs{DeclareUnknownKeyHandler} may be used to define
+% the behavior when an undefined key is encountered. The \meta{code}
+% will receive the unknown key name as |#1| and the value as |#2|.
+% These can then be processed as appropriate, e.g.~by forwarding
+% to another package.
+% \end{function}
+%
+% \begin{function}{\ProcessKeyOptions}
+% \begin{syntax}
+% \cs{ProcessKeyOptions} \oarg{family}
+% \end{syntax}
+% The \cs{ProcessKeyOptions} function is used to check the current
+% option list against the keys defined for \meta{family}. Global (class)
+% options and local (package) options are checked when this function
+% is called in a package.
+% \end{function}
+%
+% \begin{function}{\SetKeys}
+% \begin{syntax}
+% \cs{SetKeys} \oarg{family} \Arg{keyvals}
+% \end{syntax}
+% Sets (applies) the explicit list of \meta{keyvals} for the \meta{family}:
+% it the latter is not given, the value of \cs{@currname} used. This command
+% may be used within a package to set options before or after using
+% \cs{ProcessKeyOptions}.
+% \end{function}
+%
+% \StopEventually{}
+%
+% \subsection{Implementation of \pkg{ltkeys}}
+%
+% \begin{macrocode}
+%<@@=keys>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \subsection{Key properties}
+%
+% \begin{macro}{.code, .if, .store, .usage}
+% \changes{v1.0b}{2022/02/05}
+% {Create properties in \texttt{ltlkeys}}
+% \changes{v1.0c}{2022/02/07}
+% {Correct \texttt.{.code} property}
+% \begin{macrocode}
+\group_begin:
+ \cs_set_protected:Npn \@@_tmp:nn #1#2
+ {
+ \quark_if_recursion_tail_stop:n {#1}
+ \cs_new_eq:cc
+ { \c_@@_props_root_str . #2 }
+ { \c_@@_props_root_str . #1 }
+ \@@_tmp:nn
+ }
+ \@@_tmp:nn
+ { code:n } { code }
+ { legacy_if_set:n } { if }
+ { tl_set:N } { store }
+ { usage:n } { usage }
+ { \q_recursion_tail } { }
+ \q_recursion_stop
+\group_end:
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Main mechanism}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \clist_put_right:Nn { Nv }
+% \end{macrocode}
+%
+% \begin{macro}{\l_@@_options_clist}
+% A single list is used for all options, into which they are collected
+% before processing.
+% \begin{macrocode}
+\clist_new:N \l_@@_options_clist
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_options_loading_bool}
+% Used to indicate we are in the loading phase: controls the outcome
+% of warnings.
+% \begin{macrocode}
+\bool_new:N \l_@@_options_loading_bool
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_options:n}
+% \changes{v1.0f}{2022/03/18}{Simplify to always cover global options}
+% \begin{macro}{\@@_options_aux:n}
+% \changes{v1.0b}{2022/01/15}
+% {Clear option list in end-of-package hook}
+% \begin{macro}{\@@_options_end:}
+% The main function calls functions to collect up the global and local
+% options into \cs{l_@@_options_clist} before calling the
+% underlying functions to actually do the processing. So that a suitable
+% message is produced if the option is unknown, the special
+% \texttt{unknown} key is set if it does not already exist for the
+% current family, and is cleaned up afterwards if required. To allow
+% the \LaTeXe{} layer to know this mechanism is active, and to deal
+% with the key family not matching the file name, we store the family
+% in all cases.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options:n #1
+ { \@@_options_expand_module:Nn \@@_options_aux:n {#1} }
+\cs_new_protected:Npn \@@_options_aux:n #1
+ {
+ \cs_gset_nopar:cpn { opt@fam@\@currname.\@currext } {#1}
+ \cs_set_protected:Npn \@@_option_end: { }
+ \clist_clear:N \l_@@_options_clist
+ \@@_options_global:n {#1}
+ \@@_options_local:
+ \keys_if_exist:nnF {#1} { unknown }
+ {
+ \keys_define:nn {#1}
+ {
+ unknown .code:n =
+ {
+ \msg_error:nnxx { keys } { option-unknown }
+ { \l_keys_key_str } { \@currname }
+ }
+ }
+ \cs_set_protected:Npn \@@_option_end:
+ { \keys_define:nn {#1} { unknown .undefine: } }
+ }
+ \bool_set_true:N \l_@@_options_loading_bool
+ \keys_set:nV {#1} \l_@@_options_clist
+ \bool_set_false:N \l_@@_options_loading_bool
+ \AtEndOfPackage { \cs_set_eq:NN \@unprocessedoptions \scan_stop: }
+ \@@_option_end:
+ \@@_options_loaded:n {#1}
+ }
+\msg_new:nnnn { keys } { option-unknown }
+ { Unknown~option~'#1'~for~package~#2. }
+ {
+ LaTeX~has~been~asked~to~set~an~option~called~'#1'~
+ but~the~#2~package~has~not~created~an~option~with~this~name.
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_options_global:n}
+% \changes{v1.0f}{2022/03/18}{Simplify to always cover global options}
+% Global (class) options are handled differently for \LaTeXe{} packages
+% and classes. Hence this function is essentially a check on the current
+% file type. The initial test is needed as \LaTeXe{} allows variables to
+% be equal to \cs{scan_stop:}, which is usually forbidden in \pkg{expl3}
+% code.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options_global:n #1
+ {
+ \cs_if_eq:NNF \@classoptionslist \scan_stop:
+ {
+ \cs_if_eq:NNTF \@currext \@clsextension
+ { \@@_options_class:n {#1} }
+ { \@@_options_package:n {#1} }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_options_class:n}
+% For classes, each option (stripped of any content after |=|)
+% is checked for existence as a key. If found, the option is added to
+% the combined list for processing. On the other hand, unused options
+% are stored up in \cs{@unusedoptionlist}. Before any of that, though,
+% there is a simple check to see if there is an |unknown| key. If there
+% is, then \emph{everything} will match and the mapping can be skipped.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options_class:n #1
+ {
+ \cs_if_free:cF { opt@ \@currname . \@currext }
+ {
+ \keys_if_exist:nnTF {#1} { unknown }
+ {
+ \clist_put_right:Nv \l_@@_options_clist
+ { opt@ \@currname . \@currext }
+ }
+ {
+ \clist_map_inline:cn { opt@ \@currname . \@currext }
+ {
+ \keys_if_exist:neTF
+ {#1} { \@@_remove_equals:n {##1} }
+ { \clist_put_right:Nn \l_@@_options_clist {##1} }
+ { \clist_put_right:Nn \@unusedoptionlist {##1} }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_options_package:n}
+% For global options when processing a package, the tasks are slightly
+% different from those for a class. The check is the same, but here
+% there is nothing to do if the option is not applicable. Each valid
+% option also needs to be removed from \cs{@unusedoptionlist}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options_package:n #1
+ {
+ \clist_map_inline:Nn \@classoptionslist
+ {
+ \keys_if_exist:neT {#1} { \@@_remove_equals:n {##1} }
+ {
+ \clist_put_right:Nn \l_@@_options_clist {##1}
+ \clist_remove_all:Nn \@unusedoptionlist {##1}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_options_local:}
+% If local options are found, the are added to the processing list.
+% \LaTeXe{} stores options for each file in a macro which may or may not
+% exist, hence the need to use \cs{cs_if_exist:c}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options_local:
+ {
+ \cs_if_eq:NNF \@currext \@clsextension
+ {
+ \cs_if_exist:cT { opt@ \@currname . \@currext }
+ {
+ \clist_put_right:Nv \l_@@_options_clist
+ { opt@ \@currname . \@currext }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_remove_equals:n}
+% \begin{macro}[EXP]{\@@_remove_equals:w}
+% As the name suggests, this is a simple function to remove an equals
+% sign from the input. This is all wrapped up in an \texttt{n} function
+% so that there will always be a sign available.
+% \begin{macrocode}
+\cs_new:Npn \@@_remove_equals:n #1
+ { \@@_remove_equals:w #1 = \s_@@_stop }
+\cs_new:Npn \@@_remove_equals:w #1 = #2 \s_@@_stop { \exp_not:n {#1} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The document interfaces}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \keys_define:nn { nx }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_options_expand_module:Nn}
+% \changes{v1.0e}{2022/02/21}
+% {Faster approach to module expansion}
+% \begin{macro}{\@@_options_expand_module:nN}
+% To deal with active characters inside the module argument whilst also
+% expanding that argument, we use a combination of \texttt{c}- and
+% \texttt{f}-type expansion. This works as the definitions for active
+% UTF-8 bytes contain an \cs{ifincsname} test.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options_expand_module:Nn #1#2
+ {
+ \cs:w @@_options_expand_module:nN \use:e { \cs_end: {#2} } #1
+ }
+\cs_new_protected:Npn \@@_options_expand_module:nN #1#2
+ { #2 {#1} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\DeclareKeys}
+% \changes{v1.0c}{2022/02/15}{Expand module argument}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
+% Defining key options is quite straight-forward: we have an intermediate
+% function to allow for potential set-up steps.
+% \begin{macrocode}
+\NewDocumentCommand \DeclareKeys { O { \@currname } +m }
+ { \@@_options_expand_module:Nn \keys_define:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DeclareUnknownKeyHandler}
+% \changes{v1.0c}{2022/02/15}{Added \cs{DeclareUnknownKeysHandler}}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
+% \changes{v1.0d}{2022/02/16}
+% {Rename \cs{DeclareUnknownKeysHandler} to \cs{DeclareUnknownKeyHandler}}
+% \begin{macrocode}
+\NewDocumentCommand \DeclareUnknownKeyHandler { O { \@currname } +m }
+ {
+ \cs_set_protected:cpn { @@_unknown_handler_ #1 :nn } ##1##2 {#2}
+ \@@_options_expand_module:Nn \keys_define:nx {#1}
+ {
+ unknown .code:n =
+ \exp_not:N \exp_args:NV
+ \exp_not:c { @@_unknown_handler_ #1 :nn }
+ \exp_not:N \l_keys_key_str {####1}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ProcessKeyOptions}
+% \changes{v1.0c}{2022/02/15}{Expand module argument}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
+% \changes{v1.0f}{2022/03/18}{Remove \cs{ProcessKeyPackageOptions}}
+% We need to deal with the older interface from \pkg{l3keys2e} here: it had
+% a mandatory argument. We can mop that up using a look-ahead, and then
+% exploit that information to determine whether the package option handling
+% is set up for the new approach for clash handling.
+% \begin{macrocode}
+\NewDocumentCommand \ProcessKeyOptions { O { \@currname } }
+ { \@@_options:n {#1} }
+\@onlypreamble \ProcessKeyOptions
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Option usage scope}
+%
+% \begin{macro}{\@@_options_loaded:n}
+% \begin{macro}{\@@_options_loaded:nn}
+% Indicates that the load-time options for a package have been processed:
+% once this has happened, make them unavailable either with a warning or
+% an error.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_options_loaded:n #1
+ {
+ \prop_get:NnNT \l_keys_usage_load_prop {#1} \l_@@_tmpa_tl
+ {
+ \clist_map_inline:Nn \l_@@_tmpa_tl
+ {
+ \keys_define:nn {#1}
+ {
+ ##1 .code:n =
+ \@@_options_loaded:nn {#1} {##1}
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_options_loaded:nn #1#2
+ {
+ \bool_if:NTF \l_@@_options_loading_bool
+ {
+ \msg_warning:nnxx { keys } { load-option-ignored }
+ { \use:c { opt@fam@\@currname.\@currext } } {#2}
+ }
+ { \msg_error:nnnn { keys } { load-only } {#1} {#2} }
+ }
+\msg_new:nnn { keys } { load-option-ignored }
+ { Package~"#1"~has~already~been~loaded:~ignoring~load-time~option~"#2". }
+\msg_new:nnnn { keys } { load-only }
+ { Key~"#2"~may~only~be~used~in~the~during~loading~of~package~"#1". }
+ {
+ LaTeX~was~asked~to~set~a~key~called~"#2",~but~this~is~only~allowed~
+ in~the~optional~argument~when~loading~package~"#1".
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Disable all preamble options in one shot.
+% \begin{macrocode}
+\tl_gput_left:Nn \@kernel@after@begindocument
+ {
+ \prop_map_inline:Nn \l_keys_usage_preamble_prop
+ {
+ \clist_map_inline:nn {#2}
+ {
+ \keys_define:nn {#1}
+ {
+ ##1 .code:n =
+ \msg_error:nnn { keys } { preamble-only } {##1}
+ }
+ }
+ }
+ }
+\msg_new:nnnn { keys } { preamble-only }
+ { Key~"#1"~may~only~be~used~in~the~preamble. }
+ {
+ LaTeX~was~asked~to~set~a~key~called~"#1",~but~this~is~only~allowed~
+ before~\begin{document}.~You~will~need~to~set~the~key~earlier.
+ }
+% \end{macrocode}
+%
+% \subsection{General key setting}
+%
+% \begin{macro}{\SetKeys}
+% \changes{v1.0c}{2022/02/15}{Expand module argument}
+% \changes{v1.0d}{2022/02/16}{Allow for active characters in module argument}
+% A simple wrapper.
+% \begin{macrocode}
+\NewDocumentCommand \SetKeys { O { \@currname } +m }
+ { \@@_options_expand_module:Nn \keys_set:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
diff --git a/macros/latex/base/ltlength.dtx b/macros/latex/base/ltlength.dtx
index 1be147547e..f979dd4e23 100644
--- a/macros/latex/base/ltlength.dtx
+++ b/macros/latex/base/ltlength.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -83,7 +83,7 @@
% \DescribeMacro{\settodepth}
% Set the length, |#1| to the depth of a box containing |#2|.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
diff --git a/macros/latex/base/ltlists.dtx b/macros/latex/base/ltlists.dtx
index fecb312588..d0413dad08 100644
--- a/macros/latex/base/ltlists.dtx
+++ b/macros/latex/base/ltlists.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -135,7 +135,7 @@
% when it occurs immediately after an |\item| command in an enclosing
% list.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v1.0a}{1994/03/07}{Initial version, split from latex.dtx}
diff --git a/macros/latex/base/ltlogos.dtx b/macros/latex/base/ltlogos.dtx
index 132eaf636f..56453f73db 100644
--- a/macros/latex/base/ltlogos.dtx
+++ b/macros/latex/base/ltlogos.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -65,7 +65,7 @@
%
% Various logos are defined here.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macro}{\TeX}
% The \TeX{} logo, adjusted so that a full stop after the logo
diff --git a/macros/latex/base/ltluatex.dtx b/macros/latex/base/ltluatex.dtx
index 258ac48297..18623fd677 100644
--- a/macros/latex/base/ltluatex.dtx
+++ b/macros/latex/base/ltluatex.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015-2021
+% Copyright (C) 2015-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -28,7 +28,7 @@
\ProvidesFile{ltluatex.dtx}
%</driver>
%<*tex>
-[2021/10/15 v1.1v
+[2021/12/27 v1.1x
%</tex>
%<plain> LuaTeX support for plain TeX (core)
%<*tex>
@@ -120,6 +120,17 @@
% tables from $1$ so |\luafunction0| is not available).
%
% \noindent
+% \DescribeMacro{\newluacmd}
+% |\newluadef{|\meta{function}|}|\\
+% Like \cs{newluafunction}, but defines the command using \cs{luadef}
+% instead of just assigning an integer.
+%
+% \noindent
+% \DescribeMacro{\newprotectedluacmd}
+% |\newluadef{|\meta{function}|}|\\
+% Like \cs{newluacmd}, but the defined command is not expandable.
+%
+% \noindent
% \DescribeMacro{\newwhatsit}
% |\newwhatsit{|\meta{whatsit}|}|\\
% Defines a custom \cs{whatsit}, indexed from~$1$.
@@ -380,7 +391,7 @@
%
% \endgroup
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Implementation}
%
@@ -722,6 +733,22 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\newluacmd, \newprotectedluacmd}
+% \changes{v1.1x}{2021/12/27}{Macros added}
+% Additionally two variants are provided to make the passed control
+% sequence call the function directly.
+% \begin{macrocode}
+\def\newluacmd{%
+ \e@alloc\luafunction\luadef
+ \e@alloc@luafunction@count\m@ne\e@alloc@top
+}
+\def\newprotectedluacmd{%
+ \e@alloc\luafunction{\protected\luadef}
+ \e@alloc@luafunction@count\m@ne\e@alloc@top
+}
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Custom whatsits}
%
% \begin{macro}{\newwhatsit}
@@ -1351,6 +1378,8 @@ local callbacktypes = callbacktypes or {
% \changes{v1.1k}{2019/10/02}{mlist\_to\_hlist is \texttt{exclusive}}
% \changes{v1.1l}{2020/02/02}{post\_linebreak\_filter is \texttt{reverselist}}
% \changes{v1.1p}{2020/08/01}{new\_graf is \texttt{exclusive}}
+% \changes{v1.1w}{2021/11/17}{hpack\_quality is \texttt{exclusive}}
+% \changes{v1.1w}{2021/11/17}{vpack\_quality is \texttt{exclusive}}
% \begin{macrocode}
contribute_filter = simple,
buildpage_filter = simple,
@@ -1361,8 +1390,8 @@ local callbacktypes = callbacktypes or {
post_linebreak_filter = reverselist,
hpack_filter = list,
vpack_filter = list,
- hpack_quality = list,
- vpack_quality = list,
+ hpack_quality = exclusive,
+ vpack_quality = exclusive,
pre_output_filter = list,
process_rule = exclusive,
hyphenate = simple,
@@ -1516,11 +1545,11 @@ end
% Handler for |list| callbacks.
% \changes{v1.0k}{2015/12/02}{resolve name and i.description (PHG)}
% \changes{v1.1s}{2020/12/02}{Fix return value of list callbacks}
+% \changes{v1.1w}{2021/11/17}{Never pass on \texttt{true} return values for list callbacks}
% \begin{macrocode}
local function list_handler(name)
return function(head, ...)
local ret
- local alltrue = true
for _,i in ipairs(callbacklist[name]) do
ret = i.func(head, ...)
if ret == false then
@@ -1531,18 +1560,17 @@ local function list_handler(name)
return false
end
if ret ~= true then
- alltrue = false
head = ret
end
end
- return alltrue and true or head
+ return head
end
end
% \end{macrocode}
% Default for user-defined |list| and |reverselist| callbacks without explicit default.
% \begin{macrocode}
-local function list_handler_default()
- return true
+local function list_handler_default(head)
+return head
end
% \end{macrocode}
% Handler for |reverselist| callbacks.
@@ -1551,7 +1579,6 @@ end
local function reverselist_handler(name)
return function(head, ...)
local ret
- local alltrue = true
local callbacks = callbacklist[name]
for i = #callbacks, 1, -1 do
local cb = callbacks[i]
@@ -1564,11 +1591,10 @@ local function reverselist_handler(name)
return false
end
if ret ~= true then
- alltrue = false
head = ret
end
end
- return alltrue and true or head
+ return head
end
end
% \end{macrocode}
@@ -1899,14 +1925,10 @@ callback_register("mlist_to_hlist", function(head, display_type, need_penalties)
if current == false then
flush_list(head)
return nil
- elseif current == true then
- current = head
end
current = call_callback("mlist_to_hlist", current, display_type, need_penalties)
local post = call_callback("post_mlist_to_hlist_filter", current, display_type, need_penalties)
- if post == true then
- return current
- elseif post == false then
+ if post == false then
flush_list(current)
return nil
end
diff --git a/macros/latex/base/ltluatex.pdf b/macros/latex/base/ltluatex.pdf
index d5d63450a3..613b669f2f 100644
--- a/macros/latex/base/ltluatex.pdf
+++ b/macros/latex/base/ltluatex.pdf
Binary files differ
diff --git a/macros/latex/base/ltmarks-code.pdf b/macros/latex/base/ltmarks-code.pdf
new file mode 100644
index 0000000000..719155ba02
--- /dev/null
+++ b/macros/latex/base/ltmarks-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltmarks-code.tex b/macros/latex/base/ltmarks-code.tex
new file mode 100644
index 0000000000..7a3b9173bb
--- /dev/null
+++ b/macros/latex/base/ltmarks-code.tex
@@ -0,0 +1,5 @@
+% This will typeset documentation + code
+%
+
+\AtBeginDocument{\AlsoImplementation}
+\input{ltmarks.dtx}
diff --git a/macros/latex/base/ltmarks-doc.pdf b/macros/latex/base/ltmarks-doc.pdf
new file mode 100644
index 0000000000..b329ad81df
--- /dev/null
+++ b/macros/latex/base/ltmarks-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltmarks-doc.tex b/macros/latex/base/ltmarks-doc.tex
new file mode 100644
index 0000000000..8a62bb95c6
--- /dev/null
+++ b/macros/latex/base/ltmarks-doc.tex
@@ -0,0 +1,8 @@
+% This will typeset only documentation but not the code
+%
+
+\AtBeginDocument{\OnlyDescription
+% \let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
+ }
+\input{ltmarks.dtx}
diff --git a/macros/latex/base/ltmarks.dtx b/macros/latex/base/ltmarks.dtx
new file mode 100644
index 0000000000..3dc4b493ac
--- /dev/null
+++ b/macros/latex/base/ltmarks.dtx
@@ -0,0 +1,1649 @@
+% \iffalse meta-comment
+%
+%% File: ltmarks.dtx (C) Copyright 2022
+% Frank Mittelbach, LaTeX Team
+%
+% 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
+%
+%
+%%% From File: ltmarks.dtx
+%
+% \begin{macrocode}
+\def\ltmarksversion{v1.0d}
+\def\ltmarksdate{2022/06/01}
+% \end{macrocode}
+%<*driver>
+\documentclass{l3doc}
+
+%\usepackage{ltmarks}
+
+% Fixing footnotes in functions and variables: this should be in l3doc!
+
+\newcommand\fixfootnote[2]{\footnotemark
+ \AddToHookNext{env/#1/after}{\footnotetext{#2}}}
+\AddToHook{env/function/begin}{\def\footnote{\fixfootnote{function}}}
+\AddToHook{env/variable/begin}{\def\footnote{\fixfootnote{variable}}}
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltmarks.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \providecommand\hook[1]{\texttt{#1}}
+% \providecommand\env[1]{\texttt{#1}}
+%
+%
+%
+% \title{The \texttt{ltmarks.dtx} code\thanks{This file has version
+% \ltmarksversion\ dated \ltmarksdate, \copyright\ \LaTeX\
+% Project.}}
+% \author{^^A
+% Frank Mittelbach, \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \maketitle
+%
+%
+% \begin{abstract}
+% Marks are used to communicate information about the content of a
+% page to the output routine. For example, in order to construct
+% running headers, the output routine needs information about which
+% section names are present on a page, and this information is
+% passed to it through the mark system. However, marks may also be
+% used for other purposes. This module provides a generalized
+% mechanism for marks of independent classes.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% ^^A \begin{documentation}
+%
+% \section{Introduction}
+%
+% The \TeX{} engines offer a low-level mark mechanism to
+% communicate information about the content of the current page to
+% the asynchronous operating output routine. It works by placing
+% \cs{mark} commands into the source document. When the material
+% for the current page is assembled in box 255, \TeX{} scans for
+% such marks and sets the commands \cs{topmark}, \cs{firstmark} and
+% \cs{botmark}. The \cs{firstmark} receives the content of the
+% first \cs{mark} seen in box 255 and \cs{botmark} the content of
+% the last mark seen. The \cs{topmark} holds the content of the
+% last mark seen on the previous page or more exactly the value of
+% \cs{botmark} from the previous page. If there are no marks on
+% the current page then all three are made equal to the
+% \cs{botmark} from the previous page.
+%
+% This mechanism works well for simple formats (such as plain \TeX)
+% whose output routines are only called to generate pages. It
+% fails, however, in \LaTeX{} (and other more complex formats),
+% because here the output routine is sometimes called without
+% producing a page, e.g., when encountering a float and placing it
+% into one of the float regions. In that case the output routine is
+% called, determines where to place the float, alters the goal for
+% assembling text material (if the float was added to the top or
+% bottom region) and then it resumes collecting textual material.
+%
+% As a result the \cs{botmark} gets updated and so \cs{topmark} no
+% longer reflects the situation at the top of the next page when that
+% page is finally boxed.
+%
+% Another problem for \LaTeX{} was that it wanted to use several
+% \enquote{independent} marks and in the early implementations of
+% \TeX{} there was only a single \cs{mark} command available.
+% For that reason \LaTeX{} implemented its own mark
+% mechanism where the marks always contained two parts with their
+% own interfaces: \cs{markboth} and \cs{markright} to set marks and
+% \cs{leftmark} and \cs{rightmark} to retrieve them.
+%
+% However, this extended mechanism (while supporting scenarios such
+% as chapter/section marks) was far from general. The mark
+% situation at the top of a page (i.e., \cs{topmark}) remained
+% unusable and the two marks offered were not really independent of
+% each other because \cs{markboth} (as the name indicates) was
+% always setting both.
+%
+% The new mechanism overcomes both
+% issues:
+% \begin{itemize}
+% \item
+% It provides arbitrarily many, fully independent named marks, that
+% can be allocated and, from that point onwards, used.
+% \item
+% It offers access for each such marks to retrieve its top,
+% first, and bottom values separately.
+% \item
+% Furthermore, the mechanism is augmented to give access to marks
+% in different \enquote{regions} which may not be just full pages.
+% \end{itemize}
+%
+%
+% \section{Design-level and code-level interfaces}
+%
+% The interfaces are mainly meant for package developers, but they
+% are usable (with appropriate care) also in the document
+% preamble, for example, when setting up special running headers
+% with \pkg{fancyhdr}, etc. They are therefore available both as
+% CamelCase commands as well as commands for use in the L3
+% programming layer. Both are described together below.
+%
+% \begin{function}{\NewMarkClass,\mark_new_class:n}
+% \begin{syntax}
+% \cs{NewMarkClass} \Arg{class}
+% \cs{mark_new_class:n} \Arg{class}
+% \end{syntax}
+% Declares a new \meta{class} of marks to be tracked by \LaTeX{}. Each \meta{class}
+% must be declared before it is used.
+%
+% Mark classes can only be declared before \verb=\begin{document}=.
+% \end{function}
+%
+% \begin{function}{\InsertMark,\mark_insert:nn}
+% \begin{syntax}
+% \cs{InsertMark} \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}.
+%
+% It has no effect in places in which you can't place floats, e.g.,
+% a mark inside a box or inside a footnote never shows up anywhere.
+%
+% If used in vertical mode it obeys \LaTeX's internal
+% \cs{@nobreak} switch, i.e., it does not introduce a
+% breakpoint if used after a heading. If used in horizontal mode it
+% doesn't handle spacing (like, for example, \cs{index} or
+% \cs{label} does, so it should be attached to material that is
+% typeset.
+% \end{function}
+%
+% \begin{variable}{insertmark}
+% \begin{syntax}
+% \cs{AddToHook} \texttt{\{insertmark\}} \Arg{code}
+% \end{syntax}
+% When marks are inserted, the mark content may need some special
+% treatment, e.g., by default \cs{label}, \cs{index}, and
+% \cs{glossary} do not expand at this time (but only later if and when the
+% mark content is actually used.
+% In order to allow packages to augment or alter this setup there is
+% a public hook \hook{insertmark} that is executed at this point. It
+% runs in a group so local modification to commands are only applied
+% to the \meta{text} argument of \cs{InsertMark} or \cs{mark_insert:nn}.
+% \end{variable}
+%
+% \begin{function}[EXP]{\TopMark, \FirstMark, \LastMark,
+% \mark_use_top:nn,\mark_use_first:nn,\mark_use_last:nn,}
+% \begin{syntax}
+% \cs{TopMark} \oarg{region} \Arg{class}
+% \cs{FirstMark} \oarg{region} \Arg{class}
+% \cs{LastMark} \oarg{region} \Arg{class}
+% \cs{mark_use_top:nn} \Arg{region} \Arg{class}
+% \cs{mark_use_first:nn} \Arg{region} \Arg{class}
+% \cs{mark_use_last:nn} \Arg{region} \Arg{class}
+% \end{syntax}
+% These functions expand to the appropriate mark \meta{text} for
+% the given \meta{class} in the specified \meta{region}.
+% The default \meta{region} in the design-level commands is \texttt{page}.
+% Note that with the L3 layer commands there are no
+% optional arguments, i.e., both arguments have to be provided.
+% \begin{texnote}
+% The result is returned within the \tn{unexpanded}
+% primitive (\cs{exp_not:n}), which means that the \meta{text}
+% does not expand further when appearing in an \texttt{x}-type
+% or \texttt{e}-type argument expansion.
+% \end{texnote}
+%
+% The \enquote{first} and \enquote{last} marks are
+% those seen first and last in the current region/page, respectively. The
+% \enquote{top} mark is the last mark of the \meta{class} seen
+% in an earlier region, i.e., the \meta{text} what would be \enquote{current} at the
+% very top of the region.
+%
+% \noindent\llap{\bfseries Important!\qquad}\indent
+% The commands are only meaningful inside the output routine, in
+% other places their result is (while not random) unpredictable due
+% to the way \LaTeX{} cuts text material into pages.
+%% \end{function}
+%
+%
+%
+% Currently, \meta{region} is one of
+% \texttt{page},
+% \texttt{previous-page},
+% \texttt{column}, and
+% \texttt{previous-column}.
+% If a page has just been finished then the region \texttt{page}
+% refers to the current page and \texttt{previous-page}, as the name
+% indicates, to the page that has been finished previously. This
+% means you are able to access mark information for the current page
+% as well as for the page before if you are inside the output
+% routine, without the need to explicitly save that information
+% beforehand.
+%
+% In single column documents the \texttt{column} is the same as the
+% \texttt{page} region, but in two-column documents, \texttt{column}
+% refers to the current column that just got finished and
+% \text{previous-column} to the one previously finished. Code for
+% running headers are (in standard \LaTeX{}) only evaluated when
+% both columns are assembled, which is another way of saying that in
+% that case \texttt{previous-column} refers to the left column and
+% \texttt{column} to the right column.
+% However, to make this a bit nicer to access, there are also alias
+% regions named \texttt{first-column} and
+% \texttt{last-column}\footnote{This is called \enquote{last} not \enquote{second}
+% in anticipation of extending the mechanism to multiple columns,
+% where first and last would still make sense.} to
+% access these regions.\footnote{At the moment there aren't any
+% \texttt{previous-...-column} regions to access the columns from
+% the previous page. If necessary, the mechanism could be
+% easily augmented to cover them too, though.}
+%
+% Note that you can only look backwards at already processed regions,
+% e.g., in a \texttt{twoside} document finishing a recto (odd,
+% right-hand) page you can access the data from the facing verso
+% (left-hand) page, but if you are finishing a left-hand page you
+% can't integrate data from the upcoming right-hand page. If such a
+% scenario needs to be realized then it is necessary to save the
+% left-hand page temporarily instead of finalizing it, process
+% material for the right-hand page and once both are ready, attach
+% running headers and footers and shipout out both in one
+% go.\footnote{As of now that scenario is not yet officially supported.}
+%
+% \begin{function}[EXP]{\IfMarksEqualTF,\mark_if_eq:nnnnTF,\mark_if_eq:nnnnnnTF}
+% \begin{syntax}
+% \cs{IfMarksEqualTF} \oarg{region} \Arg{class} \Arg{pos_1} \Arg{pos_2} \Arg{true} \Arg{false}
+% \cs{mark_if_eq:nnnnTF} \Arg{region} \Arg{class} \Arg{pos_1} \Arg{pos_2} \Arg{true} \Arg{false}
+% \cs{mark_if_eq:nnnnnnTF} \Arg{region_1} \Arg{class_1} \Arg{pos_1}
+% \verb= = \Arg{region_2} \Arg{class_2} \Arg{pos_2} \Arg{true} \Arg{false}
+% \end{syntax}
+% These conditionals allow you to compare the content of two marks
+% and act based on the result. The commands work in an expansion
+% context, if necessary.
+% \end{function}
+%
+% It is quite common when programming with marks to need to
+% interrogate conditions such as whether marks have appeared on a
+% previous page, or if there are multiple marks present on the
+% current page, and so on.
+% The tests above allow for the construction of a variety of
+% typical test scenarios, with three examples presented below.
+%
+% The first two conditionals cover only the common scenarios. Both
+% marks are picked up from the same \meta{region} (by default
+% \texttt{page}) and they have to be of the same
+% \meta{class}.\footnote{If an undeclared mark class is used the
+% tests return \emph{true} (not an error).}
+% The \meta{pos\textsubscript{\itshape i}} argument can be either
+% \texttt{top}, \texttt{first}, or \texttt{last}.
+%
+% If you wish to compare marks across different regions or across
+% different classes, you have to do it using the generic test only
+% available in the L3 programming layer or do it manually, i.e.,
+% get the marks and then compare the values yourself.\footnote{If
+% two undeclared mark classes are compared the result is always
+% \emph{true}; if a declared and an undeclared mark class is used
+% it is always \emph{false}.}
+%
+% 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
+% page:]
+%
+% If the first and last mark in a region are the same then
+% either there was no mark at all, or there was at most one. To test
+% this on the current page:
+%\begin{verbatim}
+% \NewMarkClass{myclass}
+% \IfMarksEqualTF{myclass}{first}{last}
+% { <zero or one mark> }{ <two or more marks> }
+%\end{verbatim}
+%
+% \item[Test for no mark of class \texttt{myclass} in the previous
+% page:]
+%
+% If the top mark is the same as the first mark, there is no mark
+% in the region at all. If we wanted to do this test for the
+% previous page:
+%\begin{verbatim}
+% \IfMarksEqualTF[previous-page]{myclass}{top}{first}
+% { <no marks> }{ <at least one mark> }
+%\end{verbatim}
+% Comparing \texttt{top} and \texttt{last} would give you the
+% same result.
+%
+% \item[Test for zero, one, or more than one:]
+%
+% Combining the two tests from above you can test for zero, one
+% or more than one mark.
+%\begin{verbatim}
+% \IfMarksEqualTF{myclass}{top}{first}
+% { <no marks> }
+% {\IfMarksEqualTF{myclass}{first}{last}
+% { <exactly one mark> }{ <more than one mark> }}
+%\end{verbatim}
+%
+% \end{description}
+%
+% If you need one of such tests more often (or if you want a separate
+% command for it for readability), then consider defining:
+%\begin{verbatim}
+% \providecommand\IfNoMarkTF[2][page]{\IfMarksEqualTF[#1]{#2}{first}{last}}
+%\end{verbatim}
+%
+%
+%
+% \subsection{Debugging mark code}
+%
+%
+% \begin{function}{\DebugMarksOn,\DebugMarksOff,
+% \mark_debug_on:,\mark_debug_off:}
+% \begin{syntax}
+% \cs{DebugMarksOn} ... \cs{DebugMarksOff}
+% \end{syntax}
+%
+% Commands to turn the debugging of mark code on or off. The
+% debugging output is rather coarse and not really intended for
+% normal use at this point in time.
+%
+% \end{function}
+%
+%
+%
+% \section{Application examples}
+%
+% If you want to figure out if a break was taken at a specific point,
+% e.g., whether a heading appears at the top of the page,
+% you can do something like this:
+%\begin{verbatim}
+% \newcounter{breakcounter}
+% \NewMarkClass{break}
+% \newcommand\markedbreak[1]{\stepcounter{breakcounter}%
+% \InsertMark{break}{\arabic{breakcounter}%
+% \penalty #1\relax
+% \InsertMark{break}{-\arabic{breakcounter}}
+%\end{verbatim}
+% To test if the break was taken you can test if
+% \verb=\TopMark{break}= is positive (taken) or negative (not taken)
+% or zero (there was never any marked break so far).
+% The absolute value can be used to keep track of which break it
+% was (with some further coding).
+%
+%
+% \emph{to be extended with additional application examples}
+%
+%
+%
+% \section{Legacy \LaTeXe{} interface}
+%
+% Here we describe the interfaces that \LaTeXe{} offered since the
+% early nineties and some minor extensions.
+%
+% \subsection{Legacy design-level and document-level interfaces}
+%
+% \begin{function}{\markboth, \markright}
+% \begin{syntax}
+% \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}
+% and a \enquote{right} mark generated by the second argument of
+% \cs{markboth} or by the only argument of \cs{markright}. The
+% command \cs{markboth} and \cs{markright} are in turn called from
+% heading commands such as \cs{chaptermark} or \cs{sectionmark} and
+% their behavior is controlled by the document class.
+%
+% For example, in the \cls{article} class with \texttt{twoside} in
+% force the \cs{sectionmark} will issue \cs{markboth} with an empty
+% second argument and \cs{subsectionmark} will issue
+% \cs{markright}. As a result the left mark will contain chapter
+% titles and the right mark subsection titles.
+%
+% Note, however, that in one-sided documents the standard behavior is
+% that only \cs{markright} is used, i.e., there will only be
+% right-marks but no left marks!
+% \end{function}
+%
+% \begin{function}[EXP]{\leftmark, \rightmark}
+% \begin{syntax}
+% \cs{leftmark}
+% \cs{rightmark}
+% \end{syntax}
+% These functions return the appropriate mark value from the current page
+% and work as before, that is \cs{leftmark} will get the last (!)
+% left mark from the page and \cs{rightmark} the first (!) right
+% mark.
+%
+% In other words they work reasonably well if you want to show the
+% section title that is current when you are about to turn the page and
+% also show the first subsection title on the current page (or the last
+% from the previous page if there wasn't one). Other combinations
+% can't be shown using this interface.
+%
+% The commands are fully expandable, because this is how they have
+% been always defined in \LaTeX{}. However, this is of course
+% only true if the content of the mark they return is itself
+% expandable and does not contain any fragile material. Given that
+% this can't be guaranteed for arbitrary content, a programmer using
+% them in this way should use \cs{protected@edef} and \emph{not}
+% \cs{edef} to avoid bad surprises as far as this is possible, or use
+% the new interfaces (\cs{TopMark}, \cs{FirstMark}, and \cs{LastMark})
+% which return the \meta{text} in \cs{exp_not:n} to prevent
+% uncontrolled expansion.
+% \end{function}
+%
+%
+% \subsection{Legacy interface extensions}
+%
+% The new implementation adds three mark classes: \texttt{2e-left},
+% \texttt{2e-right} and \texttt{2e-right-nonempty} and patches
+% \cs{markboth} and \cs{markright} slightly so that they also update
+% these new mark classes, so that the new classes work with existing
+% document classes.
+%
+% As a result you can use \verb=\LastMark{2e-left}= and
+% \verb=\FirstMark{2e-right}= instead of \cs{leftmark} and
+% \cs{rightmark}. But more importantly, you can use any of the other
+% retrieval commands to get a different status value from those
+% marks, e.g., \verb=\LastMark{2e-right}= would return the last
+% subsection on the page (instead of the first as
+% returned by \cs{rightmark}).
+%
+% The difference between \texttt{2e-right} and
+% \texttt{2e-right-nonempty} is that the latter will only be updated
+% if the material for the mark is not empty. Thus
+% \verb=\markboth{title}{}= as issued by, say, \cs{sectionmark},
+% sets a \texttt{2e-left} mark with \texttt{title} and a
+% \texttt{2e-right} mark with the empty string but does not add a
+% \texttt{2e-right-nonempty} mark.
+%
+% Thus, if you have a section at the start of a page and you would
+% ask for \verb=\FirstMark{2e-right}= you would get an empty string
+% even if there are subsections on that page. But
+% \texttt{2e-right-nonempty} would then give you the first or last subsection
+% on that page. Of course, nothing is simple. If there are no
+% subsections it would tell you the last subsection from an earlier
+% page. We therefore need comparison tools, e.g., if top and
+% first are identical you know that the value is
+% bogus, i.e., a suitable implementation would be
+%\begin{verbatim}
+% \IfMarksEqualTF{2e-right-nonempty}{top}{first}
+% { <appropriate action if there was no real mark> }
+% {\FirstMark{2e-right-nonempty}}
+%\end{verbatim}
+%
+%
+%
+% \section{Notes on the mechanism}
+%
+% In contrast to vanilla \TeX, \eTeX{} extends the mark system to
+% allow multiple independent marks. However, it does not solve the
+% \cs{topmark} problem which means that \LaTeX{} still needs to manage
+% marks almost independently of \TeX{}. The reason for this is that
+% the more complex output routine used by \LaTeX{} to handle floats
+% (and related structures) means that \tn{topmark(s)} remain
+% unreliable. Each time the output routine is fired up, \TeX{} moves
+% \tn{botmark} to \tn{topmark}, and while \eTeX{} extends this to
+% multiple registers the fundamental concept remains the same. That
+% means that the state of marks needs to be tracked by \LaTeX{}
+% itself. An early implementation of this package used \TeX{}'s
+% \tn{botmark} only to ensure the correct interaction with the output
+% routine (this was before the \eTeX{} mechanism was even
+% available). However, other than in a prototype implementation for
+% \LaTeX3, this package was never made public.
+%
+% The new implementation now uses \eTeX{}'s marks as they have some
+% advantages, because with them we can leave the mark text within the
+% galley and only extract the marks during the output routine when we
+% are finally shipping out a page or storing away a column for use in
+% the next page. That means we do not have to maintain a global data
+% structure that we have to keep in sync with informational marks in
+% the galley but can rely on everything being in one place and thus
+% manipulations (e.g.~reordering of material) will take the marks with
+% them without a need for updating a fragile linkage.
+
+% To allow for completely independent marks we use the following
+% procedure:
+% \begin{itemize}
+% \item
+%
+% For every type of marks we allocate a mark class so
+% that in the output routine \TeX{} can calculate for each class
+% the current
+% top, first, and bottom mark independently. For this we use
+% \cs{newmarks}, i.e., one marks register per class.
+%
+% \item
+%
+% As already mentioned firing up an output routine without
+% shipping out a page means that \TeX's top marks get wrong so it
+% is impossible to rely on \TeX's approach directly. What we do
+% instead is to keep track of the real marks (for the last page or
+% more generally last region) in some global variables.
+%
+% \item
+%
+% These variables are updated in the output routine at defined
+% places, i.e., when we do real output processing but not if we
+% use special output routines to do internal housekeeping.
+%
+% \item
+%
+% The trick we use to get correctly updated variables is the
+% following: the material that contains new marks (for example the
+% page to be shipped out) is stored in a box. We then use \TeX{}
+% primitive box splitting functions by splitting off the largest
+% amount possible (which should be the whole box if nothing goes
+% really wrong). While that seems a rather pointless thing to do, it
+% has one important side effect: \TeX{} sets up first and bottom
+% marks for each mark class from the material it has split off. This
+% way we get the first and last marks (if there have been any) from
+% the material in the box.
+%
+% \item
+%
+% The top marks are simply the last marks from the previous
+% page or region. And if there hasn't been a first or bottom mark in
+% the box then the new top mark also becomes new first and last mark
+% for that class.
+%
+% \item
+%
+% That mark data is then stored in global token lists for use
+% during the output routine and legacy commands such as
+% \cs{leftmark} or new commands such as \cs{TopMark} simply access
+% the data stored in these token lists.
+% \end{itemize}
+% That's about it in a nutshell. Of course, there are some details to
+% be taken care of---those are discussed in the implementation sections.
+%
+%
+% \section{Internal output routine functions}
+%
+% The functions in this section are tied to the output routine and used in the
+% interface to \LaTeXe{} and perhaps at some later time within a new
+% output routine
+% for \LaTeX. They are not meant for general use and are therefore made internal.
+% Internal means that \verb|@@| automatically gets
+% replaced in the code (and in the documentation) so we have to give
+% it a suitable value.
+% \begin{macrocode}
+%<@@=mark>
+% \end{macrocode}
+%
+% \begin{function}{\@@_update_singlecol_structures:}
+% \begin{syntax}
+% \cs{@@_update_singlecol_structures:}
+% \end{syntax}
+% \LaTeXe{} integration function in case we are doing single column
+% layouts. It assumes that the page content is already stored in
+% \cs{@outputbox} and processes the marks inside that box. It is
+% called as part of \cs{@opcol}.
+% \end{function}
+%
+%
+% \begin{function}{\@@_update_dblcol_structures:}
+% \begin{syntax}
+% \cs{@@_update_singlecol_structures:}
+% \end{syntax}
+% \LaTeXe{} integration function mark used when we are doing double
+% column documents. It assumes that the page content is already
+% stored in \cs{@outputbox} and processes the marks inside that
+% box. It then does different post-processing depending on the start
+% of the switch \cs{if@firstcolumn}. If we are in the second column
+% it also has to update page marks, otherwise it only updates column
+% marks. It too is called as part of \cs{@opcol}.
+% \end{function}
+%
+% \begin{function}{\@@_update_structure:nn}
+% \begin{syntax}
+% \cs{@@_update_structure: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
+% that to the \meta{region} given in the first argument.
+% For this it first copies the mark structure from \meta{region} to
+% \texttt{previous-}\meta{region} and then takes all last mark
+% values currently in the region and makes them the new top mark
+% values. Finally it assigns new first and last values for all mark
+% classes based on what was found in the second argument.
+%
+% As a consequence, the allowed values for \meta{region} are
+% \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
+% process material stored in boxes we need to put it unboxed (using
+% \cs{unvcopy} etc.)\ into the second argument.
+% \end{function}
+%
+%
+%
+% \begin{function}{\@@_update_structure_alias:nn}
+% \begin{syntax}
+% \cs{@@_update_structure_alias:nn} \Arg{alias} \Arg{source}
+% \end{syntax}
+% 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
+% \texttt{last-column} structures inside
+% \cs{@@_update_singlecol_structures:} or
+% \cs{@@_update_dblcol_structures:}.
+% \end{function}
+%
+%
+%
+%
+% \begin{function}{\@@_update_structure_to_err:n}
+% \begin{syntax}
+% \cs{@@_update_structure_to_err:n} \Arg{region}
+% \end{syntax}
+% Helper function that sets all mark values in the \meta{region} to
+% an error message. This is currently used for \texttt{last-column}
+% at times where using marks from it would be questionable/wrong, i.e.,
+% when we have just processed the first column in a two-column document.
+% \end{function}
+%
+%
+%
+% ^^A \end{documentation}
+%
+%
+%
+%
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+%
+%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\NewModuleRelease{2022/06/01}{ltmarks}
+%<latexrelease> {Marks~handling}
+% \end{macrocode}
+%
+% \subsection{Allocating new mark classes}
+%
+%
+% \begin{variable}{\g_@@_classes_seq}
+% A list holding all the mark classes that have been declared.
+% \begin{macrocode}
+\seq_new:N \g_@@_classes_seq
+% \end{macrocode}
+% \end{variable}
+%
+%
+%
+%
+% \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.
+% \begin{macrocode}
+\cs_new_protected:Npn \mark_new_class:n #1
+{
+ \seq_if_in:NnTF \g_@@_classes_seq {#1}
+ {
+ \msg_error:nnn { mark } { class-already-defined }
+ {#1}
+ }
+ { \@@_new_class:nn {#1} }
+}
+% \end{macrocode}
+% This is only available in the preamble.
+% \changes{v1.0c}{2022/05/06}{Wrong command made \cs{@onlypreamble}}
+% \begin{macrocode}
+\@onlypreamble \mark_new_class:n
+% \end{macrocode}
+% The internal command carries out the necessary allocations.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_class:nn #1
+{
+%<*trace>
+ \@@_debug:n { \iow_term:x { Marks:~new~mark:~#1~\msg_line_context: } }
+%</trace>
+% \end{macrocode}
+% Use the \LaTeXe{} interface for now as the L3 programming layer
+% doesn't have one for marks yet.
+% \begin{macrocode}
+ \exp_args:Nc \newmarks {c_@@_class_ #1 _mark}
+% \end{macrocode}
+% Remember the new class in the sequence.
+% \begin{macrocode}
+ \seq_gput_right:Nn \g_@@_classes_seq {#1}
+% \end{macrocode}
+% We need three token lists for each region, one for top, first,
+% and last.
+% \begin{macrocode}
+ \tl_new:c { g_@@_page_top_ #1 _tl }
+ \tl_new:c { g_@@_page_first_ #1 _tl }
+ \tl_new:c { g_@@_page_last_ #1 _tl }
+% \end{macrocode}
+% For the \texttt{page} region we also keep track of the
+% \texttt{previous-page}.
+% \begin{macrocode}
+ \tl_new:c { g_@@_previous-page_top_ #1 _tl }
+ \tl_new:c { g_@@_previous-page_first_ #1 _tl }
+ \tl_new:c { g_@@_previous-page_last_ #1 _tl }
+% \end{macrocode}
+% Same game for \texttt{column} and \texttt{previous-column}
+% \begin{macrocode}
+ \tl_new:c { g_@@_column_top_ #1 _tl }
+ \tl_new:c { g_@@_column_first_ #1 _tl }
+ \tl_new:c { g_@@_column_last_ #1 _tl }
+ \tl_new:c { g_@@_previous-column_top_ #1 _tl }
+ \tl_new:c { g_@@_previous-column_first_ #1 _tl }
+ \tl_new:c { g_@@_previous-column_last_ #1 _tl }
+% \end{macrocode}
+% But for columns we also allocate token lists for the alias
+% regions \texttt{first-column} and \texttt{last-column}.
+% \begin{macrocode}
+ \tl_new:c { g_@@_first-column_top_ #1 _tl }
+ \tl_new:c { g_@@_first-column_first_ #1 _tl }
+ \tl_new:c { g_@@_first-column_last_ #1 _tl }
+ \tl_new:c { g_@@_last-column_top_ #1 _tl }
+ \tl_new:c { g_@@_last-column_first_ #1 _tl }
+ \tl_new:c { g_@@_last-column_last_ #1 _tl }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \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
+% private global token lists.
+% \begin{macrocode}
+\box_new:N \l_@@_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{macrocode}
+\cs_new_protected:Npn \@@_update_structure: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).
+% \begin{macrocode}
+ \@@_update_structure_alias:nn { previous-#1 } {#1}
+% \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.
+% \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
+% 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).
+%
+% Another possible issue are packages or user code that place stray
+% \tn{vbox}es directly into the main galley (an example is
+% \pkg{marginnote} that attaches its marginals in this way). If such
+% 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
+% \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}.
+% \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
+ }
+% \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}.
+% \begin{macrocode}
+ \int_compare:nNnT \tex_badness:D > 0
+ { \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
+% \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.
+% \begin{macrocode}
+ {
+ \vbox_set_split_to_ht:NNn \l_@@_box \l_@@_box \c_max_dim
+% \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
+ {
+% \end{macrocode}
+% First action: get the last mark from the previous region, i.e.,
+% \verb=previous-#1=. But because it is also still inside \verb=#1=,
+% at the moment we use that to construct the name because this is a
+% tiny bit faster. Given that we
+% need this value in various assignments we store it away which
+% avoids unnecessary further csname generations.
+% \begin{macrocode}
+ \tl_gset_eq:Nc \g_@@_new_top_tl { g_@@_#1_last_##1_tl }
+% \end{macrocode}
+% This will first of all become the new top mark for the current class.
+% \begin{macrocode}
+ \tl_gset_eq:cN { g_@@_#1_top_##1_tl } \g_@@_new_top_tl
+% \end{macrocode}
+% Next action is to get ourselves the new last mark 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 does
+% neither, 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
+% is done).
+% \begin{macrocode}
+ \tl_if_empty:NTF \g_@@_tmp_tl
+ {
+ \tl_gset_eq:cN { g_@@_#1_last_ ##1_tl }
+ \g_@@_new_top_tl
+ \tl_gset_eq:cN { g_@@_#1_first_##1_tl }
+ \g_@@_new_top_tl
+ }
+% \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.
+% \begin{macrocode}
+ {
+ \tl_gset_eq:cN { g_@@_#1_last_##1_tl } \g_@@_tmp_tl
+% \end{macrocode}
+% Because we had a last mark we also have a first mark (which
+% might be the same, but might be not), so we pick that up and
+% assign it to the appropriate 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}
+ \tl_gset:co { g_@@_#1_first_##1_tl }
+ {
+ \tex_splitfirstmarks:D
+ \use:c { c_@@_class_##1_mark }
+ }
+ }
+ }
+ }
+% \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.
+% \begin{macrocode}
+ {
+ \msg_error:nnn { mark } { infinite-shrinkage } {#1}
+ \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}
+% 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}{\@@_update_structure_alias:nn}
+% This function copies the structure for one region to another
+% (name), e.g., from \texttt{page} to \texttt{previous-page} above,
+% or later from \texttt{column} to \texttt{first-column}, etc.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_update_structure_alias:nn #1#2 {
+% \end{macrocode}
+% This requires a simple loop through all mark classes copying the
+% token list from one name to the next.
+% \begin{macrocode}
+ \seq_map_inline:Nn \g_@@_classes_seq
+ {
+ \tl_gset_eq:cc { g_@@_ #1 _top_ ##1 _tl }
+ { g_@@_ #2 _top_ ##1 _tl }
+ \tl_gset_eq:cc { g_@@_ #1 _first_ ##1 _tl }
+ { g_@@_ #2 _first_ ##1 _tl }
+ \tl_gset_eq:cc { g_@@_ #1 _last_ ##1 _tl }
+ { g_@@_ #2 _last_ ##1 _tl }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_update_structure_to_err:n,\@@_error:n}
+% A slight variation is to install a fixed error message as the value.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_update_structure_to_err:n #1 {
+ \seq_map_inline:Nn \g_@@_classes_seq
+ {
+ \tl_gset:cn { g_@@_ #1 _top_ ##1 _tl } { \@@_error:n {#1} }
+ \tl_gset:cn { g_@@_ #1 _first_ ##1 _tl } { \@@_error:n {#1} }
+ \tl_gset:cn { g_@@_ #1 _last_ ##1 _tl } { \@@_error:n {#1} }
+ }
+}
+% \end{macrocode}
+% Given that this is used in only one place, we could hardwire the
+% argument which would be a bit more compact, but who knows,
+% perhaps we end up with another reason to use this error command
+% elsewhere, so for now we keep the argument.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_error:n #1 {
+ \msg_error:nnn { mark } { invalid-use } {#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Placing and retrieving marks}
+%
+%
+%
+% \begin{macro}{\mark_insert:nn}
+% This function puts a mark for some \meta{class} at the current point.
+% \begin{macrocode}
+\cs_new_protected:Npn \mark_insert:nn #1#2
+{
+ \seq_if_in:NnTF \g_@@_classes_seq {#1}
+ {
+% \end{macrocode}
+% We need to pass the evaluated argument into the mark but protected
+% commands should not expand including those protected using the \cs{protect} approach of
+% \LaTeXe{}. We also disable \cs{label} and the
+% like.\footnote{Straight copy from \texttt{latex.ltx} but is this
+% even correct? At least a label in a running header makes little
+% sense if it get set several times! Maybe that needs looking at in
+% the 2e kernel.}
+%
+% At this point the code eventually should get a public
+% (and a kernel) hook instead of a set of hardwired settings.
+% \begin{macrocode}
+ \group_begin:
+% \end{macrocode}
+% Within the group we alter some comments, e.g, \cs{label} or
+% \cs{index}, to do the right at this point. This is done in the
+% kernel hook \cs{@kernel@before@insertmark} which is followed by
+% the public hook \hook{insertmark} that can be used by packages to
+% augment or alter that setup as necessary.
+% \begin{macrocode}
+ \@kernel@before@insertmark
+ \hook_use:n { insertmark }
+ \unrestored@protected@xdef \g_@@_tmp_tl {#2}
+%<*trace>
+ \@@_debug:n{ \iow_term:x { Marks:~ set~#1~<-~
+ '\tl_to_str:V \g_@@_tmp_tl' ~ \msg_line_context: } }
+%</trace>
+ \tex_marks:D \use:c { c_@@_class_ #1 _mark }
+ {
+% \end{macrocode}
+% Here is the trick to avoid truly empty marks: if the result from
+% the above processing is empty we add something which eventually
+% becomes empty, but not immediately; otherwise we just put
+% \cs{g_@@_tmp_tl} in.
+% \begin{macrocode}
+ \tl_if_empty:NTF \g_@@_tmp_tl
+ { \exp_not:n { \prg_do_nothing: } }
+ { \exp_not:o { \g_@@_tmp_tl } }
+ }
+ \group_end:
+% \end{macrocode}
+% A mark introduces a possible break point and in certain
+% situations that should not happen in vertical mode in \LaTeX{}.
+% This needs some cleanup \ldots.
+% \begin{macrocode}
+ \if@nobreak\ifvmode\nobreak\fi\fi
+ }
+% \end{macrocode}
+% If the mark class was not known, raise an error.
+% \begin{macrocode}
+ {
+ \msg_error:nnx { mark } { unknown-class }
+ { \tl_to_str:n {#1} }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[int]{\@kernel@before@insertmark}
+% \begin{macro}{insertmark}
+% By default \cs{label}, \cs{index}, and \cs{glossary} do nothing
+% when the mark is inserted.
+% \begin{macrocode}
+\cs_new:Npn \@kernel@before@insertmark {
+ \cs_set_eq:NN \label \scan_stop:
+ \cs_set_eq:NN \index \scan_stop:
+ \cs_set_eq:NN \glossary \scan_stop:
+}
+% \end{macrocode}
+% The public hook to augment the setup.
+% \begin{macrocode}
+\hook_new:n {insertmark}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\mark_use_top:nn, \mark_use_first:nn, \mark_use_last:nn}
+%
+% 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,
+% otherwise their value will be wrong.
+%
+% If used with an unknown class or region they generate an error
+% (fairly low-level because we are in an expandable context).
+% \begin{macrocode}
+\cs_new:Npn \mark_use_first:nn #1#2 { \exp_not:v { g_@@_#1_first_#2_tl } }
+\cs_new:Npn \mark_use_last:nn #1#2 { \exp_not:v { g_@@_#1_last_#2_tl } }
+\cs_new:Npn \mark_use_top:nn #1#2 { \exp_not:v { g_@@_#1_top_#2_tl } }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Comparing mark values}
+%
+%
+%
+% \begin{macro}[TF,EXP]{\mark_if_eq:nnnn,\mark_if_eq:nnnnnn}
+% Test if in a given region (\verb=#1=) for a given class
+% (\verb=#2=) the marks in position \verb=#3= and \verb=#4= (top,
+% first, or last) are identical
+% \begin{macrocode}
+\prg_new_conditional:Npnn \mark_if_eq:nnnn #1#2#3#4 { T , F , TF }
+{
+ \tl_if_eq:ccTF { g_@@_ #1 _#3_ #2 _tl }
+ { g_@@_ #1 _#4_ #2 _tl }
+ \prg_return_true:
+ \prg_return_false:
+}
+% \end{macrocode}
+% The fully general test (with two triplets of the form
+% \meta{region}, \meta{class}, and \meta{position}) is this:
+% \begin{macrocode}
+\prg_new_conditional:Npnn \mark_if_eq:nnnnnn #1#2#3#4#5#6 { T , F , TF }
+{
+ \tl_if_eq:ccTF { g_@@_ #1 _#3_ #2 _tl }
+ { g_@@_ #4 _#6_ #5 _tl }
+ \prg_return_true:
+ \prg_return_false:
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Messages}
+%
+% 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 }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnnn { mark } { class-already-defined }
+ { Mark~class~'#1'~already~defined }
+ {
+ \c__msg_coding_error_text_tl
+ LaTeX~was~asked~to~define~a~new~mark~class~called~'#1':~
+ this~mark~class~already~exists.
+ \c__msg_return_text_tl
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnnn { mark } { unknown-class }
+ { Unknown~mark~class~'#1'. }
+ {
+ \c__msg_coding_error_text_tl
+ LaTeX~was~asked~to~manipulate~a~mark~of~class~'#1',~
+ but~this~class~of~marks~does~not~exist.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+
+\msg_new:nnnn { mark } { invalid-use }
+ { Mark~region~'#1'~not ~usable }
+ {
+ \c__msg_coding_error_text_tl
+ The~region~'#1'~can~only~be~used~after~
+ all~columns~have~been~assembled.
+ \c__msg_return_text_tl
+ }
+% \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}
+%
+%
+%
+% \subsection{Debugging the mark structures}
+%
+% Code and commands in this section are not final, it needs more
+% experimentation to see what kind of tracing information is going to
+% be useful in practice. For now the tracing is mainly meant to be used
+% for code testing and not so much for application testing.
+%
+% It is quite likely that the
+% commands and the behavior of the tracing might change in the
+% future once we gained some experience with it.
+%
+% \begin{macro}{\g_@@_debug_bool}
+% Holds the current debugging state.
+% \begin{macrocode}
+\bool_new:N \g_@@_debug_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mark_debug_on:,\mark_debug_off:}
+% \begin{macro}{\@@_debug:n}
+% \begin{macro}{\@@_debug_gset:}
+% Turns debugging on and off by redefining \cs{@@_debug:n}.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_debug:n \use_none:n
+\cs_new_protected:Npn \mark_debug_on:
+ {
+ \bool_gset_true:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \mark_debug_off:
+ {
+ \bool_gset_false:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \@@_debug_gset:
+ {
+ \cs_gset_protected:Npx \@@_debug:n ##1
+ { \bool_if:NT \g_@@_debug_bool {##1} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\DebugMarksOn,\DebugMarksOff}
+% CamelCase commands for debugging.
+% \begin{macrocode}
+\cs_new_eq:NN \DebugMarksOn \mark_debug_on:
+\cs_new_eq:NN \DebugMarksOff \mark_debug_off:
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_class_status:nn}
+% Shows the mark values across all regions for one mark class
+% (\verb=#2=). The first argument gives some \meta{info} to help
+% identifying where the command was called.
+% \begin{macrocode}
+%<*trace>
+\cs_new_protected:Npn \@@_class_status:nn #1#2
+ {
+ \typeout{ Marks:~#2~ #1:}
+ \typeout{\@spaces page~ (current):
+ | \exp_not:v { g_@@_page_top_ #2 _tl }
+ | \exp_not:v { g_@@_page_first_ #2 _tl }
+ | \exp_not:v { g_@@_page_last_ #2 _tl } |}
+ \typeout{\@spaces page~ (previous):
+ | \exp_not:v { g_@@_previous-page_top_ #2 _tl }
+ | \exp_not:v { g_@@_previous-page_first_ #2 _tl }
+ | \exp_not:v { g_@@_previous-page_last_ #2 _tl } |}
+ \typeout{\@spaces column~ (previous):
+ | \exp_not:v { g_@@_previous-column_top_ #2 _tl }
+ | \exp_not:v { g_@@_previous-column_first_ #2 _tl }
+ | \exp_not:v { g_@@_previous-column_last_ #2 _tl } |}
+ \typeout{\@spaces column~ (current):
+ | \exp_not:v { g_@@_column_top_ #2 _tl }
+ | \exp_not:v { g_@@_column_first_ #2 _tl }
+ | \exp_not:v { g_@@_column_last_ #2 _tl } |}
+ \typeout{\@spaces column~ (first):
+ | \exp_not:v { g_@@_first-column_top_ #2 _tl }
+ | \exp_not:v { g_@@_first-column_first_ #2 _tl }
+ | \exp_not:v { g_@@_first-column_last_ #2 _tl } |}
+ \typeout{\@spaces column~ (second):
+ | \exp_not:v { g_@@_last-column_top_ #2 _tl }
+ | \exp_not:v { g_@@_last-column_first_ #2 _tl }
+ | \exp_not:v { g_@@_last-column_last_ #2 _tl } |}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@@_status:n}
+% Show all mark class values across all regions.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_status:n #1
+ {
+ \seq_map_inline:Nn \g_@@_classes_seq
+ { \@@_class_status:nn {#1} {##1} }
+ }
+%</trace>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Designer-level interfaces}
+%
+%
+% \begin{macro}{\NewMarkClass,\InsertMark}
+% These two are identical to the L3 programming layer commands.
+% \begin{macrocode}
+\cs_new_eq:NN \NewMarkClass \mark_new_class:n
+\@onlypreamble \NewMarkClass
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \InsertMark \mark_insert:nn
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[EXP]{\TopMark, \FirstMark, \LastMark}
+% The following commands take an optional argument that defaults to
+% page. There is no checking that the region is actually valid. If
+% not there is simply an empty return.
+% \begin{macrocode}
+\NewExpandableDocumentCommand \FirstMark { O{page} m }
+ { \mark_use_first:nn {#1}{#2} }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewExpandableDocumentCommand \LastMark { O{page} m }
+ { \mark_use_last:nn {#1}{#2} }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewExpandableDocumentCommand \TopMark { O{page} m }
+ { \mark_use_top:nn {#1}{#2} }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}[EXP]{\IfMarksEqualTF}
+% We only provide a CamelCase command for the case with one region
+% (optional) and one class. One could think of also providing a
+% version for the general case with several optional arguments, but
+% use cases for this are most likely rare, so not done yet.
+% \begin{macrocode}
+\NewExpandableDocumentCommand \IfMarksEqualTF {O{page}mmm} {
+ \mark_if_eq:nnnnTF {#1}{#2}{#3}{#4}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \section{\LaTeXe{} integration}
+%
+% \subsection{Core \LaTeXe{} integration}
+%
+% \begin{macro}{\@@_update_singlecol_structures:}
+% This command updates the mark structures if we are producing a
+% single column document.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_update_singlecol_structures: {
+% \end{macrocode}
+% First we update the \texttt{page} region (which also updates the
+% \texttt{previous-page}.
+%
+% The \cs{@outputbox} is normally in \cs{vbox} in \LaTeX{} but we
+% can't take that for granted (an \pkg{amsmath} test document
+% changed it to an \cs{hbox} just to trip me up) so we are a little
+% careful with unpack now.
+% \begin{macrocode}
+ \box_if_vertical:NTF \@outputbox
+ {
+ \@@_update_structure:nn {page}
+ { \vbox_unpack:N \@outputbox }
+ }
+ {
+ \@@_update_structure:nn {page}
+ { \hbox_unpack:N \@outputbox }
+ }
+% \end{macrocode}
+% The we provide the necessary updates for the aliases.
+% \begin{macrocode}
+ \@@_update_structure_alias:nn {previous-column}{previous-page}
+ \@@_update_structure_alias:nn {column}{page}
+ \@@_update_structure_alias:nn {first-column}{page}
+ \@@_update_structure_alias:nn {last-column}{page}
+%<*trace>
+% move this into status itself?
+ \@@_debug:n
+ {
+ \@@_status:n
+ { in~ OR~ (
+ \legacy_if:nTF {@twoside}
+ { twoside-
+ \int_if_odd:nTF \c@page
+ { odd }{ even }
+ }
+ { oneside }
+ )
+ }
+ }
+%</trace>
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_update_dblcol_structures:}
+% This commands handles the updates if we are doing two-column pages.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_update_dblcol_structures: {
+% \end{macrocode}
+% First we update the \texttt{column} and \texttt{previous-column}
+% regions using the material assembled in \cs{@outputbox}.
+% \begin{macrocode}
+ \box_if_vertical:NTF \@outputbox
+ {
+ \@@_update_structure:nn {column}
+ { \vbox_unpack:N \@outputbox }
+ }
+ {
+ \@@_update_structure:nn {column}
+ { \hbox_unpack:N \@outputbox }
+ }
+% \end{macrocode}
+% How we have to update the alias regions depends on whether or not
+% \cs{@opcol} was called to process the first column or to produce
+% the completed page
+% \begin{macrocode}
+ \legacy_if:nTF {@firstcolumn}
+ {
+% \end{macrocode}
+% If we are processing the first column then \texttt{column} is our
+% \texttt{first-column} and there is no \texttt{last-column} yet,
+% so we make those an error.
+% \begin{macrocode}
+ \@@_update_structure_alias:nn {first-column}{column}
+ \@@_update_structure_to_err:n {last-column}
+ }
+ {
+% \end{macrocode}
+% If we produce the completed page then the \texttt{first-column}
+% is the same as the new \texttt{previous-column}. However, the
+% structure should already be correct if you think about it
+% (because is was set to \texttt{column} last time which is now the
+% \texttt{previous-column}), thus there is no need to make an update.
+% \begin{macrocode}
+% \@@_update_structure_alias:nn {first-column}{previous-column}
+% \end{macrocode}
+% However, we now have a proper \texttt{last-column} so we assign that.
+% \begin{macrocode}
+ \@@_update_structure_alias:nn {last-column}{column}
+% \end{macrocode}
+% What now remains doing is to update the \texttt{page} and
+% \texttt{previous-page} regions. For this we have to copy the
+% settings in \texttt{page} into \texttt{previous-page} and then
+% update \texttt{page} such that the top and first marks are taken
+% from the \texttt{first-column} region and the last marks are
+% taken from the \texttt{last-column} region. All this has to be
+% done for all mark classes so we loop over our sequence.
+%
+% Note that one loop is needed if we arrange the copy statements in
+% a suitable way.
+% \begin{macrocode}
+ \seq_map_inline:Nn \g_@@_classes_seq
+ {
+ \tl_gset_eq:cc { g_@@_previous-page_top_ ##1 _tl }
+ { g_@@_page_top_ ##1 _tl }
+ \tl_gset_eq:cc { g_@@_previous-page_first_ ##1 _tl }
+ { g_@@_page_first_ ##1 _tl }
+ \tl_gset_eq:cc { g_@@_previous-page_last_ ##1 _tl }
+ { g_@@_page_last_ ##1 _tl }
+% \end{macrocode}
+% The \texttt{page} updates need to come after the corresponding
+% updates for \texttt{previous-page} otherwise we loose the
+% necessary value.
+% \begin{macrocode}
+ \tl_gset_eq:cc { g_@@_page_top_ ##1 _tl }
+ { g_@@_first-column_top_ ##1 _tl }
+ \tl_gset_eq:cc { g_@@_ page_first_ ##1 _tl }
+ { g_@@_first-column_first_ ##1 _tl }
+ \tl_gset_eq:cc { g_@@_page_last_ ##1 _tl }
+ { g_@@_last-column_last_ ##1 _tl }
+ }
+ }
+%<*trace>
+ \@@_debug:n
+ {
+ \@@_status:n
+ { in~ OR~ (
+ \legacy_if:nTF {@twoside}
+ { twoside-
+ \int_if_odd:nTF \c@page
+ { odd }{ even }
+ }
+ { oneside }
+ \space
+ \legacy_if:nTF {@firstcolumn}
+ { first~ }{ second~ }
+ column )
+ }
+ }
+%</trace>
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macro}[int]{\@expl@@@mark@update@singlecol@structures@@,
+% \@expl@@@mark@update@dblcol@structures@@}
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@mark@update@singlecol@structures@@
+ \__mark_update_singlecol_structures:
+\cs_new_eq:NN \@expl@@@mark@update@dblcol@structures@@
+ \__mark_update_dblcol_structures:
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Other \LaTeXe{} output routines}
+%
+% This section will cover \pkg{multicol} and other packages altering
+% or providing their own output routine. Not done yet.
+%
+%
+%
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}{ltmarks}%
+%<latexrelease> {Undo~Marks~handling}
+%<latexrelease>
+% \end{macrocode}
+% 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.
+% \begin{macrocode}
+%<latexrelease>\DeclareRobustCommand \NewMarkClass[1]{}
+%<latexrelease>\DeclareRobustCommand \InsertMark[2]{}
+%<latexrelease>\RenewExpandableDocumentCommand \FirstMark { O{} m } { }
+%<latexrelease>\RenewExpandableDocumentCommand \LastMark { O{} m } { }
+%<latexrelease>\RenewExpandableDocumentCommand \TopMark { O{} m } { }
+%<latexrelease>\RenewExpandableDocumentCommand \IfMarksEqualTF { O{} mmm }{ }
+%<latexrelease>
+% \end{macrocode}
+% Same here, this avoided extra roll back code in the OR.
+% \begin{macrocode}
+%<latexrelease>\let \@expl@@@mark@update@singlecol@structures@@ \relax
+%<latexrelease>\let \@expl@@@mark@update@dblcol@structures@@ \relax
+%<latexrelease>
+%<latexrelease>
+%<latexrelease>\EndModuleRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% Reset module prefix:
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+%
+%
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
diff --git a/macros/latex/base/ltmath.dtx b/macros/latex/base/ltmath.dtx
index 59e0d89a10..1bd979f7de 100644
--- a/macros/latex/base/ltmath.dtx
+++ b/macros/latex/base/ltmath.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -38,7 +38,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmath.dtx}
- [2021/10/14 v1.2j LaTeX Kernel (Math Setup)]
+ [2022/05/08 v1.2l LaTeX Kernel (Math Setup)]
% \iffalse
%</driver>
%
@@ -74,7 +74,7 @@
% This file contains a lot of the original plain \TeX{} code, as well
% as the \LaTeX{} environments for math. It still needs sorting out.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
@@ -467,8 +467,9 @@
% \end{macro}
%
% \begin{macro}{\openup}
+% \changes{v1.2k}{2022/04/08}{Make \cs{protected} (gh/123)}
% \begin{macrocode}
-\def\openup{\afterassignment\@penup\dimen@}
+\protected\def\openup{\afterassignment\@penup\dimen@}
% \end{macrocode}
%
% \begin{macrocode}
@@ -1089,6 +1090,18 @@
% \end{macrocode}
% \end{macro}
%
+% \changes{v1.2l}{2022/05/08}{Use consistent math styles under \LuaTeX}
+% \LuaTeX\ contains new math primitives to place expression over or under
+% horizontally extensible glyphs. Before \LuaTeX\ 1.14 these did not work
+% correctly with the |\mathstyle| primitive and sometimes did not use
+% cramped style in consistent ways. For newer version, we opt into the
+% corrected behavior.
+% \begin{macrocode}
+\ifx\mathdefaultsmode\@undefined\else
+ \mathdefaultsmode=1
+\fi
+% \end{macrocode}
+%
% \begin{macrocode}
%</2ekernel>
% \end{macrocode}
diff --git a/macros/latex/base/ltmeta.dtx b/macros/latex/base/ltmeta.dtx
new file mode 100644
index 0000000000..31c5d8dbee
--- /dev/null
+++ b/macros/latex/base/ltmeta.dtx
@@ -0,0 +1,216 @@
+% \iffalse meta-comment
+%
+%% File: ltmeta.dtx (C) Copyright 2021, 2022
+% Frank Mittelbach, LaTeX Team
+%
+% 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
+%
+%
+%%% From File: ltmeta.dtx
+%
+% \begin{macrocode}
+\def\ltmetaversion{v1.0b}
+\def\ltmetadate{2022/05/18}
+% \end{macrocode}
+%<*driver>
+\documentclass{l3doc}
+
+% Fixing footnotes in functions and variables: this should be in l3doc!
+
+\newcommand\fixfootnote[2]{\footnotemark
+ \AddToHookNext{env/#1/after}{\footnotetext{#2}}}
+\AddToHook{env/function/begin}{\def\footnote{\fixfootnote{function}}}
+\AddToHook{env/variable/begin}{\def\footnote{\fixfootnote{variable}}}
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltmeta.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \providecommand\hook[1]{\texttt{#1}}
+% \providecommand\env[1]{\texttt{#1}}
+%
+%
+%
+% \title{The \texttt{ltmeta.dtx} code\thanks{This file has version
+% \ltmetaversion\ dated \ltmetadate, \copyright\ \LaTeX\
+% Project.}}
+% \author{Frank Mittelbach}
+%
+% \maketitle
+%
+%
+% \begin{abstract}
+% This code defines the \cs{DocumentMetadata} interface.
+% \end{abstract}
+%
+% \tableofcontents
+%
+%
+% \section{Introduction}
+%
+%
+% In the past there was no dedicated location to declare settings
+% concerning a document as a whole. Settings are placed somewhere
+% in the preamble or with the class options or even with some
+% package options. For some settings this can be too late, for
+% example the pdf version can no longer be changed if a package has
+% used code which already opened the PDF.
+%
+% \cs{DocumentMetadata} as a new command unifies such settings in
+% one place. It must be used before \cs{documentclass} but can be
+% issued more than once there.
+%
+% At the moment most of the code run by \cs{DocumentMetadata} is
+% external to the format and subject to change. This includes the
+% supported key/values.
+%
+% For that reason all that happens right now in the format is to
+% look for suitable support files and if found, to redirect the
+% processing to them.
+%
+% \subsection{\cs{DocumentMetadata}}
+%
+% \begin{function}{\DocumentMetadata}
+% \begin{syntax}
+% \cs{DocumentMetadata}\Arg{key-value list}
+% \end{syntax}
+% \end{function}
+%
+%
+%
+% The keys defined for \cs{DocumentMetadata}
+% currently allow to set the PDF version, to set the PDF \texttt{/Lang},
+% to uncompress a PDF, to set the language and to declare a few PDF standards
+% and some color profiles.
+%
+% \cs{DocumentMetadata} is also used to
+% activate the new PDF management code and it loads
+% a number of required files for the PDF management code.
+% As this forces the loading of the backend files, a backend
+% which can't be detected automatically like |dvipdfmx|,
+% must be set in the first \cs{DocumentMetadata} call (if there is more than one).
+%
+% The full set of keys currently supported is documented in \texttt{documentmetadata-support.pdf}
+% for now.
+%
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+%
+%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+% Not needed yet but \ldots
+% \begin{macrocode}
+%\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\NewModuleRelease{2022/06/01}{ltmeta}
+%<latexrelease> {Document Metadata handling}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let \IfDocumentMetadataTF \@secondoftwo
+\protected\def\DocumentMetadata{%
+ \InputIfFileExists{documentmetadata-support.ltx}%
+ {}%
+% \end{macrocode}
+% The above file is changing \cs{DocumentMetadata} to a suitable
+% definition (or so we hope), so that we can try again --- if not
+% tough.
+%
+% If the file can't be found we say so and carry on without it.
+% \begin{macrocode}
+ {%
+ \@latex@error{No support files for
+ \noexpand\DocumentMetadata found}
+ {Is the 'LaTeX-lab' bundle installed?%
+ \MessageBreak
+ Without it, the declaration is ignored.}%
+% \end{macrocode}
+% No point in trying this more than once if there are several calls
+% in the document.
+% \begin{macrocode}
+ \let\DocumentMetadata\@gobble
+ }%
+ \let \IfDocumentMetadataTF \@firstoftwo
+ \DocumentMetadata
+}
+% \end{macrocode}
+%
+% To allow package and class author to support for document links
+% we provide also the new interface commands of the hyperref package
+% for the creation of targets.
+% \changes{v1.0b}{2022/05/17}{Default definition for targets added}
+% \begin{macro}{\MakeLinkTarget}
+% \begin{macro}{\LinkTargetOn}
+% \begin{macro}{\LinkTargetOff}
+% \begin{macro}{\NextLinkTarget}
+% \begin{macrocode}
+\NewDocumentCommand\MakeLinkTarget{sO{}m}{%
+ \ifvmode
+ \special{}%
+ \else
+ \@savsf\spacefactor
+ \smash{}%
+ \spacefactor\@savsf
+ \fi}
+\NewDocumentCommand\LinkTargetOn{}{}
+\NewDocumentCommand\LinkTargetOff{}{}
+\NewDocumentCommand\NextLinkTarget{m}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% We do not undo \cs{MakeLinkTarget} and friends if we roll back, in
+% case they are used in packages that themselves do not offer
+% rollback. This way a roll forward adds them, but the dummies remain
+% if you roll back and you don't get missing csname errors if they
+% are used.
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}{ltmeta}%
+%<latexrelease> {Undo Document Metadata handling}
+%<latexrelease>
+%<latexrelease>\let\DocumentMetadata\@undefined
+%<latexrelease>
+%<latexrelease>\EndModuleRelease
+% \end{macrocode}
+% Again for the future \ldots
+% \begin{macrocode}
+%\ExplSyntaxOff
+% \end{macrocode}
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% Restore module prefix (if any):
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+%
+%
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
diff --git a/macros/latex/base/ltmiscen.dtx b/macros/latex/base/ltmiscen.dtx
index 6cc58907a0..b7b2bf5e31 100644
--- a/macros/latex/base/ltmiscen.dtx
+++ b/macros/latex/base/ltmiscen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -81,7 +81,7 @@
% environments and related commands, the `flushing' environments,
% (|center|, |flushleft|, |flushright|), and |verbatim|.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
diff --git a/macros/latex/base/ltnews.pdf b/macros/latex/base/ltnews.pdf
index af795b23d4..a55de7eb1c 100644
--- a/macros/latex/base/ltnews.pdf
+++ b/macros/latex/base/ltnews.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews.tex b/macros/latex/base/ltnews.tex
index 406787c5f0..cba11c3ce3 100644
--- a/macros/latex/base/ltnews.tex
+++ b/macros/latex/base/ltnews.tex
@@ -38,9 +38,9 @@
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{ltnews.tex}%
- [2021/06/07 v1.4d Master file for ltnews*.tex (LaTeX Project)]
+ [2021/11/12 v1.4d Master file for ltnews*.tex (LaTeX Project)]
-\providecommand*{\lastissue}{34}
+\providecommand*{\lastissue}{35}
\InputIfFileExists{ltnews-lastissue.cfg}{}{}
@@ -222,7 +222,11 @@
\def\y{|multicol}%
\ifx\x\y
\else
- \@latex@error{ltnews.tex: \string\usepackage[#1]{#2} found}\@ehc
+ \def\y{|color}%
+ \ifx\x\y
+ \else
+ \@latex@error{ltnews.tex: \string\usepackage[#1]{#2} found}\@ehc
+ \fi
\fi
\fi
\fi
diff --git a/macros/latex/base/ltnews01.pdf b/macros/latex/base/ltnews01.pdf
index 208069621e..ed4420fac7 100644
--- a/macros/latex/base/ltnews01.pdf
+++ b/macros/latex/base/ltnews01.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews01.tex b/macros/latex/base/ltnews01.tex
index 3703f23f61..08ac57d27d 100644
--- a/macros/latex/base/ltnews01.tex
+++ b/macros/latex/base/ltnews01.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews02.pdf b/macros/latex/base/ltnews02.pdf
index 611665a28d..dced90a7bd 100644
--- a/macros/latex/base/ltnews02.pdf
+++ b/macros/latex/base/ltnews02.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews02.tex b/macros/latex/base/ltnews02.tex
index dfc78e4843..1d875dcd03 100644
--- a/macros/latex/base/ltnews02.tex
+++ b/macros/latex/base/ltnews02.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews03.pdf b/macros/latex/base/ltnews03.pdf
index 4e98757b7c..a6f83c70e3 100644
--- a/macros/latex/base/ltnews03.pdf
+++ b/macros/latex/base/ltnews03.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews03.tex b/macros/latex/base/ltnews03.tex
index e555e12df4..93f0963426 100644
--- a/macros/latex/base/ltnews03.tex
+++ b/macros/latex/base/ltnews03.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews04.pdf b/macros/latex/base/ltnews04.pdf
index 6bda1af53e..d9eb536b86 100644
--- a/macros/latex/base/ltnews04.pdf
+++ b/macros/latex/base/ltnews04.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews04.tex b/macros/latex/base/ltnews04.tex
index 0a313664ba..527024fa18 100644
--- a/macros/latex/base/ltnews04.tex
+++ b/macros/latex/base/ltnews04.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews05.pdf b/macros/latex/base/ltnews05.pdf
index 3b5590d158..b24151feed 100644
--- a/macros/latex/base/ltnews05.pdf
+++ b/macros/latex/base/ltnews05.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews05.tex b/macros/latex/base/ltnews05.tex
index 840f04fe72..d13f469dd6 100644
--- a/macros/latex/base/ltnews05.tex
+++ b/macros/latex/base/ltnews05.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews06.pdf b/macros/latex/base/ltnews06.pdf
index a601cc3e65..d6ff0c4ce8 100644
--- a/macros/latex/base/ltnews06.pdf
+++ b/macros/latex/base/ltnews06.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews06.tex b/macros/latex/base/ltnews06.tex
index 52ecba9918..ac32eab8d1 100644
--- a/macros/latex/base/ltnews06.tex
+++ b/macros/latex/base/ltnews06.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews07.pdf b/macros/latex/base/ltnews07.pdf
index e5781cbadd..03172d6299 100644
--- a/macros/latex/base/ltnews07.pdf
+++ b/macros/latex/base/ltnews07.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews07.tex b/macros/latex/base/ltnews07.tex
index db3812e387..56cfd76661 100644
--- a/macros/latex/base/ltnews07.tex
+++ b/macros/latex/base/ltnews07.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews08.pdf b/macros/latex/base/ltnews08.pdf
index b08f0bf834..1500a3b436 100644
--- a/macros/latex/base/ltnews08.pdf
+++ b/macros/latex/base/ltnews08.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews08.tex b/macros/latex/base/ltnews08.tex
index d79a1b1b74..68cd1247e6 100644
--- a/macros/latex/base/ltnews08.tex
+++ b/macros/latex/base/ltnews08.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews09.pdf b/macros/latex/base/ltnews09.pdf
index f5ae7d4cef..46b251d25c 100644
--- a/macros/latex/base/ltnews09.pdf
+++ b/macros/latex/base/ltnews09.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews09.tex b/macros/latex/base/ltnews09.tex
index 2d56515ca0..af14a53e34 100644
--- a/macros/latex/base/ltnews09.tex
+++ b/macros/latex/base/ltnews09.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews10.pdf b/macros/latex/base/ltnews10.pdf
index 8607468376..71203b94e1 100644
--- a/macros/latex/base/ltnews10.pdf
+++ b/macros/latex/base/ltnews10.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews10.tex b/macros/latex/base/ltnews10.tex
index 5ab159f0bb..c6a77e6e36 100644
--- a/macros/latex/base/ltnews10.tex
+++ b/macros/latex/base/ltnews10.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews11.pdf b/macros/latex/base/ltnews11.pdf
index 2e41c1b23e..0b5e3aee42 100644
--- a/macros/latex/base/ltnews11.pdf
+++ b/macros/latex/base/ltnews11.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews11.tex b/macros/latex/base/ltnews11.tex
index 6d27fee067..b4f6d19910 100644
--- a/macros/latex/base/ltnews11.tex
+++ b/macros/latex/base/ltnews11.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews12.pdf b/macros/latex/base/ltnews12.pdf
index e25c52517d..7ce5bc2138 100644
--- a/macros/latex/base/ltnews12.pdf
+++ b/macros/latex/base/ltnews12.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews12.tex b/macros/latex/base/ltnews12.tex
index 62b08324b7..b7a01bc208 100644
--- a/macros/latex/base/ltnews12.tex
+++ b/macros/latex/base/ltnews12.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews13.pdf b/macros/latex/base/ltnews13.pdf
index bedabe5c47..7cc92b75fb 100644
--- a/macros/latex/base/ltnews13.pdf
+++ b/macros/latex/base/ltnews13.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews13.tex b/macros/latex/base/ltnews13.tex
index 08acf95df6..0cbbe49a5d 100644
--- a/macros/latex/base/ltnews13.tex
+++ b/macros/latex/base/ltnews13.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews14.pdf b/macros/latex/base/ltnews14.pdf
index 34874d53e5..35ff9ebfd6 100644
--- a/macros/latex/base/ltnews14.pdf
+++ b/macros/latex/base/ltnews14.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews14.tex b/macros/latex/base/ltnews14.tex
index 61c96c81ae..b5fa7cb019 100644
--- a/macros/latex/base/ltnews14.tex
+++ b/macros/latex/base/ltnews14.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews15.pdf b/macros/latex/base/ltnews15.pdf
index 54143d4d6d..86e6f5112e 100644
--- a/macros/latex/base/ltnews15.pdf
+++ b/macros/latex/base/ltnews15.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews15.tex b/macros/latex/base/ltnews15.tex
index e143d5f4dd..3b1ea3f89c 100644
--- a/macros/latex/base/ltnews15.tex
+++ b/macros/latex/base/ltnews15.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews16.pdf b/macros/latex/base/ltnews16.pdf
index afe7946306..d1cff3c808 100644
--- a/macros/latex/base/ltnews16.pdf
+++ b/macros/latex/base/ltnews16.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews16.tex b/macros/latex/base/ltnews16.tex
index 17f9cd094a..7f7183ac0e 100644
--- a/macros/latex/base/ltnews16.tex
+++ b/macros/latex/base/ltnews16.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews17.pdf b/macros/latex/base/ltnews17.pdf
index 3b999d7051..bb04d1aca6 100644
--- a/macros/latex/base/ltnews17.pdf
+++ b/macros/latex/base/ltnews17.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews17.tex b/macros/latex/base/ltnews17.tex
index 614c5c7d63..4dab20f53f 100644
--- a/macros/latex/base/ltnews17.tex
+++ b/macros/latex/base/ltnews17.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews18.pdf b/macros/latex/base/ltnews18.pdf
index ca6f790803..21ef52e75d 100644
--- a/macros/latex/base/ltnews18.pdf
+++ b/macros/latex/base/ltnews18.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews18.tex b/macros/latex/base/ltnews18.tex
index 518aeda067..04491760b2 100644
--- a/macros/latex/base/ltnews18.tex
+++ b/macros/latex/base/ltnews18.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews19.pdf b/macros/latex/base/ltnews19.pdf
index af489f48d0..6e0428dbf1 100644
--- a/macros/latex/base/ltnews19.pdf
+++ b/macros/latex/base/ltnews19.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews19.tex b/macros/latex/base/ltnews19.tex
index f733c41dd4..43d388b29b 100644
--- a/macros/latex/base/ltnews19.tex
+++ b/macros/latex/base/ltnews19.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews20.pdf b/macros/latex/base/ltnews20.pdf
index 4313b687b8..464fd8b71b 100644
--- a/macros/latex/base/ltnews20.pdf
+++ b/macros/latex/base/ltnews20.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews21.pdf b/macros/latex/base/ltnews21.pdf
index f2301aa112..a0244199bd 100644
--- a/macros/latex/base/ltnews21.pdf
+++ b/macros/latex/base/ltnews21.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews22.pdf b/macros/latex/base/ltnews22.pdf
index b49c30a43f..271e7b5549 100644
--- a/macros/latex/base/ltnews22.pdf
+++ b/macros/latex/base/ltnews22.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews22.tex b/macros/latex/base/ltnews22.tex
index 7551616154..8d1c91acfa 100644
--- a/macros/latex/base/ltnews22.tex
+++ b/macros/latex/base/ltnews22.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015-2021
+% Copyright (C) 2015-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews23.pdf b/macros/latex/base/ltnews23.pdf
index d0a0829e7e..1baa40823b 100644
--- a/macros/latex/base/ltnews23.pdf
+++ b/macros/latex/base/ltnews23.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews23.tex b/macros/latex/base/ltnews23.tex
index 99e9615074..29241766ca 100644
--- a/macros/latex/base/ltnews23.tex
+++ b/macros/latex/base/ltnews23.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015-2021
+% Copyright (C) 2015-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews24.pdf b/macros/latex/base/ltnews24.pdf
index bbb1de7bdc..2819e7ae60 100644
--- a/macros/latex/base/ltnews24.pdf
+++ b/macros/latex/base/ltnews24.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews24.tex b/macros/latex/base/ltnews24.tex
index 44cd76a060..13d2fc8519 100644
--- a/macros/latex/base/ltnews24.tex
+++ b/macros/latex/base/ltnews24.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015-2021
+% Copyright (C) 2015-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews25.pdf b/macros/latex/base/ltnews25.pdf
index d1207ea608..b15213fa0a 100644
--- a/macros/latex/base/ltnews25.pdf
+++ b/macros/latex/base/ltnews25.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews25.tex b/macros/latex/base/ltnews25.tex
index 735fda356e..5a9f480718 100644
--- a/macros/latex/base/ltnews25.tex
+++ b/macros/latex/base/ltnews25.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016-2021
+% Copyright (C) 2016-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews26.pdf b/macros/latex/base/ltnews26.pdf
index 36548c5b6c..ef2f6476a5 100644
--- a/macros/latex/base/ltnews26.pdf
+++ b/macros/latex/base/ltnews26.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews26.tex b/macros/latex/base/ltnews26.tex
index f0e7578b70..94b4c4818b 100644
--- a/macros/latex/base/ltnews26.tex
+++ b/macros/latex/base/ltnews26.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017-2021
+% Copyright (C) 2017-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews27.pdf b/macros/latex/base/ltnews27.pdf
index b407a06077..70a4b3298e 100644
--- a/macros/latex/base/ltnews27.pdf
+++ b/macros/latex/base/ltnews27.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews27.tex b/macros/latex/base/ltnews27.tex
index ba17d26e5e..03c8c04205 100644
--- a/macros/latex/base/ltnews27.tex
+++ b/macros/latex/base/ltnews27.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017-2021
+% Copyright (C) 2017-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews28.pdf b/macros/latex/base/ltnews28.pdf
index b43107672c..267e85ea51 100644
--- a/macros/latex/base/ltnews28.pdf
+++ b/macros/latex/base/ltnews28.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews28.tex b/macros/latex/base/ltnews28.tex
index 03d4a04ae1..28bfe0577c 100644
--- a/macros/latex/base/ltnews28.tex
+++ b/macros/latex/base/ltnews28.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017-2021
+% Copyright (C) 2017-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews29.pdf b/macros/latex/base/ltnews29.pdf
index 91dfa2d7f9..090fc4c658 100644
--- a/macros/latex/base/ltnews29.pdf
+++ b/macros/latex/base/ltnews29.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews29.tex b/macros/latex/base/ltnews29.tex
index 749b927218..c06d4de347 100644
--- a/macros/latex/base/ltnews29.tex
+++ b/macros/latex/base/ltnews29.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2018-2021
+% Copyright (C) 2018-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltnews30.pdf b/macros/latex/base/ltnews30.pdf
index 62408fe152..849f406acb 100644
--- a/macros/latex/base/ltnews30.pdf
+++ b/macros/latex/base/ltnews30.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews31.pdf b/macros/latex/base/ltnews31.pdf
index 7d6614ea23..11880394de 100644
--- a/macros/latex/base/ltnews31.pdf
+++ b/macros/latex/base/ltnews31.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews32.pdf b/macros/latex/base/ltnews32.pdf
index c5adbb165d..5850e93b18 100644
--- a/macros/latex/base/ltnews32.pdf
+++ b/macros/latex/base/ltnews32.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews32.tex b/macros/latex/base/ltnews32.tex
index 01bc515db5..28f3bf88b4 100644
--- a/macros/latex/base/ltnews32.tex
+++ b/macros/latex/base/ltnews32.tex
@@ -307,7 +307,7 @@ line) could result in an unnecessary extra line in order to prevent a
hyphen in the second-last line of the paragraph. This is now avoided
by setting \cs{finalhyphendemerits} to zero in unjustified settings.
%
-\githubissue{274}
+\githubissue{247}
\subsection{Set a non-zero \cs{baselineskip} in text scripts}
diff --git a/macros/latex/base/ltnews33.pdf b/macros/latex/base/ltnews33.pdf
index 3230ff1825..45cc1a580d 100644
--- a/macros/latex/base/ltnews33.pdf
+++ b/macros/latex/base/ltnews33.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews34.pdf b/macros/latex/base/ltnews34.pdf
index 7386496035..87a85b0599 100644
--- a/macros/latex/base/ltnews34.pdf
+++ b/macros/latex/base/ltnews34.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews34.tex b/macros/latex/base/ltnews34.tex
index 11f1ce2bce..04d1c25bc7 100644
--- a/macros/latex/base/ltnews34.tex
+++ b/macros/latex/base/ltnews34.tex
@@ -493,7 +493,8 @@ for which these are now the preferred replacements.
This optional argument
specifies the format of the counter, such as \cs{roman};
the default value is \cs{arabic}.
-
+Alternatively, you can use a starred form, in which case the format of the
+counter is not altered at all.
\subsection{Tests for package and class loading}
@@ -548,7 +549,7 @@ version of the font instead of substituting the (T1-encoded) Type 1 version.
\subsection{Additional Extended Latin characters predefined}
-More characters, such as \'k (U+1E131), are now pre-defined and
+More characters, such as \'k (U+1E31), are now pre-defined and
do not need a \verb|\DeclareUnicodeCharacter| declaration.
%
\githubissue{593}
@@ -783,7 +784,7 @@ possibilities.
A \env{tabular} environment is typeset (internally) as an \env{array}
environment with special settings, and it therefore uses (hidden) math mode.
Since it is not in fact a math formula,
-no extra space from \cs{mathsuround} should be added
+no extra space from \cs{mathsurround} should be added
(the spacing around the \env{tabular} should not get changed).
%
Note that this bug has been present ``forever'', which shows that \cs{mathsurround}
@@ -830,7 +831,7 @@ brace groups inside \cs{r@}\meta{label}) However, if \pkg{nameref} or
arguments; this could cause low-level errors in some cases.
The code has therefore now been changed to avoid these errors.
%
-\sxissue{603948}
+\sxissue{q/603948}
\medskip
diff --git a/macros/latex/base/ltnews35.pdf b/macros/latex/base/ltnews35.pdf
new file mode 100644
index 0000000000..2e946fa605
--- /dev/null
+++ b/macros/latex/base/ltnews35.pdf
Binary files differ
diff --git a/macros/latex/base/ltnews35.tex b/macros/latex/base/ltnews35.tex
new file mode 100644
index 0000000000..0e0cda79b1
--- /dev/null
+++ b/macros/latex/base/ltnews35.tex
@@ -0,0 +1,987 @@
+% \iffalse meta-comment
+%
+% Copyright 2021-2022
+% 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: ltnews35.tex
+%
+% This is issue 35 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
+
+
+\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{2022}
+
+\publicationissue{35}
+
+\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}
+
+The 2022 June release of \LaTeX{} is again focussing on improvements
+made for our multi-year project to automatically offer tagged PDF
+output~\cite{35:blueprint}. These are the new document metadata
+interface, the new mark mechanism for \LaTeX{}, a standard key/value
+approach for options, and the introduction of the \texttt{latex-lab}
+area for temporary code that can be optionally loaded by a document
+(when \cs{DocumentMetadata} is used with certain test keys). These
+additions are described in the first sections. Related to this effort
+there are updates to \pkg{hyperref} and \pkg{tagpdf}, both of which
+have their own distributions.
+
+As usual, we also added a number of smaller improvements and bug
+fixes in various components of core \LaTeX{}. Perhaps the most
+interesting ones (for some users) are direct support for floating
+point arithmetic (via \cs{fpeval}; see below) and the ability to
+properly color parts of math formulas without introducing spacing
+problems. For this we now offer the command \cs{mathcolor}; see the
+description near the end of the newsletter. There is also a new major
+release of the \pkg{doc} package that supports a more fine-grained
+classification of code elements and properly supports \pkg{hyperref}.
+
+
+\section{Document metadata interface}
+
+Until recently there was no dedicated location to declare
+settings that affect a document as a whole. Settings had to be placed
+somewhere in the preamble or as class options or sometimes even as
+package options. For some such settings this may cause issues, e.g.,
+setting the PDF version is only possible as long as the PDF output
+file has not yet been opened which can be caused by loading one or the
+other package.
+
+For the \enquote{\LaTeX{} Tagged PDF project}~\cite{35:blueprint}
+further metadata about the whole document (and its processing) need to
+be specified and again this data should be all placed in a single
+well-defined place.
+
+For this reason we introduce the new command \cs{DocumentMetadata} to
+unify all such settings in one place. The command expects a key/value
+list that describes all document metadata for the current document. It
+is only allowed to be used at the very beginning of the document,
+i.e., the declaration has to be placed \emph{before}
+\cs{documentclass} and will issue an error if found later.
+
+
+At this point in time we provide only the bare command in the format;
+the actual processing of the key/value is defined externally and the
+necessary code will be loaded if the command is used. This scheme is
+chosen for two reasons: by adding the command in the kernel it is
+available to everybody without the need to load a special package
+using \cs{RequirePackage}. The actual processing, though, is external
+so that we can easily extend the code (e.g., offering additional keys
+or changing the internal processing) while the above-mentioned project
+is progressing. Both together allows users to immediately benefit from
+intermediate results produced as part of the project, as well as
+offering the \LaTeX{} Project Team the flexibility to enable such
+intermediate results (for test purposes or even production use)
+in-between and independently of regular \LaTeX{} releases. Over time,
+tested and approved functionality can then seamlessly move into the
+kernel at a later stage without any alterations to documents already
+using it. At the same time, not using the new consolidated interface
+means that existing documents are in no way affected by the work that
+is carried out and is in a wider alpha or beta test phase.
+
+Documentation about the new command and
+already existing keys are in \file{l3meta.pdf} and \file{documentmetadata-support.pdf}
+and also in the documentation of the \pkg{pdfmanagement-testphase} package.
+
+Package and class authors can test if a user has used \cs{DocumentMetadata}
+with \cs{IfDocumentMetadataTF}.
+
+
+\section{The \pkg{latex-lab} bundle}
+
+We added a new \pkg{latex-lab}oratory bundle in which we place new
+code that is going to be available only through a
+\cs{DocumentMetadata} declaration and that is\Dash most
+importantly\Dash work under development and subject to
+change without further notice. This means that commands and interfaces provided there may
+get altered or removed again after some public testing. The code can
+be accessed through the \cs{DocumentMetadata} key \texttt{testphase}.
+Currently supported values are \texttt{phase-I} and \texttt{phase-II}
+that enable code of the tagged PDF project (phase~I is frozen, and
+phase~II is the phase we are currently working on). With
+\begin{verbatim}
+ \DocumentMetadata{testphase=phase-II}
+\end{verbatim}
+you currently enable tagging for paragraphs and footnotes; more
+document elements will follow soon.
+
+Eventually, code will move (once considered stable) from the
+testphase into the \LaTeX{} kernel itself. Tagging will continue to
+require a \cs{DocumentMetadata} declaration, but you will then be able
+to drop the \texttt{testphase} key setting.
+
+
+\section{A new mark mechanism for \LaTeX{}}
+
+The mark mechanism is \TeX{}'s way to pass information to the
+page-building process, which happens asynchronously, in order to
+communicate relevant data for running headers and footers to the
+latter, e.g., what is the first section on the page or the last
+subsection, etc. However, marks may also be
+used for other purposes. The new kernel module provides a generalized
+mechanism for marks of independent classes.
+
+The \TeX{} engines offer a low-level mark mechanism to
+communicate information about the content of the current page to
+the asynchronous operating output routine. It works by placing
+\cs{mark} commands into the source document.
+
+This mechanism works well for simple formats (such as plain \TeX)
+whose output routines are only called to generate pages. It
+fails, however, in \LaTeX{} (and other more complex formats),
+because here the output routine is sometimes called without
+producing a page, e.g., when encountering a float and placing it
+into one of the float regions.
+%
+When that happens \TeX{}'s \cs{topmark} no
+longer reflects the situation at the top of the next page when that
+page is finally boxed.
+
+Furthermore, \TeX{} only offered a single mark while \LaTeX{} wanted to
+keep track of more than one piece of information. For that reason,
+\LaTeX{} implemented its own mark mechanism where the marks always
+contained two parts with their own interfaces: \cs{markboth} and
+\cs{markright} to set marks and \cs{leftmark} and \cs{rightmark} to
+retrieve them.
+
+Unfortunately, this extended mechanism, while supporting scenarios such
+as chapter/section marks, was far from general. The mark
+situation at the top of a page (i.e., \cs{topmark}) remained
+unusable and the two marks offered were not really independent of
+each other because \cs{markboth} (as the name indicates) was
+always setting both.
+
+
+The new mechanism now available in \LaTeX{} starting with the 2022
+release overcomes both issues:
+\begin{itemize}
+\item
+ It provides arbitrary many, fully independent named marks, that
+ can be allocated and from that point onwards used.
+\item
+ It offers access for each such mark to retrieve its top,
+ first, and bottom value separately.
+\item
+ Furthermore, the mechanism is augmented to give access to marks
+ in different ``regions'', which may be other than full pages.
+\end{itemize}
+The legacy interfaces, e.g., \cs{markboth}, are kept. Thus classes and
+packages making use of them continue to work seamlessly. To make use
+of the extended possibility a new set of commands for the declaration of
+mark classes, setting their values and querying their state (in the
+output routine) is now available in addition.
+%
+You find the documentation for the new interfaces together with
+examples and further notes on the mechanism in the file
+\texttt{ltmarks-doc.pdf}. Just call \texttt{texdoc}
+\texttt{ltmarks-doc} to display it on your computer.
+
+
+\section{A key/value approach to option handling}
+
+The classical \LaTeXe{} method for handling options, using \cs{ProcessOptions},
+treats each entry in the list as a string. Many package authors have sought to
+extend this handling by treating each entry as a key--value pair (keyval)
+instead. To date, this has required the use of additional packages, for example
+\pkg{kvoptions}.
+
+The \LaTeX{} team have for some time offered the package \pkg{l3keys2e} to
+allow keyvals defined using the L3 programming layer module \pkg{l3keys} to act
+as package options. This ability has now been integrated directly into the
+kernel. As part of this integration, the syntax for processing keyval options
+has been refined, such that
+\begin{verbatim}
+\ProcessKeyOptions
+\end{verbatim}
+will now automatically pick up the package name as the key \emph{family},
+%unless explicitly given as an optional argument.
+unless explicitly given as an optional argument:
+\begin{verbatim}
+\ProcessKeyOptions[family]
+\end{verbatim}
+
+To support creating key options for this mechanism, the new command
+\cs{DeclareKeys} has been added. This works using the same general
+approach as \pkg{l3keys} or \pkg{pgfkeys}: each key has one or more
+\emph{properties} which define its behavior.
+
+Options for packages which use this new approach will not be checked for
+clashes by the kernel. Instead, each time a \cs{usepackage} or
+\cs{RequirePackage} line is encountered, the list of options given will be
+passed to \cs{ProcessKeyOptions}. Options which can only be given
+the first time a package is loaded can be marked using the property
+\texttt{.usage = load}, and will result in a warning if used in a subsequent
+package loading line.
+
+Package options defined in this way can also be set within a package using
+the new command \cs{SetKeys}, which again takes an optional argument
+to specify the \emph{family}, plus a mandatory one for the options themselves.
+
+
+
+\section{New or improved commands}
+
+
+\subsection{Floating point and integer calculations}
+
+The L3 programming layer offers expandable commands for calculating
+floating point and integer values, but so far these functions have
+only been available to programmers, because they require
+\cs{ExplSyntaxOn} to be in force. To make them easily available at the
+document level, the small package \pkg{xfp} defined \cs{fpeval} and
+\cs{inteval}.
+
+
+An example of use could be the following:
+\begin{verbatim}
+ \LaTeX{} can now compute:
+ \[ \frac{\sin (3.5)}{2} + 2\cdot 10^{-3}
+ = \fpeval{sin(3.5)/2 + 2e-3} \]
+\end{verbatim}
+which produces the following output:
+\begin{quote}
+\LaTeX{} can now compute:
+\[ \frac{\sin (3.5)}{2} + 2\cdot 10^{-3}
+ = \fpeval{sin(3.5)/2 + 2e-3} \]
+\end{quote}
+These two commands have now been moved into the kernel and in addition
+we also provide \cs{dimeval} and \cs{skipeval}. The details of their
+syntax are described in \file{usrguide3.pdf}. The command \cs{fpeval}
+offers a rich syntax allowing for extensive calculations, whereas the
+other three commands are essentially thin wrappers for \cs{numexpr},
+\cs{dimexpr}, and \cs{glueexpr} \Dash therefore inheriting some syntax
+%peculiars and limitations in expressiveness.
+peculiarities and limitations in expressiveness.
+% \newcommand\calulateheight[1]{%
+\begin{verbatim}
+ \newcommand\calculateheight[1]{%
+ \setlength\textheight{\dimeval{\topskip
+ + \baselineskip * \inteval{#1-1}}}}
+\end{verbatim}
+The above, for example, calculates the appropriate \cs{textheight} for
+a given number of text lines.
+%
+\githubissue{711}
+
+
+\subsection{CamelCase commands for changing arguments to csnames}
+
+It is sometimes helpful to \enquote{construct} a command name on the
+fly rather than providing it as a single \cs{...}\ token. For these
+kinds of tasks the \LaTeX3 programming layer offers a general mechanism
+(in the form of \cs{exp\_args:N...}\ and
+\cs{cs\_generate\_variant:Nn}). However, when declaring new
+document-level commands with \cs{NewDocumentCommand} or
+\cs{NewCommandCopy}, etc.\ the L3 programming layer may not be active,
+and even if it is, mixing CamelCase syntax with L3 programming syntax
+is not really a good approach. We have therefore added the commands
+\cs{UseName} and \cs{ExpandArgs} to assist in such
+situations, e.g.,
+\begin{verbatim}
+\NewDocumentCommand\newcopyedit{mO{red}}
+ {\newcounter{todo#1}%
+ \ExpandArgs{c}\NewDocumentCommand{#1}{s m}%
+ {\stepcounter{todo#1}%
+ \IfBooleanTF {##1}%
+ {\todo[color=#2!10]%
+ {\UseName{thetodo#1}: ##2}}%
+ {\todo[inline,color=#2!10]%
+ {\UseName{thetodo#1}: ##2}}%
+ }%
+ }
+\end{verbatim}
+which provides a declaration mechanism for copyedit commands, so that
+\verb=\newcopyedit{FMi}[blue]= then defines \cs{FMi} (and the
+necessary counter).
+
+The command \cs{ExpandArgs} can be useful with the argument \texttt{cc} or
+\texttt{Nc} in
+combination with \cs{NewCommandCopy} if the old or new command name
+or both need constructing. Finally, there is \cs{UseName} which
+takes its argument and turns it into a command (i.e., a CamelCase
+version of \cs{@nameuse} (\LaTeXe) or \cs{use:c} (L3 programming
+layer)) which was also used in the example above.
+%
+\githubissue{735}
+
+
+\subsection{Testing for (nearly) empty arguments}
+%
+In addition to \cs{IfNoValueTF} to test if an optional argument was
+provided or not, there is now also \cs{IfBlankTF}, which tests if the
+argument is empty or contains only blanks. Based on the result it
+selects a true or false code branch. As usual, the variants
+\cs{IfBlankT} and \cs{IfBlankF} are also provided for use when only one
+branch leads to some action. Further details and examples are given
+in \file{usrguide3.pdf}.
+
+This test can also be useful if you set up key/value options and want
+to test if a key was specified without giving a value, vs.\
+specifying \enquote{\textit{key}\texttt{ = ,}}.
+
+
+\subsection{Better allocator for Lua command ids}
+
+In \LuaTeX\ we already had the \cs{newluafunction} macro which allocates
+a Lua function identifier which can be used to define commands
+with \cs{luadef}. But this always required two steps: \cs{newluafunction}
+defines the passed control sequence as an integer, which then has to be used
+to define the actual Lua command with \cs{luadef}. After that, the integer is
+no longer needed. This was inconsistent with other allocators. Therefore we
+added two new allocators \cs{newluacmd} and \cs{newexpandableluacmd} which
+directly define a control sequences invoking the allocated Lua function.
+The former defines a non-expandable Lua command, the latter an expandable
+one. Of course, the associated Lua function still has to be defined by assigning
+a function to the \verb|lua.get_functions_table()| table. The required index is
+available in \cs{allocationnumber}.
+
+An example could be
+\begin{verbatim}
+\newluacmd \greeting
+\directlua {
+lua.get_functions_table()
+ [tex.count.allocationnumber]
+ = function()
+ local name = token.scan_argument()
+ tex.sprint('Hello ', name, '!')
+ end
+}
+
+\greeting{world}
+\end{verbatim}
+%
+\githubissue{536}
+
+\subsection{Starred command version for \cs{ref}, \cs{Ref} and \cs{pageref}}
+
+For a long time \pkg{hyperref} has provided starred versions for the reference commands
+which do not create active links. This syntax extension required users and
+package authors to check if \pkg{hyperref} was loaded and adjust the coding
+accordingly or take the starred forms out if text was copied to a document
+without \pkg{hyperref}. The commands have now been aligned with
+the \pkg{hyperref} usage and always allow an optional star. The \pkg{showkeys} package
+has been updated to handle the starred versions too, both with \pkg{hyperref} or \pkg{nameref}
+and without. The commands are defined with \cs{NewDocumentCommand} and so no longer expand when
+written to auxiliary files. This reduces the number of compilations needed to resolve references
+in captions and sectioning commands. The package \pkg{ifthen} has been updated to ensure that
+\cs{pageref} can still be used inside tests like \cs{isodd}.
+
+
+\subsection{Preparation for supporting PDF in backends}
+
+At the current point in time, basic support for PDF in
+backends is not part of \LaTeX{} core; it is provided by an external
+package like \pkg{hyperref}.
+At some time in the future that work will be placed
+into the kernel but for now it is separate and has to be
+explicitly loaded in the document. To enable class and package authors
+to support PDF-specific tasks like the creation of link targets without
+having to test first if \pkg{hyperref} has been loaded, dummy versions of
+the commands \cs{MakeLinkTarget}, \cs{LinkTargetOn}, \cs{LinkTargetOff} and
+\cs{NextLinkTarget} are provided.
+
+\section{Code improvements}
+
+\subsection{\cs{protected} UTF-8 character definitions}
+The characters defined via \file{utf8.def} are now defined as \cs{protected}
+macros. This makes them safe to use in expansion contexts where the
+classic \cs{protect} mechanism is not enabled, notably L3 programming
+layer \texttt{e} and \texttt{x} arguments.
+
+Related to this change \cs{MakeUppercase} and \cs{MakeLowercase} have
+been updated to use the Unicode-aware case changing functions
+\cs{text\string_lowercase:n} in place of the \TeX\ primitive \cs{lowercase}.
+The \cs{NoCaseChange} command from the \pkg{textcase} package has also been added.
+
+Note: for technical reasons these low-level character handling changes
+will not be rolled back if the format version is rolled back using the
+\pkg{latexrelease} package rollback mechanism.
+%
+\githubissue{780}
+
+\subsection{A small update to \cs{obeylines} and \cs{obeyspaces}}
+
+The plain \TeX{} versions of \cs{obeylines} and \cs{obeyspaces} make
+\verb=^^M= and \verb*= = active and force them to execute \cs{par} %*
+and \cs{space}, respectively. Don Knuth makes a remark in the \TeX{}book
+that one can then use a trick such as
+\begin{verbatim}
+ \let\par=\cr \obeylines \halign{...
+\end{verbatim}
+However, redefining \cs{par} like this
+may lead to all kinds of problems in \LaTeX. We have therefore changed
+the commands to use an indirection: the active characters now execute
+\cs{obeyedline} and \cs{obeyedspace}, which in turn do what the
+hardwired solution did before.
+
+\begin{quote}
+ \renewcommand\obeyedspace{\ \textbullet\ }
+ \footnotesize\obeyspaces%
+This means that it is now possible to %
+achieve special effects in a safe way. %
+This paragraph, for example, was produced by %
+making \cs{obeyedspace} generate %
+\texttt{\{\cs{\verbvisiblespace}\cs{textbullet}\cs{\verbvisiblespace}\}} and %
+enabling \cs{obeyspaces} within a %
+quote environment.
+\end{quote}
+Thus, if you are keen to use the plain \TeX{} trick, you need to say
+\cs{let}\cs{obeyedlines}\texttt{=}\cs{cr} now.
+%
+\githubissue{367}
+
+
+\subsection{\pkg{doc} upgraded to version~3}
+
+After roughly three decades the \pkg{doc} package received a cautious
+uplift, as already announced at the 2019 TUG conference\Dash changes
+to \pkg{doc} are obviously always done in a leisurely manner.
+
+Given that most documentation is nowadays viewed on screen,
+\pkg{hyperref} support is added and by default enabled (suppress it
+with option \option{nohyperref} or alternatively with
+\option{hyperref}\texttt{=false}) so the internal cross-references are
+properly resolved including those from the index back into the
+document.
+
+Furthermore, \pkg{doc} now has a general mechanism to define
+additional \enquote{doc} elements besides the two \texttt{Macro} and
+\texttt{Env} it has known in the past. This enables better
+documentation because you can now clearly mark different types of
+objects instead of simply calling them all \enquote{macros}.
+If desired, they can be collected together under a heading
+in the index so that you have a section just with your document
+interface commands, or with all parameters, or \ldots
+
+The code borrows ideas from Didier Verna's \pkg{dox} package (although
+the document level interface is different) and it makes use of Heiko
+Oberdiek's \pkg{hypdoc} package, which at some point in the future
+will be completely integrated, given that its whole purpose it to
+patch \pkg{doc}'s internal commands to make them \pkg{hyperref}-aware.
+
+All changes are expected to be upward compatible, but if you run into
+issues with older documentation using \pkg{doc} a simple and quick
+solution is to load the package as follows:
+\verb/\usepackage{doc}[=v2]/
+
+\subsection{\pkg{doc} can now show dates in change log}
+
+Up to now the change log was always sorted by version numbers
+(ignoring the date that was given in the \cs{changes} command). It
+can now be sorted by both version and date if you specify the option
+\option{reportchangedates} on package level and in that case the
+changes are displayed with
+\begin{quote}
+ \meta{version} -- \meta{date}
+\end{quote}
+as the heading (instead of just \meta{version}), when using
+\cs{PrintChanges}.
+%
+\githubissue{531}
+
+
+
+\subsection{\class{ltxdoc} gets options \option{nocfg} and \option{doc2}}
+
+The \LaTeX{} sources are formatted with the \class{ltxdoc} class,
+which supports loading a local config file \file{ltxdoc.cfg}. In the
+past the \LaTeX{} sources used such a file but it was not distributed.
+As a result reprocessing the \LaTeX{} sources elsewhere showed
+formatting changes. We now distribute this file which means that it
+is loaded by default. With the option \option{nocfg} this can be
+prevented.
+
+We also added a \option{doc2} option to the class so that it is
+possible to run old documentation with \pkg{doc} version~2, if
+necessary.
+
+
+
+\subsection{Lua\TeX\ callback improvements}
+
+The Lua\TeX\ callbacks \texttt{hpack\_quality} and \texttt{vpack\_quality} are
+now \texttt{exclusive} and therefore only allow a single handler.
+The previous type \texttt{list} resulted in incorrect parameters when multiple
+handlers were set; therefore, this only makes an existing restriction more
+explicit.
+
+Additionally the return value \texttt{true} for \texttt{list}
+callbacks is now handled internally and no longer passed on to the
+engine. This simplifies the handling of these callbacks and makes it
+easier to provide consistent interfaces for user-defined \texttt{list}
+callbacks.
+
+
+\subsection{Class \class{proc} supports \option{twoside}}
+
+The document class \class{proc}, which is a small variation on the
+\class{article} class, now supports the \option{twoside} option,
+displaying different data in the footer line on recto and verso pages.
+%
+\githubissue{704}
+
+
+\subsection{Croatian character support}
+
+The default \pkg{inputenc} support has been extended to support the 9 characters
+D\v Z, D\v z, d\v z, LJ, Lj, lj, NJ, Nj, nj, input as single UTF-8 code points
+in the range U+01C4 to U+01CC.
+%
+\githubissue{723}
+
+
+\subsection{Cleanup of the Unicode declaration interface}
+
+When declaring encoding specific commands for the Unicode (TU)
+encoding some declarations (e.g., \cs{DeclareUnicodeComposite}) do not
+have an explicit argument for the encoding name, but instead use
+the command \cs{UnicodeEncodingName} internally. There was one
+exception though: \cs{DeclareUnicodeAccent} required an explicit
+encoding argument. This inconsistency has now been removed and the
+encoding name is always implicit. To avoid a breaking change for a few
+packages on CTAN, \cs{DeclareUnicodeAccent} still accepts three
+arguments if the second argument is \texttt{TU} or
+\cs{UnicodeEncodingName}. Once all packages have been updated this
+code branch will get removed.
+
+At the same time we added \cs{DeclareUnicodeCommand} and
+\cs{DeclareUnicodeSymbol} for consistency. They also use
+\cs{UnicodeEncodingName} internally, instead of requiring an encoding
+argument as their general purpose counterparts do.
+%
+\githubissue{253}
+
+
+\subsection{New hook:\ \hook{include/excluded}}
+
+A few releases ago we introduced a number of file hooks for different
+types of files; see~\cite{35:ltnews32} and in
+particular~\cite{35:ltfilehook-doc}.
+%
+The hooks for \cs{include} files now have an addition: if such a file
+is not included (because \cs{includeonly} is used and its \meta{name}
+is not listed in the argument) then the hooks \hook{include/excluded}
+and \hook{include/\meta{name}/excluded} are executed in that
+order\Dash of course, only if they contain code. This happens after
+\LaTeX{} has loaded the \texttt{.aux} file for this include file,
+i.e., after \LaTeX{} has updated its counters to pretend that the file
+was seen.
+
+
+\subsection{Input support for normalized angle brackets}
+
+Source files containing \textlangle\ or \textrangle\ directly written
+as Unicode codepoints U+2329 and U+232A no longer break when the
+source file gets normalized under Unicode normalization rules.
+%
+\githubissue{gh/714}
+
+
+
+
+\section{Bug fixes}
+
+\subsection{Using \cs{DeclareUnicodeCharacter} with C1 control points}
+An error in the UTF-8 handling for non-Unicode \TeX\ has prevented
+\cs{DeclareUnicodeCharacter} being used with characters in the range
+hex 80 to 9F. This has been corrected in this release.
+%
+\githubissue{730}
+
+
+
+\subsection{Fix \cs{ShowCommand} when used with \pkg{ltcmd}}
+
+When \cs{ShowCommand} support was added for \pkg{ltcmd} in the previous
+release~\cite{35:ltnews34}, a blunder in the code made it so that
+when \cs{ShowCommand} was used on a command defined with \pkg{ltcmd}, it
+only printed the meaning of the command in the terminal, but didn't stop
+for interaction as it does elsewhere (mimicking \cs{show}). The issue
+is now fixed.
+%
+\githubissue{739}
+
+
+
+\subsection{Make \cs{cite}\texttt{\textbraceleft\textbraceright} produce a warning}
+
+When the \cs{cite} command can't resolve a citation label it issues a
+warning \enquote{Citation `\meta{label}' on page \meta{page}
+ undefined}. However, due to some implementation details a completely
+empty argument was always silently accepted. Given that there are probably
+people who write \verb=\cite{}= with the intention to fill in the
+correct label later it is rather unfortunate if that is not generating
+a warning that something in the document is still amiss.
+This has finally been corrected and a warning is now generated also in this case.
+%
+\githubissue{790}
+
+
+
+\subsection{Fix adding \hook{cmd} hooks to simple macros}
+
+A bug in how \LaTeX{} detected the type of a command caused a
+premature forced expansion of such commands, which, depending on their
+definition, could be harmless or could cause severe trouble. This has
+been fixed in the latest release.
+%
+\githubissue{795}
+\sxissue{q/637565}
+
+
+\subsection{Warn if \hook{shipout/lastpage} hook is executed too early}
+
+The hook \hook{shipout/lastpage} is intended to place \cs{special}s
+into the last page shipped out. This is needed for some use cases,
+e.g., tagging. If that hook is nonempty and the user has added additional
+pages since the last run, then \LaTeX{} executes this hook too early,
+but until now without giving any indication that the document needs
+rerunning. This has now been corrected and an appropriate warning is
+given.
+%
+\githubissue{813}
+
+
+\subsection{More consistent use of cramped math styles in \LuaTeX}
+
+Using \LuaTeX's \cs{Udelimiterover} to place a horizontally extensible glyph
+on top of a mathematical expression now causes the expression to be set in cramped
+style, as used in similar situations by traditional \TeX\ math rendering.
+Similarly, cramped style is now used for expressions set under such a delimiter
+using \cs{Uunderdelimiter}, but is no longer used when setting an expression on top
+of such extensible glyphs using \cs{Uoverdelimiter}.
+This new behavior follows \TeX's rule that cramped style is used whenever something
+else appears above the expression.
+Additionally the math style of these constructs can now be detected using \cs{mathstyle}.
+
+The old behavior can be restored by adding
+\begin{verbatim}
+ \mathdefaultsmode=0
+\end{verbatim}
+to a document.
+
+
+\subsection{Fixed bug when setting hook rules for one-time hooks}
+
+If a \cs{DeclareHookRule} command is set for a one-time hook, it has to
+come \emph{before} the hook gets used, because otherwise it never
+applies\Dash after all, the hook is used only once. There was a bug in
+the implementation in that the sorting mechanism was still applied if
+the \cs{DeclareHookRule} declaration appeared while the one-time hook was
+executed, causing the spurious typesetting of the code labels and the
+hook name. This bug is now fixed and an error is raised when a new
+sorting rule is added to an already-used one-time hook.
+
+A possible scenario in which this new error is raised is the following:
+package \pkg{AAA} declares a hook rule for \hook{begindocument} (i.e.,
+\cs{AtBeginDocument}) to sort out the behavior between itself and some
+other package. Package \pkg{BBB} wants to load package \pkg{AAA} but
+only if it hasn't been loaded in the preamble, so delays the loading to
+\hook{begindocument}. In that case the hook rule declared by \pkg{AAA}
+can no longer be applied and you get the error. If that happens the
+solution is to load the package in \hook{begindocument/before}, which
+is executed at the very end of the preamble but before
+\hook{begindocument} is processed.
+%
+\githubissue{818}
+
+
+
+
+\section{Changes to packages in the \pkg{amsmath} category}
+
+
+\subsection{\pkg{amsopn}:\ Do not reset \cs{operator@font}}
+
+The package \pkg{amsopn} used to define \cs{operator@font} but this
+command has been provided by the \LaTeX{} format for at least 14
+years. As a result the definition in \pkg{amsopn} is equivalent to a
+reset to the kernel definition, which is unnecessary and surprising if
+you alter the math setup (e.g., by loading a package) and at a later
+stage add \pkg{amsmath}, which then undoes part of your setup. For
+this reason the definition was taken out and
+\pkg{amsmath}/\pkg{amsopn} now relies on the format definition.
+
+In the unlikely event that you want the resetting to happen, use
+\begin{verbatim}
+ \makeatletter
+ \def\operator@font{\mathgroup\symoperators}
+ \makeatother
+\end{verbatim}
+after loading the package.
+%
+\githubissue{734}
+
+\subsection{\pkg{amsmath}:\ Error in \cs{shoveleft}}
+
+If \cs{shoveleft} started out with the words \enquote{plus} or
+\enquote{minus} it was misunderstood as part of a rubber length and
+led either to an error or was swallowed without trace. By adding a
+\cs{relax} this erroneous scanning into the argument of \cs{shoveleft}
+is now prevented.
+%
+\githubissue{714}
+
+
+\subsection{\pkg{amsmath} and \pkg{amsopn}:\ Robustify user commands}
+
+Most user-level commands have been made robust in the \LaTeX{} kernel
+during the last years, but variant definitions in \pkg{amsmath} turned
+them back into fragile beings. We have now made most commands in
+\pkg{amsmath} and \pkg{amsopn} robust as well to match the kernel
+behavior. This also resolves a bug recently discovered in the
+\pkg{mathtools} package, which was due to \cs{big} not being robust after
+\pkg{amsmath} was loaded.
+%
+\githubissue{123}
+
+
+
+\section{Changes to packages in the \pkg{graphics} category}
+
+\subsection{Color in formulas}
+
+While it is possible to color parts of a formula using \cs{color}
+commands the approach is fairly cumbersome. For example, to color a
+summation sign, but not its limits, you need four \cs{color} commands and
+some seemingly unnecessary sets of braces to get coloring and spacing
+right:
+{\hfuzz=1pt
+\begin{verbatim}
+\[ X = \color{red} \sum
+% without {{ the superscript below is misplaced
+ _{{\color{black} i=1}}
+% without {{ the \sum is black
+ ^{{\color{black} n}}
+ \color{black} % without it the x_i is red
+ x_i \]
+\end{verbatim}
+}\noindent
+Leaving out any of the \cs{color} commands or any of the \verb={{...}}=
+will give you a wrong result instead of the desired
+\[ X = \color{red} \sum
+ _{{\color{black} i=1}} % without {{ the superscript is misplaced
+ ^{{\color{black} n}} % without {{ the \sum is black
+ \color{black} % without it the x_i is red
+ x_i
+\]
+So even if this is possible, it is not a very practical solution and
+furthermore there are a number of cases where it is impossible to
+color a certain part of a formula, for example, an opening symbol such
+as \verb=\left(= but not the corresponding \verb=\right)=.
+
+We have therefore added the command \cs{mathcolor} to the \pkg{color}
+and \pkg{xcolor} package, which has the same syntax as \cs{textcolor},
+but is specially designed for use in math and handles sub and
+superscripts and other aspects correctly and preserves correct
+spacing. Thus, the above example can now be written as
+\begin{verbatim}
+\[ X = \mathcolor{red}{\sum}_{i=1}^n x_i \]
+\end{verbatim}
+This command is \emph{only} allowed in formulas.
+For details and further examples, see \file{mathcolor.pdf}.
+
+
+\subsection{Fix locating files with \cs{graphicspath}}
+%
+
+If a call to \cs{includegraphics} asked for a file (say, \file{image})
+without extension, and if both \file{A/image.pdf} and \file{B/image.tex}
+existed (both \file{A/} and \file{B/} in \cs{graphicspath}, but neither
+in a folder searched by \TeX), then \file{A/image.pdf} would not be
+found, and a \enquote{file not found} error would be incorrectly thrown.
+The issue is now fixed and the graphics file is correctly found.
+%
+\githubissue{776}
+\sxissue{q/630167}
+
+
+
+
+\section{Changes to packages in the \pkg{tools} category}
+
+\subsection{\pkg{multicol}:\ Fix \cs{newcolumn}}
+
+The recently added \cs{newcolumn} didn't work properly if used in
+vertical mode, where it behaved like \cs{columnbreak}, i.e., spreading
+the column material out instead of running the column short.
+%
+\sxissue{q/624940}
+
+
+\subsection{\pkg{bm}:\ Fix for \pkg{amsmath} operators}
+
+An internal command used in the definition of operator commands such
+as \cs{sin} in \pkg{amsmath} has been guarded in \cs{bm} to prevent
+internal syntax errors due to premature expansion.
+%
+\githubissue{744}
+
+
+
+\medskip
+
+\begin{thebibliography}{9}
+
+\fontsize{9.3}{11.3}\selectfont
+
+\bibitem{35: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/}
+
+%\bibitem{35:source2e}
+% \emph{\LaTeX{} documentation on the \LaTeX{} Project Website}.\\
+% \url{https://latex-project.org/help/documentation/}
+
+%\bibitem{35:ltnews31} \LaTeX{} Project Team:
+% \emph{\LaTeXe{} news 31}.\\
+% \url{https://latex-project.org/news/latex2e-news/ltnews31.pdf}
+
+\bibitem{35:ltnews32} \LaTeX{} Project Team:
+ \emph{\LaTeXe{} news 32}.\\
+ \url{https://latex-project.org/news/latex2e-news/ltnews32.pdf}
+
+%\bibitem{35:ltnews33} \LaTeX{} Project Team:
+% \emph{\LaTeXe{} news 33}.\\
+% \url{https://latex-project.org/news/latex2e-news/ltnews33.pdf}
+
+\bibitem{35:ltnews34} \LaTeX{} Project Team:
+ \emph{\LaTeXe{} news 34}.\\
+ \url{https://latex-project.org/news/latex2e-news/ltnews34.pdf}
+
+\bibitem{35:ltfilehook-doc} Frank Mittelbach, Phelype Oleinik, \LaTeX{}~Project~Team:
+ \emph{The \texttt{\upshape ltfilehook} documentation}.\\
+ Run \texttt{texdoc} \texttt{ltfilehook-doc} to view.
+\end{thebibliography}
+
+
+
+\end{document}
diff --git a/macros/latex/base/ltoutenc.dtx b/macros/latex/base/ltoutenc.dtx
index 61ea381823..4dac4e1548 100644
--- a/macros/latex/base/ltoutenc.dtx
+++ b/macros/latex/base/ltoutenc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -44,7 +44,7 @@
%<*driver>
% \fi
\ProvidesFile{ltoutenc.dtx}
- [2021/10/16 v2.0x LaTeX Kernel (font encodings)]
+ [2022/05/27 v2.0z LaTeX Kernel (font encodings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutenc.dtx}
@@ -477,7 +477,7 @@
% \texttt{TS1} encoding.
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \subsection{Docstrip modules}
%
@@ -2949,14 +2949,14 @@
\endgroup
}
\else
- \newluafunction\@remove@tlig@@@@
+ \newprotectedluacmd\@remove@tlig@@@
% \end{macrocode}
% Now we can define the function. Mostly we just have to insert a protected glyph
% node, which is a glyph node with subtype 256. But we have to keep track of the
% current mode to avoid inserting the glyph into a vlist.
% \begin{macrocode}
\now@and@everyjob{\directlua{
- local rawchar_func = token.create'@remove@tlig@@@@'.index
+ local rawchar_func = token.create'@remove@tlig@@@'.index
local forcehmode = tex.forcehmode
local put_next = token.put_next
local glyph_id = node.id'glyph'
@@ -2972,7 +2972,6 @@
n.char = token.scan_int()
return node.write(n)
end
- token.set_lua('@remove@tlig@@@', rawchar_func, 'global', 'protected')
}}
% \end{macrocode}
% Now \verb+\remove@tlig+ can be implemented almost as in XeTeX.
@@ -3017,8 +3016,33 @@
\char#1\relax}
% \end{macrocode}
%
-% \begin{macrocode}
-\def\DeclareUnicodeAccent#1#2#3{%
+% In its original implementation \cs{DeclareUnicodeAccent} was
+% given 3 arguments (with second the ``Unicode encoding'' a.k.a.,
+% \cs{UnicodeEncodingName}) while in other places, e.g.,
+% \cs{DeclareUnicodeComposite}, we always made encoding implicit. So
+% we now change it here to implicit too so that the interfaces
+% become a bit more consistent. To avoid making that a
+% breaking change (even though it only affects two packages on
+% CTAN) we test for \verb=#2= being \cs{UnicodeEncodingName}. This
+% would not catch if somebody used
+% \verb|\DeclareUnicodeAccent{\=}{TU-sub}{"0304}|
+% but that fortunately hasn't happened. With the implicit argument
+% you would need to change \cs{UnicodeEncodingName} instead, as you
+% have to do anyway for the other interface commands.
+% \changes{v2.0y}{2021/12/12}{\cs{DeclareUnicodeAccent} now makes the
+% encoding argument implicit (gh/253)}
+% \begin{macrocode}
+\def\DeclareUnicodeAccent#1#2{%
+ \edef\reserved@a{#2}%
+ \edef\reserved@b{\UnicodeEncodingName}%
+ \ifx\reserved@a\reserved@b
+ \def\reserved@a{\DeclareUnicodeAccent@{#1}}%
+ \else
+ \def\reserved@a{\DeclareUnicodeAccent@{#1}\UnicodeEncodingName}%
+ \fi
+ \reserved@a{#2}%
+}
+\def\DeclareUnicodeAccent@#1#2#3{%
\DeclareTextCommand{#1}{#2}{\add@unicode@accent{#3}}%
}
% \end{macrocode}
@@ -3059,113 +3083,119 @@
\def\reserved@b{#1#2}}
% \end{macrocode}
%
+% Next two commands are simply syntactic sugar to go with the other
+% \cs{DeclareUnicode...} declarations.
+% \changes{v2.0y}{2021/12/12}{Added \cs{DeclareUnicodeCommand} and
+% \cs{DeclareUnicodeSymbol} (gh/253)}
+% \begin{macrocode}
+\def\DeclareUnicodeSymbol#1{\DeclareTextSymbol{#1}{\UnicodeEncodingName}}
+\def\DeclareUnicodeCommand#1{\DeclareTextCommand{#1}{\UnicodeEncodingName}}
+% \end{macrocode}
+%
% \begin{macrocode}
-\DeclareTextCommand\textquotesingle \UnicodeEncodingName{%
- \remove@tlig{"0027}}
-\DeclareTextCommand\textasciigrave \UnicodeEncodingName{%
- \remove@tlig{"0060}}
-\DeclareTextCommand\textquotedbl \UnicodeEncodingName{%
- \remove@tlig{"0022}}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareTextSymbol{\textdollar} \UnicodeEncodingName{"0024}
-\DeclareTextSymbol{\textless} \UnicodeEncodingName{"003C}
-\DeclareTextSymbol{\textgreater} \UnicodeEncodingName{"003E}
-\DeclareTextSymbol{\textbackslash} \UnicodeEncodingName{"005C}
-\DeclareTextSymbol{\textasciicircum} \UnicodeEncodingName{"005E}
-\DeclareTextSymbol{\textunderscore} \UnicodeEncodingName{"005F}
-\DeclareTextSymbol{\textbraceleft} \UnicodeEncodingName{"007B}
-\DeclareTextSymbol{\textbar} \UnicodeEncodingName{"007C}
-\DeclareTextSymbol{\textbraceright} \UnicodeEncodingName{"007D}
-\DeclareTextSymbol{\textasciitilde} \UnicodeEncodingName{"007E}
-\DeclareTextSymbol{\textexclamdown} \UnicodeEncodingName{"00A1}
-\DeclareTextSymbol{\textcent} \UnicodeEncodingName{"00A2}
-\DeclareTextSymbol{\textsterling} \UnicodeEncodingName{"00A3}
-\DeclareTextSymbol{\textcurrency} \UnicodeEncodingName{"00A4}
-\DeclareTextSymbol{\textyen} \UnicodeEncodingName{"00A5}
-\DeclareTextSymbol{\textbrokenbar} \UnicodeEncodingName{"00A6}
-\DeclareTextSymbol{\textsection} \UnicodeEncodingName{"00A7}
-\DeclareTextSymbol{\textasciidieresis} \UnicodeEncodingName{"00A8}
-\DeclareTextSymbol{\textcopyright} \UnicodeEncodingName{"00A9}
-\DeclareTextSymbol{\textordfeminine} \UnicodeEncodingName{"00AA}
+\DeclareUnicodeCommand\textquotesingle {\remove@tlig{"0027}}
+\DeclareUnicodeCommand\textasciigrave {\remove@tlig{"0060}}
+\DeclareUnicodeCommand\textquotedbl {\remove@tlig{"0022}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareUnicodeSymbol{\textdollar} {"0024}
+\DeclareUnicodeSymbol{\textless} {"003C}
+\DeclareUnicodeSymbol{\textgreater} {"003E}
+\DeclareUnicodeSymbol{\textbackslash} {"005C}
+\DeclareUnicodeSymbol{\textasciicircum} {"005E}
+\DeclareUnicodeSymbol{\textunderscore} {"005F}
+\DeclareUnicodeSymbol{\textbraceleft} {"007B}
+\DeclareUnicodeSymbol{\textbar} {"007C}
+\DeclareUnicodeSymbol{\textbraceright} {"007D}
+\DeclareUnicodeSymbol{\textasciitilde} {"007E}
+\DeclareUnicodeSymbol{\textexclamdown} {"00A1}
+\DeclareUnicodeSymbol{\textcent} {"00A2}
+\DeclareUnicodeSymbol{\textsterling} {"00A3}
+\DeclareUnicodeSymbol{\textcurrency} {"00A4}
+\DeclareUnicodeSymbol{\textyen} {"00A5}
+\DeclareUnicodeSymbol{\textbrokenbar} {"00A6}
+\DeclareUnicodeSymbol{\textsection} {"00A7}
+\DeclareUnicodeSymbol{\textasciidieresis} {"00A8}
+\DeclareUnicodeSymbol{\textcopyright} {"00A9}
+\DeclareUnicodeSymbol{\textordfeminine} {"00AA}
% \end{macrocode}
% \changes{v2.0j}{2018/08/11}{Provide \cs{guillemetleft} and \cs{guillemetright}}
% \begin{macrocode}
-\DeclareTextSymbol{\guillemetleft} \UnicodeEncodingName{"00AB}
+\DeclareUnicodeSymbol{\guillemetleft} {"00AB}
% old Adobe name
-\DeclareTextSymbol{\guillemotleft} \UnicodeEncodingName{"00AB}
+\DeclareUnicodeSymbol{\guillemotleft} {"00AB}
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareTextSymbol{\textlnot} \UnicodeEncodingName{"00AC}
-\DeclareTextSymbol{\textregistered} \UnicodeEncodingName{"00AE}
-\DeclareTextSymbol{\textasciimacron} \UnicodeEncodingName{"00AF}
-\DeclareTextSymbol{\textdegree} \UnicodeEncodingName{"00B0}
-\DeclareTextSymbol{\textpm} \UnicodeEncodingName{"00B1}
-\DeclareTextSymbol{\texttwosuperior} \UnicodeEncodingName{"00B2}
-\DeclareTextSymbol{\textthreesuperior} \UnicodeEncodingName{"00B3}
-\DeclareTextSymbol{\textasciiacute} \UnicodeEncodingName{"00B4}
-\DeclareTextSymbol{\textmu} \UnicodeEncodingName{"00B5}
-\DeclareTextSymbol{\textparagraph} \UnicodeEncodingName{"00B6}
-\DeclareTextSymbol{\textperiodcentered} \UnicodeEncodingName{"00B7}
-\DeclareTextSymbol{\textonesuperior} \UnicodeEncodingName{"00B9}
-\DeclareTextSymbol{\textordmasculine} \UnicodeEncodingName{"00BA}
+\DeclareUnicodeSymbol{\textlnot} {"00AC}
+\DeclareUnicodeSymbol{\textregistered} {"00AE}
+\DeclareUnicodeSymbol{\textasciimacron} {"00AF}
+\DeclareUnicodeSymbol{\textdegree} {"00B0}
+\DeclareUnicodeSymbol{\textpm} {"00B1}
+\DeclareUnicodeSymbol{\texttwosuperior} {"00B2}
+\DeclareUnicodeSymbol{\textthreesuperior} {"00B3}
+\DeclareUnicodeSymbol{\textasciiacute} {"00B4}
+\DeclareUnicodeSymbol{\textmu} {"00B5}
+\DeclareUnicodeSymbol{\textparagraph} {"00B6}
+\DeclareUnicodeSymbol{\textperiodcentered} {"00B7}
+\DeclareUnicodeSymbol{\textonesuperior} {"00B9}
+\DeclareUnicodeSymbol{\textordmasculine} {"00BA}
% \end{macrocode}
% \changes{v2.0j}{2018/08/11}{Provide \cs{guillemetleft} and \cs{guillemetright}}
% \begin{macrocode}
-\DeclareTextSymbol{\guillemetright} \UnicodeEncodingName{"00BB}
+\DeclareUnicodeSymbol{\guillemetright} {"00BB}
% old Adobe name
-\DeclareTextSymbol{\guillemotright} \UnicodeEncodingName{"00BB}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\DeclareTextSymbol{\textonequarter} \UnicodeEncodingName{"00BC}
-\DeclareTextSymbol{\textonehalf} \UnicodeEncodingName{"00BD}
-\DeclareTextSymbol{\textthreequarters} \UnicodeEncodingName{"00BE}
-\DeclareTextSymbol{\textquestiondown} \UnicodeEncodingName{"00BF}
-\DeclareTextSymbol{\AE} \UnicodeEncodingName{"00C6}
-\DeclareTextSymbol{\DH} \UnicodeEncodingName{"00D0}
-\DeclareTextSymbol{\texttimes} \UnicodeEncodingName{"00D7}
-\DeclareTextSymbol{\O} \UnicodeEncodingName{"00D8}
-\DeclareTextSymbol{\TH} \UnicodeEncodingName{"00DE}
-\DeclareTextSymbol{\ss} \UnicodeEncodingName{"00DF}
-\DeclareTextSymbol{\ae} \UnicodeEncodingName{"00E6}
-\DeclareTextSymbol{\dh} \UnicodeEncodingName{"00F0}
-\DeclareTextSymbol{\textdiv} \UnicodeEncodingName{"00F7}
-\DeclareTextSymbol{\o} \UnicodeEncodingName{"00F8}
-\DeclareTextSymbol{\th} \UnicodeEncodingName{"00FE}
-\DeclareTextSymbol{\DJ} \UnicodeEncodingName{"0110}
-\DeclareTextSymbol{\dj} \UnicodeEncodingName{"0111}
-\DeclareTextSymbol{\i} \UnicodeEncodingName{"0131}
-\DeclareTextSymbol{\IJ} \UnicodeEncodingName{"0132}
-\DeclareTextSymbol{\ij} \UnicodeEncodingName{"0133}
-\DeclareTextSymbol{\L} \UnicodeEncodingName{"0141}
-\DeclareTextSymbol{\l} \UnicodeEncodingName{"0142}
-\DeclareTextSymbol{\NG} \UnicodeEncodingName{"014A}
-\DeclareTextSymbol{\ng} \UnicodeEncodingName{"014B}
-\DeclareTextSymbol{\OE} \UnicodeEncodingName{"0152}
-\DeclareTextSymbol{\oe} \UnicodeEncodingName{"0153}
-\DeclareTextSymbol{\textflorin} \UnicodeEncodingName{"0192}
-\DeclareTextSymbol{\j} \UnicodeEncodingName{"0237}
-\DeclareTextSymbol{\textasciicaron} \UnicodeEncodingName{"02C7}
-\DeclareTextSymbol{\textasciibreve} \UnicodeEncodingName{"02D8}
-\DeclareTextSymbol{\textacutedbl} \UnicodeEncodingName{"02DD}
-\DeclareTextSymbol{\textgravedbl} \UnicodeEncodingName{"02F5}
-\DeclareTextSymbol{\texttildelow} \UnicodeEncodingName{"02F7}
-\DeclareTextSymbol{\textbaht} \UnicodeEncodingName{"0E3F}
-\DeclareTextSymbol{\SS} \UnicodeEncodingName{"1E9E}
-\DeclareTextSymbol{\textcompwordmark} \UnicodeEncodingName{"200C}
+\DeclareUnicodeSymbol{\guillemotright} {"00BB}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareUnicodeSymbol{\textonequarter} {"00BC}
+\DeclareUnicodeSymbol{\textonehalf} {"00BD}
+\DeclareUnicodeSymbol{\textthreequarters} {"00BE}
+\DeclareUnicodeSymbol{\textquestiondown} {"00BF}
+\DeclareUnicodeSymbol{\AE} {"00C6}
+\DeclareUnicodeSymbol{\DH} {"00D0}
+\DeclareUnicodeSymbol{\texttimes} {"00D7}
+\DeclareUnicodeSymbol{\O} {"00D8}
+\DeclareUnicodeSymbol{\TH} {"00DE}
+\DeclareUnicodeSymbol{\ss} {"00DF}
+\DeclareUnicodeSymbol{\ae} {"00E6}
+\DeclareUnicodeSymbol{\dh} {"00F0}
+\DeclareUnicodeSymbol{\textdiv} {"00F7}
+\DeclareUnicodeSymbol{\o} {"00F8}
+\DeclareUnicodeSymbol{\th} {"00FE}
+\DeclareUnicodeSymbol{\DJ} {"0110}
+\DeclareUnicodeSymbol{\dj} {"0111}
+\DeclareUnicodeSymbol{\i} {"0131}
+\DeclareUnicodeSymbol{\IJ} {"0132}
+\DeclareUnicodeSymbol{\ij} {"0133}
+\DeclareUnicodeSymbol{\L} {"0141}
+\DeclareUnicodeSymbol{\l} {"0142}
+\DeclareUnicodeSymbol{\NG} {"014A}
+\DeclareUnicodeSymbol{\ng} {"014B}
+\DeclareUnicodeSymbol{\OE} {"0152}
+\DeclareUnicodeSymbol{\oe} {"0153}
+\DeclareUnicodeSymbol{\textflorin} {"0192}
+\DeclareUnicodeSymbol{\j} {"0237}
+\DeclareUnicodeSymbol{\textasciicaron} {"02C7}
+\DeclareUnicodeSymbol{\textasciibreve} {"02D8}
+\DeclareUnicodeSymbol{\textacutedbl} {"02DD}
+\DeclareUnicodeSymbol{\textgravedbl} {"02F5}
+\DeclareUnicodeSymbol{\texttildelow} {"02F7}
+\DeclareUnicodeSymbol{\textbaht} {"0E3F}
+\DeclareUnicodeSymbol{\SS} {"1E9E}
+\DeclareUnicodeSymbol{\textcompwordmark} {"200C}
% \end{macrocode}
%
% \changes{v2.0u}{2021/02/19}{Add \cs{textnonbreakinghyphen}, \cs{textfiguredash}
% and \cs{texthorizontalbar} (gh/404)}
% \begin{macrocode}
-%\DeclareTextSymbol{\textnonbreakinghyphen} \UnicodeEncodingName{"2011}
-%\DeclareTextSymbol{\textfiguredash} \UnicodeEncodingName{"2012}
-\DeclareTextSymbol{\textendash} \UnicodeEncodingName{"2013}
-\DeclareTextSymbol{\textemdash} \UnicodeEncodingName{"2014}
-%\DeclareTextSymbol{\texthorizontalbar} \UnicodeEncodingName{"2015}
+%\DeclareUnicodeSymbol{\textnonbreakinghyphen} {"2011}
+%\DeclareUnicodeSymbol{\textfiguredash} {"2012}
+\DeclareUnicodeSymbol{\textendash} {"2013}
+\DeclareUnicodeSymbol{\textemdash} {"2014}
+%\DeclareUnicodeSymbol{\texthorizontalbar} {"2015}
% \end{macrocode}
% Unfortunately some fonts do not implement \texttt{"2011}, \texttt{"2012} and/or
% \texttt{"2015} (including the \LaTeX{} default fonts for Unicode
@@ -3175,70 +3205,70 @@
% The \verb=\nobreak\hskip\z@= is there to prevent a break after
% the hyphen but allow later breaks in the remainder of the word.
% \begin{macrocode}
-\DeclareTextCommand{\textnonbreakinghyphen} \UnicodeEncodingName
+\DeclareUnicodeCommand{\textnonbreakinghyphen}
{\iffontchar\font "2011 \char "2011 \else \mbox{-}\nobreak\hskip\z@ \fi}
-\DeclareTextCommand{\textfiguredash} \UnicodeEncodingName
+\DeclareUnicodeCommand{\textfiguredash}
{\iffontchar\font "2012 \char "2012 \else \char "2013 \fi}
-\DeclareTextCommand{\texthorizontalbar} \UnicodeEncodingName
+\DeclareUnicodeCommand{\texthorizontalbar}
{\iffontchar\font "2015 \char "2015 \else \char "2014 \fi}
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareTextSymbol{\textbardbl} \UnicodeEncodingName{"2016}
-\DeclareTextSymbol{\textquoteleft} \UnicodeEncodingName{"2018}
-\DeclareTextSymbol{\textquoteright} \UnicodeEncodingName{"2019}
-\DeclareTextSymbol{\quotesinglbase} \UnicodeEncodingName{"201A}
-\DeclareTextSymbol{\textquotedblleft} \UnicodeEncodingName{"201C}
-\DeclareTextSymbol{\textquotedblright} \UnicodeEncodingName{"201D}
-\DeclareTextSymbol{\quotedblbase} \UnicodeEncodingName{"201E}
-\DeclareTextSymbol{\textdagger} \UnicodeEncodingName{"2020}
-\DeclareTextSymbol{\textdaggerdbl} \UnicodeEncodingName{"2021}
-\DeclareTextSymbol{\textbullet} \UnicodeEncodingName{"2022}
-\DeclareTextSymbol{\textellipsis} \UnicodeEncodingName{"2026}
-\DeclareTextSymbol{\textperthousand} \UnicodeEncodingName{"2030}
-\DeclareTextSymbol{\textpertenthousand} \UnicodeEncodingName{"2031}
-\DeclareTextSymbol{\guilsinglleft} \UnicodeEncodingName{"2039}
-\DeclareTextSymbol{\guilsinglright} \UnicodeEncodingName{"203A}
-\DeclareTextSymbol{\textreferencemark} \UnicodeEncodingName{"203B}
-\DeclareTextSymbol{\textinterrobang} \UnicodeEncodingName{"203D}
-\DeclareTextSymbol{\textfractionsolidus} \UnicodeEncodingName{"2044}
-\DeclareTextSymbol{\textlquill} \UnicodeEncodingName{"2045}
-\DeclareTextSymbol{\textrquill} \UnicodeEncodingName{"2046}
-\DeclareTextSymbol{\textdiscount} \UnicodeEncodingName{"2052}
-\DeclareTextSymbol{\textcolonmonetary} \UnicodeEncodingName{"20A1}
-\DeclareTextSymbol{\textlira} \UnicodeEncodingName{"20A4}
-\DeclareTextSymbol{\textnaira} \UnicodeEncodingName{"20A6}
-\DeclareTextSymbol{\textwon} \UnicodeEncodingName{"20A9}
-\DeclareTextSymbol{\textdong} \UnicodeEncodingName{"20AB}
-\DeclareTextSymbol{\texteuro} \UnicodeEncodingName{"20AC}
-\DeclareTextSymbol{\textpeso} \UnicodeEncodingName{"20B1}
-\DeclareTextSymbol{\textcelsius} \UnicodeEncodingName{"2103}
-\DeclareTextSymbol{\textnumero} \UnicodeEncodingName{"2116}
-\DeclareTextSymbol{\textcircledP} \UnicodeEncodingName{"2117}
-\DeclareTextSymbol{\textrecipe} \UnicodeEncodingName{"211E}
-\DeclareTextSymbol{\textservicemark} \UnicodeEncodingName{"2120}
-\DeclareTextSymbol{\texttrademark} \UnicodeEncodingName{"2122}
-\DeclareTextSymbol{\textohm} \UnicodeEncodingName{"2126}
-\DeclareTextSymbol{\textmho} \UnicodeEncodingName{"2127}
-\DeclareTextSymbol{\textestimated} \UnicodeEncodingName{"212E}
-\DeclareTextSymbol{\textleftarrow} \UnicodeEncodingName{"2190}
-\DeclareTextSymbol{\textuparrow} \UnicodeEncodingName{"2191}
-\DeclareTextSymbol{\textrightarrow} \UnicodeEncodingName{"2192}
-\DeclareTextSymbol{\textdownarrow} \UnicodeEncodingName{"2193}
-\DeclareTextSymbol{\textminus} \UnicodeEncodingName{"2212}
+\DeclareUnicodeSymbol{\textbardbl} {"2016}
+\DeclareUnicodeSymbol{\textquoteleft} {"2018}
+\DeclareUnicodeSymbol{\textquoteright} {"2019}
+\DeclareUnicodeSymbol{\quotesinglbase} {"201A}
+\DeclareUnicodeSymbol{\textquotedblleft} {"201C}
+\DeclareUnicodeSymbol{\textquotedblright} {"201D}
+\DeclareUnicodeSymbol{\quotedblbase} {"201E}
+\DeclareUnicodeSymbol{\textdagger} {"2020}
+\DeclareUnicodeSymbol{\textdaggerdbl} {"2021}
+\DeclareUnicodeSymbol{\textbullet} {"2022}
+\DeclareUnicodeSymbol{\textellipsis} {"2026}
+\DeclareUnicodeSymbol{\textperthousand} {"2030}
+\DeclareUnicodeSymbol{\textpertenthousand} {"2031}
+\DeclareUnicodeSymbol{\guilsinglleft} {"2039}
+\DeclareUnicodeSymbol{\guilsinglright} {"203A}
+\DeclareUnicodeSymbol{\textreferencemark} {"203B}
+\DeclareUnicodeSymbol{\textinterrobang} {"203D}
+\DeclareUnicodeSymbol{\textfractionsolidus} {"2044}
+\DeclareUnicodeSymbol{\textlquill} {"2045}
+\DeclareUnicodeSymbol{\textrquill} {"2046}
+\DeclareUnicodeSymbol{\textdiscount} {"2052}
+\DeclareUnicodeSymbol{\textcolonmonetary} {"20A1}
+\DeclareUnicodeSymbol{\textlira} {"20A4}
+\DeclareUnicodeSymbol{\textnaira} {"20A6}
+\DeclareUnicodeSymbol{\textwon} {"20A9}
+\DeclareUnicodeSymbol{\textdong} {"20AB}
+\DeclareUnicodeSymbol{\texteuro} {"20AC}
+\DeclareUnicodeSymbol{\textpeso} {"20B1}
+\DeclareUnicodeSymbol{\textcelsius} {"2103}
+\DeclareUnicodeSymbol{\textnumero} {"2116}
+\DeclareUnicodeSymbol{\textcircledP} {"2117}
+\DeclareUnicodeSymbol{\textrecipe} {"211E}
+\DeclareUnicodeSymbol{\textservicemark} {"2120}
+\DeclareUnicodeSymbol{\texttrademark} {"2122}
+\DeclareUnicodeSymbol{\textohm} {"2126}
+\DeclareUnicodeSymbol{\textmho} {"2127}
+\DeclareUnicodeSymbol{\textestimated} {"212E}
+\DeclareUnicodeSymbol{\textleftarrow} {"2190}
+\DeclareUnicodeSymbol{\textuparrow} {"2191}
+\DeclareUnicodeSymbol{\textrightarrow} {"2192}
+\DeclareUnicodeSymbol{\textdownarrow} {"2193}
+\DeclareUnicodeSymbol{\textminus} {"2212}
% \end{macrocode}
% \changes{v2.0k}{2018/11/18}{Provide \cs{Hwithstroke} and \cs{hwithstroke}}
% \begin{macrocode}
-\DeclareTextSymbol{\Hwithstroke} \UnicodeEncodingName{"0126}
-\DeclareTextSymbol{\hwithstroke} \UnicodeEncodingName{"0127}
+\DeclareUnicodeSymbol{\Hwithstroke} {"0126}
+\DeclareUnicodeSymbol{\hwithstroke} {"0127}
% \end{macrocode}
%
% Not all fonts have U+2217 but using U+002A requires some adjustment.
% \changes{v2.0t}{2021/02/17}{Adjust values for
% \cs{textasteriskcentered} To match TS1 definition (gh/502)}
% \begin{macrocode}
-\DeclareTextCommand{\textasteriskcentered}\UnicodeEncodingName{%
+\DeclareUnicodeCommand{\textasteriskcentered}{%
\iffontchar\font"2217 \char"2217 \else
\begingroup
\fontsize
@@ -3251,36 +3281,39 @@
}
% \end{macrocode}
% \begin{macrocode}
-\DeclareTextSymbol{\textsurd} \UnicodeEncodingName{"221A}
-\DeclareTextSymbol{\textlangle} \UnicodeEncodingName{"2329}
-\DeclareTextSymbol{\textrangle} \UnicodeEncodingName{"232A}
-\DeclareTextSymbol{\textblank} \UnicodeEncodingName{"2422}
-\DeclareTextSymbol{\textvisiblespace} \UnicodeEncodingName{"2423}
-\DeclareTextSymbol{\textopenbullet} \UnicodeEncodingName{"25E6}
-\DeclareTextSymbol{\textbigcircle} \UnicodeEncodingName{"25EF}
-\DeclareTextSymbol{\textmusicalnote} \UnicodeEncodingName{"266A}
-\DeclareTextSymbol{\textmarried} \UnicodeEncodingName{"26AD}
-\DeclareTextSymbol{\textdivorced} \UnicodeEncodingName{"26AE}
-\DeclareTextSymbol{\textinterrobangdown} \UnicodeEncodingName{"2E18}
+\DeclareUnicodeSymbol{\textsurd} {"221A}
+\DeclareUnicodeSymbol{\textlangle} {"2329}
+\DeclareUnicodeSymbol{\textrangle} {"232A}
+\DeclareUnicodeSymbol{\textblank} {"2422}
+\DeclareUnicodeSymbol{\textvisiblespace} {"2423}
+\DeclareUnicodeSymbol{\textopenbullet} {"25E6}
+\DeclareUnicodeSymbol{\textbigcircle} {"25EF}
+\DeclareUnicodeSymbol{\textmusicalnote} {"266A}
+\DeclareUnicodeSymbol{\textmarried} {"26AD}
+\DeclareUnicodeSymbol{\textdivorced} {"26AE}
+\DeclareUnicodeSymbol{\textinterrobangdown} {"2E18}
% \end{macrocode}
% Accents must be declared before the composites that use them.
% \begin{macrocode}
-\DeclareUnicodeAccent{\`} \UnicodeEncodingName{"0300}
-\DeclareUnicodeAccent{\'} \UnicodeEncodingName{"0301}
-\DeclareUnicodeAccent{\^} \UnicodeEncodingName{"0302}
-\DeclareUnicodeAccent{\~} \UnicodeEncodingName{"0303}
-\DeclareUnicodeAccent{\=} \UnicodeEncodingName{"0304}
-\DeclareUnicodeAccent{\u} \UnicodeEncodingName{"0306}
-\DeclareUnicodeAccent{\.} \UnicodeEncodingName{"0307}
-\DeclareUnicodeAccent{\"} \UnicodeEncodingName{"0308}
-\DeclareUnicodeAccent{\r} \UnicodeEncodingName{"030A}
-\DeclareUnicodeAccent{\H} \UnicodeEncodingName{"030B}
-\DeclareUnicodeAccent{\v} \UnicodeEncodingName{"030C}
-\DeclareUnicodeAccent{\b} \UnicodeEncodingName{"0332}
-\DeclareUnicodeAccent{\d} \UnicodeEncodingName{"0323}
-\DeclareUnicodeAccent{\c} \UnicodeEncodingName{"0327}
-\DeclareUnicodeAccent{\k} \UnicodeEncodingName{"0328}
-\DeclareTextCommand\textcommabelow \UnicodeEncodingName[1]
+\DeclareUnicodeAccent{\`}{"0300}
+\DeclareUnicodeAccent{\'}{"0301}
+\DeclareUnicodeAccent{\^}{"0302}
+\DeclareUnicodeAccent{\~}{"0303}
+\DeclareUnicodeAccent{\=}{"0304}
+\DeclareUnicodeAccent{\u}{"0306}
+\DeclareUnicodeAccent{\.}{"0307}
+\DeclareUnicodeAccent{\"}{"0308}
+\DeclareUnicodeAccent{\r}{"030A}
+\DeclareUnicodeAccent{\H}{"030B}
+\DeclareUnicodeAccent{\v}{"030C}
+\DeclareUnicodeAccent{\b}{"0332}
+\DeclareUnicodeAccent{\d}{"0323}
+\DeclareUnicodeAccent{\c}{"0327}
+\DeclareUnicodeAccent{\k}{"0328}
+% \end{macrocode}
+% The odd one out:
+% \begin{macrocode}
+\DeclareUnicodeCommand\textcommabelow[1]
{\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex
\hbox{\check@mathfonts\fontsize\ssf@size\z@
\math@fontsfalse\selectfont,}\hidewidth}\egroup}
@@ -3731,7 +3764,10 @@
\@elt{\csname opt@fontenc.sty\endcsname}}
% \end{macrocode}
%
+% \changes{v2.0z}{2022/05/27}{Save the version string (gh/825)}
% \begin{macrocode}
+\global\expandafter\let\csname ver@@fontenc.sty\expandafter\endcsname
+ \csname ver@fontenc.sty\endcsname
\global\expandafter\let\csname ver@fontenc.sty\endcsname\relax
\global\expandafter\let\csname opt@fontenc.sty\endcsname\relax
\global\let\@ifl@ter@@\@ifl@ter
@@ -3743,4 +3779,12 @@
%
% \Finale
%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput
+
+^^A Needed for emacs
+^^A
+^^A Local Variables:
+^^A mode: latex
+^^A coding: utf-8-unix
+^^A End:
diff --git a/macros/latex/base/ltoutenc.ins b/macros/latex/base/ltoutenc.ins
index 1330b5c44e..8ff0f02608 100644
--- a/macros/latex/base/ltoutenc.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/ltoutput.dtx b/macros/latex/base/ltoutput.dtx
index 78b0f2335f..c2cb8f66b3 100644
--- a/macros/latex/base/ltoutput.dtx
+++ b/macros/latex/base/ltoutput.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -37,7 +37,7 @@
%<*driver>
% \fi
\ProvidesFile{ltoutput.dtx}
- [2021/09/03 v1.4h LaTeX Kernel (Output Routine)]
+ [2022/04/03 v1.4i LaTeX Kernel (Output Routine)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutput.dtx}
@@ -120,7 +120,7 @@
% \changes{v1.2n}{2015/02/21}
% {Removed autoload code}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \def \ie {i.e.~}
% \def \eg {e.g.~}
@@ -1648,8 +1648,18 @@
%<*2ekernel|fltrace>
\def \@opcol {%
\if@twocolumn
+% \end{macrocode}
+% \changes{v1.ih}{2022/04/03}{Interface with new mark mechanism}
+% The funny-looking internal commands are interfacing with the new
+% marks mechanism. We make sure (elsewhere) that those are always
+% defined, even when we roll back, so here we add them
+% unconditionally. This still need turning into a hook or config
+% point eventually:
+% \begin{macrocode}
+ \@expl@@@mark@update@dblcol@structures@@
\@outputdblcol
\else
+ \@expl@@@mark@update@singlecol@structures@@
\@outputpage
%<*trace>
\fl@trace{PAGE: one column (float? see above) page completed}%
diff --git a/macros/latex/base/ltpage.dtx b/macros/latex/base/ltpage.dtx
index 4504033f54..1d514fc7c7 100644
--- a/macros/latex/base/ltpage.dtx
+++ b/macros/latex/base/ltpage.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltpage.dtx}
- [2020/12/05 v1.0m LaTeX Kernel (page style setup)]
+ [2022/04/03 v1.0n LaTeX Kernel (page style setup)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltpage.dtx}
@@ -112,7 +112,7 @@
% command (|\ps@...|) to |\markboth| for setting the heading or to
% |\@gobbletwo| to do nothing.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
@@ -180,10 +180,11 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\markboth}{Make commands robust}%
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\markboth}{New mark support}%
% \end{macrocode}
%
+%
% \begin{macro}{\markboth}
% \begin{macro}{\markright}
% \changes{v1.0d}{1994/05/20}{Changed setting for \cs{protect}.}
@@ -202,18 +203,37 @@
% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion
% error (pr/3203).}
% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
+% \changes{v1.0n}{2022/04/04}{Interface with new mark mechanism}
% \begin{macrocode}
+\ExplSyntaxOn
\DeclareRobustCommand*\markboth[2]{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
\unrestored@protected@xdef\@themark {{#1}{#2}}%
\@temptokena \expandafter{\@themark}%
+% \end{macrocode}
+% In addition to generating the legacy mark we output the
+% individual ones as well at the very same point.
+% The legacy mark is kept unchanged in order to work with packages
+% that expect that mark in exactly the way it is right now.
+%
+% We might want to think about how to improve this in one-side
+% documents, see comments below.
+%
+% We have not changed all of the code to L3 prog layer convention,
+% in case packages attempt to do some patching and expect the 2e
+% names being around. Eventually this should and will change.
+% \begin{macrocode}
+ \mark_insert:nn{2e-left}{#1}
+ \mark_insert:nn{2e-right}{#2}
+ \tl_if_empty:nF{#2}{ \mark_insert:nn{2e-right-nonempty}{#2} }
\mark{\the\@temptokena}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}
% \end{macrocode}
%
% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
+% \changes{v1.0n}{2022/04/04}{Interface with new mark mechanism}
% \begin{macrocode}
\DeclareRobustCommand*\markright[1]{%
\begingroup
@@ -223,9 +243,23 @@
% \begin{macrocode}
\expandafter\@markright\@themark {#1}%
\@temptokena \expandafter{\@themark}%
+% \end{macrocode}
+% Same game with \cs{markright} more or less \ldots
+% \begin{macrocode}
+ \mark_insert:nn{2e-right}{#1}
+ \tl_if_empty:nF{#1}{ \mark_insert:nn{2e-right-nonempty}{#1} }
+% \end{macrocode}
+% The legacy \LaTeX{} mechanism always sets left and right mark,
+% i.e., if a sub-mark (i.e., right mark) is set the corresponding main
+% mark also is getting a mark with the same value it had previously.
+% However, for the individual mark classes this means we are losing
+% information so for them that is not done.
+% \begin{macrocode}
+% \mark_insert:nn{2e-left}{\exp_after:wN \use_i:nn \@themark }
\mark{\the\@temptokena}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}
+\ExplSyntaxOff
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -233,6 +267,27 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\markboth}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand*\markboth[2]{%
+%<latexrelease> \begingroup
+%<latexrelease> \let\label\relax \let\index\relax \let\glossary\relax
+%<latexrelease> \unrestored@protected@xdef\@themark {{#1}{#2}}%
+%<latexrelease> \@temptokena \expandafter{\@themark}%
+%<latexrelease> \mark{\the\@temptokena}%
+%<latexrelease> \endgroup
+%<latexrelease> \if@nobreak\ifvmode\nobreak\fi\fi}
+%<latexrelease>\DeclareRobustCommand*\markright[1]{%
+%<latexrelease> \begingroup
+%<latexrelease> \let\label\relax \let\index\relax \let\glossary\relax
+%<latexrelease> \expandafter\@markright\@themark {#1}%
+%<latexrelease> \@temptokena \expandafter{\@themark}%
+%<latexrelease> \mark{\the\@temptokena}%
+%<latexrelease> \endgroup
+%<latexrelease> \if@nobreak\ifvmode\nobreak\fi\fi}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\markboth}{Make commands robust}%
%<latexrelease>
diff --git a/macros/latex/base/ltpageno.dtx b/macros/latex/base/ltpageno.dtx
index 03d36a53d9..8142639633 100644
--- a/macros/latex/base/ltpageno.dtx
+++ b/macros/latex/base/ltpageno.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -77,7 +77,7 @@
% numbered i, ii, etc.
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*2ekernel>
diff --git a/macros/latex/base/ltpar.dtx b/macros/latex/base/ltpar.dtx
index 969954be0a..50ff57183c 100644
--- a/macros/latex/base/ltpar.dtx
+++ b/macros/latex/base/ltpar.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -96,7 +96,7 @@
% \end{itemize}
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \subsection{Implementation}
%
diff --git a/macros/latex/base/ltpara-code.pdf b/macros/latex/base/ltpara-code.pdf
index 19751686df..52bd980cb1 100644
--- a/macros/latex/base/ltpara-code.pdf
+++ b/macros/latex/base/ltpara-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltpara-doc.pdf b/macros/latex/base/ltpara-doc.pdf
index f0947f199e..5e05da5379 100644
--- a/macros/latex/base/ltpara-doc.pdf
+++ b/macros/latex/base/ltpara-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltpara-doc.tex b/macros/latex/base/ltpara-doc.tex
index c3892b8180..f3a51bbd2e 100644
--- a/macros/latex/base/ltpara-doc.tex
+++ b/macros/latex/base/ltpara-doc.tex
@@ -2,5 +2,6 @@
\AtBeginDocument{\OnlyDescription
\let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
}
\input{ltpara.dtx}
diff --git a/macros/latex/base/ltpara.dtx b/macros/latex/base/ltpara.dtx
index a2da67198a..9296f2b2cd 100644
--- a/macros/latex/base/ltpara.dtx
+++ b/macros/latex/base/ltpara.dtx
@@ -15,7 +15,7 @@
%
% \begin{macrocode}
\def\ltparaversion{v1.0k}
-\def\ltparadate{2021/11/11}
+\def\ltparadate{2022/05/13}
% \end{macrocode}
%<*driver>
\documentclass{l3doc}
@@ -123,7 +123,7 @@
% \verb=\hbox{a\par b}= is ignored, but \verb=$a\par b$= would complain.
%
% If this primitive ends the paragraph it does some special
-% \enquote{end of horizontal list} processing, then calls \TeX{}’s paragraph
+% \enquote{end of horizontal list} processing, then calls \TeX{}'s paragraph
% builder; this breaks the horizontal list into lines and then these
% lines are added as boxes to the enclosing vertical list and
% \TeX{} returns to vertical mode.
@@ -484,7 +484,7 @@
%
% To avoid issues a paragraph started by them should always be
% ended by \cs{RawParEnd}\footnote{Technical note for those who
-% know their \textit{\TeX book\/}: the \cs{RawParEnd} comand
+% know their \textit{\TeX book\/}: the \cs{RawParEnd} command
% invokes the original \TeX{} engine definition of \cs{par} that
% (soley) triggers the paragraph builder in \TeX{} when found
% inside unrestricted horizontal mode and does nothing in other
@@ -665,7 +665,7 @@
%
%
%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
%
% \section{The Implementation}
diff --git a/macros/latex/base/ltpictur.dtx b/macros/latex/base/ltpictur.dtx
index ae8b58995d..453ec6149e 100644
--- a/macros/latex/base/ltpictur.dtx
+++ b/macros/latex/base/ltpictur.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -83,7 +83,7 @@
% variant of this command, |\bezier|, is defined, in which the first
% argument is not optional.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v0.1a}{1994/03/07}{Initial version, split from latex.dtx}
diff --git a/macros/latex/base/ltplain.dtx b/macros/latex/base/ltplain.dtx
index 5fa7039679..ee1cf0a161 100644
--- a/macros/latex/base/ltplain.dtx
+++ b/macros/latex/base/ltplain.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltplain.dtx}
- [2021/07/16 v2.3g LaTeX Kernel (Plain TeX)]
+ [2022/01/25 v2.3h LaTeX Kernel (Plain TeX)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltplain.dtx}
@@ -102,7 +102,7 @@
% \LaTeX{} uses its own output routine, so most of the plain one was
% removed.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \begin{macrocode}
@@ -1186,18 +1186,143 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\obeylines}
-% \begin{macro}{\obeyspaces}
-% In |\obeylines|, we say |\let^^M=\par| instead of |\def^^M{\par}|
-% since this allows, for example, |\let\par=\cr \obeylines \halign{...|
+% \begin{macro}{\obeylines,\obeyspaces}
+% In |\obeylines|, we say |\let^^M=\obeyedline| instead of |\def^^M{\obeyedline}|
+% since this allows, for example,
+% |\let\obeyedline=\cr \obeylines \halign{...|.
+%
+% This is essentially a plain \TeX{} trick and in its original
+% version where you had to use to use |\let\par=\cr| not really a
+% safe idea in \LaTeX. If anybody used this trick
+% this now breaks (and one needs to use \cs{obeyedline} instead).
+% \changes{v2.3h}{2022/01/25}{Provide redirection to support special
+% use cases (gh/367)}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<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
+% 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.
+%
+% \begin{macrocode}
+\begingroup
+\catcode`\^^M=\active % these lines must end with %
+ \gdef\obeylines{\catcode`\^^M\active%
+ \let^^M\obeyedline%
+% \end{macrocode}
+%
+% The next line ending the definition is rather curious and it took
+% me awhile to understand why rollback fails. The problem is the
+% following: if \texttt{latexrelease} is used, then blocks of
+% \cs{IncludeInRelease} \dots\ \cs{EndIncludeInRelease} are
+% bypassed at high speed by grabbing each as a delimited
+% argument. However, in that case |^^M| is seen not as code but as
+% 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
+% 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
+% and we end with unbalanced braces and never see the
+% \cs{EndIncludeInRelease} --- weird. In other places it doesn't
+% matter because we aren't using the incomplete result.
% \begin{macrocode}
-{\catcode`\^^M=\active % these lines must end with %
- \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
- \global\let^^M\par} % this is in case ^^M appears in a \write
-\def\obeyspaces{\catcode`\ \active}
-{\obeyspaces\global\let =\space}
+ }%
+ \global\let^^M\par % this is in case ^^M appears in a \write
+\endgroup
+% \end{macrocode}
+%
+% \begin{macro}{\obeyedline}
+% The \cs{obeyedline} expands by default to
+% \cs{par} with whatever definition \cs{par} has when it is
+% executed. It can, however, be
+% redefined (before calling \cs{obeylines}!) to achieve some
+% special effects. If you want to alter is definition when already
+% in the scope of \cs{obeylines}, it has no effect (because
+% \cs{let} is used above).
+% In that case simply make another call to \cs{obeylines}
+% immediately. As you are in a restricted scope all that happens is
+% that your redefinition is applied.
+%
+% For the default definition we have to use \cs{def} not \cs{let}
+% because the meaning of \cs{par} can change and we want to use the
+% 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
+% \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.
+% \begin{macrocode}
+\protected\gdef\obeyedline{\par}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\obeyedspace}
+% The definition of \cs{obeyspaces} is changed in the same way and
+% now executes \cs{obeyedspace} for each active space.
+% \begin{macrocode}
+\global\let\obeyedspace\space
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\begingroup
+\catcode`\ =\active%
+\gdef\obeyspaces{\catcode`\ \active\let =\obeyedspace}%
+% \end{macrocode}
+% An active space elsewhere generates \cs{space} by default
+% (for example in a \cs{write}).
+% \begin{macrocode}
+\global\let =\space%
+\endgroup
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}{\obeylines}%
+%<latexrelease> {Add a redirection to obeylines and obeyspaces}%
+%<latexrelease>
+% \end{macrocode}
+% From 2019 onwards the commands are made robust (somewhat later in
+% the kernel sources). So if we roll back they are robust, so when
+% redefining them we have get rid of the robust payload
+% first. Otherwise that is seen by the later rollback below, which
+% then installs a fragile version of the new definition on top of
+% the one we roll back to here, sigh. \cs{kernel@make@fragile} also
+% changes its definition (later own) so this is done directly.
+% \begin{macrocode}
+%<latexrelease>\expandafter\let\csname obeylines \endcsname\@undefined
+%<latexrelease>\expandafter\let\csname obeyspace \endcsname\@undefined
+%<latexrelease>
+%<latexrelease>\begingroup
+%<latexrelease>\catcode`\^^M=\active % these lines must end with %
+%<latexrelease> \gdef\obeylines{\catcode`\^^M\active \let^^M\par %
+% \end{macrocode}
+% Closing brace on a separate line (see comment above).
+% \begin{macrocode}
+%<latexrelease> }%
+% \end{macrocode}
+% Another pitfall: if we do a rollback \cs{par} is no longer the
+% primitive, so the roll back definition needs \cs{let} to what is
+% new the primitive.
+% \begin{macrocode}
+%<latexrelease> \global\let^^M\RawParEnd % this is in case ^^M appears in a \write
+%<latexrelease>\endgroup
+%<latexrelease>\def\obeyspaces{\catcode`\ \active}
+%<latexrelease>
+%<latexrelease>\let\obeyedline\@undefined
+%<latexrelease>\let\obeyedspace\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\loop}
diff --git a/macros/latex/base/ltsect.dtx b/macros/latex/base/ltsect.dtx
index 67974c7387..71ab1ee89d 100644
--- a/macros/latex/base/ltsect.dtx
+++ b/macros/latex/base/ltsect.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -73,7 +73,7 @@
% document level commands are defined in the class files, in terms of
% these commands.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v1.0a}{1994/03/04}{Initial version, split from latex.dtx}
diff --git a/macros/latex/base/ltshipout-code.pdf b/macros/latex/base/ltshipout-code.pdf
index 81c4fb666e..f0b7e9d4e0 100644
--- a/macros/latex/base/ltshipout-code.pdf
+++ b/macros/latex/base/ltshipout-code.pdf
Binary files differ
diff --git a/macros/latex/base/ltshipout-doc.pdf b/macros/latex/base/ltshipout-doc.pdf
index 6da6e5b678..5d1c35c96e 100644
--- a/macros/latex/base/ltshipout-doc.pdf
+++ b/macros/latex/base/ltshipout-doc.pdf
Binary files differ
diff --git a/macros/latex/base/ltshipout-doc.tex b/macros/latex/base/ltshipout-doc.tex
index 33f87d8862..4cca5e9cbe 100644
--- a/macros/latex/base/ltshipout-doc.tex
+++ b/macros/latex/base/ltshipout-doc.tex
@@ -3,5 +3,6 @@
\AtBeginDocument{\OnlyDescription
% \let\tableofcontents\relax
+ \RenewCommandCopy\MaybeStop\StopEventually
}
\input{ltshipout.dtx}
diff --git a/macros/latex/base/ltshipout.dtx b/macros/latex/base/ltshipout.dtx
index 7f6555d18c..83fab820a9 100644
--- a/macros/latex/base/ltshipout.dtx
+++ b/macros/latex/base/ltshipout.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%%
-%% Copyright (C) 2020-2021
+%% Copyright (C) 2020-2022
%% Frank Mittelbach, LaTeX Team
%%
%
@@ -32,8 +32,8 @@
%%% From File: ltshipout.dtx
%
% \begin{macrocode}
-\providecommand\ltshipoutversion{v1.0j}
-\providecommand\ltshipoutdate{2021/06/09}
+\providecommand\ltshipoutversion{v1.0m}
+\providecommand\ltshipoutdate{2022/05/08}
% \end{macrocode}
%
%<*driver>
@@ -327,7 +327,10 @@
% \subsection{Legacy \LaTeX{} commands}
%
% \begin{function}{\AtBeginDvi,\AtEndDvi}
-% \cs{AtBeginDvi} is the existing \LaTeXe{} interface to fill the
+% \begin{syntax}
+% \cs{AtBeginDvi} \Arg{code}
+% \end{syntax}
+ % \cs{AtBeginDvi} is the existing \LaTeXe{} interface to fill the
% \hook{shipout/firstpage} hook. This is not really a good name
% as it is not just supporting \texttt{.dvi} but also \texttt{.pdf}
% output or \texttt{.xdv}.
@@ -335,15 +338,24 @@
% \cs{AtEndDvi} is the counterpart that was not available in the
% kernel but only through the package \pkg{atenddvi}. It fills the
% \hook{shipout/lastpage} hook.
+%
+% Neither interface can set a code label but uses the current default label.
+%
% \end{function}
%
% As these two wrappers have been available for a long time we
-% continue offering them. However, for new code we suggest using
-% the high-level hook management commands directly instead of
-% ``randomly-named'' wrappers. This will lead to code that is
-% easier to understand and to maintain. For this reason we do not
-% provide any other wrapper commands for the above hooks in the
-% kernel.
+% continue offering them (but not enhancing them, e.g., by providing
+% support for code labels).
+%
+% For new code we strongly suggest using the high-level hook
+% management commands directly instead of ``randomly-named''
+% wrappers. This will lead to code that is easier to understand
+% and to maintain and it also allows you to set code labels if
+% needed.
+%
+% For this reason we do not provide any other ``new'' wrapper
+% commands for the above hooks in the kernel, but only keep
+% the existing ones for backward compatibility.
%
%
% \subsection{Special commands for use inside the hooks}
@@ -644,7 +656,7 @@
% \end{function}
%
%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
%
% \section{The Implementation}
@@ -734,21 +746,21 @@
% \begin{macrocode}
\sys_if_engine_luatex:TF
{
- \newluafunction \@@_finalize_box:
+ \newprotectedluacmd \@@_finalize_box:
\exp_args:Nx \everyjob {
\exp_not:V \everyjob
\exp_not:N \lua_now:n {
luatexbase.create_callback('pre_shipout_filter', 'list')
local~call, getbox, setbox = luatexbase.call_callback, tex.getbox, tex.setbox~
- lua.get_functions_table()[\the \@@_finalize_box:] = function()
- local~result = call('pre_shipout_filter', getbox(\the \l_shipout_box))
- if~not (result == true) then~
+ lua.get_functions_table()[\the \allocationnumber] = function()
+ local~head = getbox(\the \l_shipout_box)
+ local~result = call('pre_shipout_filter', head)
+ if~not (result == head) then~
setbox(\the \l_shipout_box, result~or~nil)
end~
end
}
}
- \protected \luadef \@@_finalize_box: \the \@@_finalize_box:
} {
\cs_set_eq:NN \@@_finalize_box: \scan_stop:
}
@@ -1002,8 +1014,14 @@
\_@@_add_foreground_box:n
{ \UseHook{shipout/lastpage}
\@kernel@after@shipout@lastpage }
+ \bool_gset_true:N \g_@@_lastpage_handled_bool
+% \end{macrocode}
+% We record that we have handled the \hook{shipout/lastpage} hook
+% but only if we really did.
+% \changes{v1.0m}{2022/05/08}{Handle case where shipout/lastpage is
+% run too early (gh/813)}
+% \begin{macrocode}
}
- \bool_gset_true:N \g_@@_lastpage_handled_bool
}
\@@_finalize_box:
% \end{macrocode}
@@ -1711,15 +1729,35 @@
\gdef\string\@abspage@last {\int_use:N \g_shipout_readonly_int}}
\fi
% \end{macrocode}
-% But we may have guessed wrongly earlier and we still have to run the
+% But we may have guessed wrongly earlier and have run it too early
+% or we still have to run the
% \hook{shipout/lastpage} even though there is no page to place
% it into. If that is the case we make a trivial extra page and put
% it there. This temporary page will then vanish again on the next
% run but helps to keep pdf viewers happy.
+% In either case we should put out an appropriate ``rerun'' warning.
+% \changes{v1.0m}{2022/05/08}{Handle case where shipout/lastpage is
+% run too early (gh/813)}
% \begin{macrocode}
- \bool_if:NF \g_@@_lastpage_handled_bool
+ \bool_if:NTF \g_@@_lastpage_handled_bool
+ {
+% \end{macrocode}
+% If the hook was already executed, we have to test if that total
+% shipouts match the shipouts from last run (because that
+% corresponds to the page it was executed). If not we output a warning.
+% \begin{macrocode}
+ \int_compare:nNnF \@abspage@last = \g_shipout_readonly_int
+ {
+ \@latex@warning@no@line{Hook~ 'shipout/lastpage'~ executed~
+ on~ wrong~ page~ (\@abspage@last\space not~
+ \int_use:N\g_shipout_readonly_int).\MessageBreak
+ Rerun~ to~ correct~ this}%
+ }
+ }
{
% \end{macrocode}
+% If the hook was not run, we need to add an extra page and place
+% it there.
% However, making this extra page in case the hook is actually
% empty would be forcing a rerun without any reason, so we check
% that condition and also check if
@@ -1966,15 +2004,17 @@
%
%
% \begin{macro}{\AtEndDvi}
-% This package has only one public command to simulating it is easy
+% This package has only one public command, so simulating it is easy
% and actually sensible to provide as part of the kernel.
+% \changes{v1.0l}{2022/01/06}{Correctly simulate \cs{AtEndDvi} without
+% extending the syntax}
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease> {\AtEndDvi}{atenddvi emulation}%
\ExplSyntaxOn
-\cs_new_protected:Npn \AtEndDvi {\AddToHook{shipout/lastpage}}
+\cs_new_protected:Npn \AtEndDvi #1 {\AddToHook{shipout/lastpage}{#1}}
\ExplSyntaxOff
% \end{macrocode}
% As the package is integrate we prevent loading (no need to roll that back):
@@ -2041,9 +2081,11 @@
%
% \begin{macro}{\AtBeginShipout,\AtBeginShipoutNext}
% Filling hooks
+% \changes{v1.0l}{2022/01/06}{Correctly simulate \cs{AtBeginShipout}
+% and \cs{AtBeginShipoutNext} without extending the syntax}
% \begin{macrocode}
-\protected \def \AtBeginShipout {\AddToHook{shipout/before}}
-\protected \def \AtBeginShipoutNext {\AddToHookNext{shipout/before}}
+\protected\long\def\AtBeginShipout #1{\AddToHook{shipout/before}{#1}}
+\protected\long\def\AtBeginShipoutNext #1{\AddToHookNext{shipout/before}{#1}}
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/base/ltspace.dtx b/macros/latex/base/ltspace.dtx
index 17fb0d6518..feb82730ec 100644
--- a/macros/latex/base/ltspace.dtx
+++ b/macros/latex/base/ltspace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -114,7 +114,7 @@
% |\restorecr| : restores <CR> to its usual meaning.
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \subsection{Chris' comments}
%
diff --git a/macros/latex/base/lttab.dtx b/macros/latex/base/lttab.dtx
index 48627f40a3..e32153f31c 100644
--- a/macros/latex/base/lttab.dtx
+++ b/macros/latex/base/lttab.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -74,7 +74,7 @@
% \LaTeX\ Companion}. Use the |array| package to obtain the extended
% version.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v1.0a}{1994/03/04}{Initial version, split from latex.dtx}
diff --git a/macros/latex/base/lttextcomp.dtx b/macros/latex/base/lttextcomp.dtx
index 1efc36d563..de6b221b6c 100644
--- a/macros/latex/base/lttextcomp.dtx
+++ b/macros/latex/base/lttextcomp.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2021
+% Copyright (C) 2019-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -25,9 +25,10 @@
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
%
+%%% From File: lttextcomp.dtx
+%
% \fi
%
-%%% From File: lttextcomp.dtx
%
% \iffalse
%
@@ -36,7 +37,7 @@
%
%
\ProvidesFile{lttextcomp.dtx}
- [2021/04/16 v1.0f LaTeX Kernel (text companion symbols)]
+ [2021/12/09 v1.0f LaTeX Kernel (text companion symbols)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -68,7 +69,7 @@
%
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v1.0e}{2021/03/19}
% {Use \cs{NewModuleRelease}}
@@ -470,16 +471,17 @@
% \end{macrocode}
%
%
-% In the following sections the remaining default definitions are ordered by
-% sub-encoding in which they are become unavailable (i.e., they are
-% not provided in the sub-encoding with that number and all
-% sub-encodings with higher numbers.
+% In the following sections the remaining default definitions are
+% ordered by sub-encoding in which they are become
+% \textbf{unavailable}, i.e., they are not provided in the
+% sub-encoding with that number and all sub-encodings with higher
+% numbers.
%
% Thus the symbols that are available in sub-encoding $x$ are the
-% symbols above (always available) and the symbols list in the
-% sections for sub-encodings $x+1$ and higher.
+% symbols above (always available) and the symbols listed as becoming
+% unavailable in sub-encodings $x+1$ and higher.
%
-% \subsection{Sub-encoding \texttt{1} (drop symbols not working in
+% \subsection{Unavailable in sub-encoding \texttt{1} and higher (drop symbols not working in
% Latin Modern)}
%
% The \cs{textcircled} is available but the glyph is simply too
@@ -493,7 +495,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{2} (majority of new OTF fonts via autoinst)}
+% \subsection{Unavailable in sub-encoding \texttt{2} (majority of new OTF fonts via autoinst) and higher}
%
% \begin{macrocode}
\DeclareTextCommandDefault{\t}
@@ -722,7 +724,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{3}}
+% \subsection{Unavailable in sub-encoding \texttt{3} and higher}
%
% Sub-encoding \texttt{2} is the one where we loose many
% symbols. In the higher-numbered sub-encodings we see only a few
@@ -738,7 +740,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{4}}
+% \subsection{Unavailable in sub-encoding \texttt{4} and higher}
%
% \begin{macrocode}
\DeclareTextCommandDefault{\textcolonmonetary}
@@ -763,7 +765,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{5} (most older PS fonts)}
+% \subsection{Unavailable in sub-encoding \texttt{5} (most older PS fonts) and higher}
%
% Most older PS fonts (supported in \TeX{} since the early nineties
% when virtual fonts became available) are sorted under this
@@ -790,7 +792,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{6}}
+% \subsection{Unavailable in sub-encoding \texttt{6} and higher}
%
% \begin{macrocode}
\DeclareTextCommandDefault{\textflorin}
@@ -801,7 +803,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{7}}
+% \subsection{Unavailable in sub-encoding \texttt{7} and higher}
%
% \begin{macrocode}
\DeclareTextCommandDefault{\textfractionsolidus}
@@ -816,7 +818,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{8}}
+% \subsection{Unavailable in sub-encoding \texttt{8} and higher}
%
% \begin{macrocode}
\DeclareTextCommandDefault{\textblank}
@@ -837,7 +839,7 @@
%
%
%
-% \subsection{Sub-encoding \texttt{9} (most missing)}
+% \subsection{Unavailable in Sub-encoding \texttt{9} (most missing)}
%
% \begin{macrocode}
\DeclareTextCommandDefault{\textcelsius}
diff --git a/macros/latex/base/ltthm.dtx b/macros/latex/base/ltthm.dtx
index 00fe97c77a..d0d04d9669 100644
--- a/macros/latex/base/ltthm.dtx
+++ b/macros/latex/base/ltthm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -80,7 +80,7 @@
% The way \meta{name} environments are numbered can be changed by
% redefining |\the|\meta{name}.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \changes{v1.0a}{1994/03/28}{Initial version, split from latex.dtx}
diff --git a/macros/latex/base/ltvers.dtx b/macros/latex/base/ltvers.dtx
index 82f2034fda..da9d3c590e 100644
--- a/macros/latex/base/ltvers.dtx
+++ b/macros/latex/base/ltvers.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltvers.dtx}
- [2021/08/10 v1.1h LaTeX Kernel (Version Info)]
+ [2022/02/28 v1.1i LaTeX Kernel (Version Info)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltvers.dtx}
@@ -61,7 +61,7 @@
% \LaTeX, and set |\everyjob| so that it is printed at the start of
% every \LaTeX\ run.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v1.0g}{1996/11/28}
% {Check for old format modified /2319}
@@ -112,10 +112,10 @@
%</2ekernel>
%<latexrelease>\edef\latexreleaseversion
%<*2ekernel|latexrelease>
- {2021-11-15}
+ {2022-06-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{1}
+\def\patch@level{0}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
@@ -125,7 +125,7 @@
% intended to help us internally when we locally install a
% format out of some development branch.
% \begin{macrocode}
-\edef\development@branch@name{}
+\edef\development@branch@name{develop \the\year-\the\month-\the\day}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -365,6 +365,8 @@
% \changes{v1.1f}{2021/03/18}{Added \cs{NewModuleRelease}.}
% \changes{v1.1g}{2021/04/16}
% {\cs{NewModuleRelease} with the same arguments as \cs{IncludeInRelease}.}
+% \changes{v1.1i}{2022/02/28}
+% {Detect a missing \cs{IncludeInRelease}\texttt{\{0000/00/00\}}.}
% \begin{macrocode}
\let\if@skipping@module\iffalse
\def\@skipping@moduletrue{\let\if@skipping@module\iftrue}
@@ -379,7 +381,7 @@
\GenericInfo{}{BEGIN module: \new@modulename\space (\new@moduledate)}%
\GenericInfo{}{ \@spaces\@spaces\@spaces\space#3\@gobble}%
\ifnum\sourceLaTeXdate<%
- \expandafter\@parse@version\new@moduledate//00\@nil\relax
+ \expandafter\@parse@version\new@moduledate//00\@nil\relax
\ifnum\expandafter\@parse@version\fmtversion//00\@nil<%
\expandafter\@parse@version\new@moduledate//00\@nil\relax
\GenericInfo{}{Skipping module \new@modulename}%
@@ -394,7 +396,19 @@
\@skipping@moduletrue
\expandafter\new@module@skip
\fi}
-\long\def\new@module@skip#1\IncludeInRelease{\IncludeInRelease}
+\long\def\new@module@skip#1\IncludeInRelease{%
+ \long\def\reserved@a##1\EndModuleRelease{}%
+ \if\relax\detokenize\expandafter{\reserved@a#1{}{}\EndModuleRelease}\relax
+ \else
+ \@latex@error{Missing mandatory \string\IncludeInRelease{0000/00/00}}\@ehc
+ \expandafter\@secondoftwo
+ \fi
+ \@gobble
+ {\@expandtwoargs\IncludeInRelease
+ {0000/00/00}{\new@modulename}%
+ {ERROR! Emergency recovery}%
+ #1}%
+ \IncludeInRelease}
\def\EndModuleRelease{%
\ifx\new@modulename\@empty
\@latex@error{Extra \string\EndModuleRelease.}\@eha
diff --git a/macros/latex/base/ltx3info.pdf b/macros/latex/base/ltx3info.pdf
index 4997791aa3..e06a073b96 100644
--- a/macros/latex/base/ltx3info.pdf
+++ b/macros/latex/base/ltx3info.pdf
Binary files differ
diff --git a/macros/latex/base/ltx3info.tex b/macros/latex/base/ltx3info.tex
index 2a376f6431..13231da818 100644
--- a/macros/latex/base/ltx3info.tex
+++ b/macros/latex/base/ltx3info.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltxcheck.tex b/macros/latex/base/ltxcheck.tex
index 9e013bc2af..7f4b925b79 100644
--- a/macros/latex/base/ltxcheck.tex
+++ b/macros/latex/base/ltxcheck.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/ltxdoc.dtx b/macros/latex/base/ltxdoc.dtx
index 7a21f7d871..4d854728a0 100644
--- a/macros/latex/base/ltxdoc.dtx
+++ b/macros/latex/base/ltxdoc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -30,7 +30,7 @@
%
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesClass{ltxdoc}
-%<class> [2020/12/05 v2.1b Standard LaTeX documentation class]
+%<class> [2022/06/03 v2.1f Standard LaTeX documentation class]
%
%<*driver>
\documentclass{ltxdoc}
@@ -51,6 +51,8 @@
%
% \fi
%
+% \providecommand\pkg[1]{\texttt{#1}}
+%
%
% \changes{v2.0i}{1994/04/29}{Update the documentation.}
% \changes{v2.0s}{1998/08/17}{(RmS) Documentation fixes.}
@@ -102,7 +104,7 @@
% \PassOptionsToClass{a4paper}{article}
%\end{verbatim}
%
-% All the source files are in two parts, separated by |\StopEventually|.
+% All the source files are in two parts, separated by |\MaybeStop|.
% The first part (should) contain `user' documentation. The second part
% is a full documented listing of the source code. The |doc| package
% provides the command |\OnlyDescription| which suppresses the code
@@ -115,10 +117,13 @@
% \AtBeginDocument{\OnlyDescription}
%\end{verbatim}
%
+% If your document relies on using the old \pkg{doc} version, you can
+% request that the class loads \pkg{doc} version~2 by passing the
+% option \texttt{doc2}.
%
% If the full source listing |sources2e.tex| is processed, then an index
-% and change history are produced by default, however indices are not
-% normally produced for individual files.
+% and change history are produced by default, however indexes are normally
+% not produced for individual files.
%
% As an example, consider |ltclass.dtx|, which contains the sources for
% the new class and package interface commands. With no |cfg|
@@ -156,47 +161,73 @@
% \includeonly{ltvers,ltboxes}
%\end{verbatim}
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{Options}
%
% \begin{macrocode}
%<*class>
+% \end{macrocode}
+%
+% \begin{macrocode}
\DeclareOption{a5paper}{\@latexerr{Option not supported}%
{}}
% \end{macrocode}
+% Prevent loading of a config file.
+% \begin{macrocode}
+\newif\ifltxdoc@load@cfg@ \ltxdoc@load@cfg@true
+\DeclareOption{nocfg}{\ltxdoc@load@cfg@false}
+% \end{macrocode}
%
+% Support rolling back \pkg{doc} to version 2:
+% \changes{v2.1e}{2022/05/27}{Support rolling back doc to version 2}
+% \begin{macrocode}
+\let\ltxdoc@doc@version\@empty % use current version by default
+\DeclareOption{doc2}{\def\ltxdoc@doc@version{=v2}}
+% \end{macrocode}
+%
% \begin{macrocode}
\DeclareOption*{%
\PassOptionsToClass {\CurrentOption}{article}}
% \end{macrocode}
%
-% \section{Configuration}
+% \section{Option Processing}
+%
+% \begin{macrocode}
+\ProcessOptions
+% \end{macrocode}
+%
+% \section{Local configuration}
% Input a local configuration file, if it exists.
% \begin{macrocode}
+\ifltxdoc@load@cfg@
\InputIfFileExists{ltxdoc.cfg}
{\typeout{*************************************^^J%
* Local config file ltxdoc.cfg used^^J%
*************************************}}
{}
+\else
+ \typeout{*************************************^^J%
+ * Local config file ignored^^J%
+ *************************************}
+\fi
% \end{macrocode}
%
%
-% \section{Option Processing}
-%
-% \begin{macrocode}
-\ProcessOptions
-% \end{macrocode}
-%
% \section{Loading article and doc}
%
% \begin{macrocode}
\LoadClass{article}
% \end{macrocode}
%
+% By default, loadthe current \pkg{doc} version
+% (\cs{ltxdoc@doc@version} is empty). If option
+% \texttt{doc2} is given version 2 is loaded
+% (\cs{ltxdoc@doc@version} contains \texttt{=v2}).
+% \changes{v2.1e}{2022/05/27}{Support rolling back doc to version 2}
% \begin{macrocode}
-\RequirePackage{doc}
+\RequirePackage{doc}[\ltxdoc@doc@version]
% \end{macrocode}
%
% Make \verb+|+ be a `short verb' character, but not in the document
@@ -256,7 +287,7 @@
% arguments. It can \emph{not} be use 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}| also prints |\foo|, for those who prefer that
+% |\cs{foo}| already available with the \texttt{doc} package 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.
% \begin{macro}{\cmd}
@@ -266,7 +297,7 @@
% \begin{macrocode}
\def\cmd#1{\cs{\expandafter\cmd@to@cs\string#1}}
\def\cmd@to@cs#1#2{\char\number`#2\relax}
-\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+%\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}} % already part of doc.sty
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -600,7 +631,76 @@ Bug reports can be opened (category \texttt{#1}) at\\%
%
% \begin{macrocode}
\def\task#1#2{}
+% \end{macrocode}
+% \changes{v2.1f}{2022/06/03}{define \cs{pkg} and other commands}
+% \changes{v2.1f}{2022/06/03}{allow \_ in macro names}
+% Some feaures from l3doc.cls
+% \begin{macrocode}
+\providecommand\LuaTeX{Lua\TeX}
+\providecommand\cls{\textsf}
+\providecommand\pkg{\textsf}
+\providecommand\enquote[1]{``#1''}
+\DeclareRobustCommand\cs[1]{\texttt{\bslash\detokenize{#1}}}%
+\AtBeginDocument{%
+ \renewcommand\PrintMacroName[1]{\MacroFont\detokenize{#1}}%
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
%</class>
% \end{macrocode}
+%
+%
+%
+% \section{Configuration file}
+%
+%
+% \begin{macrocode}
+%<*cfg>
+%
+% This is the ltxdoc configuration file we use to format the LaTeX
+% kernel sources.
+%
+%
+% Copyright 2006, 2007, 2011 Heiko Oberdiek
+% Copyright 2014-2021 The LaTeX Project
+%
+
+\ProvidesFile{ltxdoc.cfg}%
+ [2021/12/07 v2.0c ltxdoc.cls configuration (LaTeX Project)]
+\PassOptionsToClass{a4paper}{article}
+
+% hyperref and hypdoc are now loaded late (or by the user) so we have to wait
+% with any adjustments until that has happened
+
+\AddToHook{package/hyperref/after}{%
+%% \RequirePackage{hypdoc}% % this is now triggered by doc
+ \RequirePackage{pdftexcmds}\relax
+ \ifnum\pdf@strcmp{\jobname}{inputenc}=0 %
+ \hypersetup{pdfencoding=auto}%
+ \pdfstringdefDisableCommands{%
+ \def\meta#1{% inputenc.dtx
+ \9060\010#1\9060\011%
+ }%
+ }%
+ \else
+ \fi
+ \pdfstringdefDisableCommands{%
+ \let\env\relax % longtable.dtx
+ \let\mytt\relax % tabularx.dtx
+ }%
+}
+
+% This should work well for documentation of packages outside the
+% LaTeX kernel, but if not, you can prevent the loading with the
+% option "nocfg", i.e.,
+%
+% \documentclass[nocfg]{ltxdoc]
+%
+% or by providing your own config file
+
+\endinput
+%</cfg>
+% \end{macrocode}
% \Finale
%
diff --git a/macros/latex/base/ltxdoc.pdf b/macros/latex/base/ltxdoc.pdf
index 572d8a2001..9eae697fac 100644
--- a/macros/latex/base/ltxdoc.pdf
+++ b/macros/latex/base/ltxdoc.pdf
Binary files differ
diff --git a/macros/latex/base/ltxref.dtx b/macros/latex/base/ltxref.dtx
index dd482299b2..596eb2fd74 100644
--- a/macros/latex/base/ltxref.dtx
+++ b/macros/latex/base/ltxref.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltxref.dtx}
- [2020/12/05 v1.1o LaTeX Kernel (Cross Referencing)]
+ [2022/04/12 v1.1p LaTeX Kernel (Cross Referencing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltxref.dtx}
@@ -63,17 +63,19 @@
% {Extract file ltxref from ltcntlen.}
% \changes{v1.1b}{1994/05/21}{Use new warning commands}
% \changes{v1.1c}{1994/05/25}{Modify documentation}
+% \changes{v1.1p}{2022/04/12}{Add starred variants for the ref commands}
%
% \section{Cross Referencing}
% The user writes |\label|\marg{foo} to define the following
% cross-references:
%
-% |\ref|\marg{foo}: value of most recently incremented referenceable
+% |\ref|*\marg{foo}: value of most recently incremented referenceable
% counter. in the current environment. (Chapter, section,
-% theorem and enumeration counters are
-% referenceable, footnote counters are not.)
+% theorem, footnote and enumeration counters and other counters
+% stepped with \cs{refstepcounter} are
+% referenceable.)
%
-% |\pageref|\marg{foo}: page number at which |\label{foo}| command
+% |\pageref|*\marg{foo}: page number at which |\label{foo}| command
% appeared. where foo can be any string of characters not
% containing `|\|', `|{|' or `|}|'.
%
@@ -87,8 +89,12 @@
% leaving a space on both sides of it is equivalent to leaving
% a space on either side.
%
+% Note: the starred versions |\ref*| and |\pageref*| are provided
+% to align with the use of \pkg{hyperref}. Without \pkg{hyperref} (or some
+% other package using the starred form) the star is simply ignored.
%
-% \StopEventually{}
+%
+% \MaybeStop{}
%
% \subsection{Cross Referencing}
%
@@ -206,8 +212,10 @@
% \end{macrocode}
% \begin{macro}{\ref}
% \changes{LaTeX2e}{1993/12/11}{Macro reimplemented}
+% \changes{LaTeX2e}{2022/04/12}{Macro reimplemented with a starred version}
% \begin{macro}{\pageref}
% \changes{LaTeX2e}{1993/12/11}{Macro reimplemented}
+% \changes{LaTeX2e}{2022/04/12}{Macro reimplemented with a starred version}
% \begin{macro}{\@setref}
% \changes{LaTeX2e}{1993/12/11}{Macro added}
% \changes{v1.1h}{1995/10/24}{Switch for refundefined renamed}
@@ -229,9 +237,43 @@
\else
\expandafter#2#1\null
\fi}
-\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}}
-\def\pageref#1{\expandafter\@setref\csname r@#1\endcsname
- \@secondoftwo{#1}}
+% \end{macrocode}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\ref}{Add starred reference commands}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\@kernel@sref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}}
+\def\@kernel@spageref#1{\expandafter\@setref\csname r@#1\endcsname
+ \@secondoftwo{#1}}
+\let\@kernel@ref\@kernel@sref
+\let\@kernel@pageref\@kernel@spageref
+\NewDocumentCommand\ref{s}
+ {\IfBooleanTF{#1}{\@kernel@sref}{\@kernel@ref}}
+\NewDocumentCommand\pageref{s}
+ {\IfBooleanTF{#1}{\@kernel@spageref}{\@kernel@pageref}}
+% \end{macrocode}
+% As the commands are now protected we also need expandable versions for use
+% in \cs{ifthenelse}:
+% \begin{macrocode}
+\def\@kernel@pageref@exp#1{\csname cs_if_exist:cTF\endcsname
+ {r@#1}{\csname tl_item:cn\endcsname{r@#1}{2}}{0}}
+\def\@kernel@ref@exp#1{\csname cs_if_exist:cTF\endcsname
+ {r@#1}{\csname tl_item:cn\endcsname{r@#1}{1}}{0}}
+% \end{macrocode}
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\ref}{Add starred reference commands}%
+%<latexrelease>\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}}
+%<latexrelease>\def\pageref#1{\expandafter\@setref\csname r@#1\endcsname
+%<latexrelease> \@secondoftwo{#1}}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -311,8 +353,8 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2020/10/01}%
-%<latexrelease> {\refstepcounter}{Add \@currentcounter}%
+%<latexrelease>\IncludeInRelease{2022/06/01}%
+%<latexrelease> {\Ref}{Add starred version}%
% \end{macrocode}
%
% \begin{macro}{\refstepcounter}
@@ -373,9 +415,14 @@
% normal \texttt{\textbackslash ref} which might spoil kerning.
% Perhaps one day this needs redoing.}
% \changes{v1.1l}{2019/08/22}{Commanded moved from \texttt{varioref.sty}}
+% \changes{v1.1p}{2022/04/12}{Macro reimplemented with a starred version}%
% \begin{macrocode}
-\DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
- \expandafter\MakeUppercase\@tempa}
+\def\@kernel@Ref#1{\protected@edef\@tempa{\@kernel@ref{#1}}%
+ \expandafter\MakeUppercase\@tempa}
+\def\@kernel@sRef#1{\protected@edef\@tempa{\@kernel@sref{#1}}%
+ \expandafter\MakeUppercase\@tempa}
+\NewDocumentCommand\Ref{s}
+ {\IfBooleanTF{#1}{\@kernel@sRef}{\@kernel@Ref}}
% \end{macrocode}
% \end{macro}
%
@@ -385,6 +432,18 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\Ref}{Add starred version}%
+%<latexrelease>\def\@currentcounter{}
+%<latexrelease>\def\refstepcounter#1{\stepcounter{#1}%
+%<latexrelease> \edef\@currentcounter{#1}%
+%<latexrelease> \protected@edef\@currentlabel
+%<latexrelease> {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
+%<latexrelease>}
+%<latexrelease>\def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
+%<latexrelease>\DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
+%<latexrelease> \expandafter\MakeUppercase\@tempa}
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2019/10/01}%
%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
%<latexrelease>\let\@currentcounter\@undefined
diff --git a/macros/latex/base/makeindx.dtx b/macros/latex/base/makeindx.dtx
index 9dc03a8431..fb6c474659 100644
--- a/macros/latex/base/makeindx.dtx
+++ b/macros/latex/base/makeindx.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -83,7 +83,7 @@
% \texttt{book} document classes, but works with other classes as
% well. It makes |\flushbottom| the default.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The {\sc docstrip} modules}
%
diff --git a/macros/latex/base/makeindx.ins b/macros/latex/base/makeindx.ins
index 427d4c7967..0fe55ed039 100644
--- a/macros/latex/base/makeindx.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/makeindx.pdf b/macros/latex/base/makeindx.pdf
index 265fb0877d..6ac94e0948 100644
--- a/macros/latex/base/makeindx.pdf
+++ b/macros/latex/base/makeindx.pdf
Binary files differ
diff --git a/macros/latex/base/manifest.txt b/macros/latex/base/manifest.txt
index f6afcccce7..daebefee06 100644
--- a/macros/latex/base/manifest.txt
+++ b/macros/latex/base/manifest.txt
@@ -1,5 +1,5 @@
%
-% The following files form the LaTeX2e distribution of 2020-10-01
+% The following files form the LaTeX2e distribution
%
%
% CONTENTS OF THE LaTeX DISTRIBUTION
@@ -11,10 +11,6 @@
% README.md -- The distribution guide. START BY READING THIS FILE
% manifest.txt -- This file.
%
-% tex2.txt -- Extras for installing LaTeX on TeX2.
-%
-% texpert.txt -- Documentation for TeX experts.
-%
% legal.txt -- Copyright notice; warranty; copying conditions.
% lppl.txt -- The LaTeX Project Public License (current version).
% lppl-1-0.txt -- The LaTeX Project Public License (version 1.0).
@@ -72,6 +68,9 @@
% ltnews30.tex -- What was new in the release dated 2019/10.
% ltnews31.tex -- What was new in the release dated 2020/02.
% ltnews32.tex -- What was new in the release dated 2020/10.
+% ltnews33.tex -- What was new in the release dated 2021/06.
+% ltnews34.tex -- What was new in the release dated 2021/11.
+% ltnews35.tex -- What was new in the release dated 2022/06.
%
% ltx3info.tex -- Information about the LaTeX3 project.
@@ -139,6 +138,9 @@
% lthooks.dtx -- Hook management
% ltfilehook.dtx -- Hook management for file loading
% ltshipout.dtx -- Hook management for \shipout
+% ltcmdhooks.dtx -- Hook management (generic) for commands
+% ltpara.dtx -- Hook management for paragraphs
+% ltmarks.dtx -- Mark management
%
% Standard Classes:
% -----------------
@@ -186,7 +188,7 @@
% doc.dtx -- Package for self documenting code.
% docstrip.dtx -- Module for removing comments.
% ltxdoc.dtx -- Class file for printing documentation.
-% doc-v3beta.sty -- New version of doc, current for internal use only.
+% ltxdoc.cfg -- config file to format the LaTeX sources.
%
%
% Installation scripts for the various parts:
diff --git a/macros/latex/base/modguide.pdf b/macros/latex/base/modguide.pdf
index 915dbefc54..d486116f31 100644
--- a/macros/latex/base/modguide.pdf
+++ b/macros/latex/base/modguide.pdf
Binary files differ
diff --git a/macros/latex/base/modguide.tex b/macros/latex/base/modguide.tex
index 15aad3358f..b0651da0a5 100644
--- a/macros/latex/base/modguide.tex
+++ b/macros/latex/base/modguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/newdc.ins b/macros/latex/base/newdc.ins
index e2ce183f05..eeec6479eb 100644
--- a/macros/latex/base/newdc.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/newlfont.dtx b/macros/latex/base/newlfont.dtx
index 3b6e001075..86c0d47ab6 100644
--- a/macros/latex/base/newlfont.dtx
+++ b/macros/latex/base/newlfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -84,7 +84,7 @@
% NFSS1, i.e., to change one font attribute without resetting the
% other attributes.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{The Code}
diff --git a/macros/latex/base/nfssfont.dtx b/macros/latex/base/nfssfont.dtx
index 554c7ae8f0..51d7834aa3 100644
--- a/macros/latex/base/nfssfont.dtx
+++ b/macros/latex/base/nfssfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -82,7 +82,7 @@
% the moment only a crude adaption of the test program for the
% Computer Modern fonts by Donald Knuth.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{A driver for this document}
%
diff --git a/macros/latex/base/nfssfont.ins b/macros/latex/base/nfssfont.ins
index 7d1b9cc41a..a181c61972 100644
--- a/macros/latex/base/nfssfont.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/nfssfont.pdf b/macros/latex/base/nfssfont.pdf
index 386f26aa32..75dc8427b6 100644
--- a/macros/latex/base/nfssfont.pdf
+++ b/macros/latex/base/nfssfont.pdf
Binary files differ
diff --git a/macros/latex/base/olddc.ins b/macros/latex/base/olddc.ins
index d878507d8e..707fb207e6 100644
--- a/macros/latex/base/olddc.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/oldlfont.dtx b/macros/latex/base/oldlfont.dtx
index d04ddb6323..b7c9abc3eb 100644
--- a/macros/latex/base/oldlfont.dtx
+++ b/macros/latex/base/oldlfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -95,7 +95,7 @@
% \end{tabular}
% \end{center}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \changes{v2.2k}{1995/11/29}{Remove duplicate driver code.}
%
diff --git a/macros/latex/base/preload.dtx b/macros/latex/base/preload.dtx
index bf2bfebbfa..3b75df38fd 100644
--- a/macros/latex/base/preload.dtx
+++ b/macros/latex/base/preload.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -131,7 +131,7 @@
% \end{quote}
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Module switches for the \dst{} program}
%
diff --git a/macros/latex/base/proc.dtx b/macros/latex/base/proc.dtx
index 7a1329fb82..135c67bc0b 100644
--- a/macros/latex/base/proc.dtx
+++ b/macros/latex/base/proc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -73,7 +73,7 @@
%</driver>
%<+class>\ProvidesClass{proc}
%<+style>\ProvidesFile{proc.sty}
- [2020/11/23 v1.3l
+ [2021/12/09 v1.3m
%<+class> Standard LaTeX document class]
%<+style> LaTeX 2.09 compatibility style option `proc']
% \end{macrocode}
@@ -131,7 +131,7 @@
% should appear after any |\footnote| commands that produce
% footnotes for the first column.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The {\sc docstrip} modules}
%
@@ -338,9 +338,17 @@
% \begin{macrocode}
\let\@oddhead\@empty
\let\@evenhead\@empty
-\def\@oddfoot{\normalfont\rightmark \hfil
- \pagename{} \thepage}
-\def\@evenfoot{\@oddfoot}
+\def\@oddfoot{\rightmark \hfil \pagename{} \thepage}
+% \end{macrocode}
+% If the \texttt{twoside} option is passed to the class we provide
+% a different footer that shows the \cs{leftmark} if that is set.
+% \changes{v1.3m}{2021/12/09}{Support twoside (gh/704)}
+% \begin{macrocode}
+\if@twoside
+ \def\@evenfoot{\pagename{} \thepage \hfil \leftmark}
+\else
+ \def\@evenfoot{\@oddfoot}
+\fi
% \end{macrocode}
%
%
diff --git a/macros/latex/base/proc.ins b/macros/latex/base/proc.ins
index cfed5bd6a3..16f60195e5 100644
--- a/macros/latex/base/proc.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/proc.pdf b/macros/latex/base/proc.pdf
index d7454a3941..a332696bed 100644
--- a/macros/latex/base/proc.pdf
+++ b/macros/latex/base/proc.pdf
Binary files differ
diff --git a/macros/latex/base/slides.dtx b/macros/latex/base/slides.dtx
index e63c1901d6..5ea9e58d9c 100644
--- a/macros/latex/base/slides.dtx
+++ b/macros/latex/base/slides.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -53,7 +53,7 @@
%<*driver>
\ProvidesFile{slides.drv}
%</driver>
- [2021/10/04 v2.4b
+ [2022/05/18 v2.4b
%<+class> Standard LaTeX document class]
%<+cmd> SLiTeX definitions]
% \end{macrocode}
@@ -205,7 +205,7 @@
% features without adding additional |\DeclareFontShape| commands to
% your |.fd| files or the preamble of your document.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{The Implementation}
@@ -2348,8 +2348,9 @@ COLOR LAYER\\[.75in]%
% any output when the |@visible| switch is false.
%
% \changes{v2.2j}{1994/03/11}{Corrected \cs{@oval}, like previous
+% change to the \LaTeX{} format.}
% \changes{v2.4a}{2016/03/29}{Initialize in \cs{@oval}tests added for
-% latex/4452} change to the \LaTeX{} format.}
+% latex/4452}
% \begin{macrocode}
\def\line(#1,#2)#3{\if@visible\@xarg #1\relax \@yarg #2\relax
\@linelen #3\unitlength
diff --git a/macros/latex/base/slides.ins b/macros/latex/base/slides.ins
index 43ec2bebdf..8c9862c2d5 100644
--- a/macros/latex/base/slides.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
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-2021
+Copyright (C) 1993-2022
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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/slides.pdf b/macros/latex/base/slides.pdf
index 5af868f79e..8493448c95 100644
--- a/macros/latex/base/slides.pdf
+++ b/macros/latex/base/slides.pdf
Binary files differ
diff --git a/macros/latex/base/slifonts.pdf b/macros/latex/base/slifonts.pdf
index 64128ee15a..094ac62cf1 100644
--- a/macros/latex/base/slifonts.pdf
+++ b/macros/latex/base/slifonts.pdf
Binary files differ
diff --git a/macros/latex/base/source2e.pdf b/macros/latex/base/source2e.pdf
index bdf4a4b04b..7bf5bb6271 100644
--- a/macros/latex/base/source2e.pdf
+++ b/macros/latex/base/source2e.pdf
Binary files differ
diff --git a/macros/latex/base/source2e.tex b/macros/latex/base/source2e.tex
index abe8c1aac2..797304e8d6 100644
--- a/macros/latex/base/source2e.tex
+++ b/macros/latex/base/source2e.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -264,6 +264,8 @@ page_precedence "rnaA"
\DocInclude{ltpara} % Paragraph hooks (L3 module)
+ \DocInclude{ltmeta} % Document Metadara interface (L3 module)
+
\DocInclude{ltspace} % Spacing, line and page breaking.
\DocInclude{ltlogos} % Logos.
@@ -322,10 +324,14 @@ page_precedence "rnaA"
\DocInclude{ltbibl} % Bibliography
+ \DocInclude{ltmarks} % Output routine marks management (L3 module)
+
\DocInclude{ltpage} % \pagestyle \raggedbottom \sloppy
\DocInclude{ltclass} % Package & Class interface
+ \DocInclude{ltkeys} % Key-based option management (L3 module)
+
\DocInclude{ltfilehook} % Hook management for files (L3 module)
\DocInclude{ltshipout}% \shipout redefinition (L3 module)
diff --git a/macros/latex/base/source2edoc.cls b/macros/latex/base/source2edoc.cls
index bef81d995d..f0f1479cac 100644
--- a/macros/latex/base/source2edoc.cls
+++ b/macros/latex/base/source2edoc.cls
@@ -2,9 +2,11 @@
% This class is buggy and needs fixing
\ProvidesClass{source2edoc}
- [2021/01/14 v0.2b Quick hack to typeset source2.tex
+ [2022/04/03 v0.2c Quick hack to typeset source2.tex
(not usable for anything else and buggy -- will vanish again)!]
+
+
\LoadClass{l3doc}
\RemoveFromHook{begindocument}[l3doc] % drop the standard setting making " a shortverb
@@ -18,7 +20,7 @@
\ExplSyntaxOn
% in 2e we have a lot of functions that have no ``user-level'' documentation so we disable
-% a bogus backref in that case. Over time the sources should be clean up to have such documentation.
+% a bogus backref in that case. Over time the sources should be cleaned up to have such documentation.
\cs_set_protected:Npn \__codedoc_print_documented:
{
@@ -169,7 +171,10 @@
t\or u\or v\or w\or x\or y\or z\or A\or B\or C\or
D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or
N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or
- X\or Y\or Z\else\@ctrerr\fi}
+ X\or Y\or Z\or
+ aa\or bb\or cc\or % we are getting definitely too many modules
+ dd%
+ \else\@ctrerr\fi}
\def\docincludeaux{%
\def\thepart{\aalph{part}}\def\filesep{\thepart-}%
\let\filekey\@gobble
@@ -293,6 +298,11 @@ Bug reports can be opened (category \texttt{#1}) at\\%
\fi}%
\endgroup%
+
+% don't run tocs when they are in some module files
+\AddToHook{cmd/tableofcontents/after}{\global\let\tableofcontents\relax}
+
+
\InputIfFileExists{ltxdoc.cfg}
{\typeout{*************************************^^J%
* Local config file ltxdoc.cfg used^^J%
@@ -300,6 +310,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
{}
+
\errorstopmode
\batchmode
diff --git a/macros/latex/base/syntonly.dtx b/macros/latex/base/syntonly.dtx
index b214c49ae4..ae4d4cd1f8 100644
--- a/macros/latex/base/syntonly.dtx
+++ b/macros/latex/base/syntonly.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -55,7 +55,7 @@
% This command can be used in the preamble for running a document
% through \LaTeX{} without actually getting any output.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{Identification}
diff --git a/macros/latex/base/syntonly.ins b/macros/latex/base/syntonly.ins
index 6b4113ed11..5812ef2fd6 100644
--- a/macros/latex/base/syntonly.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/syntonly.pdf b/macros/latex/base/syntonly.pdf
index c80e7d19c3..e6ae0243f2 100644
--- a/macros/latex/base/syntonly.pdf
+++ b/macros/latex/base/syntonly.pdf
Binary files differ
diff --git a/macros/latex/base/testpage.tex b/macros/latex/base/testpage.tex
index ff17984ee1..e199a2bb71 100644
--- a/macros/latex/base/testpage.tex
+++ b/macros/latex/base/testpage.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/tex2.txt b/macros/latex/base/tex2.txt
deleted file mode 100644
index 09cd388cde..0000000000
--- a/macros/latex/base/tex2.txt
+++ /dev/null
@@ -1,83 +0,0 @@
- LaTeX installation TeX2 information
-
- 16 September 1995
-
-
-In order to make a LaTeX format and use it you need, in addition to
-the LaTeX source files, a TeX implementation.
-
-If your TeX is very old, prior to version TeX3, then certain features
-will be missing from your system. In particular, you will probably
-have no support for `8-bit' input and hyphenation of words with
-accented characters.
-
-Most (perhaps all) TeX implementations are available in versions that
-are at least as recent as TeX3 (released in 1989) so the best course
-of action is to update your TeX installation before building LaTeX.
-
-However, if you must for some reason make the LaTeX format by running
-the old TeX2 then it is necessary to have a `configuration file' named
-fonttext.cfg. The existence of this file will prevent LaTeX trying to
-access 8-bit characters, which is not allowed in the old TeX2 version
-of TeX.
-
-If you fail to use such a configuration file, LaTeX will detect that it
-is running under TeX2 and stop with the following message (without
-making a format file):
-
-*************************************
-*
-* You MUST use a fonttext.cfg file!
-* As you are still using TeX2!!!!!!
-*
-* See the documentation file tex2.txt
-*
-*************************************
-
-
-There is more information about the file fonttext.cfg in the file
-cfgguide.tex; but for a minimal configuration that allows LaTeX to
-be built on TeX2, just do the following:
-
- * Copy the standard fonttext.ltx file to fonttext.cfg
- * Then edit the file fonttext.cfg as follows:
- -- Change the \ProvidesFile call (see below).
- -- Comment out all the lines referring to the `T1' encoding (but not
- those referring to the `OT1' encoding).
-
-Thus the resulting file will look something like the following.
-
-%%% File: fonttext.cfg
-\ProvidesFile{fonttext.cfg}
- [1995/06/05 v1.0 TeX2 text font setup]
-
-\input {OMLenc.def}
-%%%%% NOT FOR TeX2 \input {T1enc.def}
-\input {OT1enc.def} % <- should come after T1 for speed
-\input {OMSenc.def}
-\fontencoding{OT1}
-\DeclareFontEncodingDefaults{}{}
-%%%%% NOT FOR TeX2 \DeclareFontSubstitution{T1}{cmr}{m}{n}
-\DeclareFontSubstitution{OT1}{cmr}{m}{n}
-%%%%% NOT FOR TeX2 \input {T1cmr.fd}
-\input {OT1cmr.fd}
-\input {OT1cmss.fd}
-\input {OT1cmtt.fd}
-\DeclareErrorFont{OT1}{cmr}{m}{n}{10}
-\newcommand\rmdefault{cmr}
-\newcommand\sfdefault{cmss}
-\newcommand\ttdefault{cmtt}
-
-\newcommand\bfdefault{bx}
-\newcommand\mddefault{m}
-
-\newcommand\itdefault{it}
-\newcommand\sldefault{sl}
-\newcommand\scdefault{sc}
-\newcommand\updefault{n}
-
-\newcommand\encodingdefault{OT1}
-\newcommand\familydefault{\rmdefault}
-\newcommand\seriesdefault{\mddefault}
-\newcommand\shapedefault{\updefault}
-\endinput
diff --git a/macros/latex/base/texpert.txt b/macros/latex/base/texpert.txt
deleted file mode 100644
index 0eb1dd7784..0000000000
--- a/macros/latex/base/texpert.txt
+++ /dev/null
@@ -1,210 +0,0 @@
- LaTeX installation TeX expert information
-
- 1 June 1997
-
-
-SUMMARY
-=======
-
-This document contains information about the LaTeX installation for
-TeX experts. In particular it describes:
-
- * The checks performed by ltxcheck.tex
-
- * How to print the LaTeX source.
-
-For more general information, see install.txt.
-
-For information on configuring LaTeX see cfgguide.tex.
-
-
-THE LTXCHECK.TEX CHECKS
-=======================
-
-Here is a description of the checks run by ltxcheck.
-
-1) The \@currdir check.
-
- It is useful for LaTeX to know the syntax for the `current directory
- (or folder)', or `default directory', if the operating system has
- such a concept.
-
- For example, file abc.tex in this directory, or folder, is specified
- by:
- ./abc.tex on Unix and most DOS/OS2 TeX's,
- []abc.tex on VMS
- :abc.tex on a Macintosh.
- The above possibilities will be found automatically during the
- installation. However, if none of these syntaxes works on your
- system then the internal macro \@currdir will be set to be empty
- and ltxcheck will report this.
-
- If your system does have a notion of a current directory, you can
- define \@currdir in the file texsys.cfg.
-
- You could also report this to the latex-bug address, so that
- later releases can automatically cope with your system.
-
-2) The file name parser check.
- \filename@parse may be defined in texsys.cfg if the default
- installation does not define a suitable parser. (In fact no widely
- used TeX system should need such a re-definition as the standard
- installation should correctly define this command for unix, dos,
- atari, VMS, and Macintosh, at least.)
- Because of differences in directory syntax, most features of this
- command can not be checked in a portable way, however ltxcheck does
- check that at least {article.cls} is correctly parsed as base name
- article and extension cls.
-
-3) The \input@path check.
-
- On some systems TeX cannot check whether a file exists before
- trying to input it, unless the filename is expressed as a full path
- name, including the directory. On these systems LaTeX needs to be
- given a list of directories in which to look for files; the
- internal macro \input@path holds this information.
-
- When run, ltxcheck will try to locate the file article.cls.
- If it fails to find this file (and you have placed it in the
- `standard input directory') then you must define \input@path in
- the file texsys.cfg.
-
- The files texsys.cfg and ltdirchk.dtx contain examples of how to do
- this but only you know the directories and syntax that should be used
- for your installation.
-
- We hope to build up a better collection of examples in future
- releases of LaTeX, as it is tested on more TeX systems.
-
-4) TeX version check.
-
- The next check tests that you are running a recent version of TeX.
- If ltxcheck reports that you have TeX2, then you should try to
- upgrade TeX (and rebuild LaTeX) as soon as possible. LaTeX may be
- used with TeX2, but certain features will be missing and you will
- not be able to use the new (8-bit) font families that are now
- available. If you must stick with TeX2, please read the extra
- information in the file tex2.txt.
-
- If ltxcheck reports that your TeX version is older than 3.141, you
- will see some strange messages during the installation. This is
- because earlier versions of TeX printed certain line-breaks in
- messages on the terminal as `^^J' rather than starting a new line.
-
- LaTeX will work round this bug and thus avoid `^^J' appearing in
- error messages, but you should upgrade your TeX as soon as
- possible, as other bugs have been fixed, not just line breaks in
- messages.
-
- At the present time (2005) the current TeX version is 3.141592.
-
-5) Fonts check.
-
- Finally ltxcheck.tex tests to see if it can find a `representative
- sample' of the fonts used by LaTeX.
-
- Fonts that may cause problems are:
- a) The circle fonts. These were renamed some years ago from circle*
- to lcircle*, although some sites still have them under the old
- name. Also the names are longer than 8 letters which may cause
- some problems.
- b) The `extra Computer Modern' fonts. The American Mathematical
- Society has extended the range of sizes available in the
- Computer Modern fonts. LaTeX now assumes that these extra cm
- fonts are available.
- The fonts are available from a CTAN archive, in the directory
- ctan:macros/latex/fonts or alternatively as part of the
- AMS fonts collection, which also includes many useful
- mathematical fonts.
- c) The `T1 encoded Computer Modern' fonts. This is the ec or dc font
- collection. The new (1995) release 1.2 of the dc fonts changed
- most of the file names. For this reason the fd files such as
- t1cmr.fd cannot be written to work with the dc fonts of different
- releases. LaTeX by default unpacks the fd files for the ec
- dc fonts.
- If you have an older release of the dc fonts and do not wish to
- upgrade then you should unpack the necessary fd files by running
- LaTeX on the file olddc.ins (dc older than version 1.2) or
- newdc.ins (version 1.2 and 1.3).
- As the T1 fd files will have been used when making the format,
- you must re-run initex latex.ltx to remake the format if you
- update the fd files in this way.
- Running ltxcheck will produce a ! BAD LaTeX2e system!! error
- message if it detects that the `new' fd files are loaded into
- the format, but only the old dc fonts are available, and vice
- versa.
- If the old fonts are detected, and the `old' fd files are loaded
- then no error is generated, but a message suggesting that you
- upgrade is produced.
- The ec fonts are available from a CTAN archive, in the directory
- ctan:fonts/ec .
-
-
-6) Files check.
-
- Finally ltxcheck checks that the main TeX input files that LaTeX
- will use when running documents (such as the article class file,
- fd files, and main packages such as fontenc) are all available.
-
-
-DOCUMENTATION OF THE CODE
-=========================
-
-Most of the documentation is nowadays available as precomplied PDF
-files. This section describes how to produce typeset code
-documentation yourself from the source.
-
-To typeset a documented code file (a .dtx file) you simply run LaTeX
-on it. The file source2e.tex is a master file which produces the
-documented code for the whole LaTeX kernel (but not the standard
-packages, classes, or compatibility mode). You need to have LaTeX2e
-installed before doing this.
-
-To configure the appearance of this documentation, you can use a
-ltxdoc.cfg file. For example, putting the following line into this
-file will format the documentation for A4 paper:
-
- \PassOptionsToClass{a4paper}{article}
-
-The doc package, which is used by the documentation files, writes
-index files and change-history files that can be processed by the
-program MakeIndex. If this program is part of your TeX installation,
-you can get an index and history listing for a documentation file
-by running the .idx and .glo files through this program.
-
-For example, in Unix MakeIndex, you should say:
-
- makeindex -s gind.ist FILENAME
- makeindex -s gglo.ist -o FILENAME.gls FILENAME.glo
-
-source2e.tex needs a special source2e.ist file (in place of gind.ist).
-Running makeindex will produce some warning messages about ignored
-style specifiers; these can be safely ignored.
-
-See the comments at the end of source2e.tex for more information.
-
-
-CONFIGURING LaTeX
-=================
-
-In addition to the system-dependent customisation in texsys.cfg,
-various other parts of LaTeX can be configured to suit local needs.
-Further details can be found in the document cfgguide.tex. We
-recommend that you install the standard system before attempting any
-further customisation.
-
-If you are thinking of making other changes to LaTeX, please read the
-document modguide.tex as it describes the precautions you need to take
-when making modifications in order to ensure that standard LaTeX
-remains a stable, maintainable system.
-
-
-FURTHER INFORMATION
-===================
-
-You will find further information about various aspects of LaTeX in
-the distributed files with names <*>guide.tex. You will need
-to install the new version before you can typeset these files.
-
-
---- Copyright (C) 1995-2019 the LaTeX Project. All rights reserved ---
diff --git a/macros/latex/base/tlc2.err b/macros/latex/base/tlc2.err
index 46ba9ed845..8925a8bee1 100644
--- a/macros/latex/base/tlc2.err
+++ b/macros/latex/base/tlc2.err
@@ -1,4 +1,4 @@
-\newcommand\erratafiledate{2014-09-30}
+\newcommand\erratafiledate{2022-01-03}
\def\comando#1{\texttt{\string#1}}
@@ -852,6 +852,9 @@ highlighting color\u{ as demonstrated below}:
\erroronpage{116}{Footnote 1, line 1}{CBC}{2004/05/18}{2}
Replace: ``I managed to confuse'' with ``we managed to confuse''.
+\erroronpage{117}{para 1, l.1}{EOl}{2022/01/02}{}
+ Missing letter: ``to cho\u{o}se''
+
\erroronpage{117}{para 2, l.2}{HjG}{2004/05/25}{2}
Missing letter: ``It take\u{s} two \ldots''
@@ -2233,6 +2236,10 @@ Change: ``The unaccented ASCII Latin letters and Arabic
Various deviations from alphabetical sort order of the table
entries.
+\erroronpage{553}{para 3, l.1}{EOl}{2022/01/02}{}
+ Missing letter: ``sup\u{p}ressing''
+
+
\iffalse % more blue align stuff
\erroronpage{534}{page}{FMi}{2004/04/23}{}
Printing problem: blue color not properly aligned (horizontally).
@@ -2313,7 +2320,7 @@ Plural: ``Clearly, 8 bits \u{are} not sufficient\ldots''
\erroronpage{551}{tab 9.3}{CBe}{2004/07/27}{}
I am surprised that in Russian there is no word for ``Glossary''.
- Frank: It most certainly exits :-), but right now Babel doesn't
+ Frank: It most certainly exists :-), but right now Babel doesn't
know about it---so there is nothing we can do about it at the
moment. Actually the same problem exists with Polish, although here
I got a translation ``s\l{}ownik termin\'ow'' which will eventually
@@ -2715,6 +2722,9 @@ some of the listed drivers are only of historical interest.
\erroronpage{616}{boxed texts}{FMi}{2004/05/26}{2}
Corrections as outlined in summary entry above.
+\erroronpage{617}{Fig. 10-2-2}{EOl}{2021/11/17}{}
+ A ``|%|'' should follow the ending ``|}|'' of the two |\bluefbox|es.
+
\erroronpage{618}{boxed text}{CAR}{2004/05/26}{2}
Replace: ``\textit{key val list}'' \> ``\textit{key/val-list}''
(also in following text).
@@ -2740,6 +2750,9 @@ some of the listed drivers are only of historical interest.
%\erroronpage{621}{page}{FMi}{2004/04/23}{}
% Printing problem: blue color not properly aligned.
+\erroronpage{621}{Fig. 10-2-8}{EOl}{2021/11/17}{}
+ A ``|%|'' should follow the ending ``|}|'' of the first |\bluefbox|.
+
\erroronpage{623}{para 1, l.7}{HjG}{2004/06/07}{2}
Delete word: ``some \u{of} key combinations''
@@ -2752,7 +2765,7 @@ some of the listed drivers are only of historical interest.
\u{\texttt{tabular}} examples''
\erroronpage{631}{para.2, l.6}{FMi/HjG}{2006/10/22}{s}
- Ersetze: "`\u{This point} is shown \ldots"' \>
+ Replace: "`\u{This point} is shown \ldots"' \>
"`\u{This} is shown \ldots"'
\erroronpage{631}{para -1, l.-1}{JBr}{2004/08/02}{2}
@@ -4547,6 +4560,7 @@ and
\contributor{DHL}{Dan Luecking}
\contributor{DIs}{Daniel Isaacson}
\contributor{DSch}{Dirk Schlimm}
+\contributor{EOl}{Edgar Olthof}
\contributor{ERy}{Elizabeth Ryan}
\contributor{FHa}{Ferdy Hanssen}
\contributor{FMi}{Frank Mittelbach}
@@ -4621,7 +4635,7 @@ preferably in a form usable directly in 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 erratum}
+ \hspace*{2em}\textit{description of the erratum}
\end{flushleft}
Here is an example:
\begin{verbatim}
diff --git a/macros/latex/base/tlc2.pdf b/macros/latex/base/tlc2.pdf
index e8890a678a..3380da7878 100644
--- a/macros/latex/base/tlc2.pdf
+++ b/macros/latex/base/tlc2.pdf
Binary files differ
diff --git a/macros/latex/base/tulm.ins b/macros/latex/base/tulm.ins
index 98962f2b20..a50060b201 100644
--- a/macros/latex/base/tulm.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 2016-2022
%% 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-2021
+Copyright (C) 2016-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/base/tulm.pdf b/macros/latex/base/tulm.pdf
index eb9b18dd27..2e2261a0ce 100644
--- a/macros/latex/base/tulm.pdf
+++ b/macros/latex/base/tulm.pdf
Binary files differ
diff --git a/macros/latex/base/unpack.ins b/macros/latex/base/unpack.ins
index 6332fcb5c0..21ba62a33a 100644
--- a/macros/latex/base/unpack.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
diff --git a/macros/latex/base/usrguide.pdf b/macros/latex/base/usrguide.pdf
index fe3cfa214f..8af52cca0b 100644
--- a/macros/latex/base/usrguide.pdf
+++ b/macros/latex/base/usrguide.pdf
Binary files differ
diff --git a/macros/latex/base/usrguide.tex b/macros/latex/base/usrguide.tex
index a94d8a6a70..dfdf9443e6 100644
--- a/macros/latex/base/usrguide.tex
+++ b/macros/latex/base/usrguide.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
diff --git a/macros/latex/base/usrguide3.pdf b/macros/latex/base/usrguide3.pdf
index 39758373e4..e8048df824 100644
--- a/macros/latex/base/usrguide3.pdf
+++ b/macros/latex/base/usrguide3.pdf
Binary files differ
diff --git a/macros/latex/base/usrguide3.tex b/macros/latex/base/usrguide3.tex
index 82c1c06863..efec9ad2a2 100644
--- a/macros/latex/base/usrguide3.tex
+++ b/macros/latex/base/usrguide3.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2020-2021
+% Copyright (C) 2020-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -31,12 +31,13 @@
\documentclass{ltxguide}
\usepackage[T1]{fontenc} % needed for \textbackslash in tt
+\usepackage{csquotes}
\title{New \LaTeX\ methods for authors (starting 2020)}
-\author{\copyright~Copyright 2020-2021, \LaTeX\ Project Team.\\
+\author{\copyright~Copyright 2020-2022, \LaTeX\ Project Team.\\
All rights reserved.}
-\date{2021-06-11}
+\date{2022-02-19}
\NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}}
\NewDocumentCommand\marg{m}{\arg{#1}}
@@ -48,6 +49,18 @@
\renewcommand \verbatim@font {\normalfont \ttfamily}
\makeatother
+
+% for fpeval documentation
+
+\providecommand\fpop[1]{\mathop{\texttt{#1}}}
+\providecommand\fpbin[1]{\mathbin{\texttt{#1}}}
+\providecommand\fprel[1]{\mathrel{\texttt{#1}}}
+\providecommand\nan{\texttt{NaN}}
+
+\ExplSyntaxOn
+\ProvideExpandableDocumentCommand \fpeval { m } { \fp_eval:n {#1} }
+\ExplSyntaxOff
+
\begin{document}
\maketitle
@@ -227,6 +240,11 @@ defined.
same name. This should be used sparingly.
\end{itemize}
+If the \meta{cmd} can't be provided as a single token but needs
+\enquote{constructing}, you can use \cs{ExpandArgs} as explained in
+Section~\ref{sec:preconstructing-csnames} which also gives an example
+in which this is needed.
+
\begin{decl}
|\NewDocumentEnvironment| \arg{env} \arg{arg spec} \arg{beg-code} \arg{end-code} \\
|\RenewDocumentEnvironment| \arg{env} \arg{arg spec} \arg{beg-code} \arg{end-code} \\
@@ -288,7 +306,7 @@ must exist). So after
\end{verbatim}
the user input |\foo{arg1}[arg2]{arg3}| and \verb*|\foo{arg1} [arg2] {arg3}|
will both be parsed in the same way.
-
+
The behavior of optional arguments \emph{after} any mandatory arguments is
selectable. The standard settings will allow spaces here, and thus with
\begin{verbatim}
@@ -338,6 +356,8 @@ defaults with testing for missing values.
Optional arguments make use of dedicated variables to return information about
the nature of the argument received.
+
+
\begin{decl}
|\IfNoValueTF| \arg{arg} \arg{true code} \arg{false code} \\
|\IfNoValueT| \arg{arg} \arg{true code} \\
@@ -373,11 +393,12 @@ will be logically \texttt{false}.
When two optional arguments follow each other (a syntax we typically
discourage), it can make sense to allow users of the command to
specify only the second argument by providing an empty first
-argument. Rather than testing separately for emptiness and for
+argument.
+\NEWdescription{2022/06/01}
+Rather than testing separately for emptiness and for
|-NoValue-| it is then best to use the argument type~|O| with an
-empty default value, and simply test for emptiness using the
-\pkg{expl3} conditional \cs{tl_if_blank:nTF} or its \pkg{etoolbox}
-analogue \cs{ifblank}.
+empty default value, and then test for emptiness using the
+conditional \cs{IfBlankTF} (described below) instead.
\begin{decl}
|\IfValueTF| \arg{arg} \arg{true code} \arg{false code} \\
@@ -388,6 +409,51 @@ The reverse form of the \cs{IfNoValue(TF)} tests are also available
as \cs{IfValue(TF)}. The context will determine which logical
form makes the most sense for a given code scenario.
+
+
+
+
+\begin{decl}[2022/06/01]
+ |\IfBlankTF| \arg{arg} \arg{true code} \arg{false code} \\
+ |\IfBlankT| \arg{arg} \arg{true code} \\
+ |\IfBlankF| \arg{arg} \arg{false code}
+\end{decl}
+
+
+The \cs{IfNoValueTF} command chooses the \meta{true code} if the optional argument has not
+been used at all (and it returns the special \texttt{-NoValue-}
+marker), but not if it has been given an empty value. In contrast
+\cs{IfBlankTF} returns true if its argument is either truly empty or
+only contains one or more normal blanks.
+For example
+\begin{verbatim}
+\NewDocumentCommand\foo{m!o}{\par #1:
+ \IfNoValueTF{#2}{No optional}%
+ {\IfBlankTF{#2}{Blanks in or empty}%
+ {Real content in}}%
+ \space argument!}
+\foo{1}[bar] \foo{2}[ ] \foo{3}[] \foo{4}[\space] \foo{5} [x]
+\end{verbatim}
+results
+in the following output:
+\begin{quote}
+ \NewDocumentCommand\foo{m!o}{\par #1:
+ \IfNoValueTF{#2}{No optional}%
+ {\IfBlankTF{#2}{Blanks in or empty}%
+ {Real content in}}%
+ \space argument!}
+ \foo{1}[bar] \foo{2}[ ] \foo{3}[] \foo{4}[\space] \foo{5} [x]
+\end{quote}
+
+Note that the \cs{space} in (4) is considered real content---because it is
+a command and not a \enquote{space} character---even though it results
+in producing a space. You can also observe in (5) the effect of the
+\texttt{!} specifier, preventing the last \cs{foo}
+from interpreting \texttt{[x]} as its optional argument.
+
+
+
+
\begin{decl}
|\BooleanFalse| \\
|\BooleanTrue|
@@ -554,10 +620,12 @@ spaces are trimmed at both ends of the body: in the example there would
otherwise be spaces coming from the ends the lines after |[\itshape]| and
|world!|. Putting the prefix |!| before \texttt{b} suppresses space-trimming.
-When \texttt{b} is used in the argument specification, the last argument of the environment declaration (e.g., \cs{NewDocumentEnvironment}), which consists of an \meta{end code} to insert at
-|\end|\marg{environment}, is redundant since one can simply put that code at
-the end of the \meta{start code}. Nevertheless this (empty) \meta{end code}
-must be provided.
+When \texttt{b} is used in the argument specification, the last
+argument of the environment declaration (e.g.,
+\cs{NewDocumentEnvironment}), which consists of an \meta{end code} to
+insert at |\end|\marg{environment}, is redundant since one can simply
+put that code at the end of the \meta{start code}. Nevertheless this
+(empty) \meta{end code} must be provided.
Environments that use this feature can be nested.
@@ -665,7 +733,7 @@ with both calls to the command seeing the delimiter |\x|.
\subsection{Creating new argument processors}
\begin{decl}
- |\ProcessedArgument|
+ |\ProcessedArgument|
\end{decl}
Argument processors allow manipulation of a grabbed argument before it is
passed to the underlying code. New processor implementations may be created
@@ -710,4 +778,280 @@ requested \meta{function} or \meta{environment} at the terminal. If
the \meta{function} or \meta{environment} has no known argument
specification then an error is issued.
+
+
+\section{Copying and showing (robust) commands}
+
+If you want to (slightly) alter an existing command you may want to
+save the current definition under a new name and then use that in a
+new definition. If the existing command is robust, then the old trick of
+using the low-level \cs{let} for this doesn't work, because it only
+copies the top-level definition, but not the part that actually does
+the work. As most \LaTeX{} commands are nowadays robust, \LaTeX{}
+now offers some high-level declarations for this instead.
+
+However, please note that it is usually better to make use of
+available hooks (e.g., the generic command or environment hooks),
+instead of copying the current definition and thereby freezing it; see
+the hook management documentation \texttt{lthooks-doc.pdf} for
+details.
+
+\begin{decl}
+ |\NewCommandCopy| \arg{cmd} \arg{existing-cmd} \\
+ |\RenewCommandCopy| \arg{cmd} \arg{existing-cmd} \\
+ |\DeclareCommandCopy| \arg{cmd} \arg{existing-cmd}
+\end{decl}
+
+This copies the definition of \meta{existing-cmd} to \meta{cmd}. After
+this \meta{existing-cmd} can be redefined and \meta{cmd}
+still works! This allows you to then provide a new definition for
+\meta{existing-cmd} that makes use of \meta{cmd} (i.e., of its old
+definition). For example, after
+\begin{verbatim}
+ \NewCommandCopy\LaTeXorig\LaTeX
+ \RenewDocumentCommand\LaTeX{}{\textcolor{blue}{\LaTeXorig}}
+\end{verbatim}
+all \LaTeX{} logos generated with \cs{LaTeX} will come out in blue
+(assuming you have a color package loaded).
+
+The differences between \cs{New...} and \cs{Renew...} are as
+elsewhere: i.e., you get an error depending on whether or not
+\meta{cmd} already exists, or in case of \cs{Declare...} it is copied
+regardless. Note that there is no \cs{Provide...} declaration, because
+that would be of limited value.
+
+
+If the \meta{cmd} or \meta{existing-cmd} can't be provided as a single
+token but need \enquote{constructing}, you can use \cs{ExpandArgs}
+as explained in
+Section~\ref{sec:preconstructing-csnames}.
+
+
+
+
+\begin{decl}
+ |\ShowCommand| \arg{cmd}
+\end{decl}
+
+This displays the meaning of the \meta{cmd} on the terminal and then
+stops (just like the primitive \cs{show}). The difference is that it
+correctly shows the meaning of more complex commands, e.g., in case of
+robust commands it displays not only the top-level definition but
+also the actual payload code and in case of commands declared with
+\cs{NewDocumentCommand}, etc.\ it also gives you detailed information
+about the argument signature.
+
+
+\section[Preconstructing command names \\ (or otherwise expanding arguments)]
+ {Preconstructing command names (or otherwise expanding arguments)}
+\label{sec:preconstructing-csnames}
+
+When declaring new commands with \cs{NewDocumentCommand} or
+\cs{NewCommandCopy} or similar, it is sometimes necessary to
+``construct'' the csname. As a general mechanism the L3 programming
+layer has \cs{exp_args:N...} for this, but there is no mechanism for
+it if \cs{ExplSyntaxOn} is not active (and mixing programming and user
+interface level commands is not a good approach anyhow). We therefore
+offer a mechanism to access this ability using CamelCase naming.
+
+\begin{decl}
+ |\UseName| \arg{string} \\
+ |\ExpandArgs| \arg{spec} \arg{cmd} \arg{arg1} \dots
+\end{decl}
+
+\cs{UseName} turns the \meta{string} directly into a csname and
+then executes it: this is equivalent to the long-standing
+\LaTeXe{} internal command \cs{@nameuse}, or the L3 programming
+equivalent \cs{use:c}. \cs{ExpandArgs} takes a \meta{spec} which
+describes how to expand the \meta{arguments}, carries out these
+operations then executes the \meta{cmd}. The \meta{spec} uses
+the descriptions offered by the L3 programming layer, and the
+relevant \cs{exp_args:N...} function must exist. Common cases will
+have a \meta{spec} of \texttt{c}, \texttt{cc} or \texttt{Nc}: see below.
+
+As an example, the following declaration provides a method to generate
+copyedit commands:
+\begin{verbatim}
+\NewDocumentCommand\newcopyedit{mO{red}}
+ {\newcounter{todo#1}%
+ \ExpandArgs{c}\NewDocumentCommand{#1}{s m}%
+ {\stepcounter{todo#1}%
+ \IfBooleanTF {##1}%
+ {\todo[color=#2!10]{\UseName{thetodo#1}: ##2}}%
+ {\todo[inline,color=#2!10]{\UseName{thetodo#1}: ##2}}%
+ }%
+ }
+\end{verbatim}
+Given that declaration you can then write
+\verb/\newcopyedit{note}[blue]/ which defines the command \cs{note}
+and the corresponding counter for you.
+
+A second example is to copy a command by string name using
+\cs{NewCommandCopy}: here we might need to construct both command
+names.
+\begin{verbatim}
+\NewDocumentCommand\savebyname{m}
+ {\ExpandArgs{cc}\NewCommandCopy{saved#1}{#1}}
+\end{verbatim}
+
+In the \meta{spec} each \texttt{c} stands for one argument that is
+turned into a `\texttt{c}'ommand. An \texttt{n} represents a
+`\texttt{n}'ormal argument that is not altered and \texttt{N} stands for
+a `\texttt{N}'ormal argument which is also left unchanged, but one
+consisting only of a single token (and usually unbraced). Thus, to
+construct a command from a string only for the second argument of
+\cs{NewCommandCopy} you would write
+\begin{verbatim}
+\ExpandArgs{Nc}\NewCommandCopy\mysectionctr{c@section}
+\end{verbatim}
+There are several other single letters supported in the L3 programming
+layer that \emph{could} be used in the \meta{spec} to manipulate
+arguments in other ways. If you are interested, take a look at the
+\enquote{Argument expansion} section in the L3 programming layer
+documentation in \texttt{interface3.pdf}.
+
+
+
+\section{Expandable floating point (and other) calculations}
+
+The \LaTeX3 programming layer which is part of the format offers a
+rich interface to manipulate floating point variables and values. To
+allow for (simpler) applications to use this on document-level or in
+packages otherwise not making use of the L3 programming layer a few
+interface commands are made available.
+
+
+\begin{decl}
+ |\fpeval| \arg{floating point expression}
+\end{decl}
+
+The expandable command \cs{fpeval} takes as its argument a floating
+point expression and produces a result using the normal rules of
+mathematics. As this command is expandable it can be used where \TeX{}
+requires a number and for example within a low-level \cs{edef} operation
+to give a purely numerical result.
+
+
+
+Briefly, the floating point expressions may comprise:
+\begin{itemize}
+ \item Basic arithmetic: addition $x\fpbin{+}y$, subtraction $x\fpbin{-}y$,
+ multiplication $x\fpbin{*}y$, division $x\fpbin{/}y$, square root~$\sqrt{x}$,
+ and parentheses.
+ \item Comparison operators: $x\fprel{<}y$,
+ $x\fprel{<=}y$, $x\fprel{>?}y$,
+ $x\fprel{!=}y$ \emph{etc.}
+ \item Boolean logic: sign $\fpop{sign} x$,
+ negation $\fpop{!}x$, conjunction
+ $x\fprel{\&\&}y$, disjunction $x\fprel{\string|\string|}y$, ternary
+ operator $x\fprel{?}y\fprel{:}z$.
+ \item Exponentials: $\fpop{exp} x$, $\fpop{ln} x$, $x\mathord{\texttt{\^{}}}y$.
+ \item Integer factorial: $\fpop{fact} x$.
+ \item Trigonometry: $\fpop{sin} x$, $\fpop{cos} x$, $\fpop{tan} x$, $\fpop{cot} x$, $\fpop{sec}
+ x$, $\fpop{csc} x$ expecting their arguments in radians, and
+ $\fpop{sind} x$, $\fpop{cosd} x$,
+ $\fpop{tand} x$, $\fpop{cotd} x$,
+ $\fpop{secd} x$, $\fpop{cscd} x$ expecting their
+ arguments in degrees.
+ \item Inverse trigonometric functions: $\fpop{asin} x$,
+ $\fpop{acos} x$, $\fpop{atan} x$,
+ $\fpop{acot} x$, $\fpop{asec} x$,
+ $\fpop{acsc} x$ giving a result in radians, and
+ $\fpop{asind} x$, $\fpop{acosd} x$,
+ $\fpop{atand} x$, $\fpop{acotd} x$,
+ $\fpop{asecd} x$, $\fpop{acscd} x$ giving a result
+ in degrees.
+ \item Extrema: $\fpop{max}(x_{1},x_{2},\ldots)$, $\fpop{min}(x_{1},x_{2},\ldots)$,
+ $\fpop{abs}(x)$.
+ \item Rounding functions, controlled by two optional
+ values, $n$ (number of places, $0$ by default) and
+ $t$ (behavior on a tie, $\nan$ by default):
+ \begin{itemize}
+ \item $\fpop{trunc}(x,n)$ rounds towards zero,
+ \item $\fpop{floor}(x,n)$ rounds towards~$-\infty$,
+ \item $\fpop{ceil}(x,n)$ rounds towards~$+\infty$,
+ \item $\fpop{round}(x,n,t)$ rounds to the closest value, with
+ ties rounded to an even value by default, towards zero if $t=0$,
+ towards $+\infty$ if $t>0$ and towards $-\infty$ if $t<0$.
+ \end{itemize}
+ \item Random numbers: $\fpop{rand}()$, $\fpop{randint}(m,n)$.
+ \item Constants: \texttt{pi}, \texttt{deg} (one degree in radians).
+ \item Dimensions, automatically expressed in points, \emph{e.g.},
+ \texttt{pc} is~$12$.
+ \item Automatic conversion (no need for \cs{number}) of
+ integer, dimension, and skip variables to floating points numbers,
+ expressing dimensions in points and ignoring the stretch and
+ shrink components of skips.
+ \item Tuples: $(x_1,\ldots{},x_n)$ that can be added together,
+ multiplied or divided by a floating point number, and nested.
+\end{itemize}
+
+An example of use could be the following:
+\begin{verbatim}
+ \LaTeX{} can now compute: $ \frac{\sin (3.5)}{2} + 2\cdot 10^{-3}
+ = \fpeval{sin(3.5)/2 + 2e-3} $.
+\end{verbatim}
+which produces the following output:
+\begin{quote}
+ \LaTeX{} can now compute: $ \frac{\sin (3.5)}{2} + 2\cdot 10^{-3}
+ = \fpeval{sin(3.5)/2 + 2e-3} $.
+\end{quote}
+
+\begin{decl}
+ |\inteval| \arg{integer expression}
+\end{decl}
+
+ The expandable command \cs{inteval} takes as its argument an integer
+ expression and produces a result using the normal rules of
+ mathematics with some restrictions, see below. The operations
+ recognized are |+|, |-|, |*| and |/| plus parentheses. As this
+ command is expandable it can be used where \TeX{} requires a number
+ and for example within a low-level \cs{edef} operation to give a
+ purely numerical result.
+
+ This is basically a thin wrapper for the primitive \cs{numexpr}
+ command and therefore has some syntax restrictions. These are:
+ \begin{itemize}
+ \item \texttt{/} denotes division rounded to the closest integer with
+ ties rounded away from zero;
+ \item there is an error and the overall expression evaluates to zero
+ whenever the absolute value of any intermediate result exceeds
+ $2^{31}-1$, except in the case of scaling operations
+ $a$\texttt{*}$b$\texttt{/}$c$, for which $a$\texttt{*}$b$ may be
+ arbitrarily large;
+ \item parentheses may not appear after unary \texttt{+} or
+ \texttt{-}, namely placing \texttt{+(} or \texttt{-(} at the start
+ of an expression or after \texttt{+}, \texttt{-}, \texttt{*},
+ \texttt{/} or~\texttt{(} leads to an error.
+ \end{itemize}
+
+An example of use could be the following.
+\begin{verbatim}
+\LaTeX{} can now compute: The sum of the numbers is $\inteval{1 + 2 + 3}$.
+\end{verbatim}
+which results in
+\enquote{\LaTeX{} can now compute: The sum of the numbers is $\inteval{1 + 2 + 3}$.}
+
+
+\begin{decl}
+ |\dimeval| \arg{dimen expression} \qquad
+ |\skipeval| \arg{skip expression}
+\end{decl}
+
+Similar to \cs{inteval} but computing a length (\texttt{dimen}) or a
+rubber length (\texttt{skip}) value. Both are thin wrappers around
+the corresponding engine primitives, which makes them fast, but
+therefore shows the same syntax peculiars as discussed
+above. Nevertheless, in practice they are usually sufficient. For
+example
+\begin{verbatim}
+\newcommand\calulateheight[1]{%
+ \setlength\textheight{\dimeval{\topskip+\baselineskip*\inteval{#1-1}}}}
+\end{verbatim}
+sets the \cs{textheight} to the appropriate value if a page should
+hold a specific number of text lines. Thus after |\calulateheight{40}|
+it is set to \dimeval{\topskip+\baselineskip*\inteval{40-1}}, given
+the values \cs{topskip} (\dimeval{\topskip}) and \cs{baselineskip}
+(\dimeval{\baselineskip}) in the current document.
+
\end{document}
diff --git a/macros/latex/base/utf8ienc.dtx b/macros/latex/base/utf8ienc.dtx
index 75990d1b03..363998a853 100644
--- a/macros/latex/base/utf8ienc.dtx
+++ b/macros/latex/base/utf8ienc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
@@ -190,7 +190,7 @@
% information.
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
%
@@ -216,7 +216,7 @@
%<+ts1> \ProvidesFile{ts1enc.dfu}
%<+x2> \ProvidesFile{x2enc.dfu}
%<+all> \ProvidesFile{utf8enc.dfu}
-%<-utf8-2018> [2021/06/21 v1.2n UTF-8 support]
+%<-utf8-2018> [2022/06/07 v1.3c UTF-8 support]
% \end{macrocode}
%
% \begin{macrocode}
@@ -363,11 +363,12 @@
% \begin{macro}{\UTFviii@two@octets@noexpand}
% \begin{macro}{\UTFviii@three@octets@noexpand}
% \begin{macro}{\UTFviii@four@octets@noexpand}
+% \changes{v1.3a}{2022/02/19}{Use \cs{unexpanded} rather than \cs{noexpand} so only takes one expansion step}%
% These temporarily prevent the active chars from expanding.
% \begin{macrocode}
-\long\def\UTF@two@octets@noexpand#1#2{\noexpand#2\noexpand}
-\long\def\UTF@three@octets@noexpand#1#2#3{\noexpand#2\noexpand#3\noexpand}
-\long\def\UTF@four@octets@noexpand#1#2#3#4{\noexpand#2\noexpand#3\noexpand#4\noexpand}
+\long\def\UTF@two@octets@noexpand#1#2#3{\unexpanded{#2#3}}
+\long\def\UTF@three@octets@noexpand#1#2#3#4{\unexpanded{#2#3#4}}
+\long\def\UTF@four@octets@noexpand#1#2#3#4#5{\unexpanded{#2#3#4#5}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -376,11 +377,12 @@
% \begin{macro}{\UTFviii@two@octets@string}
% \begin{macro}{\UTFviii@three@octets@string}
% \begin{macro}{\UTFviii@four@octets@string}
+% \changes{v1.3a}{2022/02/19}{Use \cs{detokenize} rather than \cs{string} so only takes one expansion step}%
% And the same with \cs{string} for use in \cs{csname} constructions.
% \begin{macrocode}
-\long\def\UTF@two@octets@string#1#2{\string#2\string}
-\long\def\UTF@three@octets@string#1#2#3{\string#2\string#3\string}
-\long\def\UTF@four@octets@string#1#2#3#4{\string#2\string#3\string#4\string}
+\long\def\UTF@two@octets@string#1#2#3{\detokenize{#2#3}}
+\long\def\UTF@three@octets@string#1#2#3#4{\detokenize{#2#3#4}}
+\long\def\UTF@four@octets@string#1#2#3#4#5{\detokenize{#2#3#4#5}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -542,15 +544,24 @@
% |\count@| and ending at |\@tempcnta|${} - 1$, each time executing
% the code in |\UTFviii@tmp|.
%
-% All this is done in a group so that temporary catcode changes
-% etc.~vanish after everything is set up.
+% Store current settings so can restore after the loops without using a group (gh/762).
+%
+% \begin{macrocode}
+\edef\reserved@a{%
+\catcode`\noexpand\~=\the\catcode`\~\relax
+\catcode`\noexpand\"=\the\catcode`\"\relax
+\uccode`\noexpand\~=\the\uccode`\~\relax
+\count@=\the\count@\relax
+\@tempcnta=\the\@tempcnta\relax
+\let\noexpand\reserved@a\relax}
+% \end{macrocode}
%
% \begin{macrocode}
-\begingroup
\catcode`\~13
\catcode`\"12
% \end{macrocode}
%
+% \changes{v1.3a}{2022/02/19}{Use local protected definitions in the character definitions}%
% \begin{macrocode}
\def\UTFviii@loop{%
\uccode`\~\count@
@@ -566,7 +577,7 @@
% C0 controls are valid UTF-8 but defined to give the ``Character not defined error''
% They may be defined with |\DeclareUnicodeCharacter|.
% \begin{macrocode}
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@undefined@err{:\string~}}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@undefined@err{:\string~}}}
% 0 ^^@ null
\count@"1
\@tempcnta9
@@ -588,7 +599,7 @@
% \begin{macrocode}
\count@"80
\@tempcnta"C2
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@invalid@err\string~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -597,7 +608,7 @@
% \begin{macrocode}
\count@"C2
\@tempcnta"E0
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@two@octets\noexpand~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@two@octets\noexpand~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -605,7 +616,7 @@
% \begin{macrocode}
\count@"E0
\@tempcnta"F0
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@three@octets\noexpand~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@three@octets\noexpand~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -614,7 +625,7 @@
% \begin{macrocode}
\count@"F0
\@tempcnta"F5
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@four@octets\noexpand~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@four@octets\noexpand~}}
\UTFviii@loop
% \end{macrocode}
%
@@ -623,12 +634,13 @@
% \begin{macrocode}
\count@"F5
\@tempcnta"100
- \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}}
+ \def\UTFviii@tmp{\protected\edef~{\noexpand\UTFviii@invalid@err\string~}}
\UTFviii@loop
% \end{macrocode}
%
+% Restore values after the loops.
% \begin{macrocode}
-\endgroup
+\reserved@a
% \end{macrocode}
%
% \end{macro}
@@ -773,12 +785,13 @@
% looks slightly strange but is designed for the sequence of |\expandafter|
% in |\DeclareUnicodeCharacter|.
%
+% \changes{v1.2o}{2021/12/13}{Use 80 not A0 to test for single byte UTF-8}
% \begin{macrocode}
- \ifnum\count@<"A0\relax
+ \ifnum\count@<"80\relax
\ifnum\catcode\count@=13
\uccode`\~=\count@\uppercase{\def\UTFviii@tmp{\@empty\@empty~}}%
\else
- \@latex@error{Cannot define non-active Unicode char value < 00A0}%
+ \@latex@error{Cannot define non-active Unicode char value < 0080}%
\@eha
\def\UTFviii@tmp{\UTFviii@tmp}%
\fi
@@ -1139,6 +1152,7 @@
% \changes{v1.1r}{2015/12/03}{Add some more ogonek cases}
% \changes{v1.1s}{2016/01/11}{Add some more caron and acute}
% \changes{v1.1t}{2017/01/28}{Add caron combinations for GgYy}
+% \changes{v1.3c}{2022/06/07}{Fix \cs{guillemetleft} and \cs{guillemetright} also in dfu files (gh/65)}%
% \begin{macrocode}
%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00A0}{\nobreakspace}
%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00A1}{\textexclamdown}
@@ -1152,7 +1166,8 @@
%<all,ts1,utf8>\DeclareUnicodeCharacter{00A9}{\textcopyright}
%<all,ts1,ly1,utf8>\DeclareUnicodeCharacter{00AA}{\textordfeminine}
%<*all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy>
-\DeclareUnicodeCharacter{00AB}{\guillemotleft}
+%\DeclareUnicodeCharacter{00AB}{\guillemotleft} % wrong Adobe name
+\DeclareUnicodeCharacter{00AB}{\guillemetleft}
%</all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy>
%<all,ts1>\DeclareUnicodeCharacter{00AC}{\textlnot}
%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00AD}{\-}
@@ -1170,7 +1185,8 @@
%<all,ts1>\DeclareUnicodeCharacter{00B9}{\textonesuperior}
%<all,ts1,ly1,utf8>\DeclareUnicodeCharacter{00BA}{\textordmasculine}
%<*all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy>
-\DeclareUnicodeCharacter{00BB}{\guillemotright}
+%\DeclareUnicodeCharacter{00BB}{\guillemotright} % wrong Adobe name
+\DeclareUnicodeCharacter{00BB}{\guillemetright}
%</all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy>
%<all,ts1,ly1>\DeclareUnicodeCharacter{00BC}{\textonequarter}
%<all,ts1,ly1>\DeclareUnicodeCharacter{00BD}{\textonehalf}
@@ -1368,6 +1384,18 @@
%<all,t1,ly1>\DeclareUnicodeCharacter{017E}{\v z}
%<all,ts1,ly1>\DeclareUnicodeCharacter{0192}{\textflorin}
% \end{macrocode}
+% \changes{v1.2n}{2021/12/10}{add 01C4-01CC}
+% \begin{macrocode}
+%<all,t1>\DeclareUnicodeCharacter{01C4}{D\v Z}
+%<all,t1>\DeclareUnicodeCharacter{01C5}{D\v z}
+%<all,t1>\DeclareUnicodeCharacter{01C6}{d\v z}
+%<all,t1>\DeclareUnicodeCharacter{01C7}{LJ}
+%<all,t1>\DeclareUnicodeCharacter{01C8}{Lj}
+%<all,t1>\DeclareUnicodeCharacter{01C9}{lj}
+%<all,t1>\DeclareUnicodeCharacter{01CA}{NJ}
+%<all,t1>\DeclareUnicodeCharacter{01CB}{Nj}
+%<all,t1>\DeclareUnicodeCharacter{01CC}{nj}
+% \end{macrocode}
% \changes{v1.1s}{2016/01/11}{add 01CD-01F4}
% \begin{macrocode}
%<all,t1>\DeclareUnicodeCharacter{01CD}{\v A}
@@ -1795,8 +1823,14 @@
%<all,ts1>\DeclareUnicodeCharacter{2191}{\textuparrow}
%<all,ts1>\DeclareUnicodeCharacter{2192}{\textrightarrow}
%<all,ts1>\DeclareUnicodeCharacter{2193}{\textdownarrow}
+% \end{macrocode}
+% \changes{v1.3b}{2022/05/08}{Declare Unicode codepoints U+3008/U+3009 to
+% better support normalized documents}
+% \begin{macrocode}
%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{2329}{\textlangle}
+%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{3008}{\textlangle}
%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{232A}{\textrangle}
+%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{3009}{\textrangle}
%<all,ts1>\DeclareUnicodeCharacter{2422}{\textblank}
%<all,x2,t2c,t2b,t2a,t1,utf8>\DeclareUnicodeCharacter{2423}{\textvisiblespace}
%<all,ts1>\DeclareUnicodeCharacter{25E6}{\textopenbullet}
diff --git a/macros/latex/base/utf8ienc.pdf b/macros/latex/base/utf8ienc.pdf
index ced71edebe..ca7dc00f2c 100644
--- a/macros/latex/base/utf8ienc.pdf
+++ b/macros/latex/base/utf8ienc.pdf
Binary files differ
diff --git a/macros/latex/base/webcomp.pdf b/macros/latex/base/webcomp.pdf
index 0dc2c71e36..f1f98e12a0 100644
--- a/macros/latex/base/webcomp.pdf
+++ b/macros/latex/base/webcomp.pdf
Binary files differ
diff --git a/macros/latex/contrib/pxcjkcat/README-ja.md b/macros/latex/contrib/pxcjkcat/README-ja.md
index accb5faf0d..4c93dc9b04 100644
--- a/macros/latex/contrib/pxcjkcat/README-ja.md
+++ b/macros/latex/contrib/pxcjkcat/README-ja.md
@@ -30,6 +30,13 @@ pxcjkcat パッケージ ー 本体
更新履歴
--------
+ * Version 1.4 〈2022/06/06〉
+ - `\cjkcategory` 命令でブロックを符号値で指定可能にした。
+
+ * Version 1.3 〈2022/05/28〉
+ - upTeX 1.25 版以降のブロック定義を新たに CCV 4 と規定する。
+ - (試験的) key-value オプションのサポート。
+
* Version 1.2 〈2022/05/25〉
- 最新の upTeX に対応させる。
- `nomode` オプションを追加。
diff --git a/macros/latex/contrib/pxcjkcat/README.md b/macros/latex/contrib/pxcjkcat/README.md
index 719a3e3396..11fcfe0132 100644
--- a/macros/latex/contrib/pxcjkcat/README.md
+++ b/macros/latex/contrib/pxcjkcat/README.md
@@ -65,10 +65,10 @@ following lines in the preamble:
If your document is mainly in Japanese, then put the following lines
in the preamble:
- \usepackage[prefercjkvar]{pxcjkcat}
+ \usepackage[ccv3,japanesevar]{pxcjkcat}
\usepackage[utf8]{inputenc}
-The former setting treats the "CJK-ambiguous" punctuation symbols as
+The former setting treats the “CJK-ambiguous” punctuation symbols as
non-CJK letters, while the latter as CJK letters. Of course, your
document must in encoded in UTF-8.
@@ -90,6 +90,8 @@ document must in encoded in UTF-8.
Revision History
----------------
+ * Version 1.4 〈2022/06/06〉
+ * Version 1.3 〈2022/05/28〉
* Version 1.2 〈2022/05/25〉
* Version 1.1 〈2018/04/01〉
* Version 1.0 〈2012/09/22〉
diff --git a/macros/latex/contrib/pxcjkcat/pxcjkcat.pdf b/macros/latex/contrib/pxcjkcat/pxcjkcat.pdf
index 58eae044f8..8772b88c4a 100644
--- a/macros/latex/contrib/pxcjkcat/pxcjkcat.pdf
+++ b/macros/latex/contrib/pxcjkcat/pxcjkcat.pdf
Binary files differ
diff --git a/macros/latex/contrib/pxcjkcat/pxcjkcat.sty b/macros/latex/contrib/pxcjkcat/pxcjkcat.sty
index ae11b02fde..04fad06654 100644
--- a/macros/latex/contrib/pxcjkcat/pxcjkcat.sty
+++ b/macros/latex/contrib/pxcjkcat/pxcjkcat.sty
@@ -10,9 +10,45 @@
%% package declaration
\NeedsTeXFormat{pLaTeX2e}
-\ProvidesPackage{pxcjkcat}[2022/05/25 v1.2 PX cjk-category mode]
+\ProvidesPackage{pxcjkcat}[2022/06/06 v1.4 PX cjk-category mode]
\def\pxkc@pkgname{pxcjkcat}
+%% code guards
+\edef\pxkc@restore@codes{%
+\catcode33=\the\catcode33%
+\catcode34=\the\catcode34%
+\catcode39=\the\catcode39%
+\catcode43=\the\catcode43%
+\catcode45=\the\catcode45%
+\catcode46=\the\catcode46%
+\catcode47=\the\catcode47%
+\catcode58=\the\catcode58%
+\catcode60=\the\catcode60%
+\catcode62=\the\catcode62%
+\catcode63=\the\catcode63%
+\catcode94=\the\catcode94%
+\catcode96=\the\catcode96%
+\catcode239=\the\catcode239%
+\endlinechar=\the\endlinechar%
+\relax}%
+\catcode33=12 % <!>
+\catcode34=12 % <">
+\catcode39=12 % <'>
+\catcode43=12 % <+>
+\catcode45=12 % <->
+\catcode46=12 % <.>
+\catcode47=12 % </>
+\catcode58=12 % <:>
+\catcode60=12 % <<>
+\catcode62=12 % <>>
+\catcode63=12 % <?>
+\catcode94=7 % <^>
+\catcode96=12 % <`>
+\catcode239=13 %
+\AtEndOfPackage{%
+\pxkc@restore@codes
+\let\pxkc@restore@codes\relax}
+
%--------------------------------------- general
%% error messages
@@ -30,10 +66,20 @@
\PackageError\pxkc@pkgname
{Invalid name (#1) for cjk-category mode}%
{\@eha}}
+\def\pxkc@err@naltn{%
+ \PackageError\pxkc@pkgname
+ {Change to cjk-category of 'latn' is forbidden}%
+ {\@eha}}
\def\pxkc@warn@dfblk#1{%
\PackageWarning\pxkc@pkgname
- {Defunct Unicode block '#1' is\MessageBreak
+ {Unsupported Unicode block '#1' is\MessageBreak
specified}}
+\def\pxkc@err@ivfmt#1{%
+ \PackageError\pxkc@pkgname
+ {Block specs are given in bad format%
+ \ifx\detokenize\@undefined\else
+ :\MessageBreak \space'\detokenize{#1}'\fi}%
+ {\@eha}}
%% \pxkc@debug{<message>}
\ifx\bxUseDebug\@undefined
@@ -42,13 +88,17 @@
\def\pxkc@debug#1{\typeout{**[\pxkc@pkgname] #1}}
\fi
+%% packages
+\RequirePackage{keyval}\relax
+
%% unique tokens
\def\pxkc@end{\pxkc@end@}
+\def\pxkc@mt{\pxkc@mt@}
\let\pxkc@mk\indent
%% variables
\newif\ifpxkc@ok
-\newif\ifpxkc@warn@defunct \pxkc@warn@defuncttrue
+\newif\ifpxkc@warn@bad \pxkc@warn@badtrue
\let\pxkc@good@mccv\relax
\let\pxkc@mccv\relax
\let\pxkc@ccmode@opt\relax
@@ -64,12 +114,29 @@
\def\pxkc@expanded#1{%
\edef\pxkc@next{#1}\pxkc@next}
+%% \pxkc@setup{<key>=<value>,...}
+\def\pxkc@setup#1{%
+ \let\pxkc@KV@errx\KV@errx \def\KV@errx##1{\@unknownoptionerror}%
+ \setkeys{\pxkc@pkgname}{#1}
+ \let\KV@errx\pxkc@KV@errx}
+
+%% \pxkc@handle@key{<key>}{<value>}{<name>}
+\def\pxkc@handle@key#1#2#3{%
+ \expandafter\let\expandafter\pxkc@tmpa\csname pxkc@#3\endcsname
+ \ifx\pxkc@tmpa\relax
+ \PackageError\pxkc@pkgname
+ {Invalid value for key '#1':\MessageBreak\@spaces#2}%
+ {\@eha}%
+ \else \pxkc@tmpa
+ \fi}
+
%--------------------------------------- package options
%% mode CCV options
\DeclareOption{ccv1}{\chardef\pxkc@mccv=1 }
\DeclareOption{ccv2}{\chardef\pxkc@mccv=2 }
\DeclareOption{ccv3}{\chardef\pxkc@mccv=3 }
+\DeclareOption{ccv4}{\chardef\pxkc@mccv=4 }
\DeclareOption{ccv+}{\chardef\pxkc@mccv=0 }
\DeclareOption{real}{\chardef\pxkc@mccv=0 }
%% mode options
@@ -83,11 +150,21 @@
\def\pxkc@M@@default {1}
\def\pxkc@M@@nomode {0}% special
\chardef\pxkc@good@mccv=0
+%% key-value options
+\define@key{\pxkc@pkgname}{ccv}{%
+ \pxkc@handle@key{ccv}{#1}{kv@ccv@@#1}}
+\@namedef{pxkc@kv@ccv@@1}{\chardef\pxkc@mccv=1 }
+\@namedef{pxkc@kv@ccv@@2}{\chardef\pxkc@mccv=2 }
+\@namedef{pxkc@kv@ccv@@3}{\chardef\pxkc@mccv=3 }
+\@namedef{pxkc@kv@ccv@@4}{\chardef\pxkc@mccv=4 }
+\@namedef{pxkc@kv@ccv@@real}{\chardef\pxkc@mccv=0 }
+%% dispatch
\DeclareOption*{%
- \@ifundefined{pxkc@M@@\CurrentOption}{\@unknownoptionerror}{%
+ \@ifundefined{pxkc@M@@\CurrentOption}{% key option
+ \expandafter\pxkc@setup\expandafter{\CurrentOption}%
+ }{%else; mode option
\chardef\pxkc@good@mccv=\@nameuse{pxkc@M@@\CurrentOption}\relax
\edef\pxkc@ccmode@opt{\CurrentOption}}}
-%% dispatch
\ProcessOptions\relax
%% clear up
@@ -120,6 +197,16 @@
\@ehc}
\expandafter\endinput\fi\relax
+%% engine version
+\chardef\pxkc@uptex@version=0
+\def\pxkc@next#1.#2#3#4\pxkc@end{%
+ \ifx\pxkc@mk#1\pxkc@mk \ifnum99<1#2#3
+ \chardef\pxkc@uptex@version=\the\uptexversion#2#3\relax
+ \fi\fi}
+\ifx\uptexversion\@undefined\else \ifx\uptexrevision\@undefined\else
+ \expandafter\pxkc@next\uptexrevision...\pxkc@end
+\fi\fi
+
%%-------- classification version check
%% \pxkc@is@same@block
@@ -136,15 +223,26 @@
\else
\pxkc@is@same@block{"A0}{"C0}\ifpxkc@ok
\chardef\pxkc@ccv=2 % v0.29+
- \else
+ \else\ifnum\pxkc@uptex@version<125
\chardef\pxkc@ccv=3 % v1.23+
- \fi
+ \else
+ \chardef\pxkc@ccv=4 % v1.25+
+ \fi\fi
\fi
\ifx\bxDebugCcv\@undefined\else % override
\chardef\pxkc@ccv=\bxDebugCcv\relax
\fi
+\pxkc@debug{upTeX version \number\pxkc@uptex@version}
\pxkc@debug{CJK category version \number\pxkc@ccv}
+%% Here show warning about the buggy engine version (v1.24)
+\ifnum\pxkc@ccv=1 \ifnum\pxkc@uptex@version=124
+ \PackageWarningNoLine\pxkc@pkgname
+ {The upTeX engine of version 1.24 is used!\MessageBreak
+ This version has a bug on CJK category,\MessageBreak
+ and here real CCV is regard as 1}
+\fi\fi
+
%% Here show warning for mode CCV recommendation.
%% (No warning if the good mode CCV is unavailable.)
\ifnum\pxkc@good@mccv>\pxkc@mccv \ifnum\pxkc@good@mccv>\pxkc@ccv\else
@@ -172,7 +270,24 @@
\let\pxkc@mccv\pxkc@ccv
\fi
-%% \pxkc@kcatcode
+%--------------------------------------- helpers
+
+%% constants
+\chardef\pxkc@ascii@max="7F
+
+%% \pxkc@cond\ifXXX...\fi{<true>}{<false>}
+\def\pxkc@cond#1\fi{%
+ #1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+
+%% \pxkc@get@jchar{<charcode>}
+\def\pxkc@get@jchar#1{%
+ \begingroup
+ \forcecjktoken
+ \kansujichar\@ne=#1\relax
+ \xdef\pxkc@jchar{\kansuji\@ne}%
+ \endgroup}
+
+%% \pxkc@kcatcode{<charcode>}{<kcatcode>}
\ifx\bxUseDebug\@undefined
\def\pxkc@kcatcode#1#2{\kcatcode#1=#2\relax}
\else
@@ -187,32 +302,37 @@
%--------------------------------------- data tables
%% variables
-%\[pxkc@B@@<block>] : start codepoint of the block
+%\[pxkc@B@@<block>] : start charcode of the block
%\[pxkc@G@@<block>] : members of the group block
%\[pxkc@C@@<category>] : kcatcode value of the category
%% \pxkc@bslst
\def\pxkc@bslst{\@gobble}
-%% \pxkc@bval{<min_ccv>}{<block>}{<ucs>}{<full_name>}
+\def\pxkc@bbslst{}
+%% \pxkc@bval{<min_ccv>}{<block>}{<charcode>}{<full_name>}
\def\pxkc@bval#1#2#3#4{% #4 is unused for now
- \ifnum#1>\pxkc@ccv\else
+ \ifnum#1<\z@\else
+ % check if min_ccv >= 2 (now min_ccv has no other role)
\ifnum#1<\tw@ \pxkc@okfalse
\else
\@tempcnta=#3\relax
\@tempcntb\@tempcnta \advance\@tempcntb\m@ne
\pxkc@is@same@block\@tempcnta\@tempcntb
\fi
- \ifpxkc@ok \pxkc@debug{defunct: #2}%
- \@namedef{pxkc@B@@#2}{-1}% defunct
+ \ifpxkc@ok % bad
+ \@namedef{pxkc@B@@#2}{-1}%
+ \edef\pxkc@bbslst{\pxkc@bbslst\space#2}%
+ \else\ifnum#3=\z@ % 'latn'
+ \@namedef{pxkc@B@@#2}{0}%
\else
\@namedef{pxkc@B@@#2}{#3}%
\edef\pxkc@bslst{\pxkc@bslst,#2}%
- \fi
+ \fi\fi
\fi}
%% \pxkc@gval{<gblock>}{<block>,...}{<full_name>}
\def\pxkc@gval#1#2#3{\@namedef{pxkc@G@@#1}{#2}}
-%% \pxkc@cval{<category>}{<value>}
+%% \pxkc@cval{<category>}{<kcatcode>}
\def\pxkc@cval#1#2{\@namedef{pxkc@C@@#1}{#2}}
\pxkc@cval{noncjk}{15}
\pxkc@cval{kanji}{16}
@@ -286,7 +406,7 @@
\pxkc@bval{2}{lepc}{"1C00} {Lepcha}
\pxkc@bval{2}{olck}{"1C50} {Ol Chiki}
\pxkc@bval{2}{cyrlC}{"1C80} {Cyrillic Extended-C}
-\pxkc@bval{3}{geor2}{"1C90} {Georgian Extended}
+\pxkc@bval{4}{geor2}{"1C90} {Georgian Extended}
\pxkc@bval{2}{sund1}{"1CC0} {Sundanese Supplement}
\pxkc@bval{2}{sym38}{"1CD0} {Vedic Extensions}
\pxkc@bval{1}{latn4}{"1D00} {Phonetic Extensions}
@@ -426,13 +546,13 @@
\pxkc@bval{2}{phlp}{"10B80} {Psalter Pahlavi}
\pxkc@bval{2}{orkh}{"10C00} {Old Turkic}
\pxkc@bval{2}{hung}{"10C80} {Old Hungarian}
-\pxkc@bval{3}{rohg}{"10D00} {Hanifi Rohingya}
+\pxkc@bval{4}{rohg}{"10D00} {Hanifi Rohingya}
\pxkc@bval{2}{sym42}{"10E60} {Rumi Numeral Symbols}
-\pxkc@bval{3}{yezi}{"10E80} {Yezidi}
-\pxkc@bval{3}{sogo}{"10F00} {Old Sogdian}
-\pxkc@bval{3}{sogd}{"10F30} {Sogdian}
-\pxkc@bval{3}{chrs}{"10FB0} {Chorasmian}
-\pxkc@bval{3}{elym}{"10FE0} {Elymaic}
+\pxkc@bval{4}{yezi}{"10E80} {Yezidi}
+\pxkc@bval{4}{sogo}{"10F00} {Old Sogdian}
+\pxkc@bval{4}{sogd}{"10F30} {Sogdian}
+\pxkc@bval{4}{chrs}{"10FB0} {Chorasmian}
+\pxkc@bval{4}{elym}{"10FE0} {Elymaic}
\pxkc@bval{2}{brah}{"11000} {Brahmi}
\pxkc@bval{2}{kthi}{"11080} {Kaithi}
\pxkc@bval{2}{sora}{"110D0} {Sora Sompeng}
@@ -451,58 +571,58 @@
\pxkc@bval{2}{mong1}{"11660} {Mongolian Supplement}
\pxkc@bval{2}{takr}{"11680} {Takri}
\pxkc@bval{2}{ahom}{"11700} {Ahom}
-\pxkc@bval{3}{dogr}{"11800} {Dogra}
+\pxkc@bval{4}{dogr}{"11800} {Dogra}
\pxkc@bval{2}{wara}{"118A0} {Warang Citi}
-\pxkc@bval{3}{diak}{"11900} {Dives Akuru}
-\pxkc@bval{3}{nand}{"119A0} {Nandinagari}
+\pxkc@bval{4}{diak}{"11900} {Dives Akuru}
+\pxkc@bval{4}{nand}{"119A0} {Nandinagari}
\pxkc@bval{3}{zanb}{"11A00} {Zanabazar Square}
\pxkc@bval{3}{soyo}{"11A50} {Soyombo}
\pxkc@bval{2}{pauc}{"11AC0} {Pau Cin Hau}
\pxkc@bval{2}{bhks}{"11C00} {Bhaiksuki}
\pxkc@bval{2}{marc}{"11C70} {Marchen}
\pxkc@bval{3}{gonm}{"11D00} {Masaram Gondi}
-\pxkc@bval{3}{gong}{"11D60} {Gunjala Gondi}
-\pxkc@bval{3}{maka}{"11EE0} {Makasar}
-\pxkc@bval{3}{lisu1}{"11FB0} {Lisu Supplement}
-\pxkc@bval{3}{taml1}{"11FC0} {Tamil Supplement}
+\pxkc@bval{4}{gong}{"11D60} {Gunjala Gondi}
+\pxkc@bval{4}{maka}{"11EE0} {Makasar}
+\pxkc@bval{4}{lisu1}{"11FB0} {Lisu Supplement}
+\pxkc@bval{4}{taml1}{"11FC0} {Tamil Supplement}
\pxkc@bval{1}{xsux}{"12000} {Cuneiform}
\pxkc@bval{1}{xsux1}{"12400} {Cuneiform Numbers and Punctuation}
\pxkc@bval{2}{xsux2}{"12480} {Early Dynastic Cuneiform}
\pxkc@bval{2}{egyp}{"13000} {Egyptian Hieroglyphs}
-\pxkc@bval{3}{egyp1}{"13430} {Egyptian Hieroglyph Format Controls}
+\pxkc@bval{4}{egyp1}{"13430} {Egyptian Hieroglyph Format Controls}
\pxkc@bval{2}{hluw}{"14400} {Anatolian Hieroglyphs}
\pxkc@bval{2}{bamu1}{"16800} {Bamum Supplement}
\pxkc@bval{2}{mroo}{"16A40} {Mro}
\pxkc@bval{2}{bass}{"16AD0} {Bassa Vah}
\pxkc@bval{2}{hmng}{"16B00} {Pahawh Hmong}
-\pxkc@bval{3}{medf}{"16E40} {Medefaidrin}
+\pxkc@bval{4}{medf}{"16E40} {Medefaidrin}
\pxkc@bval{2}{plrd}{"16F00} {Miao}
\pxkc@bval{2}{cjk14}{"16FE0} {Ideographic Symbols and Punctuation}
\pxkc@bval{2}{tang}{"17000} {Tangut}
\pxkc@bval{2}{tang1}{"18800} {Tangut Components}
-\pxkc@bval{3}{kits}{"18B00} {Khitan Small Script}
-\pxkc@bval{3}{tang2}{"18D00} {Tangut Supplement}
+\pxkc@bval{4}{kits}{"18B00} {Khitan Small Script}
+\pxkc@bval{4}{tang2}{"18D00} {Tangut Supplement}
\pxkc@bval{2}{kana2}{"1B000} {Kana Supplement}
\pxkc@bval{3}{kanaA}{"1B100} {Kana Extended-A}
-\pxkc@bval{3}{kana3}{"1B130} {Small Kana Extension}
+\pxkc@bval{4}{kana3}{"1B130} {Small Kana Extension}
\pxkc@bval{3}{nshu}{"1B170} {Nushu}
\pxkc@bval{2}{dupl}{"1BC00} {Duployan}
\pxkc@bval{2}{sym53}{"1BCA0} {Shorthand Format Controls}
\pxkc@bval{1}{sym32}{"1D000} {Byzantine Musical Symbols}
\pxkc@bval{1}{sym33}{"1D100} {Musical Symbols}
\pxkc@bval{1}{sym34}{"1D200} {Ancient Greek Musical Notation}
-\pxkc@bval{3}{sym58}{"1D2E0} {Mayan Numerals}
+\pxkc@bval{4}{sym58}{"1D2E0} {Mayan Numerals}
\pxkc@bval{1}{sym35}{"1D300} {Tai Xuan Jing Symbols}
\pxkc@bval{1}{sym36}{"1D360} {Counting Rod Numerals}
\pxkc@bval{1}{sym37}{"1D400} {Mathematical Alphanumeric Symbols}
\pxkc@bval{2}{sgnw}{"1D800} {Sutton SignWriting}
\pxkc@bval{2}{glag1}{"1E000} {Glagolitic Supplement}
-\pxkc@bval{3}{hmnp}{"1E100} {Nyiakeng Puachue Hmong}
-\pxkc@bval{3}{wcho}{"1E2C0} {Wancho}
+\pxkc@bval{4}{hmnp}{"1E100} {Nyiakeng Puachue Hmong}
+\pxkc@bval{4}{wcho}{"1E2C0} {Wancho}
\pxkc@bval{2}{mend}{"1E800} {Mende Kikakui}
\pxkc@bval{2}{adlm}{"1E900} {Adlam}
-\pxkc@bval{3}{sym59}{"1EC70} {Indic Siyaq Numbers}
-\pxkc@bval{3}{sym61}{"1ED00} {Ottoman Siyaq Numbers}
+\pxkc@bval{4}{sym59}{"1EC70} {Indic Siyaq Numbers}
+\pxkc@bval{4}{sym61}{"1ED00} {Ottoman Siyaq Numbers}
\pxkc@bval{2}{sym51}{"1EE00} {Arabic Mathematical Alphabetic Symbols}
\pxkc@bval{2}{sym43}{"1F000} {Mahjong Tiles}
\pxkc@bval{2}{sym44}{"1F030} {Domino Tiles}
@@ -517,16 +637,16 @@
\pxkc@bval{2}{sym55}{"1F780} {Geometric Shapes Extended}
\pxkc@bval{2}{sym56}{"1F800} {Supplemental Arrows-C}
\pxkc@bval{2}{sym57}{"1F900} {Supplemental Symbols and Pictographs}
-\pxkc@bval{3}{sym60}{"1FA00} {Chess Symbols}
-\pxkc@bval{3}{sym62}{"1FA70} {Symbols and Pictographs Extended-A}
-\pxkc@bval{3}{sym63}{"1FB00} {Symbols for Legacy Computing}
+\pxkc@bval{4}{sym60}{"1FA00} {Chess Symbols}
+\pxkc@bval{4}{sym62}{"1FA70} {Symbols and Pictographs Extended-A}
+\pxkc@bval{4}{sym63}{"1FB00} {Symbols for Legacy Computing}
\pxkc@bval{1}{haniB}{"20000} {CJK Unified Ideographs Extension B}
\pxkc@bval{2}{haniC}{"2A700} {CJK Unified Ideographs Extension C}
\pxkc@bval{2}{haniD}{"2B740} {CJK Unified Ideographs Extension D}
\pxkc@bval{2}{haniE}{"2B820} {CJK Unified Ideographs Extension E}
\pxkc@bval{3}{haniF}{"2CEB0} {CJK Unified Ideographs Extension F}
\pxkc@bval{1}{hani2}{"2F800} {CJK Compatibility Ideographs Supplement}
-\pxkc@bval{3}{haniG}{"30000} {CJK Unified Ideographs Extension G}
+\pxkc@bval{4}{haniG}{"30000} {CJK Unified Ideographs Extension G}
\pxkc@bval{1}{spc07}{"E0000} {Tags}
\pxkc@bval{1}{spc08}{"E0100} {Variation Selectors Supplement}
\pxkc@bval{1}{spc09}{"F0000} {Supplementary Private Use Area-A}
@@ -544,6 +664,9 @@
\pxkc@bval{0}{latnx}{"00A0}{Latin-1 Supplement/Other}
\pxkc@bval{0}{latny}{"00C0}{Latin-1 Supplement/Latin}
\fi
+\ifx\pxkc@bbslst\@empty\else
+ \pxkc@debug{Unsupported blocks:\pxkc@bbslst}
+\fi
%% \pxkc@foreach@blocks
\edef\pxkc@foreach@blocks{%
@@ -554,22 +677,22 @@
\let\pxkc@cval\relax
\let\pxkc@gval\relax
\let\pxkc@bslst\relax
+\let\pxkc@bbslst\relax
%--------------------------------------- public interfaces
%%<*> \cjkcategory{<block>}{<category>}
% Sets the kcatcode of block <block> to <category>.
% Here <block> is given as a block name or a single character in the
-% block to be specified; <category> is given as a category name or
-% a number ranged in 15--19.
+% block (groups are not considered) to be specified;
+% <category> is given as a category name or a kcatcode value (15--19).
\newcommand*\cjkcategory{%
\begingroup
\forcecjktoken
\expandafter\endgroup\pxkc@cjkcategory@}% read args
\def\pxkc@cjkcategory@#1#2{%
- \ifnum2<1#2 % <category> is a number
- \edef\pxkc@arg{#2}%
- \else
+ \edef\pxkc@arg{#2}%
+ \ifnum2<1\pxkc@arg\relax \else % <category> is a number
\@ifundefined{pxkc@C@@#2}{%
\pxkc@err@ivcsy{#2}\def\pxkc@arg{18}%
}{%else
@@ -578,35 +701,48 @@
\fi
\pxkc@cjkcategory@a{#1}}
\def\pxkc@cjkcategory@a#1{%{<block>}
- \@for\pxkc@blk:={#1}\do{%
- \expandafter\pxkc@cjkcategory@b\expandafter{\pxkc@blk}}}
+ \pxkc@expand@text\pxkc@tmpa{#1}%
+ \ifx\pxkc@tmpa\relax
+ \pxkc@err@ivfmt{#1}%
+ \else
+ \@for\pxkc@blk:=\pxkc@tmpa\do{%
+ \expandafter\pxkc@cjkcategory@b\expandafter{\pxkc@blk}}%
+ \fi}
\def\pxkc@cjkcategory@b#1{%
- \pxkc@get@cp{#1}\ifnum\pxkc@cp>"7F
- \pxkc@kcatcode{\pxkc@cp}{\pxkc@arg}% FIXME: consider group
+ \pxkc@get@cp{#1}\ifpxkc@ok % charcode
+ \pxkc@kcatcode{\pxkc@cp}{\pxkc@arg}%
\else
- \edef\pxkc@blk{#1}%
- \pxkc@set@cjkcategory
+ \ifcase\pxkc@cp % no-op
+ \or % name
+ \edef\pxkc@blk{#1}%
+ \pxkc@set@cjkcategory
+ \else \pxkc@err@ivfmt{#1}% error
+ \fi
\fi}
%% \pxkc@set@cjkcategory
-% Sees \pxkc@blk and \pxkc@arg.
+% Sees \pxkc@blk (block name) and \pxkc@arg (kcatcode).
\def\pxkc@set@cjkcategory{%
\pxkc@letcs\pxkc@tmpa{pxkc@G@@\pxkc@blk}%
\ifx\pxkc@tmpa\relax
\pxkc@letcs\pxkc@cp{pxkc@B@@\pxkc@blk}%
\ifx\pxkc@cp\relax
\pxkc@err@ivbsy{\pxkc@blk}%
- \else\ifnum\pxkc@cp<\z@ % defunct
- \ifpxkc@warn@defunct \pxkc@warn@dfblk{\pxkc@blk}\fi
+ \else\ifnum\pxkc@cp<\z@ % bad
+ \ifpxkc@warn@bad \pxkc@warn@dfblk{\pxkc@blk}\fi
+ \else\ifnum\pxkc@cp=\z@
+ \ifnum\pxkc@arg=15 \else
+ \pxkc@err@naltn
+ \fi
\else
\pxkc@kcatcode{\pxkc@cp}{\pxkc@arg}%
- \fi\fi
+ \fi\fi\fi
\else
\pxkc@expanded{\noexpand\pxkc@cjkcategory@a{\pxkc@tmpa}}%
\fi}
-%%<*> \pxkc@cjkcategory{<block>}{<kcatcode>}
-%%<*> \pxkc@cjkcategory@mccv{<minmccv>}{<maxmccv>}{<block>}{<kcatcode>}
+%% \pxkc@cjkcategory{<block>}{<kcatcode>}
+%% \pxkc@cjkcategory@mccv{<minmccv>}{<maxmccv>}{<block>}{<kcatcode>}
% Other entry points for internal use.
\def\pxkc@cjkcategory#1#2{%
\def\pxkc@blk{#1}\edef\pxkc@arg{#2}%
@@ -617,9 +753,40 @@
\fi\fi}
%% \pxkc@get@cp{<arg>}
+% ok / 0=nop / 1=name / 2=err
\def\pxkc@get@cp#1{%
- \afterassignment\pxkc@get@cp@a\chardef\pxkc@cp=`#1?\pxkc@mk}
-\def\pxkc@get@cp@a#1\pxkc@mk{}
+ \pxkc@okfalse \chardef\pxkc@cp\z@
+ \pxkc@get@cp@a#1\pxkc@mk\pxkc@end}
+\def\pxkc@get@cp@a#1{%
+ \pxkc@cond\ifx#1\pxkc@mk\fi{%
+ \pxkc@get@cp@fin\pxkc@mk
+ }{\pxkc@cond\ifnum\pxkc@get@cp@b#1>\z@\fi{%
+ \pxkc@get@cp@c#1%
+ }{\pxkc@cond\ifnum2<"1#1 \fi{%
+ \pxkc@get@cp@c"#1%
+ }{%else
+ \chardef\pxkc@cp`#1 %
+ \pxkc@cond\ifnum\pxkc@cp>\pxkc@ascii@max\fi{%
+ \pxkc@oktrue \pxkc@get@cp@fin
+ }{%
+ \pxkc@okfalse \chardef\pxkc@cp\@ne \pxkc@get@cp@e
+ }%
+ }}}}
+\def\pxkc@get@cp@b#1{0\if#1"1\fi\if#1'1\fi\if#1+1\fi}
+\def\pxkc@get@cp@c{%
+ \afterassignment\pxkc@get@cp@d\count@=}
+\def\pxkc@get@cp@d{%
+ \chardef\pxkc@cp\count@
+ \ifnum\pxkc@cp=\count@ \pxkc@oktrue
+ \else \chardef\pxkc@cp\z@
+ \fi
+ \pxkc@get@cp@fin}
+\def\pxkc@get@cp@e#1\pxkc@mk{%
+ \pxkc@get@cp@fin\pxkc@mk}
+\def\pxkc@get@cp@fin#1\pxkc@mk\pxkc@end{%
+ \ifx\pxkc@mt#1\pxkc@mt\else
+ \pxkc@okfalse \chardef\pxkc@cp\tw@
+ \fi}
%%<*> \cjkcategorymode{<mode>}
% Invokes the cjk-category mode <mode>.
@@ -628,9 +795,10 @@
\ifx\pxkc@next\relax
\pxkc@err@ivmsy{#1}%
\else
- \pxkc@warn@defunctfalse
+ \pxkc@warn@badfalse
\pxkc@next
- \pxkc@warn@defuncttrue
+ \pxkc@warn@badtrue
+ \kcatcode0=15 % 'latn' is fixed
\fi}
%--------------------------------------- CJK category modes
@@ -639,10 +807,9 @@
\let\pxkc@cat\relax
\let\pxkc@base@cat\relax
-%% \[pxkc@K@@<block>] : Invariant blocks
+%% \[pxkc@K@@<block>] : the kcatcode of CJK core blocks
\def\do#1#2{\expandafter\chardef\csname pxkc@K@@#1\endcsname=#2 }
%C======================================
-\do{latn} {15} % Basic Latin
\do{hang1} {19} % Hangul Jamo
\do{sym15} {18} % Enclosed Alphanumerics
\do{cjk01} {16} % CJK Radicals Supplement
@@ -693,6 +860,10 @@
\do{hani2} {16} % CJK Compatibility Ideographs Supplement
\do{haniG} {16} % CJK Unified Ideographs Extension G
%=======================================
+\ifnum\pxkc@mccv<2
+ \do{cjk1b} {18}
+ \do{cjk1c} {18}
+\fi
%% \pxkc@reset@all{<kcatcode>}
\def\pxkc@reset@all#1{%
@@ -700,11 +871,9 @@
\pxkc@foreach@blocks\do{%
\pxkc@letcs\pxkc@cat{pxkc@K@@\pxkc@blk}%
\ifx\pxkc@cat\relax \let\pxkc@cat\pxkc@base@cat \fi
- \pxkc@kcatcode{\@nameuse{pxkc@B@@\pxkc@blk}}{\pxkc@cat}}%
- \ifnum\pxkc@mccv<2
- \pxkc@cjkcategory{cjk12}{18}%
- \fi}
+ \pxkc@kcatcode{\@nameuse{pxkc@B@@\pxkc@blk}}{\pxkc@cat}}}
+%% \[pxkc@M@@<mode>] : the implementation of a mode
%P======================================
%% 'forcecjk'
\def\pxkc@M@@forcecjk{%
@@ -720,7 +889,7 @@
%% 'prefercjkvar'
\def\pxkc@M@@prefercjkvar{%
\pxkc@M@@japanesevar
- \pxkc@cjkcategory@mccv{3}{3}{latny}{18}%
+ \pxkc@cjkcategory@mccv{3}{4}{latny}{18}%
\pxkc@cjkcategory{latnA}{18}%
\pxkc@cjkcategory{latnB}{18}%
\pxkc@cjkcategory{latn2}{18}%
@@ -741,7 +910,7 @@
\def\pxkc@M@@japanesevar{%
\pxkc@M@@prefernoncjk
\pxkc@cjkcategory@mccv{1}{2}{latn1}{18}%
- \pxkc@cjkcategory@mccv{3}{3}{latnx}{18}%
+ \pxkc@cjkcategory@mccv{3}{4}{latnx}{18}%
\pxkc@cjkcategory{sym04}{18}%
\pxkc@cjkcategory{sym07}{18}%
\pxkc@cjkcategory{sym08}{18}%
@@ -768,10 +937,90 @@
%% 'default'
\def\pxkc@M@@default{%
\pxkc@M@@forcecjk
- \pxkc@cjkcategory@mccv{3}{3}{latny}{15}%
- \pxkc@cjkcategory@mccv{3}{3}{latnA}{15}%
+ \pxkc@cjkcategory@mccv{3}{4}{latny}{15}%
+ \pxkc@cjkcategory@mccv{3}{4}{latnA}{15}%
+ \pxkc@cjkcategory@mccv{4}{4}{latnB}{15}%
}
+%--------------------------------------- safe text expansion
+
+%% variables
+\let\pxkc@expd\relax
+
+%% \pxkc@expand@text\CS{<text>}
+\def\pxkc@expand@text#1#2{%
+ \begingroup
+ \let\UTFviii@invalid@err \noexpand
+ \let\UTFviii@two@octets \pxkc@lead@byte@NB
+ \let\UTFviii@three@octets\pxkc@lead@byte@NC
+ \let\UTFviii@four@octets \pxkc@lead@byte@ND
+ \edef\pxkc@tmpa{#2}%
+ \let\UTFviii@invalid@err \pxkc@expand@text@err
+ \let\UTFviii@two@octets \pxkc@lead@byte@PB
+ \let\UTFviii@three@octets\pxkc@lead@byte@PC
+ \let\UTFviii@four@octets \pxkc@lead@byte@PD
+ \let\pxkc@expd\@empty
+ \expandafter\pxkc@expand@text@a\pxkc@tmpa\pxkc@mk\pxkc@end
+ \global\let\pxkc@g@tmpa\pxkc@expd
+ \endgroup
+ \let#1\pxkc@g@tmpa}
+\def\pxkc@expand@text@a{%
+ \futurelet\pxkc@tok\pxkc@expand@text@b}
+\def\pxkc@expand@text@b{%
+ \ifcat\noexpand\pxkc@tok0% other
+ \let\pxkc@next\pxkc@expand@text@d
+ \else\ifcat\noexpand\pxkc@tok\@sptoken
+ \let\pxkc@next\pxkc@expand@text@f
+ \else\ifx\pxkc@tok\pxkc@mk % end
+ \let\pxkc@next\pxkc@expand@text@fin
+ \else\ifx\pxkc@tok\bgroup
+ \let\pxkc@next\pxkc@expand@text@err
+ \else\expandafter\ifx\noexpand\pxkc@tok\pxkc@tok % unexpandable
+ \let\pxkc@next\pxkc@expand@text@c
+ \else \let\pxkc@next\pxkc@expand@text@e
+ \fi\fi\fi\fi\fi
+ \pxkc@next}
+\def\pxkc@expand@text@c#1{%
+ \edef\pxkc@expd{\pxkc@expd#1}%
+ \pxkc@expand@text@a}
+\def\pxkc@expand@text@d#1{%
+ \ifnum`#1>\pxkc@ascii@max % high byte
+ \let\pxkc@next\pxkc@expand@text@ret
+ \lccode"EF=`#1\relax\lowercase{\expandafter^^ef}% reactivate
+ \else \expandafter\pxkc@expand@text@c\expandafter#1%
+ \fi}
+\def\pxkc@expand@text@e#1{%
+ \ifcat\noexpand#1\noexpand^^ef% active-char
+ \let\pxkc@next\pxkc@expand@text@ret
+ \expandafter#1%
+ \else \expandafter\pxkc@expand@text@err
+ \fi}
+\expandafter\def\expandafter\pxkc@expand@text@f\space{%
+ \pxkc@expand@text@c\space}
+\def\pxkc@expand@text@fin#1#2\pxkc@end{%
+ \ifx\pxkc@mt#2\pxkc@mt \else \let\pxkc@expd\relax \fi}
+\def\pxkc@expand@text@err{%
+ \pxkc@expand@text@fin\pxkc@mk}
+\def\pxkc@expand@text@ret{% UTF-8 bytes are read
+ \pxkc@get@jchar\count@
+ \pxkc@expand@text@c\pxkc@jchar}
+
+%% processors
+\def\pxkc@lead@byte@NB#1{\noexpand#1\noexpand}
+\def\pxkc@lead@byte@NC#1#2{\noexpand#1\noexpand#2\noexpand}
+\def\pxkc@lead@byte@ND#1#2#3{\noexpand#1\noexpand#2\noexpand#3\noexpand}
+\def\pxkc@lead@byte@PB#1#2{%
+ \count@`#1 \advance\count@-"C0
+ \pxkc@trail@byte{#2}\pxkc@next}
+\def\pxkc@lead@byte@PC#1#2#3{%
+ \count@`#1 \advance\count@-"E0
+ \pxkc@trail@byte{#2}\pxkc@trail@byte{#3}\pxkc@next}
+\def\pxkc@lead@byte@PD#1#2#3#4{%
+ \count@`#1 \advance\count@-"F0
+ \pxkc@trail@byte{#2}\pxkc@trail@byte{#3}\pxkc@trail@byte{#4}\pxkc@next}
+\def\pxkc@trail@byte#1{%
+ \multiply\count@"40 \advance\count@`#1 \advance\count@-"80 }
+
%--------------------------------------- miscellaneous accessories
%%<*> \showcjkcategory
diff --git a/macros/latex/contrib/pxcjkcat/pxcjkcat.tex b/macros/latex/contrib/pxcjkcat/pxcjkcat.tex
index 4173f25a44..e8e00fcbc7 100644
--- a/macros/latex/contrib/pxcjkcat/pxcjkcat.tex
+++ b/macros/latex/contrib/pxcjkcat/pxcjkcat.tex
@@ -11,7 +11,7 @@
pdftitle={pxcjkcatパッケージ},
pdfauthor={八登崇之}}
\usepackage{bxtexlogo}
-\bxtexlogoimport{*}
+\bxtexlogoimport{*,LaTeXTeX}
\usepackage[verb]{bxghost}
\usepackage{shortvrb}
\MakeShortVerb{\|}
@@ -19,12 +19,13 @@
\newenvironment{myverbatim}
{\quote\small\verbatim}
{\endverbatim\endquote}
-\newcommand{\PkgVersion}{1.2}
-\newcommand{\PkgDate}{2022/05/25}
+\newcommand{\PkgVersion}{1.4}
+\newcommand{\PkgDate}{2022/06/06}
\newcommand{\Pkg}[1]{\textsf{#1}}
-\newcommand{\Meta}[1]{$\langle$\mbox{}#1\mbox{}$\rangle$}
+\newcommand{\Meta}[1]{%
+ $\langle$\mbox{}\nolinebreak#1\nolinebreak\mbox{}$\rangle$}
\newcommand{\Note}{\par\noindent ※}
-\newcommand{\Means}{:\quad}
+\newcommand{\Means}{:~}
\newcommand{\strong}{\textsf}
\newcommand{\wbr}{\linebreak[0]}
\newcommand{\Code}[1]{{\usefont{T1}{lmtt}{l}{n}#1}}
@@ -36,14 +37,182 @@
\maketitle
\begin{abstract}
-本パッケージは、
-{\upTeX}の和文文字カテゴリ(kcatcode)を扱う{\LaTeX}上の
-インタフェースを提供する。
+{\upTeX}エンジンには
+「ソース中の非ASCII文字の扱い」
+(和文・欧文の何れとして扱うか、等)
+を制御するための「和文カテゴリ(kcatcode)」
+という設定がある。
+本パッケージは、{\upTeX}の和文カテゴリを扱うための
+{\LaTeX}の文書作成者向けのインタフェースを提供する。
\end{abstract}
\tableofcontents
%===========================================================
+\section{前提知識}
+\label{sec:Introduction}
+
+%-------------------
+\subsection{和文カテゴリ}
+\label{ssec:cjkcategory}
+
+{\upTeX}エンジンの「\strong{和文カテゴリ}(kcatcode)」の設定は
+「ソース中の非ASCII文字の振舞」を制御するためのものである。
+例えば「ア」(U+30A2)という文字は普通は(既定値では)
+仮名として扱われるが、U+30A2の和文カテゴリを変更することで、
+これを「和文記号扱い」「欧文扱い」などに変えることができる。
+
+{\upTeX}の仕様では和文カテゴリの値は15~19の範囲の整数
+(\strong{和文カテゴリコード})
+として表される。
+本パッケージでは操作を直感的にするため和文カテゴリの値に名前
+(\strong{カテゴリID})を付けて扱う。
+和文カテゴリの値の一覧は以下の通りである。
+
+\begin{center}\small\begin{tabular}{ccl}
+ \hline
+ コード & カテゴリID & 意味 \\
+ \hline
+ 15 & |noncjk| & 欧文扱い \\
+ 16 & |kanji| & 漢字扱い \\
+ 17 & |kana| & 仮名扱い \\
+ 18 & |cjk| & 「その他の和文」扱い \\
+ 19 & |hangul| & ハングル扱い \\
+ \hline
+\end{tabular}\end{center}
+和文カテゴリの設定による実際の「振舞」の違いには
+以下のようなものがある
+\footnote{なお、現在の{\upTeX}の仕様では|kanji|(16)と|kana|(17)
+ の間には「振舞」の違いは存在しないようである。}。
+\begin{itemize}
+\item 和文カテゴリが|noncjk|(15)である文字は欧文として扱われる。
+ 対して、|noncjk|以外の文字は和文扱いとなる。
+ \Note なお、欧文扱いとなる文字は欧文{\LaTeX}({\pdfLaTeX})と
+ 同じ機構で処理される。
+ すなわち、{\TeX}のレベルではUTF-8のバイト列として扱われ、
+ これを\Pkg{inputenc}パッケージが適切に処理することで
+ 初めて「文字」として認識される。
+\item (u){\pLaTeX}には「行末にある文字が和文文字の場合には当該の改行は
+ 空白にならずに無視される」という独自の入力規則があるが、
+ 和文カテゴリが|hangul|(19)である和文文字が行末にある場合は
+ 欧文と同様に改行は空白を発生させる。
+\item {\LaTeX}の|\|から始まる命令名(制御綴)の構成について
+ 「複数文字の名前を作れるのは英字のみ」という規則がある。
+ 命令名構成の規則について、和文カテゴリが
+ |kanji|(16)・|kana|(17)・|hangul|(19)
+ の和文文字は「英字」と同じ扱いになり、
+ |cjk|(18)の和文文字は「英字以外の欧文文字」と同じ扱いになる。
+\end{itemize}
+
+ただし、{\upTeX}の仕様では、和文文字カテゴリの設定は“文字単位”ではなく
+“Unicodeブロック単位”で行うようになっている(一部例外あり)。
+従って、例えば「ア」(U+30A2)の和文カテゴリを変更したいという場合には、
+U+30A2が属する“Katakana”(U+30A0~30FF)のブロックについて
+和文カテゴリの設定を行うことになる。
+
+本パッケージが提供する命令を利用すると
+「“Katakana”の和文カテゴリを|cjk|(18)に変更する」
+という設定は
+\begin{quote}\small
+\begin{verbatim}
+\cjkcategory{kana}{cjk}
+\end{verbatim}
+\end{quote}
+で実現できる。
+
+%-------------------
+\subsection{和文カテゴリモード}
+\label{ssec:cjkcategory-mode}
+
+\strong{和文カテゴリモード}は
+全てのブロックに対する和文カテゴリの一括設定
+(プリセット設定)のことである
+(TODO:ちゃんと説明する)。
+
+モード設定には以下のものがある。
+何れのモードも、「CJK中核セット」(後述)のブロック群の
+設定は共通で、
+その他のブロックが欧文扱い(|noncjk|)であるか
+和文扱い(|cjk|%
+\footnote{全てのモード設定において、「CJK中核セット」\strong{以外}の
+ ブロックのカテゴリは必ず|noncjk|か|cjk|の何れかになる。}%
+)であるかが異なる。
+\begin{itemize}
+\item |forcecjk|\Means
+ 全てのブロックを和文扱い
+ (|noncjk|以外)とする。
+ 和文フォントの中のUnicode値の割当がある全ての文字を
+ 和文文字として直接用いることができる。
+\item |default|\Means
+ 現在のモードCCVに対応する{\upTeX}の版
+ (例えばモードCCVが3ならばv1.23)
+ における既定設定と一致させる。
+ \Note モードCCVが2以下の場合は|forcecjk|と同一の設定になる。
+\item |prefercjk|\Means
+ 和文扱いのブロックとして「CJK中核セット」の他に
+ 「Adobeの定めるCJK文字集合
+ \footnote{Adobe-Japan1、Adobe-GB1、Adobe-CNS1、Adobe-Korea1の4つ。}%
+ の何れかと共通部分をもつ文字ブロック」を加えて、
+ 残りを欧文扱いに設定する。
+\item |prefercjkvar|\Means\hspace{-.25em}%
+ |prefercjk|からギリシャ・キリル文字の
+ ブロックを欧文扱いに変更したもの。
+\item |japanese|\Means
+ 和文扱いのブロックとして「CJK中核セット」の他に
+ 「Adobe-Japan1の全角幅のグリフ
+ の何れかと共通部分をもつ文字ブロック」を加えて、
+ 残りを欧文扱いに設定する。
+\item |japanesevar|\Means
+ |japanese|からギリシャ・キリル文字の
+ ブロックを欧文扱いに変更したもの。
+\item |prefernoncjk|\Means
+ 「CJK中核セット」のブロックのみを和文扱いとし、
+ 残りを欧文扱いにする。
+\end{itemize}
+
+\Note 各モードでの具体的な設定値については\ref{sec:Values}節を参照。
+
+\paragraph{CJK中核セット}
+「CJK中核セット」は以下の文字種が属するブロックのセットを指す。
+(括弧内は、モード設定において当該のブロックに設定される
+和文カテゴリの値。)
+ \begin{itemize}
+ \item 漢字・部首・注音字母(|kanji|)
+ \item ひらがな・カタカナ(|kana|)
+ \item CJK記号の一部・全角半角互換形・彝文字
+ ・西夏文字・女書文字・契丹文字(|cjk|)
+ \Note モードCCVが2以上の場合、|cjk12|の再分割の|cjk1b|、
+ |cjk1c|は|kana|に設定される。
+ \item ハングル完成形・ハングル字母(|hangul|)
+\end{itemize}
+
+%-------------------
+\subsection{和文トークン状態}
+\label{ssec:cjktoken}
+
+{\upTeX}には、和文カテゴリ(kcatcode)とは別に、
+非ASCII文字全体の和文・欧文扱いの設定を一斉に切り替えるための
+命令が存在する
+\footnote{これらの命令は本パッケージが提供するものではなく
+ {\upTeX}に元から存在するものであることに注意。}。
+\begin{itemize}
+\item |\enablecjktoken|\Means
+ 和文・欧文扱いの設定を和文カテゴリの設定に従わせる。
+\item |\disablecjktoken|\Means
+ 和文カテゴリ設定に関わらず非ASCII文字全体を欧文扱いにする。
+ \Note あたかも全ブロックの和文カテゴリを|noncjk|(15)に設定したのと
+ 同じ状態になる。
+\item |\forcecjktoken|\Means
+ 和文カテゴリ設定に関わらず非ASCII文字全体を和文扱いにする。
+ \Note 和文カテゴリが|noncjk|(15)であるブロックは
+ あたかもそれが|cjk|(18)であるように動作する。
+\end{itemize}
+
+これらの命令群により変更されるパラメタのことを本パッケージでは
+「\strong{和文トークン状態}」と呼ぶことにする
+\footnote{「和文トークン状態」を指す公式の用語は存在しないと思われる。}。
+
+%===========================================================
\section{パッケージ読込}
\label{sec:Loading}
@@ -68,42 +237,65 @@
\item |ccv2|\Means
モードCCVを2({\upTeX} v0.29~1.22と互換)とする。
\item |ccv3|\Means
- モードCCVを3({\upTeX} v1.23以降と互換)とする。
+ モードCCVを3({\upTeX} v1.23と互換)とする。
+ \item |ccv4|\Means
+ モードCCVを4({\upTeX} v1.25以降と互換)とする。
\item |real|または|ccv+|\Means
- モードCCVをエンジンの実のCCVと一致させる。
+ モードCCVを{\upTeX}の実際のCCVと一致させる。
\end{itemize}
-\item |\cjkcategorymode|\strong{命令で有効なモード値}\Means
- 和文カテゴリがモードに従って設定される。
- \Note モード値オプションが非指定の場合は、パッケージ読込時に
- 和文カテゴリが変更されることはない。
+\item \strong{和文カテゴリモード値}\Means
+ |\cjkcategorymode|命令で有効なモード値(|prefernoncjk|等)
+ をオプションとして指定可能で、
+ この場合、和文カテゴリがモードに従って設定される。
+ \Note 和文カテゴリモード値オプションが指定されていない場合は、
+ パッケージ読込時に和文カテゴリが変更されることはない。
\item |nomode|\Means
- モード値オプションの効果を打ち消す。
+ 和文カテゴリモード値オプションの効果を打ち消す。
\end{itemize}
%===========================================================
\section{機能}
\label{sec:Function}
+%-------------------
+\subsection{和文カテゴリ設定に関連する機能}
+\label{ssec:cjkcategory-function}
+
\begin{itemize}
\item |\cjkcategory{|\Meta{ブロック}|,...}{|\Meta{カテゴリ}|}|\Means
- \Meta{ブロック}で表される文字ブロック(複数指定が可能)の
+ \Meta{ブロック}で指定される文字ブロック(複数指定が可能)の
和文カテゴリを\Meta{カテゴリ}に変更する。
\Meta{ブロック}は以下の何れかの形式で指定する:
\begin{itemize}
- \item ブロックID(後述)
- %\item ブロック名
+ \item ブロックID(\ref{sec:Blocks}節参照)%
+ \footnote{ブロックIDによる指定は{\upTeX}の版の影響を受けない。
+ 例えば、{\upTeX}の版(およびモードCCV指定)が何であっても、
+ |latn1|は常に“Latin-1 Supplement”の範囲(U+0080~00FF)を指す。
+ 実CCVが3以上の場合に|latn1|のカテゴリ設定を行った場合は、
+ 実際には|latnx|と|latny|の2つのブロックに対して設定が行われる。}
\item 非ASCII文字1つ\Means
- その文字の属するブロックを指す。
- \Note 文字による指定は「{\upTeX}の版によるブロック分割の差異」に
- 影響されることに注意。
- %\item 整数値\Means
- % その符号位置の属するブロックを指す。
+ 当該の文字が属するブロックを指す。
+ \Note 「文字の属するブロック」は、モードCCV設定とは無関係であり
+ 常に{\upTeX}の実際のブロック定義に従う。
+ 従ってその動作は{\upTeX}の版に依存することに注意。
+ \item 符号値(整数値)\Means
+ 当該の符号値の文字が属するブロックを指す。
+ 符号値は以下の形式で指定できる\Means
+ \begin{itemize}
+ \item \Meta{16進表記}\Means 例えば|1F600|。
+ \item |"|\Meta{16進表記}\Means 例えば|"1F600|。
+ \Note 16進数字の|A|~|F|は大文字で書く。
+ \item |+|\Meta{整数}\Means 例えば|+128512|は10進表記で128512、
+ すなわちU+1F600を表す。
+ \Note \Meta{整数}の部分には一般に任意の
+ 「{\LaTeXTeX}で整数を表すテキスト」が記述できる。
+ 例えば|+\value{mycode}|のように書くとカウンタ値を指定できる。
+ \end{itemize}
+ \Note 前項と同様、動作が{\upTeX}の版に依存することに注意を要する。
\end{itemize}
- \Meta{カテゴリ}は以下に示す「カテゴリID」で指定する
- \footnote{括弧内の整数値は{\upTeX}が内部で用いている
- 「カテゴリコード値」であり、「カテゴリID」の代わりに
- この値を指定することもできる。}:
+ \Meta{カテゴリ}は「カテゴリID」または
+ 「カテゴリコード」(括弧内の整数値)で指定する。
\begin{itemize}
\item |noncjk|(15)\Means 欧文扱い
\item |kanji|または|han|(16)\Means 漢字扱い
@@ -113,61 +305,70 @@
\end{itemize}
和文カテゴリの変更は局所的(グルーピングに従う)である。
+
\Note モードCCVの指定は|\cjkcategory|の動作には影響を与えない。
+ \Note “Basic Latin”ブロック(|latn|)のカテゴリは常に|noncjk|で
+ なければならず、|noncjk|以外に変更しようとするとエラーになる。
+
\item |\cjkcategorymode{|\Meta{モード}|}|\Means
全てのブロックの和文カテゴリの一括設定(モード設定)を行う。
- モードには以下のものがある。
- 何れのセットも、後述する「CJK中核セット」の設定は共通であり、
- それ以外のブロックが欧文扱い(|noncjk|)であるか
- 和文扱い(|cjk|)であるかが異なる。
+ 有効なモード設定の値は以下の通りである。
+ \Note モード設定の詳細については
+ \ref{ssec:cjkcategory-mode}節を参照。
\begin{itemize}
- \item |forcecjk|\Means
- ASCII文字のみ欧文扱いで他のブロックは全て和文扱い
- (|noncjk|以外)とする。
- 和文フォントの中のUnicode値の割当がある全ての文字を
- 和文文字として直接用いることができる。
- \item |default|\Means
- 指定のモードCCVにおける既定の設定と一致させる。
- \Note モードCCVが2以下の場合は|forcecjk|と同一の設定になる。
- %\Note モードCCVがエンジンの実のCCVと一致する場合は、
- % エンジンの既定の設定と一致する。
- \Note モードCCVが3の場合の\strong{仕様は未確定}である。
- 現状の動作は「v1.23の既定設定と一致させる」となっているが、
- この動作は\strong{将来変更される可能性がある}。
- \item |prefercjk|\Means
- 和文扱いのブロックとして、「CJK中核セット」のものに加えて、
- 「Adobeの定めるCJK文字集合
- \footnote{Adobe-Japan1、Adobe-GB1、Adobe-CNS1、Adobe-Korea1。}%
- の何れかと共通部分をもつ文字ブロック」を加えて、
- 残りを欧文扱いに設定する。
- \item |prefercjkvar|\Means
- |prefercjk|において、ギリシャ・キリル文字の
- ブロックを欧文扱いに変更したもの。
- \item |japanese|\Means
- 和文扱いのブロックとして、「CJK中核セット」のものに加えて、
- 「Adobe-Japan1の全角幅のグリフ
- の何れかと共通部分をもつ文字ブロック」を加えて、
- 残りを欧文扱いに設定する。
- \item |japanesevar|\Means
- |japanese|において、ギリシャ・キリル文字の
- ブロックを欧文扱いに変更したもの。
- \item |prefernoncjk|\Means
- 「CJK中核セット」のブロックのみを和文扱いとし、
- 残りを欧文扱いにする。
+ \item |forcecjk|
+ \item |default|
+ \item |prefercjk|
+ \item |prefercjkvar|
+ \item |japanese|
+ \item |japanesevar|
+ \item |prefernoncjk|
\end{itemize}
- ここで「CJK中核セット」の内容は以下のとおりである。
- \begin{itemize}
- \item 漢字・部首・注音字母\Means |kanji|に設定。
- \item ひらがな・カタカナ\Means |kana|に設定。
- \item CJK記号の一部・全角半角互換形・彝文字
- ・西夏文字・女書文字・契丹文字\Means |cjk|に設定。
- \Note モードCCVが2以上の場合、|cjk12|の再分割の|cjk1b|、
- |cjk1c|は|kana|に設定される。
- \item ハングル完成形・ハングル字母\Means |hangul|に設定。
+\end{itemize}
+
+%-------------------
+\subsection{和文トークン状態に関する機能}
+\label{ssec:cjktoken-function}
+
+\Note 「和文トークン状態」については\ref{ssec:cjktoken}節を参照。
+
+\begin{itemize}
+
+\item |\getcjktokenmode|\Means
+ 現在の和文トークン状態の取得して、
+ それを表す整数値を|\thecjktokenmode|に設定する。
+ \begin{itemize}
+ \item 0\Means |\disablecjktoken|の状態。
+ \item 1\Means |\enablecjktoken|の状態。
+ \item 2\Means |\forcecjktoken|の状態。
+ \item 255\Means 状態取得に失敗した%
+ \footnote{{\TeX} Live 2022以降で{\eTeX}拡張無しの{\upTeX}エンジンの
+ 場合は取得ができない。
+ しかし、2014年以降の{\LaTeX}カーネルは{\eTeX}拡張を必須としている
+ ので、そのようなエンジンの上で{\LaTeX}が動作している可能性は
+ ほぼ考えられない。
+ 従って、現実的には255が返ることはないと思ってよい。}。
\end{itemize}
- \Note 各モードでの具体的な設定値については\ref{sec:Values}節を参照。
+
+\item |\setcjktokenmode{|\Meta{整数値}|}|\Means
+ |\getcjktokenmode|の規則の整数値を用いて和文トークン状態を設定する。
+
+\item |\withcjktokendisabled{|\Meta{コード}|}|\Means
+ 一時的に|\disablecjktoken|に変更した状態で、
+ \Meta{コード}を実行する。
+\item |\withcjktokenenabled{|\Meta{コード}|}|\Means
+ 一時的に|\enablecjktoken|に変更した状態で、
+ \Meta{コード}を実行する。
+\item |\withcjktokenforced{|\Meta{コード}|}|\Means
+ 一時的に|\forcecjktoken|に変更した状態で、
+ \Meta{コード}を実行する。
+\Note 以上3つの命令はどれも、
+「和文トークン状態を設定して\Meta{コード}を実行した後
+和文トークン状態を再設定する」
+という動作を行う。
+そのため新たに局所化グループに入ることはない。
\end{itemize}
@@ -176,9 +377,11 @@
\label{sec:CCV}
\noindent \strong{注意}\Means
-この節に述べられている説明は現状の仕様と食い違っている部分があり、
+\ref{sec:CCV}節および\ref{sec:Blocks}に述べられている
+説明は現状の仕様と食い違っている部分があり、
大幅な改訂が必要な状態である。
-現状の仕様では、モードCCVの影響を受けるのはモード設定の定義のみであり、
+少なくとも1.1版以降の仕様では、
+モードCCVの影響を受けるのはモード設定の定義のみであり、
ブロック分割は常に実際のエンジンのものに一致させている。
\bigskip
@@ -197,11 +400,16 @@
\item 文字ブロックの分割の違いを
「\strong{文字分類バージョン}(CCV;Character Category Version)」
と呼ぶことにする。
- 現状では次のものが存在する。
+ 現状では次のものが存在する
+ \footnote{{\upTeX}のv1.24には文字ブロック分割に関してバグが存在するので、
+ CCVの定義からは除外する。
+ なお、実際にv1.24の{\upTeX}で本パッケージが読み込まれた場合は、
+ 実CCVは1と見なされる(はずである)。}。
\begin{itemize}
\item バージョン1: {\upTeX} v0.11~0.28と互換
\item バージョン2: {\upTeX} v0.29~1.22と互換
- \item バージョン3: {\upTeX} v1.23以降と互換
+ \item バージョン3: {\upTeX} v1.23と互換
+ \item バージョン4: {\upTeX} v1.25以降と互換
\end{itemize}
\item \Pkg{pxcjkcat}の読込時に、そのオプションにおいて
@@ -351,7 +559,7 @@
\xI{lepc} \xV{2} \xR {1C00} {1C4F} \xN{Lepcha}\par
\xI{olck} \xV{2} \xR {1C50} {1C7F} \xN{Ol Chiki}\par
\xI{cyrlC} \xV{2} \xR {1C80} {1C8F} \xN{Cyrillic Extended-C}\par
-\xI{geor2} \xV{3} \xR {1C90} {1CBF} \xN{Georgian Extended}\par
+\xI{geor2} \xV{4} \xR {1C90} {1CBF} \xN{Georgian Extended}\par
\xI{sund1} \xV{2} \xR {1CC0} {1CCF} \xN{Sundanese Supplement}\par
\xI{sym38} \xV{2} \xR {1CD0} {1CFF} \xN{Vedic Extensions}\par
\xI{latn4} \xV{1} \xR {1D00} {1D7F} \xN{Phonetic Extensions}\par
@@ -491,13 +699,13 @@
\xI{phlp} \xV{2} \xR {10B80} {10BAF} \xN{Psalter Pahlavi}\par
\xI{orkh} \xV{2} \xR {10C00} {10C4F} \xN{Old Turkic}\par
\xI{hung} \xV{2} \xR {10C80} {10CFF} \xN{Old Hungarian}\par
-\xI{rohg} \xV{3} \xR {10D00} {10D3F} \xN{Hanifi Rohingya}\par
+\xI{rohg} \xV{4} \xR {10D00} {10D3F} \xN{Hanifi Rohingya}\par
\xI{sym42} \xV{2} \xR {10E60} {10E7F} \xN{Rumi Numeral Symbols}\par
-\xI{yezi} \xV{3} \xR {10E80} {10EBF} \xN{Yezidi}\par
-\xI{sogo} \xV{3} \xR {10F00} {10F2F} \xN{Old Sogdian}\par
-\xI{sogd} \xV{3} \xR {10F30} {10F6F} \xN{Sogdian}\par
-\xI{chrs} \xV{3} \xR {10FB0} {10FDF} \xN{Chorasmian}\par
-\xI{elym} \xV{3} \xR {10FE0} {10FFF} \xN{Elymaic}\par
+\xI{yezi} \xV{4} \xR {10E80} {10EBF} \xN{Yezidi}\par
+\xI{sogo} \xV{4} \xR {10F00} {10F2F} \xN{Old Sogdian}\par
+\xI{sogd} \xV{4} \xR {10F30} {10F6F} \xN{Sogdian}\par
+\xI{chrs} \xV{4} \xR {10FB0} {10FDF} \xN{Chorasmian}\par
+\xI{elym} \xV{4} \xR {10FE0} {10FFF} \xN{Elymaic}\par
\xI{brah} \xV{2} \xR {11000} {1107F} \xN{Brahmi}\par
\xI{kthi} \xV{2} \xR {11080} {110CF} \xN{Kaithi}\par
\xI{sora} \xV{2} \xR {110D0} {110FF} \xN{Sora Sompeng}\par
@@ -516,58 +724,58 @@
\xI{mong1} \xV{2} \xR {11660} {1167F} \xN{Mongolian Supplement}\par
\xI{takr} \xV{2} \xR {11680} {116CF} \xN{Takri}\par
\xI{ahom} \xV{2} \xR {11700} {1174F} \xN{Ahom}\par
-\xI{dogr} \xV{3} \xR {11800} {1184F} \xN{Dogra}\par
+\xI{dogr} \xV{4} \xR {11800} {1184F} \xN{Dogra}\par
\xI{wara} \xV{2} \xR {118A0} {118FF} \xN{Warang Citi}\par
-\xI{diak} \xV{3} \xR {11900} {1195F} \xN{Dives Akuru}\par
-\xI{nand} \xV{3} \xR {119A0} {119FF} \xN{Nandinagari}\par
+\xI{diak} \xV{4} \xR {11900} {1195F} \xN{Dives Akuru}\par
+\xI{nand} \xV{4} \xR {119A0} {119FF} \xN{Nandinagari}\par
\xI{zanb} \xV{3} \xR {11A00} {11A4F} \xN{Zanabazar Square}\par
\xI{soyo} \xV{3} \xR {11A50} {11AAF} \xN{Soyombo}\par
\xI{pauc} \xV{2} \xR {11AC0} {11AFF} \xN{Pau Cin Hau}\par
\xI{bhks} \xV{2} \xR {11C00} {11C6F} \xN{Bhaiksuki}\par
\xI{marc} \xV{2} \xR {11C70} {11CBF} \xN{Marchen}\par
\xI{gonm} \xV{3} \xR {11D00} {11D5F} \xN{Masaram Gondi}\par
-\xI{gong} \xV{3} \xR {11D60} {11DAF} \xN{Gunjala Gondi}\par
-\xI{maka} \xV{3} \xR {11EE0} {11EFF} \xN{Makasar}\par
-\xI{lisu1} \xV{3} \xR {11FB0} {11FBF} \xN{Lisu Supplement}\par
-\xI{taml1} \xV{3} \xR {11FC0} {11FFF} \xN{Tamil Supplement}\par
+\xI{gong} \xV{4} \xR {11D60} {11DAF} \xN{Gunjala Gondi}\par
+\xI{maka} \xV{4} \xR {11EE0} {11EFF} \xN{Makasar}\par
+\xI{lisu1} \xV{4} \xR {11FB0} {11FBF} \xN{Lisu Supplement}\par
+\xI{taml1} \xV{4} \xR {11FC0} {11FFF} \xN{Tamil Supplement}\par
\xI{xsux} \xV{1} \xR {12000} {123FF} \xN{Cuneiform}\par
\xI{xsux1} \xV{1} \xR {12400} {1247F} \xN{Cuneiform Numbers and Punctuation}\par
\xI{xsux2} \xV{2} \xR {12480} {1254F} \xN{Early Dynastic Cuneiform}\par
\xI{egyp} \xV{2} \xR {13000} {1342F} \xN{Egyptian Hieroglyphs}\par
-\xI{egyp1} \xV{3} \xR {13430} {1343F} \xN{Egyptian Hieroglyph Format Controls}\par
+\xI{egyp1} \xV{4} \xR {13430} {1343F} \xN{Egyptian Hieroglyph Format Controls}\par
\xI{hluw} \xV{2} \xR {14400} {1467F} \xN{Anatolian Hieroglyphs}\par
\xI{bamu1} \xV{2} \xR {16800} {16A3F} \xN{Bamum Supplement}\par
\xI{mroo} \xV{2} \xR {16A40} {16A6F} \xN{Mro}\par
\xI{bass} \xV{2} \xR {16AD0} {16AFF} \xN{Bassa Vah}\par
\xI{hmng} \xV{2} \xR {16B00} {16B8F} \xN{Pahawh Hmong}\par
-\xI{medf} \xV{3} \xR {16E40} {16E9F} \xN{Medefaidrin}\par
+\xI{medf} \xV{4} \xR {16E40} {16E9F} \xN{Medefaidrin}\par
\xI{plrd} \xV{2} \xR {16F00} {16F9F} \xN{Miao}\par
\xI{cjk14} \xV{2} \xR {16FE0} {16FFF} \xN{Ideographic Symbols and Punctuation}\par
\xI{tang} \xV{2} \xR {17000} {187FF} \xN{Tangut}\par
\xI{tang1} \xV{2} \xR {18800} {18AFF} \xN{Tangut Components}\par
-\xI{kits} \xV{3} \xR {18B00} {18CFF} \xN{Khitan Small Script}\par
-\xI{tang2} \xV{3} \xR {18D00} {18D7F} \xN{Tangut Supplement}\par
+\xI{kits} \xV{4} \xR {18B00} {18CFF} \xN{Khitan Small Script}\par
+\xI{tang2} \xV{4} \xR {18D00} {18D7F} \xN{Tangut Supplement}\par
\xI{kana2} \xV{2} \xR {1B000} {1B0FF} \xN{Kana Supplement}\par
\xI{kanaA} \xV{3} \xR {1B100} {1B12F} \xN{Kana Extended-A}\par
-\xI{kana3} \xV{3} \xR {1B130} {1B16F} \xN{Small Kana Extension}\par
+\xI{kana3} \xV{4} \xR {1B130} {1B16F} \xN{Small Kana Extension}\par
\xI{nshu} \xV{3} \xR {1B170} {1B2FF} \xN{Nushu}\par
\xI{dupl} \xV{2} \xR {1BC00} {1BC9F} \xN{Duployan}\par
\xI{sym53} \xV{2} \xR {1BCA0} {1BCAF} \xN{Shorthand Format Controls}\par
\xI{sym32} \xV{1} \xR {1D000} {1D0FF} \xN{Byzantine Musical Symbols}\par
\xI{sym33} \xV{1} \xR {1D100} {1D1FF} \xN{Musical Symbols}\par
\xI{sym34} \xV{1} \xR {1D200} {1D24F} \xN{Ancient Greek Musical Notation}\par
-\xI{sym58} \xV{3} \xR {1D2E0} {1D2FF} \xN{Mayan Numerals}\par
+\xI{sym58} \xV{4} \xR {1D2E0} {1D2FF} \xN{Mayan Numerals}\par
\xI{sym35} \xV{1} \xR {1D300} {1D35F} \xN{Tai Xuan Jing Symbols}\par
\xI{sym36} \xV{1} \xR {1D360} {1D37F} \xN{Counting Rod Numerals}\par
\xI{sym37} \xV{1} \xR {1D400} {1D7FF} \xN{Mathematical Alphanumeric Symbols}\par
\xI{sgnw} \xV{2} \xR {1D800} {1DAAF} \xN{Sutton SignWriting}\par
\xI{glag1} \xV{2} \xR {1E000} {1E02F} \xN{Glagolitic Supplement}\par
-\xI{hmnp} \xV{3} \xR {1E100} {1E14F} \xN{Nyiakeng Puachue Hmong}\par
-\xI{wcho} \xV{3} \xR {1E2C0} {1E2FF} \xN{Wancho}\par
+\xI{hmnp} \xV{4} \xR {1E100} {1E14F} \xN{Nyiakeng Puachue Hmong}\par
+\xI{wcho} \xV{4} \xR {1E2C0} {1E2FF} \xN{Wancho}\par
\xI{mend} \xV{2} \xR {1E800} {1E8DF} \xN{Mende Kikakui}\par
\xI{adlm} \xV{2} \xR {1E900} {1E95F} \xN{Adlam}\par
-\xI{sym59} \xV{3} \xR {1EC70} {1ECBF} \xN{Indic Siyaq Numbers}\par
-\xI{sym61} \xV{3} \xR {1ED00} {1ED4F} \xN{Ottoman Siyaq Numbers}\par
+\xI{sym59} \xV{4} \xR {1EC70} {1ECBF} \xN{Indic Siyaq Numbers}\par
+\xI{sym61} \xV{4} \xR {1ED00} {1ED4F} \xN{Ottoman Siyaq Numbers}\par
\xI{sym51} \xV{2} \xR {1EE00} {1EEFF} \xN{Arabic Mathematical Alphabetic Symbols}\par
\xI{sym43} \xV{2} \xR {1F000} {1F02F} \xN{Mahjong Tiles}\par
\xI{sym44} \xV{2} \xR {1F030} {1F09F} \xN{Domino Tiles}\par
@@ -582,16 +790,16 @@
\xI{sym55} \xV{2} \xR {1F780} {1F7FF} \xN{Geometric Shapes Extended}\par
\xI{sym56} \xV{2} \xR {1F800} {1F8FF} \xN{Supplemental Arrows-C}\par
\xI{sym57} \xV{2} \xR {1F900} {1F9FF} \xN{Supplemental Symbols and Pictographs}\par
-\xI{sym60} \xV{3} \xR {1FA00} {1FA6F} \xN{Chess Symbols}\par
-\xI{sym62} \xV{3} \xR {1FA70} {1FAFF} \xN{Symbols and Pictographs Extended-A}\par
-\xI{sym63} \xV{3} \xR {1FB00} {1FBFF} \xN{Symbols for Legacy Computing}\par
+\xI{sym60} \xV{4} \xR {1FA00} {1FA6F} \xN{Chess Symbols}\par
+\xI{sym62} \xV{4} \xR {1FA70} {1FAFF} \xN{Symbols and Pictographs Extended-A}\par
+\xI{sym63} \xV{4} \xR {1FB00} {1FBFF} \xN{Symbols for Legacy Computing}\par
\xI{haniB} \xV{1} \xR {20000} {2A6DF} \xN{CJK Unified Ideographs Extension B}\par
\xI{haniC} \xV{2} \xR {2A700} {2B73F} \xN{CJK Unified Ideographs Extension C}\par
\xI{haniD} \xV{2} \xR {2B740} {2B81F} \xN{CJK Unified Ideographs Extension D}\par
\xI{haniE} \xV{2} \xR {2B820} {2CEAF} \xN{CJK Unified Ideographs Extension E}\par
\xI{haniF} \xV{3} \xR {2CEB0} {2EBEF} \xN{CJK Unified Ideographs Extension F}\par
\xI{hani2} \xV{1} \xR {2F800} {2FA1F} \xN{CJK Compatibility Ideographs Supplement}\par
-\xI{haniG} \xV{3} \xR {30000} {3134F} \xN{CJK Unified Ideographs Extension G}\par
+\xI{haniG} \xV{4} \xR {30000} {3134F} \xN{CJK Unified Ideographs Extension G}\par
\xI{spc07} \xV{1} \xR {E0000} {E007F} \xN{Tags}\par
\xI{spc08} \xV{1} \xR {E0100} {E01EF} \xN{Variation Selectors Supplement}\par
\xI{spc09} \xV{1} \xR {F0000} {FFFFF} \xN{Supplementary Private Use Area-A}\par
diff --git a/macros/latex/required/amsmath/README.md b/macros/latex/required/amsmath/README.md
index f7c700994c..1bc1702484 100644
--- a/macros/latex/required/amsmath/README.md
+++ b/macros/latex/required/amsmath/README.md
@@ -1,7 +1,7 @@
The amsmath bundle for LaTeX
============================
-Release 2021-11-15
+Release 2022-06-01
Overview
--------
@@ -77,4 +77,5 @@ version 1.3c or later.
-----
<p>Copyright (C) 2001-2004, 2007, 2008, 2010, 2011, 2013 American Mathematical Society. <br />
-<p>Copyright (C) 2016-2021 The LaTeX Project and American Mathematical Society. <br />
+<p>Copyright (C) 2016-2022 The LaTeX Project and American Mathematical Society. <br />
+
diff --git a/macros/latex/required/amsmath/amsbsy.dtx b/macros/latex/required/amsmath/amsbsy.dtx
index 8557c6534a..d94bf9a72f 100644
--- a/macros/latex/required/amsmath/amsbsy.dtx
+++ b/macros/latex/required/amsmath/amsbsy.dtx
@@ -81,7 +81,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \[
% \pmb{\infty} = \boldsymbol{\infty} \quad ?
% \]
-% \StopEventually{}
+% \MaybeStop{}
%
% Standard package info.
% \begin{macrocode}
diff --git a/macros/latex/required/amsmath/amsbsy.ins b/macros/latex/required/amsmath/amsbsy.ins
index 9194608622..c35a72dad6 100644
--- a/macros/latex/required/amsmath/amsbsy.ins
+++ b/macros/latex/required/amsmath/amsbsy.ins
@@ -26,7 +26,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
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/latex/required/amsmath/amsbsy.pdf b/macros/latex/required/amsmath/amsbsy.pdf
index 50882b2530..e85825b6f9 100644
--- a/macros/latex/required/amsmath/amsbsy.pdf
+++ b/macros/latex/required/amsmath/amsbsy.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/amscd.dtx b/macros/latex/required/amsmath/amscd.dtx
index f3528dd7c1..1ed5be6b67 100644
--- a/macros/latex/required/amsmath/amscd.dtx
+++ b/macros/latex/required/amsmath/amscd.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -97,7 +97,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \end{CD}\end{equation}
% \end{verbatim}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% Standard package info.
% \begin{macrocode}
diff --git a/macros/latex/required/amsmath/amscd.ins b/macros/latex/required/amsmath/amscd.ins
index 30b2f28177..5ecf051583 100644
--- a/macros/latex/required/amsmath/amscd.ins
+++ b/macros/latex/required/amsmath/amscd.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
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/latex/required/amsmath/amscd.pdf b/macros/latex/required/amsmath/amscd.pdf
index f1182d6c20..c0ecd2961b 100644
--- a/macros/latex/required/amsmath/amscd.pdf
+++ b/macros/latex/required/amsmath/amscd.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/amsgen.dtx b/macros/latex/required/amsmath/amsgen.dtx
index 10ac58b18e..0493940071 100644
--- a/macros/latex/required/amsmath/amsgen.dtx
+++ b/macros/latex/required/amsmath/amsgen.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -49,7 +49,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% distribution. Some of these might eventually make it into the \latex/
% kernel.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% Standard package info.
% Using \cs{ProvidesFile} rather than \cs{ProvidesPackage} because
diff --git a/macros/latex/required/amsmath/amsgen.ins b/macros/latex/required/amsmath/amsgen.ins
index aacb6e0c39..7d845e61cf 100644
--- a/macros/latex/required/amsmath/amsgen.ins
+++ b/macros/latex/required/amsmath/amsgen.ins
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
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/latex/required/amsmath/amsgen.pdf b/macros/latex/required/amsmath/amsgen.pdf
index 7f7d05c81f..014feb8d2a 100644
--- a/macros/latex/required/amsmath/amsgen.pdf
+++ b/macros/latex/required/amsmath/amsgen.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/amsldoc.pdf b/macros/latex/required/amsmath/amsldoc.pdf
index b3cbac1118..dd7061eac5 100644
--- a/macros/latex/required/amsmath/amsldoc.pdf
+++ b/macros/latex/required/amsmath/amsldoc.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/amsldoc.tex b/macros/latex/required/amsmath/amsldoc.tex
index 97294772e7..4a8230e39f 100644
--- a/macros/latex/required/amsmath/amsldoc.tex
+++ b/macros/latex/required/amsmath/amsldoc.tex
@@ -1,6 +1,6 @@
%
% Copyright (C) 1995, 2000, 2013 American Mathematical Society.
-% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%
% 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/latex/required/amsmath/amsmath.dtx b/macros/latex/required/amsmath/amsmath.dtx
index a5cf333e79..34d17b65f0 100644
--- a/macros/latex/required/amsmath/amsmath.dtx
+++ b/macros/latex/required/amsmath/amsmath.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 2000, 2013 American Mathematical Society.
-% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -68,7 +68,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% provided here is found in the AMSmath Users' Guide,
% \fn{amsldoc.tex}.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% Standard file identification.
% \begin{macrocode}
@@ -86,7 +86,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesPackage{amsmath}[2021/10/15 v2.17l AMS math features]
+\ProvidesPackage{amsmath}[2022/04/08 v2.17n AMS math features]
% \end{macrocode}
%
% \section{Catcode defenses}
@@ -615,7 +615,8 @@ Foreign command \@backslashchar#1;\MessageBreak
% abbreviations for some commonly needed mathstyle overrides. To
% conserve csnames we avoid making \cn{dfrac} and \cn{tfrac} robust
% (\cn{genfrac} is itself robust).
-% \changes{v2.17i}{2020/09/23}{added \cs{Ustack} for luatex (moved patch from lualatex-math)}
+% \changes{v2.17i}{2020/09/23}{added \cs{Ustack} for luatex (moved patch from lualatex-math)}
+% \changes{v2.17n}{2022/04/08}{Make fraction commands robust (gh/123)}
% \begin{macrocode}
%
\ifx\directlua\@undefined
@@ -623,8 +624,8 @@ Foreign command \@backslashchar#1;\MessageBreak
\else
\DeclareRobustCommand{\frac}[2]{{\Ustack{\begingroup#1\endgroup\@@over#2}}}
\fi
-\newcommand{\dfrac}{\genfrac{}{}{}0}
-\newcommand{\tfrac}{\genfrac{}{}{}1}
+\DeclareRobustCommand{\dfrac}{\genfrac{}{}{}0}
+\DeclareRobustCommand{\tfrac}{\genfrac{}{}{}1}
% \end{macrocode}
% The \cn{binom} command for binomial notation works like \cn{frac}
% and has similar variants. Note that we do not use \cs{z@} in
@@ -632,10 +633,11 @@ Foreign command \@backslashchar#1;\MessageBreak
% like \cn{binom}, and so the \cs{z@} with the potentially
% problematic \qc{\@} character would become visible when writing one
% of those commands to a \fn{.toc} file.
+% \changes{v2.17n}{2022/04/08}{Make binom commands robust (gh/123)}
% \begin{macrocode}
\DeclareRobustCommand{\binom}{\genfrac()\z@{}}
-\newcommand{\dbinom}{\genfrac(){0pt}0}
-\newcommand{\tbinom}{\genfrac(){0pt}1}
+\DeclareRobustCommand{\dbinom}{\genfrac(){0pt}0}
+\DeclareRobustCommand{\tbinom}{\genfrac(){0pt}1}
% \end{macrocode}
%
% \begin{macro}{\genfrac}
@@ -938,8 +940,9 @@ Foreign command \@backslashchar#1;\MessageBreak
% an equation or piece of an equation. (Not including the equation
% number.) This isn't trivial for end-users to do it properly
% with \cs{fbox} so we provide a command for them.
+% \changes{v2.17n}{2022/04/08}{Make \cs{boxed} command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
+\DeclareRobustCommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
% \end{macrocode}
% \end{macro}
%
@@ -980,8 +983,9 @@ Foreign command \@backslashchar#1;\MessageBreak
% small space on the left, larger space on the right. The \qc{\:}
% character by itself is treated as a \cs{mathrel} i.e. large, equal
% spacing on both sides.
+% \changes{v2.17n}{2022/04/08}{Make \cs{colon} command robust (gh/123)}
% \begin{macrocode}
-\renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript
+\DeclareRobustCommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript
\mkern-\thinmuskip{:}\mskip6muplus1mu\relax}
% \end{macrocode}
% \end{macro}
@@ -1386,10 +1390,10 @@ Foreign command \@backslashchar#1;\MessageBreak
{{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}%
{{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}}
%
-\ams@newcommand{\iint}{\DOTSI\protect\MultiIntegral{2}}
-\ams@newcommand{\iiint}{\DOTSI\protect\MultiIntegral{3}}
-\ams@newcommand{\iiiint}{\DOTSI\protect\MultiIntegral{4}}
-\newcommand{\idotsint}{\DOTSI\protect\MultiIntegral{0}}
+\ams@newcommand{\iint}{\DOTSI\MultiIntegral{2}}
+\ams@newcommand{\iiint}{\DOTSI\MultiIntegral{3}}
+\ams@newcommand{\iiiint}{\DOTSI\MultiIntegral{4}}
+\newcommand{\idotsint}{\DOTSI\MultiIntegral{0}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1403,8 +1407,9 @@ Foreign command \@backslashchar#1;\MessageBreak
% the left-hand space a bit to make the subscript visually centered.
%
% \verb'#1' is the multiplicity.
+% \changes{v2.17n}{2022/04/08}{Make \cs{MultiIntegral} command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\MultiIntegral}[1]{%
+\DeclareRobustCommand{\MultiIntegral}[1]{%
\edef\ints@c{\noexpand\intop
\ifnum#1=\z@\noexpand\intdots@\else\noexpand\intkern@\fi
\ifnum#1>\tw@\noexpand\intop\noexpand\intkern@\fi
@@ -1582,11 +1587,12 @@ Foreign command \@backslashchar#1;\MessageBreak
% the \latex/ kernel; the macro |\n@space| is then superfluous (since
% it is only used once) and should be removed to avoid wasting hash
% table space unnecessarily.
+% \changes{v2.17n}{2022/04/08}{Make biggg commands robust (gh/123)}
% \begin{macrocode}
-\renewcommand{\big}{\bBigg@\@ne}
-\renewcommand{\Big}{\bBigg@{1.5}}
-\renewcommand{\bigg}{\bBigg@\tw@}
-\renewcommand{\Bigg}{\bBigg@{2.5}}
+\DeclareRobustCommand{\big}{\bBigg@\@ne}
+\DeclareRobustCommand{\Big}{\bBigg@{1.5}}
+\DeclareRobustCommand{\bigg}{\bBigg@\tw@}
+\DeclareRobustCommand{\Bigg}{\bBigg@{2.5}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1666,6 +1672,17 @@ Foreign command \@backslashchar#1;\MessageBreak
{\mathop{\kern\z@#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
\hbox{\,\normalfont....}\vss}}}}
% \end{macrocode}
+%
+% We make the commands robust only at the end of the preamble as
+% \pkg{amsmath} interacts with \pkg{stix} (which should also move
+% to robust commands).
+% \changes{v2.17n}{2022/04/08}{Make dddot commands robust (gh/123)}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \MakeRobust\dddot
+ \MakeRobust\ddddot
+ }
+% \end{macrocode}
% \end{macro}
% \end{macro}
%
@@ -2087,14 +2104,16 @@ Foreign command \@backslashchar#1;\MessageBreak
% \begin{macro}{\mod}
% The commands \cn{bmod}, \cn{pmod}, \cn{pod}, \cn{mod} aren't
% currently robust. [mjd, 1994/09/05]
+% Now they are
+% \changes{v2.17n}{2022/04/08}{Make mod commands robust (gh/123)}
% \begin{macrocode}
-\renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
+\DeclareRobustCommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
{\operator@font mod}\penalty900
\mkern5mu\nonscript\mskip-\medmuskip}
-\newcommand{\pod}[1]{\allowbreak
+\DeclareRobustCommand{\pod}[1]{\allowbreak
\if@display\mkern18mu\else\mkern8mu\fi(#1)}
-\renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
-\newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu
+\DeclareRobustCommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
+\DeclareRobustCommand{\mod}[1]{\allowbreak\if@display\mkern18mu
\else\mkern12mu\fi{\operator@font mod}\,\,#1}
% \end{macrocode}
% \end{macro}
@@ -2109,8 +2128,9 @@ Foreign command \@backslashchar#1;\MessageBreak
% fraction rules to line up. The \cs{strut} keeps the numerator of
% a subsidiary cfrac from coming too close to the fraction rule above
% it.
+% \changes{v2.17n}{2022/04/08}{Make \cs{cfrac} command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\cfrac}[3][c]{{\displaystyle\frac{%
+\DeclareRobustCommand{\cfrac}[3][c]{{\displaystyle\frac{%
\strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}{#3}}%
\kern-\nulldelimiterspace}
% \end{macrocode}
@@ -2123,13 +2143,15 @@ Foreign command \@backslashchar#1;\MessageBreak
% naturally accept limits. \cs{binrel@@} uses information collected
% by \cs{binrel@} to make the resulting construction be of type
% mathrel or mathbin if the base symbol is either of those types.
+% \changes{v2.17n}{2022/04/08}{Make \cs{overset}, \cs{underset} and
+% \cs{overunderset} commands robust (gh/123)}
% \begin{macrocode}
-\newcommand{\overset}[2]{\binrel@{#2}%
+\DeclareRobustCommand{\overset}[2]{\binrel@{#2}%
\binrel@@{\mathop{\kern\z@#2}\limits^{#1}}}
% \end{macrocode}
%
% \begin{macrocode}
-\newcommand{\underset}[2]{\binrel@{#2}%
+\DeclareRobustCommand{\underset}[2]{\binrel@{#2}%
\binrel@@{\mathop{\kern\z@#2}\limits_{#1}}}
% \end{macrocode}
% \end{macro}
@@ -2141,7 +2163,7 @@ Foreign command \@backslashchar#1;\MessageBreak
% something that is sometimes needed.
% \changes{v2.17c}{2019/04/01}{New command \cs{overunderset}}
% \begin{macrocode}
-\newcommand{\overunderset}[3]{\binrel@{#3}%
+\DeclareRobustCommand{\overunderset}[3]{\binrel@{#3}%
\binrel@@{\mathop{\kern\z@#3}\limits^{#1}_{#2}}}
% \end{macrocode}
% \end{macro}
@@ -2157,8 +2179,9 @@ Foreign command \@backslashchar#1;\MessageBreak
% have to read and measure the top and bottom limits and use
% mathchoice to always get the right mathstyle for each piece,
% etc., etc.
+% \changes{v2.17n}{2022/04/08}{Make \cs{sideset} command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\sideset}[3]{%
+\DeclareRobustCommand{\sideset}[3]{%
\@mathmeasure\z@\displaystyle{#3}%
% \end{macrocode}
% Use a global box assignment here since the depth override is
@@ -2182,9 +2205,10 @@ Foreign command \@backslashchar#1;\MessageBreak
% denoting the part of the formula to be smashed.
% \changes{v2.17b}{2018/12/01}{Start LR-mode for \cs{smash}
% if necessary (github/49)}
+% \changes{v2.17n}{2022/04/08}{Make \cs{smash} command robust (gh/123)}
% \begin{macrocode}
\ifx\leavevmode@ifvmode\@undefined
-\renewcommand{\smash}[1][tb]{%
+\DeclareRobustCommand{\smash}[1][tb]{%
\def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}%
\edef\finsm@sh{\csname mb@#1\endcsname\z@\z@\box\z@}%
\ifmmode \@xp\mathpalette\@xp\mathsm@sh
@@ -2192,7 +2216,7 @@ Foreign command \@backslashchar#1;\MessageBreak
\fi
}
\else
-\renewcommand{\smash}[1][tb]{%
+\DeclareRobustCommand{\smash}[1][tb]{%
\def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}%
\edef\finsm@sh{\csname mb@#1\endcsname\z@\z@ \leavevmode@ifvmode\box\z@}%
\ifmmode \@xp\mathpalette\@xp\mathsm@sh
@@ -2240,9 +2264,10 @@ Foreign command \@backslashchar#1;\MessageBreak
%
% \begin{macro}{\relbar}
% \begin{macro}{\Relbar}
+% \changes{v2.17n}{2022/04/08}{Make commands robust (gh/123)}
% \begin{macrocode}
-\ams@def\relbar{\mathrel{\mathpalette\mathsm@sh\std@minus}}
-\ams@def\Relbar{\mathrel\std@equal}
+\ams@DeclareRobustCommand\relbar{\mathrel{\mathpalette\mathsm@sh\std@minus}}
+\ams@DeclareRobustCommand\Relbar{\mathrel\std@equal}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2272,6 +2297,17 @@ Foreign command \@backslashchar#1;\MessageBreak
\ams@newcommand{\overleftrightarrow}{%
\mathpalette{\overarrow@\leftrightarrowfill@}}
% \end{macrocode}
+% Again we delay making commands robut for \pkg{stix}.
+% \changes{v2.17n}{2022/04/08}{Make commands robust (gh/123)}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \expandafter\let\csname overleftarrow \endcsname\@undefined
+ \expandafter\let\csname overrightarrow \endcsname\@undefined
+ \MakeRobust\overrightarrow
+ \MakeRobust\overleftarrow
+ \MakeRobust\overleftrightarrow
+ }
+% \end{macrocode}
%
% \begin{macrocode}
\def\underarrow@#1#2#3{%
@@ -2285,8 +2321,19 @@ Foreign command \@backslashchar#1;\MessageBreak
\mathpalette{\underarrow@\leftrightarrowfill@}}
% \end{macrocode}
%
+%
+% \changes{v2.17n}{2022/04/08}{Make commands robust (gh/123)}
% \begin{macrocode}
-%\newcommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}}
+\AtBeginDocument{%
+ \MakeRobust\underrightarrow
+ \MakeRobust\underleftarrow
+ \MakeRobust\underleftrightarrow
+ }
+% \end{macrocode}
+%
+% \changes{v2.17n}{2022/04/08}{Make commands robust (gh/123)}
+% \begin{macrocode}
+%\DeclareRobustCommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}}
\def\ext@arrow#1#2#3#4#5#6#7{%
\mathrel{\mathop{%
% \end{macrocode}
@@ -2315,8 +2362,8 @@ Foreign command \@backslashchar#1;\MessageBreak
% sub/superscripts. These commands are robust because they take an
% optional argument.
% \begin{macrocode}
-\newcommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}}
-\newcommand{\xleftarrow}[2][]{\ext@arrow 3095\leftarrowfill@{#1}{#2}}
+\DeclareRobustCommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}}
+\DeclareRobustCommand{\xleftarrow}[2][]{\ext@arrow 3095\leftarrowfill@{#1}{#2}}
% \end{macrocode}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2406,8 +2453,9 @@ Foreign command \@backslashchar#1;\MessageBreak
% \begin{macro}{\substack}
% The \cn{substack} command is just an abbreviation for the
% most common use of \env{subarray}.
+% \changes{v2.17n}{2022/04/08}{Make command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\substack}[1]{\subarray{c}#1\endsubarray}
+\DeclareRobustCommand{\substack}[1]{\subarray{c}#1\endsubarray}
% \end{macrocode}
% \end{macro}
%
@@ -2630,8 +2678,9 @@ ill-advised in LaTeX.%
% numbered within sections. The \LaTeX{} kernel contains a similar command
% \cs{counterwithin} (with a slightly extended syntax) that can be used
% as a drop-in replacement for \cs{numberwithin}.
+% \changes{v2.17n}{2022/04/08}{Make command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\numberwithin}[3][\arabic]{%
+\DeclareRobustCommand{\numberwithin}[3][\arabic]{%
\@ifundefined{c@#2}{\@nocounterr{#2}}{%
\@ifundefined{c@#3}{\@nocnterr{#3}}{%
\@addtoreset{#2}{#3}%
@@ -2645,8 +2694,9 @@ ill-advised in LaTeX.%
% To make references to equation numbers easier, we provide
% \cn{eqref}. We almost don't need \cn{textup}, except that
% \cs{tagform@} doesn't supply the italic correction.
+% \changes{v2.17n}{2022/04/08}{Make command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\eqref}[1]{\textup{\tagform@{\ref{#1}}}}
+\DeclareRobustCommand{\eqref}[1]{\textup{\tagform@{\ref{#1}}}}
% \end{macrocode}
% \end{macro}
%
@@ -2685,8 +2735,9 @@ ill-advised in LaTeX.%
% The \cn{allowdisplaybreaks} command. Since this is intended for use
% outside displayed formulas (typically in the preamble), it does not
% need to use \cs{new@ifnextchar}.
+% \changes{v2.17n}{2022/04/08}{Make command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\allowdisplaybreaks}[1][4]{%
+\DeclareRobustCommand{\allowdisplaybreaks}[1][4]{%
\interdisplaylinepenalty\getdsp@pen{#1}\relax
}
% \end{macrocode}
@@ -2709,8 +2760,9 @@ ill-advised in LaTeX.%
% \begin{macro}{\dspbrk@context}
% \begin{macro}{\nogood@displaybreak}
% For breaks in a certain row of a alignment.
+% \changes{v2.17n}{2022/04/08}{Make command robust (gh/123)}
% \begin{macrocode}
-\newcommand{\displaybreak}{\new@ifnextchar[\dspbrk@{\dspbrk@[4]}}
+\DeclareRobustCommand{\displaybreak}{\new@ifnextchar[\dspbrk@{\dspbrk@[4]}}
\chardef\dspbrk@context=\sixt@@n
% \end{macrocode}
%
@@ -6130,15 +6182,16 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}%
% in his \fn{amstex.doc} Spivak indicates those commands should never
% be used on a first or last line. Perhaps better to leave the
% question open unless/until real-life examples turn up.
+% \changes{v2.17m}{2022/02/03}{Make \cs{shoveright} robust (if def is not trival)}
% \begin{macrocode}
\iftagsleft@
- \def\shoveright#1{%
+ \protected\def\shoveright#1{%
#1%
\hfilneg
\hskip\multlinegap
}
\else
- \def\shoveright#1{%
+ \protected\def\shoveright#1{%
#1%
\hfilneg
\iftag@
@@ -6153,12 +6206,14 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}%
\fi
}
\fi
-
+% \end{macrocode}
+% \changes{v2.17m}{2022/02/03}{Make \cs{shoveleft} robust (if def is not trival)}
+% \begin{macrocode}
\if@fleqn
\def\shoveleft#1{#1}%
\else
\iftagsleft@
- \def\shoveleft#1{%
+ \protected\def\shoveleft#1{%
\setboxz@h{$\m@th\displaystyle{}#1$}%
\setbox\@ne\hbox{$\m@th\displaystyle#1$}%
\hfilneg
@@ -6173,17 +6228,23 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}%
\hskip\multlinegap
\fi
\hskip.5\wd\@ne
- \hskip-.5\wdz@
+% \end{macrocode}
+% \changes{v2.17m}{2022/02/03}{Added missing \cs{relax} for (gh/716)}
+% \begin{macrocode}
+ \hskip-.5\wdz@ \relax
#1%
}
\else
- \def\shoveleft#1{%
+ \protected\def\shoveleft#1{%
\setboxz@h{$\m@th\displaystyle{}#1$}%
\setbox\@ne\hbox{$\m@th\displaystyle#1$}%
\hfilneg
\hskip\multlinegap
\hskip.5\wd\@ne
- \hskip-.5\wdz@
+% \end{macrocode}
+% \changes{v2.17m}{2022/02/03}{Added missing \cs{relax} for (gh/716)}
+% \begin{macrocode}
+ \hskip-.5\wdz@ \relax
#1%
}
\fi
diff --git a/macros/latex/required/amsmath/amsmath.ins b/macros/latex/required/amsmath/amsmath.ins
index 1bb73101bb..82876ffc5d 100644
--- a/macros/latex/required/amsmath/amsmath.ins
+++ b/macros/latex/required/amsmath/amsmath.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999, 2000, 2013 American Mathematical Society.
-Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
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/latex/required/amsmath/amsmath.pdf b/macros/latex/required/amsmath/amsmath.pdf
index 1212097e79..806926ebc0 100644
--- a/macros/latex/required/amsmath/amsmath.pdf
+++ b/macros/latex/required/amsmath/amsmath.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/amsopn.dtx b/macros/latex/required/amsmath/amsopn.dtx
index 03df1a116b..110a5fa8be 100644
--- a/macros/latex/required/amsmath/amsopn.dtx
+++ b/macros/latex/required/amsmath/amsopn.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -52,13 +52,13 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% similar to the standard function names \cn{sin}, \cn{lim},
% \cn{max}, etc.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% Standard file identification.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
[1994/12/01]% LaTeX date must December 1994 or later
-\ProvidesPackage{amsopn}[2021/08/26 v2.02 operator names]
+\ProvidesPackage{amsopn}[2022/04/08 v2.04 operator names]
% \end{macrocode}
%
% What \cs{nolimits@} does is keep a \cn{limits} typed by the user
@@ -151,41 +151,42 @@ Bug reports can be opened (category \texttt{#1}) at\\%
\@onlypreamble\@declmathop
% \end{macrocode}
%
+% \changes{v2.04}{2022/04/08}{Make operators \cs{protected} (gh/123)}
% \begin{macrocode}
-\def\arccos{\qopname\relax o{arccos}}
-\def\arcsin{\qopname\relax o{arcsin}}
-\def\arctan{\qopname\relax o{arctan}}
-\def\arg{\qopname\relax o{arg}}
-\def\cos{\qopname\relax o{cos}}
-\def\cosh{\qopname\relax o{cosh}}
-\def\cot{\qopname\relax o{cot}}
-\def\coth{\qopname\relax o{coth}}
-\def\csc{\qopname\relax o{csc}}
-\def\deg{\qopname\relax o{deg}}
-\def\det{\qopname\relax m{det}}
-\def\dim{\qopname\relax o{dim}}
-\def\exp{\qopname\relax o{exp}}
-\def\gcd{\qopname\relax m{gcd}}
-\def\hom{\qopname\relax o{hom}}
-\def\inf{\qopname\relax m{inf}}
-\def\injlim{\qopname\relax m{inj\,lim}}
-\def\ker{\qopname\relax o{ker}}
-\def\lg{\qopname\relax o{lg}}
-\def\lim{\qopname\relax m{lim}}
-\def\liminf{\qopname\relax m{lim\,inf}}
-\def\limsup{\qopname\relax m{lim\,sup}}
-\def\ln{\qopname\relax o{ln}}
-\def\log{\qopname\relax o{log}}
-\def\max{\qopname\relax m{max}}
-\def\min{\qopname\relax m{min}}
-\def\Pr{\qopname\relax m{Pr}}
-\def\projlim{\qopname\relax m{proj\,lim}}
-\def\sec{\qopname\relax o{sec}}
-\def\sin{\qopname\relax o{sin}}
-\def\sinh{\qopname\relax o{sinh}}
-\def\sup{\qopname\relax m{sup}}
-\def\tan{\qopname\relax o{tan}}
-\def\tanh{\qopname\relax o{tanh}}
+\protected\def\arccos{\qopname\relax o{arccos}}
+\protected\def\arcsin{\qopname\relax o{arcsin}}
+\protected\def\arctan{\qopname\relax o{arctan}}
+\protected\def\arg{\qopname\relax o{arg}}
+\protected\def\cos{\qopname\relax o{cos}}
+\protected\def\cosh{\qopname\relax o{cosh}}
+\protected\def\cot{\qopname\relax o{cot}}
+\protected\def\coth{\qopname\relax o{coth}}
+\protected\def\csc{\qopname\relax o{csc}}
+\protected\def\deg{\qopname\relax o{deg}}
+\protected\def\det{\qopname\relax m{det}}
+\protected\def\dim{\qopname\relax o{dim}}
+\protected\def\exp{\qopname\relax o{exp}}
+\protected\def\gcd{\qopname\relax m{gcd}}
+\protected\def\hom{\qopname\relax o{hom}}
+\protected\def\inf{\qopname\relax m{inf}}
+\protected\def\injlim{\qopname\relax m{inj\,lim}}
+\protected\def\ker{\qopname\relax o{ker}}
+\protected\def\lg{\qopname\relax o{lg}}
+\protected\def\lim{\qopname\relax m{lim}}
+\protected\def\liminf{\qopname\relax m{lim\,inf}}
+\protected\def\limsup{\qopname\relax m{lim\,sup}}
+\protected\def\ln{\qopname\relax o{ln}}
+\protected\def\log{\qopname\relax o{log}}
+\protected\def\max{\qopname\relax m{max}}
+\protected\def\min{\qopname\relax m{min}}
+\protected\def\Pr{\qopname\relax m{Pr}}
+\protected\def\projlim{\qopname\relax m{proj\,lim}}
+\protected\def\sec{\qopname\relax o{sec}}
+\protected\def\sin{\qopname\relax o{sin}}
+\protected\def\sinh{\qopname\relax o{sinh}}
+\protected\def\sup{\qopname\relax m{sup}}
+\protected\def\tan{\qopname\relax o{tan}}
+\protected\def\tanh{\qopname\relax o{tanh}}
% \end{macrocode}
%
% \begin{macro}{\operator@font}
@@ -198,8 +199,16 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% more accessible so that users can call this font for use in special
% constructs that are not ordinary operator names but conceptually
% related.
+%
+% \cs{operator@font} is also declared by the \LaTeX{} kernel (for
+% at least 14 years), thus defining it here effectively means
+% ``resetting it'' to the kernel value, which is counterproductive
+% in situations where the user (or a class) has altered its
+% definition and at a later point \pkg{amsopn} got added.
+% \changes{v2.03}{2022/01/20}{Do not reset \cs{operator@font} it is
+% already defined in the LaTeX kernel (gh/734)}
% \begin{macrocode}
-\def\operator@font{\mathgroup\symoperators}
+%\def\operator@font{\mathgroup\symoperators} % commented out in 2.03
\def\operatorfont{\operator@font}
% \end{macrocode}
% \end{macro}
@@ -218,23 +227,24 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% vertical spacing may not be optimal in script and scriptscript
% sizes. Unfortunately \tex/ provides no easy way to do math mode
% vertical spacing that varies with current math style like mu units.
+% \changes{v2.04}{2022/04/08}{Make operators \cs{protected} (gh/123)}
% \begin{macrocode}
-\def\varlim@#1#2{%
+\protected\def\varlim@#1#2{%
\vtop{\m@th\ialign{##\cr
\hfil$#1\operator@font lim$\hfil\cr
\noalign{\nointerlineskip\kern1.5\ex@}#2\cr
\noalign{\nointerlineskip\kern-\ex@}\cr}}%
}
-\def\varinjlim{%
+\protected\def\varinjlim{%
\mathop{\mathpalette\varlim@{\rightarrowfill@\textstyle}}\nmlimits@
}
-\def\varprojlim{%
+\protected\def\varprojlim{%
\mathop{\mathpalette\varlim@{\leftarrowfill@\textstyle}}\nmlimits@
}
-\def\varliminf{\mathop{\mathpalette\varliminf@{}}\nmlimits@}
+\protected\def\varliminf{\mathop{\mathpalette\varliminf@{}}\nmlimits@}
\def\varliminf@#1{\@@underline{\vrule\@depth.2\ex@\@width\z@
\hbox{$#1\m@th\operator@font lim$}}}
-\def\varlimsup{\mathop{\mathpalette\varlimsup@{}}\nmlimits@}
+\protected\def\varlimsup{\mathop{\mathpalette\varlimsup@{}}\nmlimits@}
\def\varlimsup@#1{\@@overline{\hbox{$#1\m@th\operator@font lim$}}}
% \end{macrocode}
%
diff --git a/macros/latex/required/amsmath/amsopn.ins b/macros/latex/required/amsmath/amsopn.ins
index 72c649c340..8a57404c1e 100644
--- a/macros/latex/required/amsmath/amsopn.ins
+++ b/macros/latex/required/amsmath/amsopn.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
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/latex/required/amsmath/amsopn.pdf b/macros/latex/required/amsmath/amsopn.pdf
index 0c6ae29bc2..0c1f60fd38 100644
--- a/macros/latex/required/amsmath/amsopn.pdf
+++ b/macros/latex/required/amsmath/amsopn.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/amstext.dtx b/macros/latex/required/amsmath/amstext.dtx
index 88cc837f03..7498040214 100644
--- a/macros/latex/required/amsmath/amstext.dtx
+++ b/macros/latex/required/amsmath/amstext.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -72,7 +72,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% macro called \cs{mathhexbox} so that commands like \cn{dag}
% or \cn{P} will change sizes if used in math subscripts.
%
-% \StopEventually{}
+% \MaybeStop{}
% Package information.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
diff --git a/macros/latex/required/amsmath/amstext.ins b/macros/latex/required/amsmath/amstext.ins
index 5578a7e947..3ba3000eb8 100644
--- a/macros/latex/required/amsmath/amstext.ins
+++ b/macros/latex/required/amsmath/amstext.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
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/latex/required/amsmath/amstext.pdf b/macros/latex/required/amsmath/amstext.pdf
index afaa124a10..bc92eb847d 100644
--- a/macros/latex/required/amsmath/amstext.pdf
+++ b/macros/latex/required/amsmath/amstext.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/amsxtra.dtx b/macros/latex/required/amsmath/amsxtra.dtx
index aaa5fd1a2d..c2bc4bbd26 100644
--- a/macros/latex/required/amsmath/amsxtra.dtx
+++ b/macros/latex/required/amsmath/amsxtra.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
%
% Copyright (C) 1995, 1999 American Mathematical Society.
-% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -53,7 +53,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% documents using the \pkg{amstex} package these commands are just
% wasted overhead.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
\ProvidesPackage{amsxtra}[1999/11/15 v1.2c AMS extra commands]
diff --git a/macros/latex/required/amsmath/amsxtra.ins b/macros/latex/required/amsmath/amsxtra.ins
index 7eca6e065a..70f50c6bcb 100644
--- a/macros/latex/required/amsmath/amsxtra.ins
+++ b/macros/latex/required/amsmath/amsxtra.ins
@@ -1,6 +1,6 @@
%%
%% Copyright (C) 2010 American Mathematical Society.
-%% Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+%% Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\preamble
Copyright (C) 1995, 1999 American Mathematical Society.
-Copyright (C) 2016-2021 LaTeX Project and American Mathematical Society.
+Copyright (C) 2016-2022 LaTeX Project and American Mathematical Society.
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/latex/required/amsmath/amsxtra.pdf b/macros/latex/required/amsmath/amsxtra.pdf
index 7c694e14b2..6074bb822e 100644
--- a/macros/latex/required/amsmath/amsxtra.pdf
+++ b/macros/latex/required/amsmath/amsxtra.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/changes.txt b/macros/latex/required/amsmath/changes.txt
index 3f3c36bf79..83d6c6e3a1 100644
--- a/macros/latex/required/amsmath/changes.txt
+++ b/macros/latex/required/amsmath/changes.txt
@@ -3,6 +3,35 @@ All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2022-06-01 Release
+#########################
+
+2022-04-08 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * amsmath.dtx:
+ Make various math commands robust to match the LaTeX kernel (gh/123)
+
+ * amsopn.dtx:
+ Make various operators \protected (gh/123)
+
+
+2022-02-03 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * amsmath.dtx (subsection{The \env{multline} environment}):
+ Added missing \relax for (gh/716)
+ Also make \shoveleft and \shoveright robust (part of gh/123)
+
+2022-01-20 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * amsopn.dtx:
+ Do not define/reset \operator@font; it is already defined in
+ the LaTeX kernel (gh/734)
+
+2021-11-18 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * All *.dtx: Replaced \StopEventually by \MaybeStop
+
+#########################
# 2021-11-15 Release
#########################
diff --git a/macros/latex/required/amsmath/subeqn.pdf b/macros/latex/required/amsmath/subeqn.pdf
index c016df16b8..28c721c6f2 100644
--- a/macros/latex/required/amsmath/subeqn.pdf
+++ b/macros/latex/required/amsmath/subeqn.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/technote.pdf b/macros/latex/required/amsmath/technote.pdf
index 7027cfd8df..6a8c594364 100644
--- a/macros/latex/required/amsmath/technote.pdf
+++ b/macros/latex/required/amsmath/technote.pdf
Binary files differ
diff --git a/macros/latex/required/amsmath/testmath.pdf b/macros/latex/required/amsmath/testmath.pdf
index 7fc3601faf..8aef17f9ef 100644
--- a/macros/latex/required/amsmath/testmath.pdf
+++ b/macros/latex/required/amsmath/testmath.pdf
Binary files differ
diff --git a/macros/latex/required/firstaid/changes.txt b/macros/latex/required/firstaid/changes.txt
index 6f8268c6b6..a3626f83a4 100644
--- a/macros/latex/required/firstaid/changes.txt
+++ b/macros/latex/required/firstaid/changes.txt
@@ -1,3 +1,12 @@
+2022-02-20 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * latex2e-first-aid-for-external-files.dtx:
+ Fixes for biditools because taken out as package is updated
+
+2021-11-18 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * All *.dtx: Replaced \StopEventually by \MaybeStop
+
2021-11-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
* latex2e-first-aid-for-external-files.dtx:
diff --git a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx
index fb8d340137..1e6e286a73 100644
--- a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx
+++ b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: latex2e-first-aid-for-external-files.dtx (C) Copyright 2020-2021
+%% File: latex2e-first-aid-for-external-files.dtx (C) Copyright 2020-2022
%%
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
@@ -99,7 +99,7 @@
% release we have to make and distribute also a matching
% development release.
%
-% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
%
%
% \section{The Implementation}
@@ -111,8 +111,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-\def\LaTeXFirstAidDate{2021/11/11}
-\def\LaTeXFirstAidVersion{v1.0q}
+\def\LaTeXFirstAidDate{2022/02/20}
+\def\LaTeXFirstAidVersion{v1.0r}
% \end{macrocode}
%
% \begin{macrocode}
@@ -311,11 +311,12 @@
%<*kernel>
% \end{macrocode}
%
+% Bidi is now ar a new version: patches are no longer needed.
% \begin{macrocode}
-\AddToHook{file/biditools.sty/after}[firstaid]{%
- \FirstAidNeededT{biditools}{sty}%
- {2020/05/13 v2 Programming tools for bidi package}%
- {%
+%\AddToHook{file/biditools.sty/after}[firstaid]{%
+% \FirstAidNeededT{biditools}{sty}%
+% {2020/05/13 v2 Programming tools for bidi package}%
+% {%
% \end{macrocode}
% \pkg{bidi} adds some code to the beginning of \cs{document} which
% contains \cs{endgroup} and \cs{begingroup} which is no longer
@@ -324,20 +325,20 @@
% Patching \cs{document} using \cs{bidi@patchcmd} doesn't work so
% we take the extra groups out by hand:
% \begin{macrocode}
- \def\firstaid@bidi@document@patch
- \endgroup#1\begingroup#2\firstaid@bidi@document@patch
- {\unexpanded{#1#2}}%
- \edef\document{\expandafter\firstaid@bidi@document@patch\document
- \firstaid@bidi@document@patch}%
+% \def\firstaid@bidi@document@patch
+% \endgroup#1\begingroup#2\firstaid@bidi@document@patch
+% {\unexpanded{#1#2}}%
+% \edef\document{\expandafter\firstaid@bidi@document@patch\document
+% \firstaid@bidi@document@patch}%
% \end{macrocode}
% There are also some patches into \cs{enddocument}, some continue
% to go in but one fails, so we add that now into the right place.
% \begin{macrocode}
- \AddToHook{enddocument/info}%
- {\let\bidi@AfterEndDocumentCheckLabelsRerun\@firstofone
- \bidi@afterenddocumentchecklabelsrerunhook}%
- }%
-}
+% \AddToHook{enddocument/info}%
+% {\let\bidi@AfterEndDocumentCheckLabelsRerun\@firstofone
+% \bidi@afterenddocumentchecklabelsrerunhook}%
+% }%
+%}
% \end{macrocode}
%
%
@@ -559,6 +560,30 @@
}
% \end{macrocode}
%
+% \subsection{The \pkg{german} class first aid}
+%
+% Handling of \cs{protected} UTF-8
+% \begin{macrocode}
+\AddToHook{file/german.sty/after}[firstaid]{%
+ \FirstAidNeededT{german}{sty}{1998/07/08 v2.5e Support for writing german texts (br)}
+ {%
+\let\grmn@active@dq@\@active@dq
+\def\@active@dq{\protect\grmn@active@dq@}%
+\germanTeX
+}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AddToHook{file/ngerman.sty/after}[firstaid]{%
+ \FirstAidNeededT{ngerman}{sty}{1998/07/08 v2.5e Support for writing german texts (br)}
+ {%
+\let\grmn@active@dq@\@active@dq
+\def\@active@dq{\protect\grmn@active@dq@}%
+\ngermanTeX
+}%
+}
+% \end{macrocode}
%
%
%
diff --git a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf
index d505fa379b..ef46525b24 100644
--- a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf
+++ b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/README.md b/macros/latex/required/graphics/README.md
index e58a421c93..5ccff78a3b 100644
--- a/macros/latex/required/graphics/README.md
+++ b/macros/latex/required/graphics/README.md
@@ -1,7 +1,7 @@
The LaTeX `graphics` bundle
===========================
-Release 2021-12-14
+Release 2022-06-01
Overview
--------
@@ -61,4 +61,4 @@ of the package.
-----
-<p>Copyright (C) 1993-2021 The LaTeX Project <br />
+<p>Copyright (C) 1993-2022 The LaTeX Project <br />
diff --git a/macros/latex/required/graphics/changes.txt b/macros/latex/required/graphics/changes.txt
index eb95865d2f..616f56230f 100644
--- a/macros/latex/required/graphics/changes.txt
+++ b/macros/latex/required/graphics/changes.txt
@@ -9,6 +9,26 @@ All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2022-06-01 Release
+#########################
+
+2022-03-10 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * graphics.dtx:
+ Use \set@curr@file@nosearch to avoid premature inclusion of path
+ from \cs{graphicspath} (gh/776).
+
+2022-01-06 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * mathcolor.dtx:
+ Support \mathcolor to correctly color parts of formulas without
+ spacing problems. This command is *only* supported in math mode.
+
+2021-12-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * color.dtx: Remove stray spaces after change for xcolor/gh/10}
+
+#########################
# 2021-12-14 Release
#########################
diff --git a/macros/latex/required/graphics/color.dtx b/macros/latex/required/graphics/color.dtx
index b4b0ad1091..cf3a7efbcf 100644
--- a/macros/latex/required/graphics/color.dtx
+++ b/macros/latex/required/graphics/color.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% color.dtx Copyright (C) 1994--1999 David Carlisle
-%% Copyright (C) 2005-2021
+%% Copyright (C) 2005-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -21,7 +21,7 @@
%<driver> \ProvidesFile{color.drv}
% \fi
% \ProvidesFile{color.dtx}
- [2021/12/07 v1.3c Standard LaTeX Color (DPC)]
+ [2022/01/06 v1.3d Standard LaTeX Color (DPC)]
%
% \iffalse
%<*driver>
@@ -56,7 +56,7 @@
% document \emph{Packages in the `graphics' bundle} in the file
% \texttt{grfguide.tex}.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{Options}
@@ -826,6 +826,13 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Providing \cs{mathcolor}}
+%
+% This is shared coded between different packages, so external.
+%
+% \begin{macrocode}
+\input{mathcolor.ltx}
+% \end{macrocode}
%
% \section{Extra Groups}
% Turning on extra groups in the standard \LaTeX\ commands, so that
diff --git a/macros/latex/required/graphics/color.pdf b/macros/latex/required/graphics/color.pdf
index 540a4f2808..b3cca89de7 100644
--- a/macros/latex/required/graphics/color.pdf
+++ b/macros/latex/required/graphics/color.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/drivers.dtx b/macros/latex/required/graphics/drivers.dtx
index 6704ad11c6..e1c19e0296 100644
--- a/macros/latex/required/graphics/drivers.dtx
+++ b/macros/latex/required/graphics/drivers.dtx
@@ -3,7 +3,7 @@
%
%% drivers.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
%% Copyright (C) 1995 1996 1997 1998 1999 David Carlisle
-%% Copyright (C) 2000-2021
+%% Copyright (C) 2000-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -77,7 +77,7 @@
%
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{Colour}
diff --git a/macros/latex/required/graphics/drivers.pdf b/macros/latex/required/graphics/drivers.pdf
index 0f83884b10..a9bfdac464 100644
--- a/macros/latex/required/graphics/drivers.pdf
+++ b/macros/latex/required/graphics/drivers.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/epsfig.dtx b/macros/latex/required/graphics/epsfig.dtx
index a34aa6842e..b8927f2da5 100644
--- a/macros/latex/required/graphics/epsfig.dtx
+++ b/macros/latex/required/graphics/epsfig.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% epsfig.dtx Copyright (C) 1994-1996 1999 Sebastian Rahtz
-%% Copyright (C) 2000-2021
+%% Copyright (C) 2000-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -41,7 +41,7 @@
% \maketitle
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Preface}
% \begin{macrocode}
diff --git a/macros/latex/required/graphics/epsfig.pdf b/macros/latex/required/graphics/epsfig.pdf
index f8af4c38ae..b72f727ebb 100644
--- a/macros/latex/required/graphics/epsfig.pdf
+++ b/macros/latex/required/graphics/epsfig.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/graphics.dtx b/macros/latex/required/graphics/graphics.dtx
index cec35559ef..92b3c8f335 100644
--- a/macros/latex/required/graphics/graphics.dtx
+++ b/macros/latex/required/graphics/graphics.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% graphics.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
-%% Copyright (C) 1995-2021
+%% Copyright (C) 1995-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -27,7 +27,7 @@
%<driver> \ProvidesFile{graphics.drv}
% \fi
% \ProvidesFile{graphics.dtx}
- [2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR)]
+ [2022/03/10 v1.4e Standard LaTeX Graphics (DPC,SPQR)]
%
% \iffalse
%<*driver>
@@ -276,7 +276,7 @@
% and |\rotatebox| commands that some people may prefer. It is provided
% by the accompanying |graphicx| package.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Graphics Kernel Functions}
%
@@ -1053,33 +1053,39 @@
% \edef{macrocode}
% \end{macro}
%
-% \begin{macro}{\set@curr@file}
+% \begin{macro}{\Gin@set@curr@file}
% \begin{macro}{\quote@name}
% \changes{v1.3c}{2019/10/08}
% {Definitions added for old formats}
+% \changes{v1.4e}{2022/03/10}
+% {Use \cs{Gin@set@curr@file}, and define it appropriately}
+% We have to cope with older formats (rollback as far as 2019-10-01)
+% and Plain. Define a minimal \cs{Gin@set@curr@file} first:
% \begin{macrocode}
-\def\Gin@temp#1{%
- \begingroup
- \escapechar\m@ne
- \xdef\@curr@file{\expandafter\string\csname #1\endcsname}%
- \endgroup
-}
-\ifx\set@curr@file\@Gin@temp
- \let\set@curr@file\@undefined
-\fi
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ifx\set@curr@file\@undefined
-\def\set@curr@file#1{%
+\def\Gin@set@curr@file#1{%
\begingroup
\escapechar\m@ne
\xdef\@curr@file{\expandafter\string\csname\@firstofone#1\@empty\endcsname}%
- \endgroup
-}
-\def\quote@name#1{"\quote@@name#1\@gobble""}
-\def\quote@@name#1"{#1\quote@@name}
-\def\unquote@name#1{\quote@@name#1\@gobble"}
+ \endgroup}
+% \end{macrocode}
+% Then, if \cs{set@curr@file@nosearch} is undefined, we're before
+% 2022-06-01, and if \cs{set@curr@file} is undefined, we're before
+% 2019-10-01 (aka Plain, as far as these tests are concerned). Make
+% \cs{Gin@set@curr@file} be a copy of the most recent macro:
+% \cs{set@curr@file@nosearch} if it exists, and \cs{set@curr@file}
+% otherwise. If neither exist, we also need to define
+% \cs{quote@name} et~al.
+% \begin{macrocode}
+\ifx\set@curr@file@nosearch\@undefined
+ \ifx\set@curr@file\@undefined
+ \def\quote@name#1{"\quote@@name#1\@gobble""}
+ \def\quote@@name#1"{#1\quote@@name}
+ \def\unquote@name#1{\quote@@name#1\@gobble"}
+ \else
+ \let\Gin@set@curr@file\set@curr@file
+ \fi
+\else
+ \let\Gin@set@curr@file\set@curr@file@nosearch
\fi
% \end{macrocode}
% \end{macro}
@@ -1114,8 +1120,11 @@
%
% \changes{v1.3d}{2019/11/01}
% {\cs{curr@name} now unquoted}
+% \changes{v1.4e}{2022/03/10}
+% {Use \cs{set@curr@file@nosearch} to avoid premature inclusion of
+% path from \cs{graphicspath}}
% \begin{macrocode}
- \set@curr@file{#1}%
+ \Gin@set@curr@file{#1}%
\expandafter\filename@parse\expandafter{\@curr@file}%
% \end{macrocode}
% If extension is |.gz| tack on to previous extension, eg |.eps.gz| if available.
diff --git a/macros/latex/required/graphics/graphics.ins b/macros/latex/required/graphics/graphics.ins
index 95e190c9ec..09c37e7c38 100644
--- a/macros/latex/required/graphics/graphics.ins
+++ b/macros/latex/required/graphics/graphics.ins
@@ -40,4 +40,6 @@ reports for it can be opened at https://latex-project.org/bugs/
\generate{\file{rotating.sty}{\from{rotating.dtx}{package}}}
+\generate{\file{mathcolor.ltx}{\from{mathcolor.dtx}{code}}}
+
\endbatchfile
diff --git a/macros/latex/required/graphics/graphics.pdf b/macros/latex/required/graphics/graphics.pdf
index a50ff186fd..5cdae79b24 100644
--- a/macros/latex/required/graphics/graphics.pdf
+++ b/macros/latex/required/graphics/graphics.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/graphicx.dtx b/macros/latex/required/graphics/graphicx.dtx
index 29e0db5b12..8c20091585 100644
--- a/macros/latex/required/graphics/graphicx.dtx
+++ b/macros/latex/required/graphics/graphicx.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% graphicx.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
-%% Copyright (C) 1995-2021
+%% Copyright (C) 1995-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -211,7 +211,7 @@
% which rotates around the reference point on the baseline, thus
% producing a box that is mainly \emph{below} the baseline.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{Implementation}
diff --git a/macros/latex/required/graphics/graphicx.pdf b/macros/latex/required/graphics/graphicx.pdf
index 88ef6488c2..2a02092804 100644
--- a/macros/latex/required/graphics/graphicx.pdf
+++ b/macros/latex/required/graphics/graphicx.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/grfguide.pdf b/macros/latex/required/graphics/grfguide.pdf
index 95e7c76295..419ea295ed 100644
--- a/macros/latex/required/graphics/grfguide.pdf
+++ b/macros/latex/required/graphics/grfguide.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/grfguide.tex b/macros/latex/required/graphics/grfguide.tex
index 3b679ea382..585e87adc7 100644
--- a/macros/latex/required/graphics/grfguide.tex
+++ b/macros/latex/required/graphics/grfguide.tex
@@ -243,12 +243,27 @@ to the font commands such as |\textbf|:
So the above is essentially equivalent to
|{\color|\arg{name}\emph{text}|}|.
+\subsection{Using Colours in math formulas}
+
+While |\color| and to some extent |\textcolor| can be used in
+formulas, this is cumbersome, may lead to bad spacing, and in some
+situations is simply not possible. For this reason we also introduce
+|\mathcolor| which will help in this respect. The basic syntax is:
+
+\begin{decl}
+|\mathcolor|\arg{name}\arg{math}
+\end{decl}
+
+See \texttt{mathcolor.pdf} for details on this command.
+
+
\subsubsection{Using colour specifications directly}
\begin{decl}
|\color|\oarg{model}\arg{specification}\\
-|\textcolor|\oarg{model}\arg{specification}\arg{text}
+|\textcolor|\oarg{model}\arg{specification}\arg{text}\\
+|\mathcolor|\oarg{model}\arg{specification}\arg{math}
\end{decl}
Normally one would predeclare all the colours used in a package, or in
diff --git a/macros/latex/required/graphics/keyval.dtx b/macros/latex/required/graphics/keyval.dtx
index 58664b8f03..9fce6267e0 100644
--- a/macros/latex/required/graphics/keyval.dtx
+++ b/macros/latex/required/graphics/keyval.dtx
@@ -1,7 +1,7 @@
%
% \iffalse
%% keyval.dtx Copyright (C) 1993 1994 1995 1997 1998 1999 David Carlisle
-%% Copyright (C) 2000-2021 David Carlisle, LaTeX Project
+%% Copyright (C) 2000-2022 David Carlisle, LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -20,7 +20,7 @@
%<driver> \ProvidesFile{keyval.drv}
% \fi
% \ProvidesFile{keyval.dtx}
- [2014/10/28 v1.15 key=value parser (DPC)]
+ [2022/05/29 v1.15 key=value parser (DPC)]
%
% \iffalse
%</!plain>
@@ -177,7 +177,7 @@
% \section{The Internal Interface}
% A declaration of the form:\\
% |\define@key{family}{key}{...}|\\
-% Defines a macro |\KV@prefix@key| with one argument. When used in a
+% Defines a macro |\KV@family@key| with one argument. When used in a
% keyval list, the macro receives the value as its argument.
%
% A declaration of the form:\\
@@ -202,7 +202,7 @@
% package do not break styles making use of these `low level'
% definitions.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Macros}
%
diff --git a/macros/latex/required/graphics/keyval.pdf b/macros/latex/required/graphics/keyval.pdf
index 8746550d0e..5b1bd6a06e 100644
--- a/macros/latex/required/graphics/keyval.pdf
+++ b/macros/latex/required/graphics/keyval.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/lscape.dtx b/macros/latex/required/graphics/lscape.dtx
index 969c94ae7a..d173af6468 100644
--- a/macros/latex/required/graphics/lscape.dtx
+++ b/macros/latex/required/graphics/lscape.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% lscape.dtx Copyright (C) 1994 1999-2000 David Carlisle
-%% Copyright (C) 2000-2021
+%% Copyright (C) 2000-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -54,7 +54,7 @@
% page before the page head and foot are added.
%
%
-% \StopEventually{\end{landscape}}
+% \MaybeStop{\end{landscape}}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \changes{v1.00}{1992/04/28}{Initial release}
diff --git a/macros/latex/required/graphics/lscape.pdf b/macros/latex/required/graphics/lscape.pdf
index 178ffb231d..cc6e113a01 100644
--- a/macros/latex/required/graphics/lscape.pdf
+++ b/macros/latex/required/graphics/lscape.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/mathcolor.dtx b/macros/latex/required/graphics/mathcolor.dtx
new file mode 100644
index 0000000000..2341e71e28
--- /dev/null
+++ b/macros/latex/required/graphics/mathcolor.dtx
@@ -0,0 +1,431 @@
+% \iffalse meta-comment
+%
+%% File: mathcolor.dtx (C) Copyright 2021-2022
+% Frank Mittelbach, LaTeX Team
+%
+% 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
+%
+%
+%%% From File: mathcolor.dtx
+%
+% \begin{macrocode}
+\def\mathcolorversion{v1.0b}
+\def\mathcolordate{2022/01/28}
+% \end{macrocode}
+%<*driver>
+\documentclass{l3doc}
+
+%\makeatletter \input{mathcolor.ltx} \makeatother
+
+\usepackage{color}
+
+% Fixing footnotes in functions and variables: this should be in l3doc!
+
+\newcommand\fixfootnote[2]{\footnotemark
+ \AddToHookNext{env/#1/after}{\footnotetext{#2}}}
+\AddToHook{env/function/begin}{\def\footnote{\fixfootnote{function}}}
+\AddToHook{env/variable/begin}{\def\footnote{\fixfootnote{variable}}}
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{mathcolor.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+
+
+
+%
+% \title{Providing color in math\thanks{This file has version
+% \mathcolorversion\ dated \mathcolordate, \copyright\ \LaTeX\
+% Project.}}
+% \author{Frank Mittelbach}
+%
+% \maketitle
+%
+%
+% \section{Introduction}
+%
+% It is possible to use the \cs{color} command in math formulas but
+% doing that has a number of restrictions and often leads to rather
+% unreadable input. For example, to color the summation sign in red
+% in the following formula
+% \[
+% X = \color{red} \sum_{{\color{black} i=1}}^{{\color{black} n}} \color{black} x_i
+% \]
+% A total of four color commands and a number of seemingly
+% unnecessary extra braces in the sub and superscript are needed:
+%\begin{verbatim}
+% \[ X = \color{red} \sum
+% _{{\color{black} i=1}} % without {{ the superscript is misplaced
+% ^{{\color{black} n}} % without {{ the \sum is black
+% \color{black} % without the x_i is red
+% x_i \]
+%\end{verbatim}
+% While this is ugly but at least works, other things are simply
+% impossible, e.g.,
+% \[ \left\{ \frac{1}{2} \mathcolor{red}{\right\}} \]
+% are not achievable at all because of the fact that \cs{left} and
+% \cs{right} form a group. Thus, a \cs{color} command immediately
+% before the \cs{right} has no effect and \verb=\}= remains black.
+% Putting the color change before the \cs{left} and then resetting
+% the color inside would work if you want to color both braces, but
+% the above combination or the attempt to color only the left brace
+% fails always.
+%
+% Using \cs{textcolor} in formulas appears to work on first glance,
+% but it produces spacing problems that are not easy to overcome
+% either, because it generates a single \cs{mathord} and no
+% longer reflects its input, thus
+% \verb/\[ a = b \textcolor{red}{\neq} c \]/
+% produces
+% \[ a = b \textcolor{red}{\neq} c \]
+% This is a case one could mend by wrapping the
+% \cs{textcolor} and its arguments in a \cs{mathrel}, but even when
+% that is possible, the resulting formula source is difficult to
+% maintain and in other situations the solutions are even more
+% complicated or there is no solution at all.
+%
+% We therefore offer now a dedicated math coloring command named
+% \cs{mathcolor}.
+%
+% \begin{function}{\mathcolor}
+% \begin{syntax}
+% \cs{mathcolor} \oarg{model} \Arg{color-spec} \Arg{math material}
+% \end{syntax}
+% It has the same arguments as \cs{textcolor} but is intended for
+% use in formulas. The command does not generate a group and the
+% \meta{math material} retains its math atom states and it correctly
+% handles sub and superscripts that follow.
+% \end{function}
+%
+% The command can also be used to color a single opening or closing
+% symbol, e.g., the correct input to our earlier example is
+%\begin{verbatim}
+% \[ \left\{ \frac{1}{2} \mathcolor{red}{\right\}} \]
+%\end{verbatim}
+% which is how it was produced.
+%
+% If you attempt to color large operators that use explicit
+% \cs{limits}, \cs{nolimits}, or \cs{displaylimits}, then these
+% limit controls need to immediately follow the operator. However,
+% \cs{mathcolor} is written in a way that it is possible write
+%\begin{verbatim}
+% \[ \mathcolor{red}{\int}\limits_0^1 \textrm{ or }
+% \mathcolor{red}{\int\limits}_0^1 \]
+%\end{verbatim}
+% and achieve the same effect:
+% \[ \mathcolor{red}{\int}\limits_0^1 \textrm{ or }
+% \mathcolor{red}{\int\limits}_0^1 \]
+
+%
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+% The code is called inside of the \pkg{color} or \pkg{xcolor}
+% packages, so \texttt{@} is already a letter, but the
+% coding here is done in the L3 programming layer, so we need to
+% activate that. But first we check if this file was loaded before,
+% e.g., when both \pkg{color} and \pkg{xcolor} are in the preamble
+% and in that case we stop immediately.
+% \begin{macrocode}
+%<*code>
+\ifcsname mathcolor\endcsname \endinput \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+%<@@=mathcolor>
+% \end{macrocode}
+%
+% \begin{macro}{\g_@@_seq}
+% We need to keep our own stack of color commands, so we allocate a
+% sequence for that.
+% \begin{macrocode}
+\seq_new:N \g_@@_seq
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\mathcolor}
+% The document-level command which expects a color (if unnamed then
+% the optional argument is the model) and colors the content of the
+% second argument (like \cs{textcolor}, but without spacing
+% problems in math).
+% \begin{macrocode}
+\DeclareDocumentCommand \mathcolor { o m m } {
+% \end{macrocode}
+% The \cs{mathcolor} is only supported in math mode because in text
+% mode it has problems scanning away a space after it, for example.
+% We therefore raise an error if it executes
+% anywhere else. The \LaTeXe{} error command is a
+% bit strangely named, because in the kernel it is only used for
+% math alphabets, but the message it gives is fine.
+% \changes{v1.0b}{2022/01/28}{Restrict command to math mode}
+% \begin{macrocode}
+ \mode_if_math:F { \non@alpherr {\mathcolor\space} }
+% \end{macrocode}
+% First real action is to save the current color value on a stack
+% (needed if the command is nested or contains some further color
+% changes with \cs{color} inside).
+% \begin{macrocode}
+ \seq_gpush:No \g_@@_seq \current@color
+% \end{macrocode}
+% Then we switch to the new color, but we do not want to reset the
+% color after the group (which is done by \cs{color} using
+% \cs{aftergroup}\cs{reset@color}). The best solution here would be
+% if the color packages would provide a command doing just the
+% color switching, but for now we simply undo that part by pushing
+% \cs{use_none:n} which gobbles the \cs{reset@color} added by
+% \cs{color} with \cs{aftergroup}.
+% \begin{macrocode}
+ \group_insert_after:N \use_none:n
+% \end{macrocode}
+% Switching the color is also slightly suboptimal, because
+% depending on whether or not we have a \meta{model} argument, we
+% have to call \cs{color} with or without the optional argument. But
+% going low-level here is not an option as we need to support
+% different color packages and their internals are not identical.
+% \begin{macrocode}
+ \IfValueTF{#1} { \color[#1]{#2} }{ \color{#2} }
+% \end{macrocode}
+% Then comes the math material we want to see colored:
+% \begin{macrocode}
+ #3
+% \end{macrocode}
+% After that we need to reset the color ourselves (without a group
+% that does it for us), i.e., popping the saved color from our
+% stack, but there are some twists to that so we do this in a
+% separate command (which in fact needs to be called several times,
+% so inlining the code wouldn't be possible.
+% \begin{macrocode}
+ \@@_scan_for_scripts:w
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_scan_for_scripts:w}
+% The complication when changing the color back is due to the fact
+% that the \cs{mathcolor} may be followed by \verb=^= or \verb=_=
+% or the hidden superscript \texttt{'} and its argument may end in a
+% \cs{mathop} in which case the sub and superscripts may be
+% attached as \cs{limits} instead of after the material. All cases
+% need separate treatment.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_scan_for_scripts:w {
+% \end{macrocode}
+% We therefore first parse for a \cs{c_math_subscript_token}
+% ignoring (dropping) any spaces and \cs{relax} as \TeX{} would
+% do. We do this with expansion so that hidden sub or superscripts
+% in macros are still found as long as the macros are expandable.
+% \begin{macrocode}
+ \@@_peek_catcode_ignore_filler_expand:NTF \c_math_subscript_token
+% \end{macrocode}
+% If we found that character we call a function that handles sub or
+% superscripts.
+% \begin{macrocode}
+ { \@@_handle_scripts:Nw }
+% \end{macrocode}
+% Otherwise check if this token we peeked at (which is now stored
+% in \cs{l_peek_token} is a superscript token.
+% \begin{macrocode}
+ { \token_if_math_superscript:NTF \l_peek_token
+% \end{macrocode}
+% If found we call the sub/superscript handler.
+% \begin{macrocode}
+ { \@@_handle_scripts:Nw }
+% \end{macrocode}
+% Otherwise we check if it was any of the limit operation
+% primitives. If that is the case, e.g., if we have a situation
+% such as
+%\begin{verbatim}
+% \mathcolor{red}{\int}\limits_1
+%\end{verbatim}
+% we have to move it directly after the \cs{int} to ensure there
+% is no color reset between the operator and the \cs{limits} command.
+% \begin{macrocode}
+ { \token_case_meaning:NnTF \l_peek_token
+ {
+ \limits { \limits }
+ \nolimits { \nolimits }
+ \displaylimits { \displaylimits }
+ }
+% \end{macrocode}
+% Once that is done, we have to get rid of the token we peeked at
+% and then restart scanning for sub or superscripts. Given that
+% \cs{@@_scan_for_scripts:w} expands while scanning the simplest
+% solution is to add \cs{use_none:n} in front of the peeked at token.
+% \begin{macrocode}
+ { \@@_scan_for_scripts:w \use_none:n }
+% \end{macrocode}
+% If it was one of these we look for a \texttt{'} and if found remove it and
+% replace it by its expansion. The reason we have to do this (and
+% not rely on the earlier peeking to expand for us is the fact
+% that \texttt{'} is only ``math active'' and that doesn't expand
+% under \cs{expanded} or \cs{expandafter}.
+% \begin{macrocode}
+ { \peek_meaning_remove:NTF '
+ { \@@_handle_scripts:Nw ^\c_group_begin_token \prim@s }
+% \end{macrocode}
+% If it is anything else we finish off which means we reset the
+% color (because we prevented that before to happen automatically
+% after the next group) and pop the color stack setting \cs{current@color}.
+% \begin{macrocode}
+ { \reset@color
+ \seq_gpop:NN \g_@@_seq \current@color
+ }
+ }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\@@_handle_scripts:Nw}
+% The tricky part of handling sub and superscripts is that we have
+% to reset color to the one that is on the stack but reset it back
+% to what it was before to allow for cases like
+%\begin{verbatim}
+% \[ \mathcolor{red}{a+\sum}_{i=1}^n \]
+%\end{verbatim}
+% Here, \TeX{} constructs a \cs{vbox} stacking subscript, summation
+% sign, and superscript. So technically the superscript comes first
+% and the \cs{sum} that should get colored red is the middle.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_handle_scripts:Nw #1 {
+% \end{macrocode}
+% The argument is either \verb=^= or \verb=_=, so we execute it and
+% explicitly open two \verb={= groups. We need two because color
+% resets are always done after a group, so the first group is for
+% script material (in case it was just something like \verb=_i=)
+% and the second is needed for the color reset to keep it within
+% the super or subscript. If that reset would happen after it then
+% the color \cs{special} would interfere with \TeX{} math spacing.
+% \begin{macrocode}
+ #1 \c_group_begin_token \c_group_begin_token
+% \end{macrocode}
+% Now it is time to change the color back to the one on the stack.
+% \begin{macrocode}
+ \seq_get:NN \g_@@_seq \current@color
+ \set@color
+% \end{macrocode}
+% \cs{set@color} adds \cs{aftergroup}\cs{reset@color}. We now a add
+% bit more so that the code executed after the current (inner) group
+% looks like this:
+%\begin{verbatim}
+% \reset@color } \@@_scan_for_scripts:w
+%\end{verbatim}
+% The \cs{_@@_scan_for_scripts:w} then retakes control and initiates
+% parsing for another sub or superscript.
+% \begin{macrocode}
+ \group_insert_after:N \c_group_end_token
+ \group_insert_after:N \@@_scan_for_scripts:w
+% \end{macrocode}
+% Before we give control to \TeX{} to process the sub or
+% superscript some final adjustment is necessary: if the input was
+% \verb=^{...}= then we have one \verb={= too many, because we
+% already supplied the outer one already. In that case we drop
+% it. Otherwise we have an unbraced single token sub or superscript
+% which means we are missing a closing \verb=}= at the end and need
+% to account for that: this is done in \cs{_@@_handle_unbraced_script:N}.
+% \begin{macrocode}
+ \@@_peek_catcode_ignore_filler_expand:NTF \c_group_begin_token
+ { \peek_catcode_remove:NT \c_group_begin_token { } }
+ { \@@_handle_unbraced_script:N }
+ }% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_handle_unbraced_script:N}
+% All we have to do here is to add the final closing brace.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_handle_unbraced_script:N #1 {
+ #1 \c_group_end_token }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Utility function for the peek module}
+%
+% This peek is expanding and ignores spaces and \cs{relax} (even
+% though the name doesn't say so)
+% but \cs{relax} is usually allowed in such places where we so it
+% may not be bad to have it in this way in general --- maybe this
+% should move to expl3 peek functions (or otherwise the naming
+% should perhaps be adjusted).
+%
+%
+% \begin{macrocode}
+\tl_new:N \l_@@_peek_tmp_tl
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_catcode_ignore_filler_expand:NTF #1#2#3
+ {
+ \tl_set:Nn \l_@@_peek_tmp_tl
+ { \token_if_eq_catcode:NNTF \l_peek_token #1 {#2} {#3} }
+ \@@_peek_expand:w
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_expand:w
+ {
+ \exp_after:wN \peek_catcode_remove:NTF
+ \exp_after:wN \c_space_token
+ \exp_after:wN \@@_peek_test_expand:w
+ \exp_after:wN \@@_peek_test_relax:w
+ \exp:w \exp_end_continue_f:w
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_test_expand:w
+ {
+ \token_if_expandable:NTF \l_peek_token
+ { \@@_peek_expand:w }
+ { \l_@@_peek_tmp_tl }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_test_relax:w
+ {
+ \peek_meaning_remove:NTF \scan_stop:
+ { \@@_peek_expand:w }
+ { \@@_peek_test_expand:w }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%</code>
+% \end{macrocode}
+%
+% \Finale
+%
+%
+
+%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%
+
diff --git a/macros/latex/required/graphics/mathcolor.pdf b/macros/latex/required/graphics/mathcolor.pdf
new file mode 100644
index 0000000000..1940791f90
--- /dev/null
+++ b/macros/latex/required/graphics/mathcolor.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/rotating.dtx b/macros/latex/required/graphics/rotating.dtx
index c6db1273a4..ac64086082 100644
--- a/macros/latex/required/graphics/rotating.dtx
+++ b/macros/latex/required/graphics/rotating.dtx
@@ -5,7 +5,7 @@
% File: rotating.dtx
%% Copyright (C) 1995-1999 Sebastian Rahtz and Leonor Barroca
%% Copyright (C) 2001-2003,2007-2009 Robin Fairbairns
-%% Copyright (C) 2016-2021 LaTeX Project
+%% Copyright (C) 2016-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%
@@ -157,7 +157,7 @@
% top does
% \end{tabular}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Setup}
% Now we present the documented code. First, package options.
diff --git a/macros/latex/required/graphics/rotating.pdf b/macros/latex/required/graphics/rotating.pdf
index 94fab64ec2..3352fd8fd1 100644
--- a/macros/latex/required/graphics/rotating.pdf
+++ b/macros/latex/required/graphics/rotating.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/rotex.pdf b/macros/latex/required/graphics/rotex.pdf
index 3ca96254af..6027e6cb08 100644
--- a/macros/latex/required/graphics/rotex.pdf
+++ b/macros/latex/required/graphics/rotex.pdf
Binary files differ
diff --git a/macros/latex/required/graphics/trig.dtx b/macros/latex/required/graphics/trig.dtx
index 533f3b0648..4b673494af 100644
--- a/macros/latex/required/graphics/trig.dtx
+++ b/macros/latex/required/graphics/trig.dtx
@@ -1,6 +1,6 @@
% \iffalse
%% File: trig.dtx Copyright (C) 1993-1999 David Carlisle
-%% Copyright (C) 2000-2021
+%% Copyright (C) 2000-2022 LaTeX Project
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -78,7 +78,7 @@
% |\dimen2=\UseSin{30}\dimen0|. Which means that |\UseSin| must
% \emph{expand} to a \meta{factor}.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Macros}
%
diff --git a/macros/latex/required/graphics/trig.pdf b/macros/latex/required/graphics/trig.pdf
index cc9bbe3bcf..8521167f77 100644
--- a/macros/latex/required/graphics/trig.pdf
+++ b/macros/latex/required/graphics/trig.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/README.md b/macros/latex/required/latex-lab/README.md
new file mode 100644
index 0000000000..410292cda5
--- /dev/null
+++ b/macros/latex/required/latex-lab/README.md
@@ -0,0 +1,42 @@
+# LaTeX laboratory
+
+Release 2022-06-01 pre-release 4
+
+## Overview
+
+This bundle holds optional files that are loaded in certain situations
+by kernel code (if available). For example, the new (as of 2021/12)
+`\DocumentMetadata` command in the kernel loads a file from here holding
+the real payload. While this code is still in development and the use
+is experimental and mainly for the tagging project, the code is stored
+outside the format so that there can be intermediate releases not
+affecting the production use of LaTeX.
+
+
+Once the code is finalized and properly tested it will eventually move
+to the kernel and the corresponding file in this bundle will
+vanish. Note that none of these files are directly user accessible in
+documents (i.e., they aren't packages) so the process is transparent
+to documents already using the new functionality.
+
+
+## Current support code in the bundle
+
+### Support for `\DocumentMetadata`
+
+### New output routine code (under development)
+
+ - so far there is a first implementation of footnote support
+
+
+## License
+
+The license is LPPL 1.3c.
+
+
+## Copyright
+
+This README file is
+
+Copyright (C) 2021-2022
+The LaTeX Project
diff --git a/macros/latex/required/latex-lab/changes.txt b/macros/latex/required/latex-lab/changes.txt
new file mode 100644
index 0000000000..80b3b4a22c
--- /dev/null
+++ b/macros/latex/required/latex-lab/changes.txt
@@ -0,0 +1,27 @@
+2022-05-28 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * latex-lab-prototype.dtx
+ Removed
+
+2022-14-04 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * documentmeta-support.dtx:
+ add key A-4 for first steps to support pdf/A-4
+
+2022-03-08 Joseph Wright <Joseph.Wright@latex-project.org>
+
+ * latex-lab-prototype.dtx
+ New file re-implementing ideas from on xtemplate.dtx using updated
+ keyval support
+
+2021-12-30 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * documentmeta-support.dtx:
+ cleaned up keys and bundle name
+ * added latex-lab-testphase.dtx for wrappers for the testphase
+ key.
+
+2021-12-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * README.md:
+ Add the bundle to support project work.
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-code.pdf b/macros/latex/required/latex-lab/documentmetadata-support-code.pdf
new file mode 100644
index 0000000000..a6dadb2e9c
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-code.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-code.tex b/macros/latex/required/latex-lab/documentmetadata-support-code.tex
new file mode 100644
index 0000000000..c051960ab9
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-code.tex
@@ -0,0 +1,4 @@
+% this will typeset documentation + code
+
+\AtBeginDocument{\AlsoImplementation}
+\input{documentmetadata-support.dtx}
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf b/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf
new file mode 100644
index 0000000000..1cfe4cdaf7
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/documentmetadata-support-doc.tex b/macros/latex/required/latex-lab/documentmetadata-support-doc.tex
new file mode 100644
index 0000000000..dcf45514d6
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support-doc.tex
@@ -0,0 +1,6 @@
+% this will typeset only documentation but not the code
+
+\AtBeginDocument{\OnlyDescription
+ \let\tableofcontents\relax
+ }
+\input{documentmetadata-support.dtx}
diff --git a/macros/latex/required/latex-lab/documentmetadata-support.dtx b/macros/latex/required/latex-lab/documentmetadata-support.dtx
new file mode 100644
index 0000000000..23053a484a
--- /dev/null
+++ b/macros/latex/required/latex-lab/documentmetadata-support.dtx
@@ -0,0 +1,418 @@
+% \iffalse meta-comment
+%
+%% File: documentmetadata-support.dtx
+% Copyright (C) 2021-2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e
+%
+% for those people who are interested or want to report an issue.
+%
+% \begin{macrocode}
+\def\documentmetadatasupportversion{1.0b}
+\def\documentmetadatasupportdate{2022-14-04}
+% \end{macrocode}
+%
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{documentmetadata-support.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+%\NewDocElement[macrolike = false ,
+% toplevel = true,
+% idxtype = key ,
+% noprint = true ,
+% idxgroup = metadata keys ,
+% printtype = \textit{key}
+% ]{Mkey}{mkey}
+%
+%
+% \title{The \texttt{documentmetadata-support} code\thanks{This file
+% has version \documentmetadatasupportversion\ dated
+% \documentmetadatasupportdate, \copyright\ \LaTeX\
+% Project.}}
+% \author{Frank Mittelbach, Ulrike Fischer, \LaTeX{} Project}
+%
+% \maketitle
+%
+%
+% \section{Introduction}
+%
+% The kernel command \cs{DocumentMetadata}, which can be used as
+% the very first declaration in a document (i.e., before
+% \cs{documentclass}), defines metadata and other configuration
+% data that applies to the document as a whole (using a key/value
+% syntax).
+%
+% While the underlying functionality is still under
+% development (e.g., further keys will be added over time and keys
+% marked temporary may vanish again) the code for
+% \cs{DocumentMetadata} is place in a separate bundle, so that it
+% is easier to update it without the need to build a full \LaTeX{}
+% release. Over time the functionality will move fully into the
+% kernel.
+%
+% From a process perspective \cs{DocumentMetadata} loads the
+% \pkg{pdfmanagement} code the first time it is called and then
+% redefines itself to only manage key/value pairs in case it is
+% called more than once. In particular, this means that a document
+% without a \cs{DocumentMetadata} declaration has no code available
+% for extended management of PDF output as needed for various
+% features developed as part of the multi-year ``Tagged PDF''
+% project~\cite{blueprint}.
+%
+%
+%
+% \section{Currently supported key/values}
+%
+%
+% Currently the following keys are implemented for \cs{DocumentMetadata}:
+% \DescribeMkey{colorprofiles}
+% \DescribeMkey{debug}
+% \DescribeMkey{lang}
+% \DescribeMkey{pdfstandard}
+% \DescribeMkey{pdfversion}
+% \DescribeMkey{testphase}
+% \DescribeMkey{uncompress}
+%
+% \begin{description}
+% \item[\texttt{backend}] Passes the backend name to expl3. This is
+% needed only if the needed backend can't be automatically
+% determined or if the workflow used requires a special backend.
+%
+%^^A This will probably be extended to pass the value also to
+%^^A packages.
+%
+% \item[\texttt{pdfversion}] Sets the PDF version explicitly, e.g., \texttt{pdfversion=1.7}
+% \item[\texttt{uncompress}] (no value) Forces an uncompressed pdf
+% --- mainly for debugging purposes.
+%
+% \item[\texttt{lang}] Explicitly sets the Lang entry in the Catalog,
+% e.g., \texttt{lang=de-DE}. If not given the default value used is |en-US|.
+%
+% \item[\texttt{pdfstandard}] Choice key to set the pdf standard.
+% Currently |A-1b|, |A-2a|, |A-2b|, |A-2u|, |A-3a|, |A-3b|, |A-3u| and |A-4| are accepted as
+% values. The casing is irrelevant, |a-1b| works too.
+% The underlying code to ensure the requirements (as far as they
+% can be ensured) is still incomplete, but a color profile is included and the
+% \texttt{/OutputIntent} is set. The |u| variants for example do not force unicode,
+% but they will pass the information to hyperref and hyperxmp. The |a| variants
+% do \emph{not} enforce (or even test) a tagged pdf yet. The |A-4| support is
+% currently incomplete.
+% More information can be found in the documentation
+% of \pkg{l3pdfmeta}.
+%
+% \item[\texttt{colorprofiles}] This allows to load icc-colorprofiles. Details
+% are described in the documentation of \pkg{l3pdfmeta}.
+%
+% \item[\texttt{testphase}] This key is used to load testphase code. The values it accepts
+% and their effect will change over time, when testphase packages are added or
+% removed or when the code is moved into the kernel.
+% \begin{description}
+% \item[\texttt{phase-I}]
+% This value loads code implementing the first phase of the project~\cite{blueprint}, i.e., it
+% will load the tagpdf package. It will also activate tagging by issuing
+% |\tagpdfsetup{activate,interwordspace}|. This phase
+% is frozen.
+% \item[\texttt{phase-II}]
+% This is the current development phase.
+% Currently it differs from \texttt{phase-I} only in one point: It will
+% additionally activate tagging of paragraphs with
+% |\tagpdfsetup{paratagging}|. In the upcoming months it will
+% also enable automatic tagging of other basic document elements.
+% \end{description}
+% The |testphase| key can only be used in the first \cs{DocumentMetadata}.
+%
+% \item[\texttt{debug}] This key activates some debug options. It takes a list of key-values
+% as value. Currently the following keys are known:
+% \begin{description}
+% \item[\texttt{para}] with the default and only value |show|. It will activate the |paratagging-show|
+% option of \pkg{tagpdf},
+% \item[\texttt{log}] with the values as described in the documentation \pkg{tagpdf},
+% \item[\texttt{uncompress}] which does the same as |uncompress| as main key
+% \item[\texttt{pdfmanagement}] a boolean which allows to deactivate the pdfmanagement.
+% \item[\texttt{firstaidoff}] This accepts a comma lists of keywords and disables the patches
+% related to them. More information can be found in the documentation of
+% \pkg{pdfmanagement-firstaid}.
+% \end{description}
+% \end{description}
+%
+% \bibliographystyle{plain}
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{blueprint} Frank Mittelbach and Chris Rowley:
+% \emph{\LaTeX{} Tagged PDF\,---\,A blueprint for a large project}.
+% \url{https://latex-project.org/publications/indexbyyear/2020/}
+%
+% \end{thebibliography}
+%
+%
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+% \begin{implementation}
+%
+% \section{The Implementation}
+%
+%
+% \begin{macrocode}
+%<@@=pdfmanagement>
+%<*code>
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+\RequirePackage{pdfmanagement-testphase}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn\makeatletter
+% \end{macrocode}
+
+
+
+% \begin{macro}{\DocumentMetadata}
+%
+% \cs{DocumentMetadata} should not be used after
+% \cs{documentclass} so we error in this case.
+% It can be used more than once
+% but follow-up calls should not do the initialization code.
+% \begin{macrocode}
+\cs_set_protected:Npn \DocumentMetadata #1
+ {
+ \cs_if_eq:NNTF \documentclass \@twoclasseserror
+ { \msg_error:nn { meta } { after-class } }
+ {
+% \end{macrocode}
+%
+% The wanted backend must be detected first, we read the init
+% key and then force the loading of the backend.
+% The backend can contain management commands, so the boolean should
+% be set to true first.
+% \begin{macrocode}
+ \bool_gset_true:N \g_@@_active_bool
+ \keys_set_groups:nnn { document / metadata} {init}{ #1 }
+ %if no backend has been loaded force it now:
+ \str_if_exist:NF \c_sys_backend_str
+ {
+ \sys_load_backend:n {}
+ }
+% \end{macrocode}
+% Now we load the extra backend code:
+% \begin{macrocode}
+ \ExplSyntaxOn\makeatletter
+ \file_input:n {l3backend-testphase-\c_sys_backend_str.def}
+ \ExplSyntaxOff\makeatother
+% \end{macrocode}
+% Set the default language (this requires that the backend has been loaded),
+% process the rest of the keys,
+% and setup the generic driver.
+% \begin{macrocode}
+ \keys_set_filter:nnn { document / metadata } { init } { lang=en-US, #1 }
+ \bool_if:NT \g_@@_active_bool
+ {
+ \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+ }
+% \end{macrocode}
+% \cs{pdfmanagement_add:nnn} has collected values in this hook.
+% \begin{macrocode}
+ \hook_use_once:n {pdfmanagement/add}
+% \end{macrocode}
+% Now we redefine \cs{DocumentMetadata} so that it only process the
+% keys on any further calls.
+%
+% We need to update the hyperref option if the active status changes.
+% \begin{macrocode}
+ \cs_set_protected:Npn \DocumentMetadata ##1
+ {
+ \keys_set_filter:nnn { document / metadata } { init } { ##1 }
+ \str_remove_all:cn {opt@hyperref.sty}{customdriver=hgeneric-testphase}
+ \bool_if:NT \g__pdfmanagement_active_bool
+ {
+ \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+ }
+ }
+% \end{macrocode}
+% Load more modules, the testphase code and the firstaid code. The code is only
+% loaded in the first \cs{DocumentMetadata} call!
+% \begin{macrocode}
+ \g_@@_testphase_tl
+ \RequirePackage{pdfmanagement-firstaid}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \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 =
+ { dvipdfmx , dvips , dvisvgm , luatex , pdftex , pdfmode , xdvipdfmx , xetex }
+ {
+ \sys_load_backend:n {#1}
+ },
+ backend .groups:n = { init } ,
+ }
+
+\keys_define:nn { document / metadata }
+ {
+ ,pdfversion .code:n =
+ {
+ \pdf_version_gset:n { #1 }
+ \AddToDocumentProperties[document]{pdfversion}{#1}
+ }
+ ,uncompress .code:n =
+ {
+ \pdf_uncompress:
+ }
+ ,uncompress .value_forbidden:n = true
+ ,lang .code:n =
+ {
+ \pdfmanagement_add:nnn {Catalog} {Lang}{(#1)}
+ \AddToDocumentProperties[document]{lang}{#1}
+ }
+ %,xmpmeta .bool_gset:N = \g_pdfmeta_xmp_bool %see pdfmeta unused and undefined for now!
+ % this uses internal command from pdfmeta, it should probably move there ...
+ ,pdfstandard .code:n =
+ {
+ \exp_args:Nnx
+ \keys_set:nn {document / metadata} {_pdfstandard=\str_uppercase:n{#1}}
+ }
+ ,_pdfstandard .choices:nn =
+ {A-1B,A-2A,A-2B,A-2U,A-3A,A-3B,A-3U,A-4}
+ {
+ \prop_if_exist:cT { g__pdfmeta_standard_pdf/#1_prop }
+ {
+ \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/#1 _prop }
+ }
+ \AddToDocumentProperties [document]{pdfstandard}{#1}
+ }
+ ,_pdfstandard / unknown .code:n =
+ {
+ \msg_warning:nnn{pdf}{unknown-standard}{#1}
+ }
+ ,testphase .multichoice:
+ ,testphase / tagpdf .code:n =
+ {
+ \tl_gput_right:Nn\g_@@_testphase_tl
+ {
+ \file_if_exist_input:nF {tagpdf-latex-lab-testphase.ltx}
+ {
+ \RequirePackage{tagpdf}
+ \AddToDocumentProperties [document]{testphase/tagpdf}{loaded}
+ \tagpdfsetup{activate,paratagging,interwordspace}
+ \AddToDocumentProperties [document]{tagging}{active}
+ \AddToDocumentProperties [document]{tagging/para}{active}
+ \AddToDocumentProperties [document]{tagging/interwordspace}{active}
+ }
+ }
+ }
+ ,testphase / unknown .code:n =
+ {
+ \tl_gput_right:Nn\g_@@_testphase_tl
+ {
+ \AddToDocumentProperties [document]{testphase/#1}{loaded}
+ \file_if_exist_input:nF {#1-latex-lab-testphase.ltx}
+ {
+ \msg_warning:nnn{meta}{latex-lab-pkg-missing}{#1}
+ \AddToDocumentProperties [document]{testphase/#1}{missing}
+ }
+ }
+ }
+ ,activate .multichoice:
+ ,activate / tagging .code:n =
+ {
+ \PackageWarning{pdfmanagement-testphase}
+ {The~activate~key~is~deprecated.\MessageBreak
+ Tagging~is~activated~with~'testphase=tagpdf'~directly}{}
+ }
+ ,debug .code:n =
+ {
+ \keys_set:nn { document / metadata / debug } {#1}
+ }
+ ,debug / para .code:n =
+ {
+ \AddToHook
+ {
+ package/tagpdf/after
+ }
+ {
+ \tagpdfsetup{paratagging-show}
+ }
+ }
+ ,debug / log .code:n =
+ {
+ \AddToHook
+ {
+ package/tagpdf/after
+ }
+ {
+ \tagpdfsetup{log=#1}
+ }
+ }
+ ,debug / uncompress .code:n =
+ {
+ \pdf_uncompress:
+ }
+ ,debug / pdfmanagement .bool_gset:N = \g_@@_active_bool
+ ,debug / firstaidoff .clist_gset:N = \g_@@_firstaidoff_clist
+ }
+
+
+% \end{macrocode}
+% \subsection{Messages}
+% \begin{macrocode}
+%UFi is meta the right module name here?
+\prop_gput:Nnn \g_msg_module_type_prop { meta } { LaTeX }
+\prop_gput:Nnn \g_msg_module_name_prop { meta } { DocumentMetadata }
+
+\msg_new:nnn { meta } { after-class }
+ {
+ \token_to_str:N \DocumentMetadata \c_space_tl
+ should~be~used~only~before~\token_to_str:N\documentclass
+ }
+\msg_new:nnn { meta } { latex-lab-pkg-missing }
+ {
+ LaTeX-lab~package~'#1'~not~found.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff\makeatother
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</code>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-footnotes.dtx b/macros/latex/required/latex-lab/latex-lab-footnotes.dtx
new file mode 100644
index 0000000000..330ae7b0cc
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-footnotes.dtx
@@ -0,0 +1,1822 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-footnotes.dtx
+% Copyright (C) 2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-footnotes.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \texttt{latex-lab-footnotes} code\thanks{}}
+% \author{Frank Mittelbach, \LaTeX{} Project}
+%
+% \maketitle
+%
+% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}}
+% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
+% \providecommand\class[1]{\texttt{#1.cls}}
+% \providecommand\pkg[1]{\texttt{#1}}
+% \providecommand\hook[1]{\texttt{#1}}
+%
+% \begin{abstract}
+% \emph{to be written}
+% \end{abstract}
+%
+% \tableofcontents
+%
+%
+% \section{Introduction}
+%
+% This code reimplements the footnote interfaces for \LaTeX{}
+% offering configurable methods for layout and functionality
+% adjustments that avoid overwriting each other when used in
+% classes as well as in packages (as far as possible --- obviously
+% some adjustments are mutally exclusive). This is achieved by
+% providing a a larger number of hooks (for areas where different
+% packages/classes can easily coexist with their adjustments) and a
+% number of configuration points to which only one class or package
+% can write to successfully (in case of multiple changes the the
+% last one wins). The latter are for special functionality, e.g.,
+% if footnote text is typeset as a single paragraph, it can't be configured
+% the same time to be typeset vertically with one footnote below
+% each other.
+%
+% The interfaces are set up to support tagged PDF, but in order
+% for this to work, all packages altering the fontnote setup should
+% use the inferfaces provided here and not do it through the
+% legacy methods (though there is some support for the latter as
+% well, but if will not work in a cases).
+%
+% \subsection{Configuration methods}
+%
+% Historically, the footnote setup in \LaTeX{} was done by
+% providing definitions for \cs{@makefnmark} (format the footnote
+% mark in running text and in front of the footnote text) and
+% \cs{@makefntext} (formatting the footnote text and placing a mark
+% in front of it).
+%
+% There was a default definition for \cs{@makefnmark} in the format
+% that was used by most document classes,
+% but \cs{@makefntext} had to be defined in the class itself because
+% the format didn't provide a default. As a result you will find
+% definitions for the latter in all document classes and defintions
+% for \cs{@makefnmark} only in very few.
+%
+% Furthermore, to enable special footnote layouts or provide
+% additional functionality a few packages (and a few classes)
+% overwrote other internal commands of \LaTeX's footnote
+% mechanism. The commands affected in this way are mainly
+% \cs{@footnotemark} and \cs{@footnotetext}. These overwrites could
+% not be used in combination, so either the packages/classes had to
+% be aware of being loaded together (which they sometimes did or
+% tried to) or they would fail by overwriting each other
+% unconditionally.
+%
+% The present rewrite is an attempt to improve this situation, but
+% of course, it will only work if all packages/classes make use of
+% the new interfaces. Fortunately, the number of problematical
+% packages altering these internal commands are fairly small so
+% arranging for updates is a realistic goal --- to achieve properly
+% tagged PDF it is a requirement.
+%
+%
+%
+% \section{Hooks and configuration points}
+%
+% Note: the configuration points do not have an interface mechanism
+% yet and all their names are temporary right now.
+% Also note that configuration points are of interest only to very
+% few specialized packages, mainly \pkg{footmisc}, and packages
+% providing similar functionality---the current documentation is
+% therefore fairly sketchy.
+%
+% In contrast the hooks are of interest to many classes to provide
+% their layout alterations in a way that it works smoothly with
+% other packages handling aspects of foonote formatting.
+%
+%
+% \subsection{Formatting the mark in the main text}
+%
+% This implements formatting the mark\footnote{Like this one.} and
+% its relation to surrounding text, e.g., if several marks appear
+% in the same place, etc.
+%
+%
+% \subsubsection{Configuration points}
+%
+% None: everything is implemented through a single definition for
+% \cs{@footnotemark} that offers a number of hooks that can be used
+% by packages to implement handling of multiple marks and the
+% formatting of marks.
+%
+%
+% \subsubsection{Hooks}
+%
+% The hooks to customize the marks in the text are the following:
+% \begin{description}
+% \item[\hook{fnmark/before}]
+%
+% Executed at the very beginning of \cs{footnotemark}. Currently
+% there are two packages (\pkg{bibarts} and \pkg{chextras}) that
+% prepend material at this point (not ncessarily correctly, e.g.,
+% they do not all check that they are in horizontal mode).
+%
+% This hook is paired with hook \hook{fnmark/after}.
+%
+% \item[\hook{fnmark}]
+%
+% Executed in horizontal mode and after the current space factor
+% has been saved away for reuse. This is where currently code for multiple
+% marks does its preparation (as done by \pkg{footmisc} and
+% others).
+%
+% The hook is only executed in hmode, i.e., not if the mark is
+% generated in math --- maybe that means the multiple handling
+% should happen later?
+%
+% After the hook \cs{nobreak} is executed, so any
+% ``material'' added in the hook is tied to the following mark
+% unless it contains its own permissible penalty.
+%
+% \item[\hook{fnmark/begin}]
+%
+% This hook is executed directly in front of the typeset mark.
+% This is the place where \pkg{hyperref} adds part of its code,
+% i.e., after the \cs{nobreak} mentioned above. With a closer
+% integration of \pkg{hyperref} this hook may not be necessary at
+% all.
+%
+% \item[\hook{fnmark/end}]
+%
+% This hook is executed directly after the typeset mark. It is
+% used by \pkg{hyperref}, \pkg{memhfixc}, \pkg{scrlttr2}, and
+% \pkg{footmisc}. Used, for example, to implement support for
+% multiple marks in succession.
+%
+% It is \emph{not} a reversed hook.
+%
+%
+% \item[\hook{fnmark/after}]
+%
+% This hook is executed at the very end of the \cs{footnotemark} command.
+%
+% It is a reversed hook to pair with \hook{fnmark/before}
+% \end{description}
+%
+%
+%
+%
+% \subsubsection{Additional configuration possibilities}
+%
+% The actual formatting is done through \cs{@makefnmark} --- no
+% special customization support for now.
+%
+%
+%
+% \subsection{Formatting the footnote text}
+%
+% This implements the formatting of the footnote text the way it
+% appears at the bottom of the page (default case), or possibly
+% elsewhere, e.g. in the margin.
+%
+% \subsubsection{Configuration points}
+%
+% To cater for different layout configurations there are four
+% configuration points which can be set only by one package or
+% class, if two packages/classes set them they are mutually
+% incompatible.
+% These are:
+% \begin{description}
+% \item[\cs{@footnotetext@cfgpoint} (1 argument)]
+%
+% This receives all material that is to be processed (or stored)
+% including color protection code and what have you. The default
+% definition is to run \cs{insert}\cs{footins}.
+%
+% \item[\cs{@footnotetext@cfgpointii} (1 argument)]
+%
+% The default definition runs \cs{@makefntext} which contains
+% various hooks for customization. For most scenarios this is
+% sufficient. However, when running all footnotes as a single
+% paragraph at the bottom, then each footnote needs to be
+% prepared prior to storing in the insert and this configuration
+% point allows running extra code to do that.
+%
+% \item[\cs{@footnotetext@cfgpointiii} (no argument)]
+%
+% By default this configuration point adds a strut to the
+% footnote material. so that consecutive footnotes are properly
+% spaced vertically. In some use cases this is not appropriate
+% (e.g., when running all footnotes s a single paragraph) and so
+% this configuration point can cancel the action or do something
+% else instead.
+%
+% The configuration point is executed near the start of the
+% argument for the configuration point
+% \cs{@footnotetext@cfgpointii}.
+%
+% \item[\cs{@footnotetext@cfgpointiv} (no argument)]
+%
+% This configuration point is executed at the very end of the
+% argument passed to \cs{@footnotetext@cfgpointii}.
+% By default it adds a final strut as long as we are still in
+% horizontal mode (i.e., processing the footnote text paragraph.
+% When running several footnotes in one paragraph some additional
+% material (some horizontal glue) needs adding at this point.
+%
+% \end{description}
+% The configuration point \cs{@footnotetext@cfgpointii} runs
+% \cs{@makefntext} and this command contains two further
+% configuration points (and a few hooks):
+% \begin{description}
+% \item[\cs{@makefntext@cfgpoint} (1 argument)]
+%
+% This configuration point receives the material to typeset the
+% footnote mark. By default, all it does is running \cs{indent}
+% to get a paragraph indentation (if one is set up---in most
+% layouts it is 0~points) and then typesets the mark, but in
+% some designs it executes more elaborate code.
+%
+% If tagging is produced this configuration point is also
+% responsible for surrounding the mark with the appropriate tags
+% marking the mark as an Lbl. It does this using the command \cs{tag@FELbl}.
+%
+% \item[\cs{@makefntext@cfgpointii} (1 argument)]
+%
+% This configuration point manages the formatting of the footnote
+% text once the mark has been typeset.
+%
+% If tagging is produced this configuration point is also
+% responsible for surrounding the mark with the appropriate tags
+% marking the mark as an MC of type FENote. It does this using
+% the command \cs{tag@FENote}.
+%
+% \end{description}
+%
+%
+% The above configuration points are sufficient to implement all
+% commonly used footnote layouts assuming L-R typesetting. For R-L
+% typesetting they or may or may not need some extension (though
+% that is not clear right now).
+%
+%
+%
+% \subsubsection{Hooks}
+%
+% \begin{description}
+% \item[\hook{fntext/before}]
+%
+% Executed at the very beginning of \cs{footnotetext}. Currently
+% there is on package (\pkg{linguex}) that
+% prepends material at this point.
+%
+% This hook is paired with hook \hook{fnmark/after}.
+%
+% \item[\hook{fntext}]
+%
+% Executed at the beginning of the material passed to the first
+% configuration point. Typically used to set any baseline
+% stretch for the footnote text, e.g., by \pkg{setspace},
+% \pkg{footmisc}, \class{uathesis} and others. Could be done in a
+% later hook but is a bit more efficient here.
+%
+% After the hook has run, the font is established, i.e., it can't
+% be used to set a different font size.
+%
+% \item[\hook{fntext/para}]
+%
+% After the font is set default paragraph parameters are set up
+% including \cs{interlinepenalty}, \cs{hsize}, \cs{parindent} and
+% a number of others, as some of them depend on the font
+% size. Then the \hook{fntext/para} is run. If one wants to
+% change the font size, it is probably necessary to reset these
+% other parameters too, e.g., \cs{parindent}, which can be done
+% here.
+%
+% The configuration point \cs{@footnotetext@cfgpointii} normally
+% runs the command \cs{@makefntext} or some code that eventually
+% runs this command, and this then produces the footnote mark (in
+% front of the footnote text) and the formatted footnote text. In
+% front of both the mark and the footnote text some classes have
+% placed paragraph parameter adjustments in their redefinition of
+% \cs{@makefntext}. However, there is no need to place it there
+% it could equally well go into the \hook{fntext/para} hook. We
+% therefore do not provide another hook at this point.
+%
+% \item[\hook{fntext/begin} \& \hook{fntext/end}]
+%
+% The footnote text itself is surrounded by the hooks
+% \hook{fntext/begin} and \hook{fntext/end}. The two hooks are
+% not paired as they are typically used independently.
+%
+% \item[\hook{fntext/after}]
+%
+% At the very end of \cs{footnotetext} we execute the hook
+% \hook{fntext/after} which is a reversed hook paired with
+% \hook{fntext/before}. Some packages, e.g., \pkg{linuex}, have
+% code in that position.
+%
+% \end{description}
+%
+%
+%
+%
+% \subsubsection{Additional configuration possibilities}
+%
+% The formatting of the footnote mark in front of the footnote
+% texts is influenced by the setting of the dimen parameter
+% \cs{footnotemargin}. By default its value is 1.8em in the current
+% text font (or \texttt{-}\cs{maxdimen} when the para option is
+% chosen). The following rules apply:
+% \begin{itemize}
+% \item
+%
+% If it has the value \texttt{-}\cs{maxdimen} then the mark is
+% generated by \cs{@makefnmark}.
+%
+% \item
+%
+% Otherwise, if the value is
+% negative then the mark is placed into an \cs{llap} left aligned
+% in a box of size \texttt{-}\cs{footnotemargin}.
+%
+% \item
+%
+% If the value is zero an \cs{llap} is used without an inner box.
+%
+% \item
+%
+% If the value is greater zero (but less than \cs{maxdimen}) the
+% mark is placed right aligned into a box of size
+% \cs{footnotemargin}.
+%
+% \item
+%
+% The value \cs{maxdimen} is used as a marker to indicate that
+% no value was given and that the default should be used,
+% i.e. 1.8em or \texttt{-}\cs{maxdimen} depending on the chosen
+% option.
+% \end{itemize}
+%
+%
+% \section{Tagging support}
+%
+% \emph{To be documented}
+%
+%
+%
+%
+% \MaybeStop{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+% All this is very rough and misses a lot of documentation.
+%
+% \begin{macrocode}
+%<*kernel>
+%<@@=fnote>
+% \end{macrocode}
+%
+% \subsection{File declaration}
+% \begin{macrocode}
+\ProvidesFile{latex-lab-footnotes.ltx}
+ [2022-03-10 v0.6a changes to the footnote interfaces]
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+% latex.ltx
+
+ % not looked at yet
+
+\long\def\@mpfootnotetext#1{%
+ \global\setbox\@mpfootins\vbox{%
+ \unvbox\@mpfootins
+ \reset@font\footnotesize
+ \hsize\columnwidth
+ \@parboxrestore
+ \def\@currentcounter{mpfootnote}%
+ \protected@edef\@currentlabel
+ {\csname p@mpfootnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \par
+ \color@endgroup}}
+
+
+\def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}}
+
+
+
+\def\@mpfn{footnote}
+\def\thempfn{\thefootnote}
+
+
+
+%-------------------------------------
+
+
+\ExplSyntaxOn
+
+
+\cs_new_protected:Npn \fnote_step_fnmark:nn #1#2 {
+ \tl_if_novalue:nTF {#1}
+ {
+ \stepcounter {#2}
+ \protected@xdef \@thefnmark { \use:c { the#2 } }
+ }
+ {
+ \group_begin:
+% \end{macrocode}
+% Note that this is a local assignment even though \LaTeX{}
+% counters are normally globally changed. This is the way it was in
+% 2e and so far we haven't changed it. The alternative would be to
+% store the current value and restore it after \cs{@thefnmark} is
+% altered.
+% \begin{macrocode}
+ \int_set:cn { c@#2 }{ #1 }
+ \unrestored@protected@xdef \@thefnmark { \use:c { the#2 } }
+ \group_end:
+ }
+}
+
+\cs_new_protected:Npn \fnote_set_fnmark:nn #1#2 {
+ \tl_if_novalue:nTF {#1}
+ {
+ \protected@xdef \@thefnmark { \use:c { the#2 } }
+ }
+ {
+ \group_begin:
+ \int_set:cn { c@#2 }{ #1 }
+ \unrestored@protected@xdef \@thefnmark { \use:c { the#2 } }
+ \group_end:
+ }
+}
+
+%-------------------------------------
+
+% the debugging code is just temp
+\bool_new:N \g_fnote_debug_bool
+\bool_gset_true:N \g_fnote_debug_bool % for now we have debugging turned on by default
+
+%-------------------------------------
+
+
+
+\NewMirroredHookPair{fnmark/before}{fnmark/after}
+\NewHook{fnmark}
+\NewHook{fnmark/begin}
+\NewHook{fnmark/end}
+
+
+\cs_new:Npn \@@_debug_footnotemark: {
+ \bool_if:NT \g_fnote_debug_bool
+ {
+ \LogHook{fnmark/before}
+ \LogHook{fnmark}
+ \LogHook{fnmark/begin}
+ \LogHook{fnmark/end}
+ \LogHook{fnmark/after}
+ \cs_gset_eq:NN \@@_debug_footnotemark: \prg_do_nothing:
+ }
+}
+
+
+\cs_new_protected:Npn \fnote_footnotemark: {
+ \@@_debug_footnotemark:
+%-------
+% bibarts
+% chextras --- actually in the wrong place does an \unskip
+ \UseHook{fnmark/before}
+%-------
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}
+%-------
+% bxjsja-minimal.def --- what they do could be done at ``bibarts''
+% (a bit less efficient)
+% memhfixc.sty
+% footmisc.sty
+ \UseHook{fnmark}
+%-------
+ \nobreak
+ \fi
+%-------
+% hyperref.sty
+ \UseHook{fnmark/begin}
+%-------
+ \@kernel@process@makefnmark
+ \@makefnmark
+%-------
+% \end{macrocode}
+% If a footnote mark is placed by its own then it should finish by
+% executing \hook{fnmark/end}, resetting the space factor, and
+% finishing with \hook{fnmark/after}. However, inf a complete
+% footnote these actions have to happen only after we have handled
+% the footnote text (e.g., by placing it into an \cs{insert}. In
+% such a situation \cs{_@@_footmark_finish:} below does nothing
+% and the action is carried out later.
+% \begin{macrocode}
+ \@@_footnotemark_finish:
+}
+
+
+\cs_new:Npn \@@_finish: {
+% hyperref.sty
+% memhfixc.sty --- could move fnmark/after
+% scrlttr2.cls --- could vanish if footmisc uses a hook
+% footmisc.sty
+ \UseHook{fnmark/end}
+%-------
+ \ifhmode
+ \spacefactor \@x@sf \relax
+ \fi
+%
+%-------
+ \UseHook{fnmark/after}
+%-------
+}
+
+
+\cs_new_eq:NN \@@_footnotemark_finish: \@@_finish:
+
+
+
+% Not a public config point but the kernel hook to add tagging
+\def \@kernel@process@makefnmark { }
+
+
+% alterations not covered:
+%
+% ./arabtex/afoot.sty --- too different (and probably too old)
+
+
+% Provide the name \LaTeXe{} is used to.
+
+\cs_set_eq:NN \@footnotemark \fnote_footnotemark:
+
+
+
+%-------------------------------------
+
+\NewMirroredHookPair{fntext/before}{fntext/after}
+\NewHook{fntext}
+\NewHook{fntext/para}
+\NewHook{fntext/begin}
+\NewHook{fntext/end}
+
+
+\cs_new:Npn \@@_debug_footnotetext: {
+ \bool_if:NT \g_fnote_debug_bool
+ {
+ \cs_log:N\@footnotetext@cfgpoint
+ \cs_log:N\@footnotetext@cfgpointii
+ \cs_log:N\@footnotetext@cfgpointiii
+ \cs_log:N\@footnotetext@cfgpointiv
+ \cs_log:N\@makefntext@cfgpoint
+ \cs_log:N\@makefntext@cfgpointii
+ \LogHook{fntext/before}
+ \LogHook{fntext}
+ \LogHook{fntext/para}
+ \LogHook{fntext/begin}
+ \LogHook{fntext/end}
+ \LogHook{fntext/after}
+% \end{macrocode}
+% Show the info only once (if at all).
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_debug_footnotetext: \prg_do_nothing:
+ }
+ }
+
+\cs_new_protected:Npn \fnote_footnotetext:n #1 {
+ \@@_debug_footnotetext:
+%-------
+% ./linguex/linguex.sty
+ \UseHook{fntext/before}
+%-------
+ \@kernel@process@footnotetext
+ \@footnotetext@cfgpoint { % config point
+%-------
+% resetting baselinestretch ... (could be done further down)
+% ./uafthesis/uafthesis.cls
+% ./setspace/setspace.sty
+% ./footmisc/footmisc.sty (normal)
+ \UseHook{fntext}
+%-------
+ \reset@font
+ \footnotesize
+%-------
+% some classes use a different font size, e.g.,
+% ./nrc/nrc1.cls ./nrc/nrc2.cls
+% but those could be done in fntext/para instead
+%-------
+% \end{macrocode}
+% In case of sidenotes the next settings are pointless, but as they
+% do not hurt (except for the \cs{hsize} setting) and are needed
+% for all other cases we make them here and overwrite them for side notes
+% \begin{macrocode}
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox
+ \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \parindent 1em % typical default used in \@makefntext moved up here
+ \def\@currentcounter{footnote}
+ \protected@edef \@currentlabel { \p@footnote \@thefnmark }
+%-------
+% for altering para parameters ...
+% code for resphilosophica came earlier but it could go here.
+% Has the advantage that one can also overwrite \cs{@currentcounter}
+% and \cs{@currentlabel} is that is necessary.
+%
+% ./resphilosophica/resphilosophica.cls
+ \UseHook{fntext/para}
+%-------
+ \color@begingroup
+%-------
+% fnpara wants to replace \@makefntext{...} and para and side option of footmisc etc too ...
+% so we make this a config point
+%-------
+ \@footnotetext@cfgpointii % config point
+ {
+%-------
+% ./resphilosophica/resphilosophica.cls
+%-------
+ \@footnotetext@cfgpointiii % config point
+%-------
+% bibarts
+% fnbreak.sty
+ \UseHook{fntext/begin}
+%-------
+ \ignorespaces
+ #1
+%-------
+% bibarts
+% fnbreak.sty
+ \UseHook{fntext/end}
+%-------
+ \@footnotetext@cfgpointiv % config point
+ }
+ \par
+ \color@endgroup
+ }
+%-------
+% ./linguex/linguex.sty
+ \UseHook{fntext/after}
+%-------
+}
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@footnotetext@cfgpoint { \insert\footins }
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@footnotetext@cfgpointii { \@makefntext }
+
+
+% default for config point (0 args)
+\cs_new_protected:Npn \@footnotetext@cfgpointiii { \rule\z@\footnotesep }
+
+% default for config point (0 args)
+\cs_new_protected:Npn \@footnotetext@cfgpointiv { \@finalstrut\strutbox }
+
+
+% kernel hook for tagging (2 args)
+\cs_new_protected:Npn \@kernel@process@footnotetext {}
+
+% Provide the name \LaTeXe{} is used to and do this unconditionally
+% (no patching of class code if any). This means that if a class provides it own
+% definition that gets lost and if necessary needs to be handled
+% with firstaid (or updating of the class.
+
+\AddToHook{begindocument}{
+ \cs_set_eq:NN \@footnotetext \fnote_footnotetext:n
+}
+
+% alterations not covered:
+%
+% ./revtex4-1/revtex4-1.cls ./revtex/ltxutil.sty ./revtex/revtex4-2.cls ... (need analysis)
+% ./bigfoot/bigfoot.sty
+
+
+
+% \footnotemargin is the logic implemented by footmisc. Perhaps we
+% don't want to do this like that in the kernel but for now I have
+% used this interface unchanged.
+
+
+\newdimen\footnotemargin
+\footnotemargin\maxdimen % no value given
+
+\AtBeginDocument{
+ \ifdim \footnotemargin=\maxdimen
+ \setlength\footnotemargin{1.8em}
+ \fi
+}
+
+
+\cs_new_protected:Npn \fnote_makefntext:n #1 {
+% \end{macrocode}
+% Some classes in their redefinition for \cs{@makefntext} have
+% places some paragraph parameters at this point, but those can
+% equally well go into the hook \hook{fntext/para}. We therefore do
+% not provide a further hook at this point.
+% \begin{macrocode}
+ \@makefntext@cfgpoint
+ {
+ \ifdim\footnotemargin>\z@
+ \hb@xt@ \footnotemargin{\hss\@makefnmark}
+ \else
+ \ifdim\footnotemargin=\z@
+ \llap{\@makefnmark}
+ \else
+ \ifdim\footnotemargin=-\maxdimen
+ \@makefnmark
+ \else
+ \llap{\hb@xt@ -\footnotemargin{\@makefnmark\hss}}
+ \fi
+ \fi
+ \fi
+ }
+ \@makefntext@cfgpointii
+ { #1 }
+}
+
+
+
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@makefntext@cfgpoint { \noindent }
+
+% default for config point (1 arg)
+\cs_new_protected:Npn \@makefntext@cfgpointii #1 { #1 }
+% \end{macrocode}
+%
+%
+%
+% If the definition for \cs{@makefntext} is that of the standard
+% classes then replace it with \cs{fnote_makefntext:n}, otherwise
+% try to patch the definition.
+%
+% Here is the the definition the way it is in
+% \texttt{classes.dtx}. Notice that (for saving space) there is no
+% space after \texttt{em} to terminate the assignment. We need to
+% mimic that, otherwise a test would return false even if the
+% definition has not been modified.
+%
+% \begin{macrocode}
+\newcommand\old@std@class@makefntext[1]{%
+ \parindent 1em%
+ \noindent
+ \hb@xt@1.8em{\hss\@makefnmark}#1}
+
+% \end{macrocode}
+% Here is the messy code for patching. Note that this is only there
+% to help classes along that aren't updated yet so it does some
+% minimal patching to hopefully add configuration points in the
+% right place.
+%
+% What it does is roughly the
+% following: It look for a definition of \cs{@makefntext} of the form
+%\begin{verbatim}
+% {AAA \hbox BBB { CCC } DDD #1 EEE }
+%\end{verbatim}
+% where ``BBB'' is something like \texttt{to 1em} or similar. It then
+% replaces that with
+%\begin{verbatim}
+% {AAA \@makefntext@cfgpoint{\hbox BBB { CCC }} DDD
+% \@makefntext@cfgpointii{#1} EEE }
+%\end{verbatim}
+% The patching is not very careful, i.e., it assumes there is only
+% one \verb=#1= in the replacement text and that a \cs{hbox} found
+% is the right one to patch. But that is enough to cater for all
+% definitions of \cs{@makefntext} out there in the TL distribution.
+%
+% If \cs{hbox} is not found it tries the same looking for
+% \cs{hb@xt@} which is what some classes use and if that is not
+% found either it assume that this is a version that uses
+% \cs{@makefnmark} without surrounding it in a box and if that
+% fails it gives up with an \cs{ERROR} (which needs to get a proper definition).
+% \begin{macrocode}
+
+\tl_new:N \l_@@_patch_tl
+\cs_new_eq:NN \@@_tmp:w \ERROR
+
+\cs_new_protected:Npn \@@_patch:
+ {
+ \tl_set:No \l_@@_patch_tl { \@makefntext { \@makefntext@cfgpointii{##1} } }
+ \tl_if_in:NnTF \l_@@_patch_tl { \hbox }
+ { \cs_set_eq:NN \@@_tmp:w \@@_patch_hbox:w }
+ {
+ \tl_if_in:NnTF \l_@@_patch_tl { \hb@xt@ }
+ { \cs_set_eq:NN \@@_tmp:w \@@_patch_hb@xt@:w }
+ {
+ \tl_if_in:NnTF \l_@@_patch_tl { \@makefnmark }
+ { \cs_set_eq:NN \@@_tmp:w \@@_patch_@makefnmark:w }
+ { \ERROR
+ \cs_set_eq:NN \@@_tmp:w \exp_stop_f: }
+ }
+ }
+ \tl_set:Nf \l_@@_patch_tl
+ { \exp_after:wN \@@_tmp:w \l_@@_patch_tl }
+ \cs_set:Npn \@@_tmp:w { \long \def \@makefntext ####1 }
+ \exp_after:wN \@@_tmp:w \exp_after:wN { \l_@@_patch_tl }
+ }
+% \end{macrocode}
+%
+% If \cs{@makefntext} contains \cs{hbox} then grab ``AAA'' as
+% \verb=#1= and ``BBB'' (up to the open \verb={=) and return it as
+%\begin{verbatim}
+% AAA \@makefntext@processX { \hbox BBB }
+%\end{verbatim}
+% \begin{macrocode}
+\cs_new:Npn \@@_patch_hbox:w #1 \hbox #2 #
+ { \exp_stop_f: #1 \@makefntext@processX { \hbox #2 } }
+% \end{macrocode}
+% Same for the other cases.
+% \begin{macrocode}
+\cs_new:Npn \@@_patch_hb@xt@:w #1 \hb@xt@ #2 #
+ { \exp_stop_f: #1 \@makefntext@processX { \hb@xt@ #2 } }
+\cs_new:Npn \@@_patch_@makefnmark:w #1 \@makefnmark
+ { \exp_stop_f: #1 \@makefntext@processX { \use:n } { \@makefnmark } }
+% \end{macrocode}
+%
+% The code provided by Bruno above expects 2 arguments but we need a
+% different structure so this is a simple reshuffling. Would be
+% better if we can patch the right structure in directly, but I'm
+% not a patch person, so this is the simple way out for now:
+%
+% \begin{macrocode}
+\cs_new:Npn \@makefntext@processX #1#2{\@makefntext@cfgpoint{#1{#2}}}
+% \end{macrocode}
+% At \verb=\begin{document}= check if the current definition is
+% that of the standard classes and if so replace it by
+% \cs{fnote_makefntext:n} otherwise try and patch the definition
+% using the approach above.
+% \begin{macrocode}
+
+\AddToHook{begindocument}{
+ \cs_if_eq:NNTF \@makefntext \old@std@class@makefntext
+ {
+ \cs_set_eq:NN \@makefntext \fnote_makefntext:n
+ }
+ {
+ \@@_patch:
+ }
+}
+
+
+% possibly add the following to check for multiple \hbox in
+% the definition:
+%
+% \seq_set_split:NnV \l_@@_patch_seq { \hbox } \l_@@_patch_tl
+% \int_compare:nT { \seq_count:N \l_@@_patch_seq } > 2 \ERROR
+%
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{Document-level commands}
+%
+% \begin{macrocode}
+
+\DeclareDocumentCommand\footnotetext {om} {
+ \fnote_set_fnmark:nn {#1} \@mpfn
+ \@footnotetext {#2}
+}
+
+
+%-------------------------------------
+
+
+\DeclareDocumentCommand\footnote {om} {
+ \fnote_step_fnmark:nn {#1} \@mpfn
+ \cs_set_eq:NN \@@_footnotemark_finish: \prg_do_nothing:
+ \@footnotemark
+ \cs_set_eq:NN \@@_footnotemark_finish: \@@_finish:
+ \@footnotetext {#2}
+ \@@_footnotemark_finish:
+}
+
+%-------------------------------------
+
+
+\DeclareDocumentCommand\footnotemark {o} {
+ \fnote_step_fnmark:nn {#1} { footnote }
+ \@footnotemark
+}
+
+
+%-------------------------------------
+
+\DeclareDocumentCommand\footref {m}{%
+ \begingroup
+ \unrestored@protected@xdef\@thefnmark{\ref{#1}}%
+ \endgroup
+ \@footnotemark
+}
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+% \subsection{Firstaid for packages and classes}
+%
+% \subsubsection{\pkg{setspace}}
+%
+% It should not overwrite it any longer but use a hook, so for now we
+% do just that here.
+% \begin{macrocode}
+\AddToHook{package/setspace/after}
+ {\let \@footnotetext \fnote_footnotetext:n
+ \AddToHook{fntext}[setspace]{\let\baselinestretch\setspace@singlespace}}
+% \end{macrocode}
+%
+%
+%
+%
+% \subsubsection{\pkg{hyperref}}
+%
+% Prevent hyperref from redefining footnote stuff --- this is a
+% temp solution.
+% \begin{macrocode}
+\AddToHook{package/hyperref/after}{
+ \let\H@@footnotetext\fnote_footnotetext:n
+ \let\H@@footnotemark\fnote_footnotemark:
+ \let \@footnotetext \fnote_footnotetext:n
+ \let \@footnotemark \fnote_footnotemark:
+}
+
+
+
+% \end{macrocode}
+%
+% \subsection{Stuff that needs cleanup and documentation}
+%
+% \begin{macrocode}
+
+
+%-------------------------------------
+
+% use of kerns to mark h-mode positions (unit sp)
+%
+% 1 = CJK
+% 2 = CJK
+% 3 = multiple footnotes (footmisc, koma, eledmac, tufte, memoir,
+% parnotes, sidenotes)
+% 3 = outer kern in letter spacing (letterspace)
+% 3 = beginning of list (examdesign.cls)
+% 4 = CJK pigin
+% 5 = CJK ruby
+
+% 1-4 = polyglossia for korean
+
+%-------------------------------------
+
+
+
+%-------------------------------------
+% Tagging
+%-------------------------------------
+
+% hyperref support only when loaded (improve integration)
+
+\newcounter{absfootnote}
+\AddToHook{fnmark/begin}{\stepcounter{absfootnote}} % too simple (fails with opt args)
+
+
+
+% this is rubbish and should be handled better:
+
+\cs_new_protected:Npn \tag_if_loaded:TF { \cs_if_exist:NTF \tag_struct_begin:n }
+
+
+
+\cs_new_protected:Npn \tag@FEMark #1 {
+ \tag_if_loaded:TF
+ {
+ \tag_mc_end_push:
+ \exp_args:Nx
+ \tag_struct_begin:n{tag=Lbl,ref=fn.\the\c@absfootnote}
+ \tag_mc_begin:n{tag=Lbl}
+ \IfPackageLoadedTF{hyperref}{ \hyper@linkstart
+ {link}{fn.\the\c@absfootnote} }{}
+ #1
+ \IfPackageLoadedTF{hyperref}{ \hyper@linkend }{}
+ \tag_mc_end:
+ \tag_struct_end:
+ \tag_mc_begin_pop:n{}
+ }
+ { #1 }
+}
+
+% to be done next round around:
+%
+% \the\c@absfootnote should be replaced directly by some command with default meaning
+% \the\c@absfootnote so that the actual reference can be changed from the outside.
+%
+% there are several instances that are curently hardwired.
+
+\cs_set_eq:NN \@kernel@process@makefnmark \tag@FEMark
+
+
+
+% kernel hook for tagging (2 args)
+\cs_set:Npn \@kernel@process@footnotetext #1#2 {
+ \tag_if_loaded:TF
+ {
+ \tag_mc_end_push:
+ \tag_struct_begin:n { tag=FENote,label=fn.\the\c@absfootnote }
+ #1 {#2}
+ \tag_struct_end:
+ \tag_mc_begin_pop:n{}
+ }
+ { #1 {#2} }
+}
+
+
+
+\cs_set:Npn \@makefntext@cfgpoint #1 {
+ \noindent
+ \cs_if_exist:NT \tag_struct_begin:n { \tag_mc_end_push: }
+ \tag@FELbl { #1 }
+}
+
+\cs_set:Npn \@makefntext@cfgpointii #1 {
+ \tag@FENote { #1 }
+ \cs_if_exist:NT \tag_struct_begin:n { \tag_mc_begin_pop:n{} }
+}
+
+
+
+
+\cs_new_protected:Npn \tag@FELbl #1 {
+ \tag_if_loaded:TF
+ {
+ % target should perhaps be raised ...
+ \IfPackageLoadedTF{hyperref}{ \hypertarget{fn.\the\c@absfootnote}{} }{}
+ %\tag_struct_begin:n { tag=FENote,label=fn.\the\c@absfootnote } %alternativ location for structure
+ \tag_struct_begin:n { tag=Lbl }
+ \tag_mc_begin:n { tag=Lbl }
+ #1
+ \tag_mc_end:
+ \tag_struct_end:
+ }
+ { #1 }
+}
+
+\cs_new_protected:Npn \tag@FENote #1 {
+ \tag_if_loaded:TF
+ {
+ \tag_mc_begin:n{tag=FENote}
+ #1
+ \tag_mc_end:
+ %\tag_struct_end: %alternative location for structure end but ends inside a P
+ }
+ { #1 }
+}
+
+%-------------------------------------
+
+
+\ExplSyntaxOff
+%</kernel>
+% \end{macrocode}
+%
+%
+% \section{Reimplementing the \pkg{footmisc} package}
+%
+% \begin{macrocode}
+%<*footmisc>
+%%
+%% Copyright (c) 1995-2011 Robin Fairbairns
+%% Copyright (c) 2018-2022 Robin Fairbairns, Frank Mittelbach
+%%
+%% This file is part of the `latex-lab Bundle'.
+%% --------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% 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 work has the LPPL maintenance status 'maintained'.
+%%
+%%
+%% File: footmisc.dtx (C) Copyright 1995-2011 Robin Fairbairns
+%% (C) Copyright 2018-2022 Frank Mittelbach
+\NeedsTeXFormat{LaTeX2e}
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+
+\DeclareRelease{v5}{2011-06-06}{footmisc-2011-06-06.sty}
+\DeclareCurrentRelease{}{2022-02-14}
+\ProvidesPackage{latex-lab-footmisc}%
+ [2022/03/08 v6.0d
+ a miscellany of footnote facilities -- latex-lab version%
+ ]
+
+\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+\newtoks\FN@temptoken
+\providecommand\protected@writeaux{%
+ \protected@write\@auxout
+}
+\def\l@advance@macro{\@@dvance@macro\edef}
+\def\@@dvance@macro#1#2#3{\expandafter\@tempcnta#2\relax
+ \advance\@tempcnta#3\relax
+ #1#2{\the\@tempcnta}%
+}
+\let\@advance@macro\l@advance@macro
+\DeclareOption{symbol}{\renewcommand\thefootnote{\fnsymbol{footnote}}}
+\newif\ifFN@robust \FN@robustfalse
+\DeclareOption{symbol*}{%
+ \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+ \FN@robusttrue
+ \AtEndOfPackage{\setfnsymbol{lamport*-robust}}%
+}
+\newif\ifFN@para \FN@parafalse
+\DeclareOption{para}{%
+% \end{macrocode}
+% Options are executed in the order of declaration, thus no point in
+% checking for side option as footmisc did in the past
+% \begin{macrocode}
+% \PackageError{footmisc}{Option "\CurrentOption" incompatible with
+% option "side"}%
+% {I shall ignore "\CurrentOption"}%
+ \FN@paratrue
+ \setlength\footnotemargin{-\maxdimen} % default when para is used
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareOption{side}{\ifFN@para
+ \PackageError{footmisc}{Option "\CurrentOption" incompatible with
+ option "para"}%
+ {I shall ignore "\CurrentOption"}%
+ \else
+ \def\@footnotetext@cfgpoint {\marginpar}
+ \AddToHook{fntext/para}{%
+ \hsize\marginparwidth % correct the default \hsize
+ \footnotesep\z@ % don't add a default separation
+ }
+ \def\@footnotetext@cfgpointii {\@makefntext}
+ \def\@footnotetext@cfgpointiii {}
+ \def\@footnotetext@cfgpointiv {}
+ \fi
+}
+\let\footnotelayout\@empty
+\DeclareOption{ragged}{%
+ \@ifundefined{RaggedRight}%
+ {\renewcommand\footnotelayout{\linepenalty50 \raggedright}}%
+ {\renewcommand\footnotelayout{\linepenalty50 \RaggedRight}}%
+}
+\newif\ifFN@perpage
+\FN@perpagefalse
+\DeclareOption{perpage}{%
+ \FN@perpagetrue
+}
+\newif\ifFN@fixskip \FN@fixskipfalse
+
+\let\FN@bottomcases\thr@@
+\newif\ifFN@abovefloats \FN@abovefloatstrue
+\DeclareOption{bottom}{%
+ \let\FN@bottomcases\@ne
+ \FN@abovefloatsfalse
+ \FN@fixskiptrue
+}
+\DeclareOption{bottomfloats}{%
+ \let\FN@bottomcases\tw@
+ \FN@abovefloatstrue \FN@fixskiptrue
+}
+\DeclareOption{abovefloats}{\FN@abovefloatstrue \FN@fixskiptrue}
+\DeclareOption{belowfloats}{\FN@abovefloatsfalse \FN@fixskiptrue}
+\DeclareOption{marginal}{%
+ \footnotemargin-0.8em\relax
+}
+\DeclareOption{flushmargin}{%
+ \footnotemargin0pt\relax
+}
+\newif\ifFN@hangfoot \FN@hangfootfalse
+\DeclareOption{hang}{%
+ \FN@hangfoottrue
+}
+\newcommand*\hangfootparskip{0.5\baselineskip}
+\newcommand*\hangfootparindent{0em}%
+\DeclareOption{norule}{%
+ \renewcommand\footnoterule{}%
+ \advance\skip\footins 4\p@\@plus2\p@\relax
+}
+\DeclareOption{splitrule}{%
+ \gdef\split@prev{0}
+ \let\pagefootnoterule\footnoterule
+ \let\mpfootnoterule\footnoterule
+ \def\splitfootnoterule{\kern-3\p@ \hrule \kern2.6\p@}
+ \def\footnoterule{\relax
+ \ifx \@listdepth\@mplistdepth
+ \mpfootnoterule
+ \else
+ \ifnum\split@prev=\z@
+ \pagefootnoterule
+ \else
+ \splitfootnoterule
+ \fi
+ \xdef\split@prev{\the\insertpenalties}%
+ \fi
+ }%
+}
+\newif\ifFN@stablefootnote \FN@stablefootnotefalse
+\DeclareOption{stable}{\FN@stablefootnotetrue}
+\newif\ifFN@multiplefootnote \FN@multiplefootnotefalse
+\DeclareOption{multiple}{\FN@multiplefootnotetrue}
+\ProcessOptions
+% \end{macrocode}
+% This version of \pkg{footmisc} can assume that the new OR code is
+% already available, thus nothing needs loading at this
+% point. However, as long as we use this code also in a package
+% version that can be loaded by other package while we are in a
+% transition phase it is not clear whether not the kernel code is
+% already available for other packages.
+% \begin{macrocode}
+%\@ifundefined{@kernel@before@cclv}
+% {\input{latex-lab-new-or.ltx}}{}
+% \end{macrocode}
+%
+% Footnote box layout for para footnotes;
+% this would also be the hook to support dblfootnotes (from the
+% \texttt{dblfnote} package if we integrate that).
+% \begin{macrocode}
+\ifFN@para
+ \def\@makecol@cfgpointii {%
+ \global\setbox\footins\vbox{\FN@makefootnoteparagraph}%
+ }
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ifFN@fixskip
+ \def\@outputbox@removebskip{%
+ \ifx\@textbottom\relax \else
+ \@outputbox@append{%
+ \@tempskipa\lastskip
+ \ifnum \gluestretchorder\@tempskipa>\z@
+ \vskip-\@tempskipa
+ \xdef\@outputbox@reinsertbskip
+ {\noexpand\@outputbox@append{\vskip\the\@tempskipa}}%
+ \else
+ \global\let\@outputbox@reinsertbskip\relax
+ \fi
+ }%
+ \fi
+ }
+\let\@outputbox@reinsertbskip\relax
+\else
+ \let\@outputbox@removebskip \relax
+ \let\@outputbox@reinsertbskip\relax
+\fi
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+\ifcase \FN@bottomcases\relax
+\ERROR
+\or
+ \ifFN@abovefloats
+ \def\@makecol@cfgpoint {%
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@if@bfloats@TF{\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}}%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+ }
+ \else
+ \def\@makecol@cfgpoint {%
+ \@outputbox@attachfloats
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}%
+ \@outputbox@appendfootnotes
+ }
+ \fi
+\or
+ \ifFN@abovefloats
+ \def\@makecol@cfgpoint {%
+ \@outputbox@appendfootnotes
+ \@if@bfloats@TF
+ {\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}%
+ \@outputbox@attachfloats
+ }
+ \else
+ \def\@makecol@cfgpoint {%
+ \@if@footnotes@TF
+ {\@outputbox@append{\vfill}}%
+ {\@if@bfloats@TF{\@outputbox@append{\vfill}}%
+ {\@outputbox@reinsertbskip}}%
+ \@outputbox@attachfloats
+ \@outputbox@appendfootnotes
+ }
+ \fi
+\or
+ \ifFN@abovefloats
+ \def\@makecol@cfgpoint {%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+ \@outputbox@reinsertbskip
+ }
+ \else
+ \def\@makecol@cfgpoint {%
+ \@outputbox@attachfloats
+ \@outputbox@appendfootnotes
+ \@outputbox@reinsertbskip
+}
+ \fi
+\else
+\ERROR
+\fi
+
+% next can be dropped when cleaned up
+\newif\ifFN@setspace
+\@ifpackageloaded{setspace}%
+ {%
+ \FN@setspacetrue
+ \@ifclassloaded{memoir}%
+ {%
+ \AddToHook{fntext}{\let\baselinestretch\m@m@singlespace}%
+ \let\FN@baselinestretch\m@m@singlespace
+ }%
+ {%
+% \AddToHook{fntext}{\let\baselinestretch\setspace@singlespace}%
+ \let\FN@baselinestretch\setspace@singlespace
+ }%
+ }%
+ {%
+ \FN@setspacefalse
+ }
+
+
+
+\ifFN@para
+ \def\@footnotetext@cfgpoint {\insert\footins}
+
+ \long\def\@footnotetext@cfgpointii #1{%
+ \setbox\FN@tempboxa\hbox{\@makefntext{#1}}%
+ \dp\FN@tempboxa\z@
+ \ht\FN@tempboxa
+ \dimexpr\wd\FN@tempboxa *%
+ \footnotebaselineskip /\columnwidth\relax
+ \box\FN@tempboxa
+ }
+
+
+ \def\@footnotetext@cfgpointiii {}
+ \def\@footnotetext@cfgpointiv {% config point
+ \strut
+ \penalty-10\relax
+ \hskip\footglue
+ }
+\fi
+
+
+
+\ifFN@para
+ \let\FN@tempboxa\@tempboxa
+ \newbox\FN@tempboxb
+ \newbox\FN@tempboxc
+ \newskip\footglue \footglue=1em plus.3em minus.3em
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \newdimen\footnotebaselineskip
+
+ % establish late:
+
+\AddToHook{begindocument/before} {%
+ {%
+ \footnotesize
+ \global\footnotebaselineskip=\normalbaselineskip
+ }%
+}
+% \end{macrocode}
+% The coding is based on David Kastrup's improvement to Don Knuth's
+% original implementation. You find in the \TeX{}book if you own
+% the latest edition.
+% \begin{macrocode}
+
+ \long\def\FN@makefootnoteparagraph{%
+ \FN@setfootnoteparawidth
+ \@parboxrestore
+ \baselineskip=\footnotebaselineskip
+ \unvbox\footins \FN@removehboxes
+ \RawParEnd
+ }
+ \def\FN@removehboxes{\setbox\FN@tempboxa\lastbox
+ \ifhbox\FN@tempboxa{\FN@removehboxes}%
+ \unhbox\FN@tempboxa
+ \else
+ \RawNoindent
+ \rule\z@\footnotesep
+ \fi
+ }
+\fi
+
+
+\@ifpackageloaded{multicol}
+ {\def\FN@setfootnoteparawidth
+ {\hsize\ifnum\doublecol@number>\@ne
+ \textwidth
+ \else \columnwidth \fi}}
+ {\def\FN@setfootnoteparawidth{\hsize\columnwidth}}
+
+\ifFN@perpage
+ \RequirePackage{perpage}
+ \MakePerPage{footnote}
+% \end{macrocode}
+% Fix a bug in perpage \ldots
+% \begin{macrocode}
+ \def\@stpelt#1{\global\csname c@#1\endcsname \m@ne
+ \stepcounter{#1}%
+ \pp@fix@MakePerPage{#1}%
+ }
+ \def\pp@fix@MakePerPage#1{%
+ \ifnum \value{#1}>\z@
+ \addtocounter{#1}\m@ne\fi
+ }
+% \end{macrocode}
+% The above code may look a bit odd: the \cs{stepcounter} sets the
+% counter to zero and then we alter it if it is not zero. The
+% reason is that \cs{stepcounter} resets other counters and when
+% perpage is loaded this results in updating counters on the reset
+% list to 1 (or to a higher starting value if \cs{MakePerPage} is
+% used with an optional argument, which is precisely the problem
+% here. By subtracting 1 in that case we set it back to 1 lower
+% than the starting value.
+%
+% But to make this fully work we also need to update a support
+% command in \pkg{perpage}:
+% \begin{macrocode}
+ \def\pp@cl@end@iii\stepcounter#1\pp@fix@MakePerPage#2{}
+\fi
+
+
+\ifFN@para
+
+% This can use the default interface, except that a negative value for
+% \footnotemargin makes little sense, so we test for this and warn if
+% necessary. But -\maxdimen is ok again, so would need to be a litte bit more elaborate.
+%
+
+%\AddToHook{fntext/para}{
+% \ifdim \footnotemargin >\z@ \else
+% \PackageWarningNoline{footmisc}{Option 'para' needs positive \noexpand\footnotemargin}%
+% \footnotemargin 1.8em\relax
+% \fi
+%}
+
+
+\AddToHook{fntext/begin}{\nobreak \hspace{.2em}}
+
+
+
+
+\else
+
+ \ifFN@hangfoot
+ \long\def\@makefntext#1{%
+ \bgroup
+ \setbox\@tempboxa\hbox{%
+ \ifdim\footnotemargin>\z@
+ \hb@xt@\footnotemargin{\@makefnmark\hss}%
+ \else
+ \@makefnmark
+ \fi
+ }%
+ \leftmargin\wd\@tempboxa
+ \rightmargin\z@
+ \linewidth \columnwidth
+ \advance \linewidth -\leftmargin
+ \parshape \@ne \leftmargin \linewidth
+ \footnotesize
+ \@setpar{{\@@par}}%
+ \leavevmode
+ \llap{\box\@tempboxa}%
+ \parskip\hangfootparskip\relax
+ \parindent\hangfootparindent\relax
+ \footnotelayout#1%
+ \par
+ \egroup
+ }
+
+ \else
+
+% This is now using the default interface:
+%
+% \long\def\@makefntext#1{%
+% \parindent1em
+% \noindent
+% \ifdim\footnotemargin>\z@
+% \hb@xt@ \footnotemargin{\hss\@makefnmark}%
+% \else
+% \ifdim\footnotemargin=\z@
+% \llap{\@makefnmark}%
+% \else
+% \llap{\hb@xt@ -\footnotemargin{\@makefnmark\hss}}%
+% \fi
+% \fi
+% \footnotelayout#1%
+% }
+
+ \fi
+\fi
+
+
+
+
+\ifFN@multiplefootnote
+ \providecommand*{\multiplefootnotemarker}{3sp}
+ \providecommand*{\multfootsep}{,}
+ \AddToHook{fnmark} {\FN@mf@check}
+ \AddToHook{fnmark/end} {\FN@mf@prepare}
+%
+ \def\FN@mf@prepare{%
+ \kern-\multiplefootnotemarker
+ \kern\multiplefootnotemarker\relax
+ }
+ \def\FN@mf@check{%
+ \ifdim\lastkern=\multiplefootnotemarker\relax
+%?? is that necessary or even correct ??
+ \edef\@x@sf{\the\spacefactor}%
+%?? shouldn't that be 2 unkerns ?? (none would also be ok)
+ \unkern % new
+ \unkern
+ \textsuperscript{\multfootsep}%
+ \spacefactor\@x@sf\relax
+ \fi
+ }
+\else
+ \let\FN@mf@prepare\relax
+\fi
+\ifFN@stablefootnote
+\let\FN@sf@@footnote\footnote
+\def\footnote{\ifx\protect\@typeset@protect
+ \expandafter\FN@sf@@footnote
+ \else
+ \expandafter\FN@sf@gobble@opt
+ \fi
+}
+\edef\FN@sf@gobble@opt{\noexpand\protect
+ \expandafter\noexpand\csname FN@sf@gobble@opt \endcsname}
+\expandafter\def\csname FN@sf@gobble@opt \endcsname{%
+ \@ifnextchar[%]
+ \FN@sf@gobble@twobracket
+ \@gobble
+}
+\def\FN@sf@gobble@twobracket[#1]#2{}
+\let\FN@sf@@footnotemark\footnotemark
+\def\footnotemark{\ifx\protect\@typeset@protect
+ \expandafter\FN@sf@@footnotemark
+ \else
+ \expandafter\FN@sf@gobble@optonly
+ \fi
+}
+\edef\FN@sf@gobble@optonly{\noexpand\protect
+ \expandafter\noexpand\csname FN@sf@gobble@optonly \endcsname}
+\expandafter\def\csname FN@sf@gobble@optonly \endcsname{%
+ \@ifnextchar[%]
+ \FN@sf@gobble@bracket
+ {}%
+}
+\def\FN@sf@gobble@bracket[#1]{}
+\fi
+\newcommand\setfnsymbol[1]{%
+ \@bsphack
+ \@ifundefined{FN@fnsymbol@#1}%
+ {%
+ \PackageError{footmisc}{Symbol style "#1" not known}%
+ \@eha
+ }{%
+ \expandafter\let\expandafter\@fnsymbol\csname
+ FN@fnsymbol@#1\endcsname
+ }%
+ \@esphack
+}
+\let\FN@fnsymbol@lamport\@fnsymbol
+\newif\if@tempswb
+\DeclareDocumentCommand\DefineFNsymbols {smO{text}m}{%
+ \expandafter\ifx\csname FN@fnsymbol@#2\endcsname\relax
+ \PackageInfo{footmisc}{Declaring symbol style #2}%
+ \else
+ \PackageWarning{footmisc}{Redeclaring symbol style #2}%
+ \fi
+ \toks@{}%
+ \def\@tempb{\end}%
+ \FN@build@symboldef#4\end
+ \def\@tempc{math}%
+ \def\@tempd{#3}%
+ \expandafter\xdef\csname FN@fnsymbol@#2\endcsname##1{%
+ \ifx\@tempc\@tempd
+ \noexpand\ensuremath
+ \else
+ \noexpand\nfss@text
+ \fi
+ {%
+ \noexpand\ifcase##1%
+ \the\toks@
+ \noexpand\else
+ \IfBooleanTF#1{\noexpand\@ctrerr}%
+ {\noexpand\FN@orange##1}%
+ \noexpand\fi
+ }%
+ }%
+}
+\def\FN@build@symboldef#1{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@tempb
+ \else
+ \toks@\expandafter{\the\toks@\or#1}%
+ \expandafter\FN@build@symboldef
+ \fi
+}
+\DeclareDocumentCommand\DefineFNsymbolsTM {smm}{%
+ \expandafter\ifx\csname FN@fnsymbol@#2\endcsname\relax
+ \PackageInfo{footmisc}{Declaring symbol style #2}%
+ \else
+ \PackageWarning{footmisc}{Redeclaring symbol style #2}%
+ \fi
+ \toks@{}%
+ \def\@tempb{\end}%
+ \FN@build@symboldefTM#3\end\@null
+ \expandafter\xdef\csname FN@fnsymbol@#2\endcsname##1{%
+ \noexpand\ifcase##1%
+ \the\toks@
+ \noexpand\else
+ \IfBooleanTF#1{\noexpand\@ctrerr}%
+ {\noexpand\FN@orange##1}%
+ \noexpand\fi
+ }%
+}
+\def\FN@build@symboldefTM#1#2{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@tempb
+ \else
+ \toks@\expandafter{\the\toks@\or\TextOrMath{#1}{#2}}%
+ \expandafter\FN@build@symboldefTM
+ \fi
+}
+\def\FN@orange#1{%
+ \ifFN@robust
+ \@arabic#1%
+ \@bsphack
+ \PackageInfo{footmisc}{Footnote number \number#1 out of range}%
+ \protect\@fnsymbol@orange
+ \@esphack
+ \else \@ctrerr \fi
+}
+\global\let\@diagnose@fnsymbol@orange\relax
+\AtEndDocument{\@diagnose@fnsymbol@orange}
+\def\@fnsymbol@orange{%
+ \gdef\@diagnose@fnsymbol@orange{%
+ \PackageWarningNoLine{footmisc}{Some footnote number(s)
+ were out of range
+ \MessageBreak
+ see log for details%
+ }%
+ }%
+}
+\DefineFNsymbolsTM{bringhurst}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textbardbl \|%
+ \textparagraph \mathparagraph
+}%
+\DefineFNsymbolsTM{chicago}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textbardbl \|%
+ \#\#%
+}%
+\DefineFNsymbolsTM{wiley}{%
+ \textasteriskcentered *%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+}%
+\DefineFNsymbolsTM{lamport-robust}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ {\textdagger\textdagger}{\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}%
+}
+\DefineFNsymbolsTM*{lamport*}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ {\textdagger\textdagger}{\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}%
+ {\textsection\textsection}{\mathsection\mathsection}%
+ {\textparagraph\textparagraph}{\mathparagraph\mathparagraph}%
+ {\textasteriskcentered\textasteriskcentered\textasteriskcentered}{***}%
+ {\textdagger\textdagger\textdagger}{\dagger\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger\ddagger}%
+ {\textsection\textsection\textsection}%%
+ {\mathsection\mathsection\mathsection}%
+ {\textparagraph\textparagraph\textparagraph}%%
+ {\mathparagraph\mathparagraph\mathparagraph}%
+}
+\setfnsymbol{lamport*}
+\DefineFNsymbolsTM{lamport*-robust}{%
+ \textasteriskcentered *%
+ \textdagger \dagger
+ \textdaggerdbl \ddagger
+ \textsection \mathsection
+ \textparagraph \mathparagraph
+ \textbardbl \|%
+ {\textasteriskcentered\textasteriskcentered}{**}%
+ {\textdagger\textdagger}{\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}%
+ {\textsection\textsection}{\mathsection\mathsection}%
+ {\textparagraph\textparagraph}{\mathparagraph\mathparagraph}%
+ {\textasteriskcentered\textasteriskcentered\textasteriskcentered}{***}%
+ {\textdagger\textdagger\textdagger}{\dagger\dagger\dagger}%
+ {\textdaggerdbl\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger\ddagger}%
+ {\textsection\textsection\textsection}%%
+ {\mathsection\mathsection\mathsection}%
+ {\textparagraph\textparagraph\textparagraph}%%
+ {\mathparagraph\mathparagraph\mathparagraph}%
+}
+\newcommand\mpfootnotemark{%
+ \@ifnextchar[%
+ \@xmpfootnotemark
+ {%
+ \stepcounter\@mpfn
+ \protected@xdef\@thefnmark{\thempfn}%
+ \@footnotemark
+ }%
+}
+\def\@xmpfootnotemark[#1]{%
+ \begingroup
+ \csname c@\@mpfn\endcsname #1\relax
+ \unrestored@protected@xdef\@thefnmark{\thempfn}%
+ \endgroup
+ \@footnotemark
+}
+% \end{macrocode}
+% TEMP PATCHES FOR TESTING
+% \begin{macrocode}
+
+\endinput
+%</footmisc>
+% \end{macrocode}
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-footnotes.pdf b/macros/latex/required/latex-lab/latex-lab-footnotes.pdf
new file mode 100644
index 0000000000..2e35bfb74e
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-footnotes.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/latex-lab-new-or.dtx b/macros/latex/required/latex-lab/latex-lab-new-or.dtx
new file mode 100644
index 0000000000..08b58a7286
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-new-or.dtx
@@ -0,0 +1,545 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-new-or.dtx
+% Copyright (C) 2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-new-or.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \title{The \texttt{latex-lab-new-or} code\thanks{}}
+% \author{Frank Mittelbach, \LaTeX{} Project}
+%
+% \maketitle
+%
+% \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}}
+% \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}}
+% \providecommand\pkg[1]{\texttt{#1}}
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% This code implements changes to the output routine.
+%
+%
+%
+%
+% \section{Hooks and configuration points}
+%
+% Note: the configuration points do not have an interface mechanism
+% yet and all their names are temporary right now.
+%
+%
+% \subsubsection{Configuration points}
+%
+% To cater for different layouts with respect to text, footnotes,
+% and bottom-floats placements there are two configuration points for
+% now.
+% \begin{description}
+% \item[\cs{@makecol@cfgpoint} (0 arguments)]
+%
+% In this configuration point the \cs{@outputbox} (holding the
+% galley text for the current column or page) is augmented by
+% attaching floats and footnote areas together with appropriate
+% spacing. Before the code is run any existing glue at the bottom
+% of the \cs{@outputbox} is removed and stored in a safe
+% place. If needed, it can be reinserted with one of the helper
+% commands.
+%
+% To support setting this up the following helper commands are available:
+% \begin{description}
+% \item[\cs{@outputbox@append} (1 argument)]
+%
+% This general purpose command alters the \cs{@outputbox} box by
+% appending material to it.
+%
+% \item[\cs{@outputbox@appendfootnotes} (0 arguments)]
+%
+% This command appends the footnotes to the \cs{@outputbox} (if
+% there are any). If not, then it does nothing.
+%
+% \item[\cs{@outputbox@attachfloats} (0 arguments)]
+% \item[\cs{@outputbox@attachtopfloats} (0 arguments)]
+% \item[\cs{@outputbox@attachbottomfloats} (0 arguments)]
+%
+% Attaching top and bottom floats can usually be done in one
+% go, but for special layouts we might want more control so we
+% provide also separate commands.
+%
+% \item[\cs{@outputbox@reinsertbskip} (0 arguments)]
+%
+% Reinsert the bottom skip of the \cs{@outputbox} that was
+% saved before.
+%
+% \item[Testing for existence of material]
+%
+% There are a number of helpers to run conditional code
+% depending on whether or not there are footnotes or bottom
+% floats. They are \cs{@if@footnotes@TF} and
+% \cs{@if@bfloats@TF}
+% (names are likely to change).
+%
+% \end{description}
+% This configuration point needs an appropriate definition; a
+% default is already given in the kernel.
+%
+% \item[\cs{@makecol@cfgpointii} (0 arguments)]
+%
+% This configuration point is used to manipulate the footnote
+% material inside \cs{box}\cs{footins}. It if contains code, it
+% is supposed to do some processing of that box and then write
+% the result back into it (and nothing else!). By default it
+% does nothing.
+%
+% \end{description}
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+% \begin{macrocode}
+%<*code>
+% \end{macrocode}
+%
+% \subsection{File declaration}
+% \begin{macrocode}
+\ProvidesFile{latex-lab-new-or.ltx}
+ [2022-03-09 v0.1b changes to the output routine]
+% \end{macrocode}
+% \subsection{\cs{@makecol} reimplementation}
+%
+% In order for other packages to prepend or append code to
+% \cs{@makecol}, they can use the generic command hooks
+% \texttt{cmd/@makecol/before} and \texttt{cmd/@makecol/after}, so
+% there is nothing we need to do here.
+%
+%
+% \begin{macro}{\@makecol}
+% \cs{@makecol} is shortened a lot, basically all the hardwired
+% code in the middle has moved into a configuration point.
+% \begin{macrocode}
+\def \@makecol {%
+ \@kernel@before@cclv
+ \setbox\@outputbox \box\@cclv
+% \end{macrocode}
+% The only real addition is the next command which either does
+% nothing or removes an infinite glue from the bottom of the
+% \cs{@outputbox}.
+% \begin{macrocode}
+ \@outputbox@removebskip
+% \end{macrocode}
+% Any ``here'' floats in the \cs{@outputbox} are now handled so we
+% recycle their registers and put them back to the \cs{@freelist}.
+% \begin{macrocode}
+ \let\@elt\relax
+ \xdef\@freelist{\@freelist\@midlist}%
+ \global \let \@midlist \@empty
+% \end{macrocode}
+% Here we have the configurable part.
+% \fmi{Interface to configuration points will change in the future}
+% \begin{macrocode}
+ \@makecol@cfgpoint
+% \end{macrocode}
+% The we deal with any \cs{enlargethispage} or run the normal code
+% to build a column.
+% \begin{macrocode}
+ \ifvbox\@kludgeins
+ \@makespecialcolbox
+ \else
+ \@makenormalcolbox
+ \fi
+ \global \maxdepth \@maxdepth
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@outputbox@depth}
+% We need to know the depth of \cs{@outputbox} once in a
+% while. Rather than using a temp dimen (as it was done in the
+% past), we give it a proper register.
+% \begin{macrocode}
+\newdimen\@outputbox@depth
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makenormalcolbox}
+% Taken out of \cs{@makecol} for readability.
+% \begin{macrocode}
+\def \@makenormalcolbox {%
+ \setbox\@outputbox \vbox to\@colht {%
+ \@texttop
+ \@outputbox@depth \dp\@outputbox
+ \unvbox \@outputbox
+ \vskip -\@outputbox@depth
+ \@textbottom
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@makespecialcolbox}
+% Make the colbox when \cs{enlargethispage} was used.
+% \begin{macrocode}
+\def \@makespecialcolbox {%
+ \@outputbox@append {\vskip-\@outputbox@depth}%
+ \@tempdima \@colht
+ \ifdim \wd\@kludgeins>\z@
+ \advance \@tempdima -\ht\@outputbox
+ \advance \@tempdima \pageshrink
+ \setbox\@outputbox \vbox to \@colht {%
+ \unvbox\@outputbox
+ \vskip \@tempdima
+ \@textbottom
+ }%
+ \else
+ \advance \@tempdima -\ht\@kludgeins
+ \setbox \@outputbox \vbox to \@colht {%
+ \vbox to \@tempdima {%
+ \unvbox\@outputbox
+ \@textbottom}%
+ \vss}%
+ \fi
+ {\setbox \@tempboxa \box \@kludgeins}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@outputbox@removebskip}
+%
+% This is really a bug fix for the kernel but one we only
+% automatically make in new documents using \cs{DocumentMetadata}.
+% \fmi{may make optional for legacy docs}
+% If
+% \cs{raggedbottom} is in force, footnotes get attached to the main
+% galley at a distance of \cs{footskip} on all pages except on
+% those that are ended by \cs{newpage} or \cs{clearpage} where the
+% \cs{vfil} from \cs{newpage} pushes the footnotes to the very bottom.
+%
+% This is kind of a weird difference to a page ending with
+% \cs{pagebreak}---in that case the page is also run
+% short, but the footnotes are not pushed to the bottom.
+%
+% In \pkg{footmisc} \cs{@outputbox@removebskip} is only applied when
+% \pkg{footmisc} is called with with an option specifying the
+% footnote placement, i.e., not in the default case.
+% In new documents we apply it always.
+% \begin{macrocode}
+\def\@outputbox@removebskip{%
+% \end{macrocode}
+% We first test if we are in a \cs{raggedbottom} layout. If not we
+% do nothing, but we don't disable the code because
+% \cs{raggedbottom} may get used only for some parts of the
+% document.
+% \begin{macrocode}
+ \ifx\@textbottom\relax \else
+% \end{macrocode}
+% We then append some negative glue at the end of \cs{@outputbox}
+% provided it has a glue stretch order of 1 or more (i.e., contains
+% a \texttt{fil} or \texttt{fill} part).
+% \begin{macrocode}
+ \@outputbox@append{%
+ \@tempskipa\lastskip
+ \ifnum \gluestretchorder\@tempskipa>\z@
+ \vskip-\@tempskipa
+% \end{macrocode}
+% \begin{macro}{\@outputbox@reinsertbskip}
+% We also record the value so that it can be reinserted
+% elsewhere. As we have to do this globally, we also need to
+% explicitly reset it if we don't find any such glue.
+% \begin{macrocode}
+ \xdef\@outputbox@reinsertbskip
+ {\noexpand\@outputbox@append{\vskip\the\@tempskipa}}%
+ \else
+ \global\let\@outputbox@reinsertbskip\relax
+ \fi
+ }%
+ \fi
+}
+% \end{macrocode}
+% We need a trivial top-level definition for
+% \cs{@outputbox@reinsertbskip} in case the first page has no
+% bottom glue and the command gets called.
+% \begin{macrocode}
+\let\@outputbox@reinsertbskip\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@kernel@before@cclv}
+% \begin{macro}{\@kernel@before@footins}
+% These two commands are internal kernel hooks intended for tagging
+% support in case that is active. By default they do nothing (and
+% may have been defined already by \cs{DocumentMetadata}).
+% \begin{macrocode}
+\providecommand\@kernel@before@cclv{}
+\providecommand\@kernel@before@footins{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{The output routine configuration components}
+%
+% Here we provide the components that are used to define
+% \cs{@makecol@cfgpoint}.
+%
+%
+% \begin{macro}{\@outputbox@append}
+%
+% This general purpose command alters the \cs{@outputbox} box by
+% appending material to it. As this is a box typesetting operation
+% we make sure that the last line of the box reflects the true
+% depth of the last line (in case that is needed later). We also
+% expose the current depth of \cs{@outputbox} as
+% \cs{@outputbox@depth} before unboxing so that its value can be
+% used by \verb=#1= if wanted.
+% \begin{macrocode}
+\def\@outputbox@append #1{%
+% \if!\detokenize{#1}!\else
+ \setbox\@outputbox \vbox {%
+ \boxmaxdepth \@maxdepth
+ \@outputbox@depth\dp\@outputbox % if needed in #1
+ \unvbox \@outputbox
+ #1%
+ }%
+% \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{\@outputbox@appendfootnotes}
+%
+% This command appends the footnotes to the \cs{@outputbox} (if
+% there are any). If not then it does nothing.
+% \begin{macrocode}
+\def\@outputbox@appendfootnotes {%
+ \ifvoid\footins \else
+% \end{macrocode}
+% First come two configuration points: what to do if we are in a split
+% footnote situation and a second one that does some manipulation
+% of the \cs{footins} box before it gets appended.
+% \fmi{this code will get revised as part of CP handling in the future}
+% \begin{macrocode}
+ \@makecol@handlesplitfootnotes
+ \@makecol@cfgpointii
+% \end{macrocode}
+% Then the footnotes are appended:
+% \begin{macrocode}
+ \@outputbox@append{%
+ \vskip \skip\footins
+ \@kernel@before@footins
+ \color@begingroup
+ \normalcolor
+ \footnoterule
+% \end{macrocode}
+% Support for \pkg{pdfcolfoot}, eventually this can go once color
+% is properly supported.
+% \begin{macrocode}
+ \csname pdfcolfoot@current\endcsname
+ \unvbox \footins
+ \color@endgroup
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@outputbox@attachfloats}
+% \begin{macro}{\@outputbox@attachtopfloats}
+% \begin{macro}{\@outputbox@attachbottomfloats}
+% Attaching top and bottom floats can usually be done in one go,
+% but for special layouts we might want more control so we provide
+% also separate commands.
+% \begin{macrocode}
+\let \@outputbox@attachfloats \@combinefloats
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def \@outputbox@attachtopfloats {%
+ \ifx \@toplist\@empty \else \@cflt \fi
+}
+\def \@outputbox@attachbottomfloats {%
+ \ifx \@botlist\@empty \else \@cflb \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@makecol@handlesplitfootnotes}
+% \begin{macro}{\@makecol@splitfootnotemessagehook}
+% This is only an early draft and doesn't do much.
+% Contains incomplete preparation for tagging commented out.
+% \fmi{Interfaces and code will change in the future}
+% \begin{macrocode}
+\def\@makecol@handlesplitfootnotes {%
+% \ifx\splitfootnote@continuation\@empty \else
+% \setbox\footins\vbox{\splitfootnote@continuation\unvbox\footins}%
+% \global\let\splitfootnote@continuation\@empty
+% \fi
+ \ifnum\insertpenalties>\z@
+ \@makecol@splitfootnotemessagehook
+% \setbox\footins\vbox{\unvbox\footins --- END at split}%
+% \gdef\splitfootnote@continuation {--- START after split}%
+ \fi
+}
+%\def\splitfootnote@continuation{}
+% \end{macrocode}
+% This could issue warning if split footnotes are encountered.
+% \begin{macrocode}
+\let \@makecol@splitfootnotemessagehook \@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@makecol@cfgpointii}
+%
+% Configuration point to support manipulation of footins box
+% (result needs to be moved back in there). Used by the
+% \texttt{para} option.
+% \fmi{Interface will change in the future}
+% \begin{macrocode}
+\let \@makecol@cfgpointii \@empty
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+%
+% \fmi{Some temp interfaces until configuration points are available.}
+%
+% \begin{macro}{\@if@flushbottom@TF}
+% Test for \cs{flushbottom} (currently not used).
+% \begin{macrocode}
+\def\@if@flushbottom@TF{%
+ \ifx\@textbottom\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@if@footnotes@TF}
+% Test if footnotes are present on the current page.
+% \begin{macrocode}
+\def\@if@footnotes@TF{%
+ \ifvoid\footins
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@if@bfloats@TF}
+% Test if bottom floats are around.
+% \begin{macrocode}
+\def\@if@bfloats@TF{%
+ \ifx \@botlist\@empty
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{The \cs{@makecol} configuration}
+%
+%
+% \begin{macro}{\@makecol@cfgpoint}
+%
+% Here is only the configuration for the default case for now,
+% others are provided by \pkg{footmisc}.
+%
+% \begin{macrocode}
+ \def\@makecol@cfgpoint {%
+ \@outputbox@appendfootnotes
+ \@outputbox@attachfloats
+% \end{macrocode}
+% We do, however, reinsert the bottom skip from \cs{newpage} if it
+% was taken out earlier. This is, strictly speaking, not necessary
+% in most cases, but it is a \cs{vfil} while \cs{raggedbottom} is
+% only generating \verb=\vspace{0pt plus .0001fil}=, so if you have
+% several \cs{vfil} on the page before the \cs{newpage} you would
+% alter the space distribution if one is taken out.
+% \begin{macrocode}
+ \@outputbox@reinsertbskip
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section {Replacement for the \pkg{footmisc} package}
+%
+% The replacement for \pkg{footmisc}. If the new code is used, we must replace
+% the package if it is loaded by the user:
+% \begin{macrocode}
+\declare@file@substitution{footmisc.sty}{latex-lab-footmisc.ltx}
+% \end{macrocode}
+%
+%
+%
+% \section {Temp stuff that is related but should go to the kernel}
+%
+% \begin{macrocode}
+\input{latex-lab-footnotes.ltx}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</code>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-new-or.pdf b/macros/latex/required/latex-lab/latex-lab-new-or.pdf
new file mode 100644
index 0000000000..ad45673c55
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-new-or.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/latex-lab-testphase.dtx b/macros/latex/required/latex-lab/latex-lab-testphase.dtx
new file mode 100644
index 0000000000..d8d9c671c3
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-testphase.dtx
@@ -0,0 +1,84 @@
+% \iffalse meta-comment
+%
+%% File: latex-lab-testphase.dtx
+% Copyright (C) 2021-2022 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/latex3/latex2e/required/latex-lab
+%
+% for those people who are interested or want to report an issue.
+%
+%<*driver>
+\documentclass{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex-lab-testphase.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+
+% \title{The \texttt{latex-lab-testphase} code\thanks{}}
+% \author{Ulrike Fischer \LaTeX{} Project}
+%
+% \maketitle
+%
+%
+% \begin{abstract}
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% This code implements small files which can be loaded with the |testphase|
+% key of \cs{DocumentMetadata}. This will be extended to allow user to load
+% well defined parts of the tagged PDF project.
+% Currently the values |phase-I|, |phase-II| and |new-or| are provided.
+% |tagpdf| is an undocumented alias for |phase-II| which is kept for compability.
+%
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+% New output routine code is loaded in phase-II and new-or:
+% \begin{macrocode}
+%<*tagpdf|phase-II|new-or>
+\IfFileExists{latex-lab-testphase-new-or.sty}
+ {
+ \RequirePackage{latex-lab-testphase-new-or}
+ }
+ {}
+%</tagpdf|phase-II|new-or>
+% \end{macrocode}
+% \begin{macrocode}
+%<*tagpdf|phase-I|phase-II>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{tagpdf}
+\AddToDocumentProperties [document]{testphase/tagpdf}{loaded}
+%</tagpdf|phase-I|phase-II>
+%<tagpdf|phase-II>\tagpdfsetup{activate,paratagging,interwordspace}
+%<phase-I>\tagpdfsetup{activate,interwordspace}
+%<*tagpdf|phase-I|phase-II>
+\AddToDocumentProperties [document]{tagging}{active}
+\AddToDocumentProperties [document]{tagging/para}{active}
+\AddToDocumentProperties [document]{tagging/interwordspace}{active}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</tagpdf|phase-I|phase-II>
+% \end{macrocode}
+% \Finale
+%
diff --git a/macros/latex/required/latex-lab/latex-lab-testphase.pdf b/macros/latex/required/latex-lab/latex-lab-testphase.pdf
new file mode 100644
index 0000000000..6ab6a28554
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab-testphase.pdf
Binary files differ
diff --git a/macros/latex/required/latex-lab/latex-lab.ins b/macros/latex/required/latex-lab/latex-lab.ins
new file mode 100644
index 0000000000..bc668a71e1
--- /dev/null
+++ b/macros/latex/required/latex-lab/latex-lab.ins
@@ -0,0 +1,82 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the dtx file(s) in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 2021-2022 The LaTeX Project
+%%
+%%
+%% This file is part of the `LaTeX-lab Bundle' for LaTeX.
+%% -------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% In particular, NO PERMISSION is granted to modify the contents of this
+%% file since it contains the legal notices that are placed in the files
+%% it generates.
+%%
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/contrib/latex-lab}
+
+\preamble
+
+This is a generated file.
+
+Copyright 2021,2022 LaTeX Project
+
+This file was generated from file(s) of the `LaTeX-lab Bundle'.
+------------------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle'
+without such generated files.
+
+The newest sources can be found below
+
+ https://github.com/latex3/latex2e/required/latex-lab
+
+where one can also log issues in case there are any.
+
+
+\endpreamble
+
+
+\generate{\file{documentmetadata-support.ltx}{\from{documentmetadata-support.dtx}{code}}}
+
+% files that should be loadable with the testphase key should use the naming scheme
+% #1-latex-lab-testphase.ltx
+\generate{\file{phase-I-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{phase-I}}}
+\generate{\file{phase-II-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{phase-II}}}
+
+\generate{\file{tagpdf-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{tagpdf}}}
+\generate{\file{new-or-latex-lab-testphase.ltx}{\from{latex-lab-testphase.dtx}{new-or}}}
+
+% support files (the new-or code is a private package to make life easier)
+
+\generate{\file{latex-lab-testphase-new-or.sty}{\from{latex-lab-new-or.dtx}{code}}}
+\generate{\file{latex-lab-footmisc.ltx}{\from{latex-lab-footnotes.dtx}{footmisc}}}
+\generate{\file{latex-lab-footnotes.ltx}{\from{latex-lab-footnotes.dtx}{kernel}}}
+
+
+\endbatchfile
diff --git a/macros/latex/required/latex-lab/usage-of-@footnotemark.txt b/macros/latex/required/latex-lab/usage-of-@footnotemark.txt
new file mode 100644
index 0000000000..684a695faa
--- /dev/null
+++ b/macros/latex/required/latex-lab/usage-of-@footnotemark.txt
@@ -0,0 +1,186 @@
+% packages that alter \@footnotemark ...
+
+
+% bibarts
+
+\let\ba@footnmark=\@footnotemark
+\def\@footnotemark{\ifhmode{\nobreak \hskip 0.04em plus 0.01em}\else\leavevmode\fi\ba@footnmark}%
+
+
+% ./bxjscls/bxjsja-minimal.def
+
+\def\bxjs@cjk@loaded{%
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \ifdim\lastkern>\z@\ifdim\lastkern<5sp\relax
+ \unkern\unkern
+ \ifdim\lastskip>\z@ \unskip \fi
+ \fi\fi
+ \nobreak
+ \fi
+ \@makefnmark
+ \ifhmode \spacefactor\@x@sf \fi
+ \relax}%
+ \let\bxjs@cjk@loaded\relax
+}
+
+% ./arabtex/afoot.sty
+
+\let \a@@footnotemark \@footnotemark
+
+\def \a@footnotemark {% inside Arabic environment
+\iftrans \unskip \unskip \nobreak \@makefnmark \fi
+\ifarab \a@spacefalse \putwordb@x \@makefnmark \a@spacetrue \fi }
+
+% ./hyperref/hyperref.sty
+
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+ \stepcounter{Hfootnote}%
+ \global\let\Hy@saved@currentHref\@currentHref
+ \hyper@makecurrent{Hfootnote}%
+ \global\let\Hy@footnote@currentHref\@currentHref
+ \global\let\@currentHref\Hy@saved@currentHref
+ \hyper@linkstart{link}{\Hy@footnote@currentHref}%
+ \@makefnmark
+ \hyper@linkend
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }%
+
+
+% ./hypdvips/hypdvips.sty
+
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+ \stepcounter{Hfootnote}%
+ \global\let\Hy@saved@currentHref\@currentHref
+ \hyper@makecurrent{Hfootnote}%
+ \global\let\Hy@footnote@currentHref\@currentHref
+ \global\let\@currentHref\Hy@saved@currentHref
+ \ifHy@draft%
+ \@makefnmark%
+ \else%
+ \pp@hyperfootnote%
+ \fi%
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }
+
+ \newcommand{\pp@hyperfootnote}{%
+ \ifx\pp@activerect\pp@true%
+ \@makefnmark%
+ \else%
+ \ifpp@smallfootnotes%
+ \let\pp@backup@@thefnmark\@thefnmark%
+ \renewcommand{\@thefnmark}{\pdf@rect{\pp@backup@@thefnmark}}%
+ \Hy@colorlink\@footnotecolor%
+ \@makefnmark%
+ \Hy@endcolorlink%
+ \pdfmark{%
+ pdfmark=/ANN,%
+ linktype=footnote,%
+ Subtype=/Link,%
+ AcroHighlight=\@pdfhighlight,%
+ Border=\@pdfborder,%
+ BorderStyle=\@pdfborderstyle,%
+ Color=\@footnotebordercolor,%
+ Dest=\Hy@footnote@currentHref,%
+ Raw=H.B%
+ }%
+ \let\@thefnmark\pp@backup@@thefnmark%
+ \else%
+ \pdfmark[\@makefnmark]{%
+ pdfmark=/ANN,%
+ linktype=footnote,%
+ Subtype=/Link,%
+ AcroHighlight=\@pdfhighlight,%
+ Border=\@pdfborder,%
+ BorderStyle=\@pdfborderstyle,%
+ Color=\@footnotebordercolor,%
+ Dest=\Hy@footnote@currentHref%
+ }%
+ \fi%
+ \fi%
+ }
+
+
+% ./memoir/memhfixc.sty
+
+\ifHy@hyperfootnotes
+ \def\@footnotemark{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}%
+ \m@mmf@check% <--- added
+ \nobreak\fi
+ \stepcounter{Hfootnote}%
+ \global\let\Hy@saved@currentHref\@currentHref
+ \hyper@makecurrent{Hfootnote}%
+ \global\let\Hy@footnote@currentHref\@currentHref
+ \global\let\@currentHref\Hy@saved@currentHref
+ \hyper@linkstart{link}{\Hy@footnote@currentHref}%
+ \@makefnmark
+ \hyper@linkend
+ \m@mmf@prepare% <--- added
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }%
+\fi
+
+
+% caption3.sty
+
+% this is altering the top-level when inside a float
+
+
+% ./koma-script/scrlttr2.cls
+
+\newcommand*{\scr@footnotemark}{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\FN@mf@check\nobreak\fi
+ \@makefnmark
+ \csname FN@mf@prepare\endcsname
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}
+
+% tested against this ...
+
+\newcommand*{\scr@saved@footnotemark}{%
+ \leavevmode
+ \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
+ \@makefnmark
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax}
+
+
+% ./chextras/chextras.sty
+
+\ifstd@notes\else
+ \let\std@footnotemark\@footnotemark
+ \def\alt@footnotemark{\unskip\thinspace\std@footnotemark}
+ \let\@footnotemark\alt@footnotemark
+
+% footmisx.sty
+
+ \newcommand*\@footmisxnotemark{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}%
+ \FN@mf@check
+ \nobreak
+ \fi
+ \@footmicx@makefnmark
+ \ifFN@pp@towrite
+ \FN@pp@writetemp
+ \FN@pp@towritefalse
+ \fi
+ \FN@mf@prepare
+ \ifhmode\spacefactor\@x@sf\fi
+ \relax
+ }
+
+
diff --git a/macros/latex/required/latex-lab/usage-of-@footnotetext.txt b/macros/latex/required/latex-lab/usage-of-@footnotetext.txt
new file mode 100644
index 0000000000..48a3172843
--- /dev/null
+++ b/macros/latex/required/latex-lab/usage-of-@footnotetext.txt
@@ -0,0 +1,842 @@
+
+% ./bibarts/bibarts.sty
+
+\let\ba@footnotetext=\@footnotetext
+\long\def\@footnotetext#1{\ba@footnotetext{%
+ \global\let\thisto@ba=-%
+ \global\let\thisti@ba=-%
+ \global\let\thisp@ba=-%
+ \global\let\thisvol@ba=-%
+ \global\let\thiss@ba=-%
+ \global\let\thisn@ba=-%
+ \global\let\pos@ba=0%
+ \kern 0.1em\nulskip@ba{\@footnotetrue\ignorespaces
+ #1\nulskip@ba\ba@textmode}\global\let\lastto@ba=\thisto@ba
+ \global\let\lastti@ba=\thisti@ba
+ \global\let\lastp@ba=\thisp@ba
+ \global\let\lastvol@ba=\thisvol@ba
+ \global\let\lasts@ba=\thiss@ba
+ \global\let\lastn@ba=\thisn@ba}}%
+
+
+% ./fnbreak/fnbreak.sty
+
+ \let\fnb@orig@footnotetext\@footnotetext
+ \long\def\@footnotetext#1{\fnb@orig@footnotetext{\fnb@fnstart#1\fnb@fnend}}%
+
+
+% ./revtex4-1/revtex4-1.cls ./revtex/ltxutil.sty ./revtex/revtex4-2.cls ...
+
+\long\def\@footnotetext{%
+ \insert\footins\bgroup
+ \make@footnotetext
+}%
+\long\def\@mpfootnotetext{%
+ \minipagefootnote@pick
+ \make@footnotetext
+}%
+\long\def\make@footnotetext#1{%
+ \set@footnotefont
+ \set@footnotewidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@\@mpfn\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1%
+ \@finalstrut\strutbox\vadjust{\vskip\z@skip}%
+ }%
+ \color@endgroup
+ \minipagefootnote@drop
+}%
+
+
+% ./nrc/nrc1.cls ./nrc/nrc2.cls
+
+% this is missing the \par at the end and \@currentcounter
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \reset@font\smallt
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox
+ }%
+ \color@endgroup
+ }%
+}%
+
+%-------------------------------------
+
+% ./bigfoot/bigfoot.sty
+
+ \def\@footnotetext{\Footnotetextdefault{}}%
+
+%-------------------------------------
+
+
+% ./uafthesis/uafthesis.cls
+
+% this is missing the \par at the end and \@currentcounter
+
+%% this little gem provides for single-spaced footnotes
+\long\def\@footnotetext#1{\insert\footins{%
+ \ssp
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
+ {\rule{\z@}{\footnotesep}\ignorespaces
+ #1\strut}}}
+
+%-------------------------------------
+
+
+
+% ./resphilosophica/resphilosophica.cls
+
+% I wonder if this \, is really intended below ...
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \normalfont\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM \hsize\columnwidth
+ \@parboxrestore \parindent\normalparindent \sloppy
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{%
+ \,\rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}}
+
+%-------------------------------------
+
+
+
+% ./setspace/setspace.sty
+
+% this is missing the \par at the end and \@currentcounter
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+% GT: Next line added. Hook desired here!
+ \def\baselinestretch {\setspace@singlespace}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+%-------------------------------------
+
+
+
+% ./linguex/linguex.sty
+
+
+\let\predefinedfootnotetext=\@footnotetext
+\long\def\@footnotetext#1{\@noftnotefalse\predefinedfootnotetext{#1}%
+ \@noftnotetrue}
+
+
+%-------------------------------------
+
+
+% ./fnpara/fnpara.sty
+
+\long\def\@footnotetext#1{\insert\footins{%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \setbox0=\hbox{%
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox
+ \penalty -10
+ \hskip\footglue
+ }%
+ }%
+ \dp0=0pt \ht0=\fudgefactor\wd0 \box0
+ \color@endgroup}}
+
+%-------------------------------------
+
+
+% ./footmisc/footmisc.sty (para option)
+
+% this is missing the \par at the end and \@currentcounter
+
+ \long\def\FN@footnotetext#1{%
+ \insert\footins{%
+ \ifFN@setspace
+ \let\baselinestretch\FN@baselinestretch
+ \fi
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \setbox\FN@tempboxa\hbox{%
+ \@makefntext{\ignorespaces#1\strut
+ \penalty-10\relax
+ \hskip\footglue
+ }% end of \@makefntext parameter
+ }% end of \hbox
+ \dp\FN@tempboxa\z@
+ \ht\FN@tempboxa\dimexpr\wd\FN@tempboxa *%
+ \footnotebaselineskip / \columnwidth\relax
+ \box\FN@tempboxa
+ \color@endgroup
+ }%
+ \FN@mf@prepare
+ }
+
+%-------------------------------------
+
+
+% ./footmisc/footmisc.sty (normal)
+
+% this is missing the \par at the end and \@currentcounter
+
+ \long\def\FN@footnotetext#1{%
+ \insert\footins{%
+ \ifFN@setspace
+ \let\baselinestretch\FN@baselinestretch
+ \fi
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep
+ \ignorespaces#1\@finalstrut\strutbox
+ }%
+ \color@endgroup
+ }%
+ \FN@mf@prepare
+ }%
+
+
+
+%-------------------------------------
+
+
+% ./footmisc/footmisc.sty (side option)
+
+ \long\def\FN@footnotetext#1{%
+ \marginpar{%
+ \ifFN@setspace
+ \let\baselinestretch\FN@baselinestretch
+ \fi
+ \reset@font\footnotesize
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \ignorespaces#1%
+ }%
+ \color@endgroup
+ }%
+ \FN@mf@prepare
+ }%
+
+
+
+%-------------------------------------
+
+
+
+% ./bxjscls/bxjsarticle.cls ./bxjscls/bxjsbook.cls ...
+
+\long\def\@footnotetext{%
+ \insert\footins\bgroup
+ \normalfont\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces}%
+ \futurelet\jsc@next\jsc@fo@t}
+\def\jsc@fo@t{\ifcat\bgroup\noexpand\jsc@next \let\jsc@next\jsc@f@@t
+ \else \let\jsc@next\jsc@f@t\fi \jsc@next}
+\def\jsc@f@@t{\bgroup\aftergroup\jsc@@foot\let\jsc@next}
+\def\jsc@f@t#1{#1\jsc@@foot}
+\def\jsc@@foot{\@finalstrut\strutbox\color@endgroup\egroup
+ \ifx\pltx@foot@penalty\@undefined\else
+ \ifhmode\null\fi
+ \ifnum\pltx@foot@penalty=\z@\else
+ \penalty\pltx@foot@penalty
+ \pltx@foot@penalty\z@
+ \fi
+ \fi}
+
+
+not covered so far supports \footnote{ catcode changes ...} but also
+\foonote A --- the latter is questionable I would say
+
+
+%-------------------------------------
+
+
+% ./fn2end/fn2end.sty
+
+obsolete I guess, ignored in evaluation
+
+
+%-------------------------------------
+
+
+% ./hyperref/hyperref.sty
+
+ \long\def\@footnotetext#1{%
+ \H@@footnotetext{%
+ \ifHy@nesting
+ \expandafter\ltx@firstoftwo
+ \else
+ \expandafter\ltx@secondoftwo
+ \fi
+ {%
+ \expandafter\hyper@@anchor\expandafter{%
+ \Hy@footnote@currentHref
+ }{\ignorespaces #1}%
+ }{%
+ \Hy@raisedlink{%
+ \expandafter\hyper@@anchor\expandafter{%
+ \Hy@footnote@currentHref
+ }{\relax}%
+ }%
+ \let\@currentHref\Hy@footnote@currentHref
+ \let\@currentlabelname\@empty
+ \ignorespaces #1%
+ }%
+ }%
+ }%
+
+
+Handling of anchors (in nested context) I guess. This needs to be
+married with the anchor setting that the tagging currently does and
+the latter improved/adjusted
+
+
+%-------------------------------------
+
+% ./biblatex-gb7714-2015/gb7714-2015ms.bbx ./biblatex-gb7714-2015/gb7714-2015mx.bbx ...
+
+ \long\def\@footnotetext##1{\insert\footins{%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \leftskip \footbibmargin%增加的左侧缩进
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces##1\@finalstrut\strutbox%
+ }%
+ \color@endgroup}}%
+
+fits the structure
+%-------------------------------------
+
+
+% ./amscls/amsbook.cls ./amscls/amsproc.cls ./amscls/amsart.cls ...
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \normalfont\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep \splitmaxdepth \dp\strutbox
+ \floatingpenalty\@MM \hsize\columnwidth
+ \@parboxrestore \parindent\normalparindent \sloppy
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\unskip\strut\par}}}
+
+fits the structure
+%-------------------------------------
+
+
+% ./umich-thesis/umich-thesis.cls
+
+% change LaTeX's footnotes to get vertical spacing correct
+\skip\footins \baselinestretch2\skip\footins
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \def\baselinestretch {\setspace@singlespace}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \vskip 1.2\baselineskip
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+fits the structure
+%-------------------------------------
+
+
+% ./nostarch/nostarch.cls
+
+\long\def\@footnotetext#1{\insert\footins{%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@{13.5pt}\ignorespaces#1}%
+ \color@endgroup}}%
+
+fixed \footsep, probably very old
+fits the structure
+%-------------------------------------
+
+
+
+% ./coursepaper/coursepaper.cls
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \def\baselinestretch {1}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./ucthesis/ucthesis.cls
+
+% Single-space footnotes.
+\long\def\@footnotetext#1{\insert\footins{\ssp\reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
+ {\rule{\z@}{\footnotesep}\ignorespaces
+ #1\strut}}}
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./jura/jura.cls
+
+\long\def\@footnotetext#1{\insert\footins{%
+ \linespread{\J@FootnoteSpread}\reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}%
+
+fits the structure
+%-------------------------------------
+
+
+% ./asaetr/asaesub.sty
+
+2.09
+
+%-------------------------------------
+
+
+% ./lineno/fnlineno.sty
+
+%% |\FNLN@@text| stores the `\@footnotetext' found,
+%% we might check if it is `\FNLN@ltx@fntext' ... %% TODO
+\let\FNLN@@text\@footnotetext
+\def\@footnotetext{%
+ \ifLineNumbers \expandafter \FNLN@text
+ \else \expandafter \FNLN@@text
+ \fi}
+
+
+\def \FNLN@text {% %% 2010/12/31 arg read later
+ \vadjust{\penalty-\FNLN@M@swap@codepen}%
+%% Standard \LaTeX's `\@footnotetext' expands `\@thefnmark'
+%% to produce the footnote mark at the page bottom,
+%% right after it has been determined for the mark
+%% in the main text. \emph{Here} the footnote text
+%% will be typeset only when \emph{other} footnote marks
+%% may have been formed for typesetting the main text
+%% paragraph before.
+%% %%% (TODO clearer wording)
+%% In the \strong{footnote list}
+%% macro |\FNLN@list|, the (\dqtd{`&\protect'ed})
+%% \emph{current} expansion <mark> of `\@thefnmark'
+%% is stored as an item preceding the footnote text
+%% <text>. One footnote entry in `\FNLN@list'
+%% thus has the form \lq`<mark>\@lt<text>\@lt'\rq.
+%% \LaTeX's internal `\g@addto@macro' is used to \emph{append}
+%% an entry to the list (at the right). The OTR will later
+%% take the entries from the left of the list.
+%%
+%% The argument of the auxiliary/temporary `\@tempa'
+%% will contain the footnote text and thus must be able to
+%% carry `\par' tokens. We therefore need a `\long' version of
+%% `\protected@edef':
+ \let\@@protect\protect
+ \let\protect\@unexpandable@protect
+ \afterassignment\restore@protect
+ \long \edef \@tempa ##1{%
+ \noexpand\g@addto@macro \noexpand\FNLN@list {%
+ \@thefnmark \noexpand\@lt ##1\noexpand \@lt}}%
+%% ... issuing
+%% \lq`\g@addto@macro\FNLN@list{<mark>\elt<text>\@lt}'\rq\ ...
+ \@tempa %% reads arg
+}
+%% Here we initialize |\FNLN@list|:
+\let\FNLN@list\@empty
+
+
+
+probably continues working but needs separate checking
+
+%-------------------------------------
+
+
+
+% ./jurabib/jurabib.sty
+
+ \long\def\@footnotetext#1{%
+ \Orig@tabularx@footnotetext{%
+ \jb@fntrue
+ #1%
+ \setcounter{jb@cites@in@footnote}{0}%
+ }%
+ }%
+
+ \let\jbsaved@footnotetext\@footnotetext
+ \long\def\@footnotetext#1{%
+ \begingroup
+ \jb@fntrue
+ \jbsaved@footnotetext{#1}%
+ \setcounter{jb@cites@in@footnote}{0}%
+ \endgroup
+ }%
+
+
+first is table notes, second
+fits the structure
+%-------------------------------------
+
+
+
+% ./york-thesis/york-thesis.cls
+
+\long\def\@footnotetext#1{%
+ \insert\footins{%
+ \def\baselinestretch {1}%
+ \reset@font\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark}%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+
+fits the structure
+%-------------------------------------
+
+
+% ./ucdavisthesis/ucdavisthesis.cls
+
+\long\def\@footnotetext#1{\insert\footins{\renewcommand\baselinestretch{1}
+ \footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
+ {\rule{\z@}{\footnotesep}\ignorespaces
+ #1\strut}\renewcommand\baselinestretch{\@spacing}}}
+
+looks old ...
+fits the structure
+%-------------------------------------
+
+
+% ./ledmac/afoot.sty
+
+fairly old and buggy in some aspects
+
+%%% Make the LaTeX \cs{footnote} catcode-safe, like in Plain TeX.
+
+\def \@footnotetext {% new, do not yet read footnote text
+ \insert \footins \bgroup
+ \ifx \footglue \undefined % prepare normal footnote
+ \interlinepenalty \interfootnotelinepenalty \floatingpenalty \@MM
+ \splittopskip \footnotesep \splitmaxdepth \dp \strutbox
+ \else
+ \global\long\def \@makefntext ##1{{$^{\@thefnmark }$}##1\nobreak }%
+ \setbox0=\hbox \bgroup % fnpara.sty is present
+ \floatingpenalty=20000 \footnotesize
+ \fi
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \a@fntext }
+
+
+%-------------------------------------
+
+
+% ./toptesi/toptesi.sty
+
+
+\long\def\@footnotetext#1{\insert\footins{\linespread{1}\footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
+ \hsize\columnwidth \@parboxrestore
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{\rule{\z@}{\footnotesep}\ignorespaces#1\strut}}}
+
+
+fits the structure
+%-------------------------------------
+
+
+% ./gb4e/gb4e.sty
+
+\let\@gbsaved@footnotetext=\@footnotetext
+\long\def\@footnotetext#1{%
+ \@noftnotefalse\setcounter{fnx}{0}%
+ \@gbsaved@footnotetext{#1}%
+ \@noftnotetrue}
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./koma-script/scrlttr2.cls ./koma-script/scrextend.sty ./koma-script/scrreprt.cls ...
+
+same bug as footmisc: the @prepare is in the wrong place
+
+fits the structure
+%-------------------------------------
+
+
+
+% ./tabu/tabu.sty
+
+not checked what that does
+
+
+%-------------------------------------
+
+
+% ./uwthesis/uwthesis.cls
+
+does chapter notes -- ignore for now
+
+%-------------------------------------
+
+
+% ./tools/multicol.sty
+
+\long\def\mult@footnotetext#1{\begingroup
+ \columnwidth\textwidth
+ \orig@footnotetext{#1}\endgroup}
+
+
+fits the structure, but need to think what makes sense here as this a
+temporary redefinition for the environment only
+
+%-------------------------------------
+
+
+% ./fancyvrb/fancyvrb.sty
+
+\long\def\V@footnotetext{%
+ \afterassignment\V@@footnotetext
+ \let\@tempa}
+\def\V@@footnotetext{%
+ \insert\footins\bgroup
+ \csname reset@font\endcsname
+ \footnotesize
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\footnotesep
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty \@MM
+ \hsize\columnwidth
+ \@parboxrestore
+ \def\@currentcounter{footnote}%
+ \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
+ \@makefntext{}%
+ \rule{\z@}{\footnotesep}%
+ \bgroup
+ \aftergroup\V@@@footnotetext
+ \ignorespaces}
+\def\V@@@footnotetext{\strut\egroup}
+
+
+another one of the footnote commands that do not read they argument as an argument
+
+%-------------------------------------
+
+
+% ./savefnmark/savefnmark.sty
+
+obsolete
+
+%-------------------------------------
+
+
+% ./changebar/changebar.sty
+
+\let\ltx@footnotetext\@footnotetext
+\long\def\cb@footnotetext#1{%
+ \cb@trace@stack{end footnote on page \the\c@page}%
+ \cb@pop\cb@currentstack
+ \ifnum\cb@topleft=\cb@nil
+ \ltx@footnotetext{#1}%
+ \else
+ \cb@push\cb@currentstack
+ \edef\cb@temp{\the\cb@curbarwd}%
+ \ltx@footnotetext{\cb@start[\cb@temp]#1\cb@end}%
+ \fi}
+\let\@footnotetext\cb@footnotetext
+
+
+% ./eledmac/eledmac.sty
+
+\apptocmd{\@footnotetext}{\m@mmf@prepare}{}{}
+\pretocmd{\@footnotetext}{%
+ \ifnumberedpar@
+ \edtext{}{\l@dbfnote{#1}}%
+ \else
+ }{}{}
+\apptocmd{\@footnotetext}{\fi}{}{}%
+
+
+% ./yafoot/dblfnote.sty
+
+\long\def\dfn@footnotetext#1{{\setbox\dfn@boxa\vbox{
+ \let\insert\dfn@gobble
+ \columnwidth\DFNcolumnwidth \hbadness\c@DFNsloppiness
+ \def\@makefnmark{\smash{\dfn@makefnmark}}
+ \dfn@latex@footnotetext{#1}\par \boxmaxdepth\dfn@fnmaxdp}%
+ \dfn@dima\ht\dfn@boxa \advance\dfn@dima\dp\dfn@boxa
+ \ifdim\dfn@dima>\z@\else
+ \dfn@dima1sp\relax
+ \setbox\dfn@boxa\vbox{\vbox to1sp{\unvbox\dfn@boxa\vfil}}\fi
+ \global\setbox\dfn@ins\vbox{\boxmaxdepth\dfn@fnmaxdp
+ \ifvoid\dfn@ins\else
+ \unvbox\dfn@ins \allowbreak \nointerlineskip \fi
+ \ifdfn@allowcbreak \unvbox \else \box \fi \dfn@boxa}%
+ \setbox\dfn@boxa\copy\dfn@ins
+ \dfn@split{.5\ht\dfn@boxa}\dfn@boxa\dfn@boxb\dfn@fnmaxdp\footnotesep
+ \advance\@tempdima\@tempdimb \@tempdimb\@tempdima
+ \advance\@tempdima-\dfn@fnht \global\dfn@fnht\@tempdimb
+ \insert\footins{\floatingpenalty\@MM \vbox to\@tempdima{}}%
+ \xdef\dfn@list{\dfn@list\@elt{\number\dfn@dima}{\number\@tempdima}}}}
+\let\dfn@latex@footnotetext\@footnotetext
+\let\@footnotetext\dfn@footnotetext
+
+
+% ./ftnxtra/ftnxtra.sty
+
+not checked what this does
+
+
+% ./acmart/acmart.cls
+
+\if@ACM@sigchiamode
+\long\def\@footnotetext#1{\marginpar{%
+ \reset@font\small
+ \interlinepenalty\interfootnotelinepenalty
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}%
+\fi
+
+
+% ./memoir/memoir.cls
+
+ this needs some further analysis
+
diff --git a/macros/latex/required/latex-lab/usage-of-kern-kern.txt b/macros/latex/required/latex-lab/usage-of-kern-kern.txt
new file mode 100644
index 0000000000..e119197b70
--- /dev/null
+++ b/macros/latex/required/latex-lab/usage-of-kern-kern.txt
@@ -0,0 +1,80 @@
+
+ \ifdim\lastkern>\z@\ifdim\lastkern<5sp\relax
+./bxjscls/bxjsja-minimal.def
+
+
+
+ \ifdim\lastkern=-3sp \unkern
+ \ifdim\lastkern=3sp \kern-3sp
+ {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}%
+./microtype/letterspace.sty
+
+
+ \ifdim\lastkern=-3sp \unkern
+ \ifdim\lastkern=3sp \kern-3sp
+ {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}%
+./microtype/microtype-pdftex.def
+
+
+ \ifdim\lastkern=-3sp \unkern
+ \ifdim\lastkern=3sp \kern-3sp
+ {\kern\MT@outer@kern\kern3sp\kern-3sp\relax}%
+./microtype/microtype-luatex.def
+
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./eledmac/eledmac.sty
+
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./reledmac/reledmac.sty
+
+
+\edef\CJK@kern{\kern -2sp\kern 2sp}
+\edef\CJK@CJK{\kern -1sp\kern 1sp}
+./cjk/texinput/CJK.sty
+
+
+\edef\ruby@kern{\kern -5sp\kern 5sp}
+./cjk/texinput/ruby.sty
+
+
+% hyphenation between pinyin syllables. Values 1sp-3sp are already used
+\edef\py@sp{\kern -4sp\kern 4sp}
+./cjk/texinput/pinyin.sty
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./tufte-latex/tufte-common.def
+
+
+
+\newcommand*{\multiplefootnotemarker}{3sp}
+./memoir/memoir.cls
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./parnotes/parnotes.sty
+
+
+\providecommand*{\multiplefootnotemarker}{3sp}
+./lwarp/lwarp-footmisc.sty
+
+
+ \bgroup \kern-3sp\kern3sp % kerns so I can test for beginning of list
+./examdesign/examdesign.cls
+
+
+ \kern-1sp \kern1sp }
+ \kern-2sp \kern2sp }
+ \kern-3sp \kern3sp }
+ \kern-4sp \kern4sp }
+./polyglossia/gloss-korean.ldf
+
+
+
+\NewDocumentCommand \@sidenotes@multisign { } {3sp}
+./sidenotes/sidenotes.sty
+
diff --git a/macros/latex/required/tools/README.md b/macros/latex/required/tools/README.md
index cad662ebb1..5c8ee4cc31 100644
--- a/macros/latex/required/tools/README.md
+++ b/macros/latex/required/tools/README.md
@@ -1,7 +1,7 @@
The LaTeX `tools` bundle
========================
-Release 2021-11-15
+Release 2022-06-01
Overview
--------
@@ -51,4 +51,4 @@ of the package.
-----
-<p>Copyright (C) 1993-2021 The LaTeX Project <br />
+<p>Copyright (C) 1993-2022 The LaTeX Project <br />
diff --git a/macros/latex/required/tools/afterpage.dtx b/macros/latex/required/tools/afterpage.dtx
index e5fa69f515..cf949c0aca 100644
--- a/macros/latex/required/tools/afterpage.dtx
+++ b/macros/latex/required/tools/afterpage.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -101,7 +101,7 @@
% on a new page.
% \end{enumerate}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macrocode}
%<*package>
diff --git a/macros/latex/required/tools/afterpage.ins b/macros/latex/required/tools/afterpage.ins
index 0cfc531f19..3aa1679f77 100644
--- a/macros/latex/required/tools/afterpage.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/required/tools/afterpage.pdf b/macros/latex/required/tools/afterpage.pdf
index 305337ebc1..d9e5b6285f 100644
--- a/macros/latex/required/tools/afterpage.pdf
+++ b/macros/latex/required/tools/afterpage.pdf
Binary files differ
diff --git a/macros/latex/required/tools/array.dtx b/macros/latex/required/tools/array.dtx
index ba88aba7c2..c9f77d77a3 100644
--- a/macros/latex/required/tools/array.dtx
+++ b/macros/latex/required/tools/array.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -33,7 +33,7 @@
%<+package>\DeclareCurrentRelease{}{2020-10-01}
%<+package>
%<+package>\ProvidesPackage{array}
-%<+package> [2021/10/04 v2.5f Tabular extension package (FMi)]
+%<+package> [2022/03/10 v2.5f Tabular extension package (FMi)]
%
% \fi
%
@@ -753,7 +753,7 @@
%
% \changes{v2.2b}{1994/02/04}{Removed interactive prompt}
%
-% \StopEventually{
+% \MaybeStop{
%
%
% \begin{thebibliography}{1}
@@ -773,7 +773,7 @@
% Addison-Wesley, Reading, Massachusetts, 1986.
% \end{thebibliography}
%
-% } ^^A end of \StopEventually
+% } ^^A end of \MaybeStop
%
%
%
@@ -890,8 +890,8 @@
% c & 0 & 0 \\
% l & 0 & 1 \\
% r & 0 & 2 \\
-% p-arg & 0 & 3 \\
-% t-arg & 0 & 4 \\
+% m-arg & 0 & 3 \\
+% p-arg & 0 & 4 \\
% b-arg & 0 & 5 \\
% | & 1 & 0 \\
% !-arg & 1 & 1 \\
@@ -907,8 +907,8 @@
% @ & 7 & --- \\
% < & 8 & --- \\
% > & 9 & --- \\
-% p & 10 & 3 \\
-% t & 10 & 4 \\
+% m & 10 & 3 \\
+% p & 10 & 4 \\
% b & 10 & 5
% \end{tabular}
% \end{center}
diff --git a/macros/latex/required/tools/array.pdf b/macros/latex/required/tools/array.pdf
index b53441748b..6059b098ca 100644
--- a/macros/latex/required/tools/array.pdf
+++ b/macros/latex/required/tools/array.pdf
Binary files differ
diff --git a/macros/latex/required/tools/bm.dtx b/macros/latex/required/tools/bm.dtx
index 2b56b92b54..daf4dce66b 100644
--- a/macros/latex/required/tools/bm.dtx
+++ b/macros/latex/required/tools/bm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% 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
+%% Copyright 1996 1997 1998 1999 2002 2003 2004 2016 2017 2019 2021 2022
%% 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}
- [2021/04/25 v1.2e Bold Symbol Support (DPC/FMi)]
+ [2022/01/05 v1.2f Bold Symbol Support (DPC/FMi)]
%
% \iffalse
%<*driver>
@@ -312,7 +312,7 @@
% the package option |nopbm| is available which prevents its use in which case |\bm| will
% use the non-bold for characters from the affected font,
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Implementation}
%
@@ -839,9 +839,12 @@
\unvcopy{\GenericError{##1}{##2}{##3}{##4}}}%
% \end{macrocode}
% For AMS definitions.
+% \changes{v1.2f}{2022/01/05}
+% {Guard \cs{nolimits@}, gh/744}
% \begin{macrocode}
\let\DN@\copy
\let\FN@\copy
+ \let\nolimits@\copy
\let\next@\copy
\global\let\bm@first\@empty
% \end{macrocode}
@@ -1016,7 +1019,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\bm@end}
+% \begin{macro}[outer]{\bm@end}
% \changes{v0.10}{1997/01/04}
% {Macro added}
% Normally speaking |\outer| declarations should be avoided at all
diff --git a/macros/latex/required/tools/bm.ins b/macros/latex/required/tools/bm.ins
index c00a3e5cca..51243a6090 100644
--- a/macros/latex/required/tools/bm.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/required/tools/bm.pdf b/macros/latex/required/tools/bm.pdf
index 676814876a..bac5c04169 100644
--- a/macros/latex/required/tools/bm.pdf
+++ b/macros/latex/required/tools/bm.pdf
Binary files differ
diff --git a/macros/latex/required/tools/calc.dtx b/macros/latex/required/tools/calc.dtx
index 78b6167fe6..97ef72e7b9 100644
--- a/macros/latex/required/tools/calc.dtx
+++ b/macros/latex/required/tools/calc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -425,7 +425,7 @@
% syntax characters.
%
%
-% \StopEventually{
+% \MaybeStop{
% \begin{thebibliography}{1}
% \bibitem{texbook}
% \textsc{D. E. Knuth}.
diff --git a/macros/latex/required/tools/calc.pdf b/macros/latex/required/tools/calc.pdf
index 27edf27493..1d82f19254 100644
--- a/macros/latex/required/tools/calc.pdf
+++ b/macros/latex/required/tools/calc.pdf
Binary files differ
diff --git a/macros/latex/required/tools/changes.txt b/macros/latex/required/tools/changes.txt
index 43464f8b24..689d3f4369 100644
--- a/macros/latex/required/tools/changes.txt
+++ b/macros/latex/required/tools/changes.txt
@@ -10,6 +10,32 @@ All changes above are only part of the development branch for the next release.
================================================================================
#########################
+# 2022-06-01 Release
+#########################
+
+2022-04-12 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
+
+ * showkeys.dtx: Adapt to starred references, update varioref support.
+ Added rollback to 2014-10-28
+
+2022-01-05 David Carlisle <David.Carlisle@latex-project.org>
+
+ * bm.dtx: Guard \nolimits@ for gh issue 744
+
+2021-12-05 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx (subsection{Manual column breaking} \label{sec:colbreak}):
+ Added a missing guard in \newcolumn -- it only worked in hmode (sx/624940)
+
+2021-11-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: Added rollback to v1.8 (2019-10-01 release)
+
+2021-11-18 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * All *.dtx: Replaced \StopEventually by \MaybeStop
+
+#########################
# 2021-11-15 Release
#########################
@@ -87,7 +113,7 @@ All changes above are only part of the development branch for the next release.
2021-03-28 David Carlisle <David.Carlisle@latex-project.org>
* longtable.dtx: \reset@font in captions gh/133
-
+
* longtable.dtx: Allow paragraphs in footnotes gh/364
2021-03-10 Johannes Braams <Johannes.Braams@latex-project.org>
@@ -1903,4 +1929,3 @@ Wed Jul 10 11:15:30 1996 David Carlisle <carlisle@cs.man.ac.uk>
Changed driver code slightly.
Moved the driver code in front so that the documentation can be
processed by simply running the file through LaTeX2e.
-
diff --git a/macros/latex/required/tools/dcolumn.dtx b/macros/latex/required/tools/dcolumn.dtx
index 069e633221..7415e23752 100644
--- a/macros/latex/required/tools/dcolumn.dtx
+++ b/macros/latex/required/tools/dcolumn.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -191,7 +191,7 @@
% "D{+}{\,\pm\,}{3,3}" will give nice, symmetric layout of up to three
% digits on either side of a $\pm$ sign.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{The Macros}
diff --git a/macros/latex/required/tools/dcolumn.pdf b/macros/latex/required/tools/dcolumn.pdf
index 8b5ed07f9e..ae58873898 100644
--- a/macros/latex/required/tools/dcolumn.pdf
+++ b/macros/latex/required/tools/dcolumn.pdf
Binary files differ
diff --git a/macros/latex/required/tools/delarray.dtx b/macros/latex/required/tools/delarray.dtx
index cc503707b0..d8aba52f32 100644
--- a/macros/latex/required/tools/delarray.dtx
+++ b/macros/latex/required/tools/delarray.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -100,7 +100,7 @@
% \end{verbatim}
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Macros}
%
diff --git a/macros/latex/required/tools/delarray.pdf b/macros/latex/required/tools/delarray.pdf
index e166deaf34..5b38f447a9 100644
--- a/macros/latex/required/tools/delarray.pdf
+++ b/macros/latex/required/tools/delarray.pdf
Binary files differ
diff --git a/macros/latex/required/tools/enumerate.dtx b/macros/latex/required/tools/enumerate.dtx
index 150a7386b8..89910438e9 100644
--- a/macros/latex/required/tools/enumerate.dtx
+++ b/macros/latex/required/tools/enumerate.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -122,7 +122,7 @@
% |\ref{LA}|, |\ref{LB}| and |\ref{LC}| produce
% `\ref{LA}', `\ref{LB}' and `\ref{LC}' respectively.
%
-% \StopEventually{}
+% \MaybeStop{}
%
%\section{Macros}
%
diff --git a/macros/latex/required/tools/enumerate.pdf b/macros/latex/required/tools/enumerate.pdf
index f9c8f07850..6ea6e1d4d6 100644
--- a/macros/latex/required/tools/enumerate.pdf
+++ b/macros/latex/required/tools/enumerate.pdf
Binary files differ
diff --git a/macros/latex/required/tools/fileerr.dtx b/macros/latex/required/tools/fileerr.dtx
index d916304116..59c1bbbbec 100644
--- a/macros/latex/required/tools/fileerr.dtx
+++ b/macros/latex/required/tools/fileerr.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -51,7 +51,7 @@
% \par After installing these files the user can respond with
% |h|, |q|, |r|, |s|, |e|, |x|, and on some systems also with
% \meta{return} to \TeX's missing file name question.
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The documentation driver}
% This code will generate the documentation. Since it is the
diff --git a/macros/latex/required/tools/fileerr.pdf b/macros/latex/required/tools/fileerr.pdf
index 3ae0da8810..7507c3009b 100644
--- a/macros/latex/required/tools/fileerr.pdf
+++ b/macros/latex/required/tools/fileerr.pdf
Binary files differ
diff --git a/macros/latex/required/tools/fontsmpl.dtx b/macros/latex/required/tools/fontsmpl.dtx
index b720826773..de2b55a608 100644
--- a/macros/latex/required/tools/fontsmpl.dtx
+++ b/macros/latex/required/tools/fontsmpl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -70,7 +70,7 @@
% The |fontsmpl| document prompts interactively for a font family (for
% example `|cmr|') and produces a sample of that family.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Documentation}
%
diff --git a/macros/latex/required/tools/fontsmpl.pdf b/macros/latex/required/tools/fontsmpl.pdf
index 5a4123dfc5..0ee42b5913 100644
--- a/macros/latex/required/tools/fontsmpl.pdf
+++ b/macros/latex/required/tools/fontsmpl.pdf
Binary files differ
diff --git a/macros/latex/required/tools/ftnright.dtx b/macros/latex/required/tools/ftnright.dtx
index e8da56aa20..1a7f7f584f 100644
--- a/macros/latex/required/tools/ftnright.dtx
+++ b/macros/latex/required/tools/ftnright.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -292,7 +292,7 @@
% worth of footnote material and that means that some of your footnotes are
% likely to be detached from their reference and show up on a later page!
%
-% \StopEventually{
+% \MaybeStop{
%
% \begin{small}
% \begin{thebibliography}{1}
diff --git a/macros/latex/required/tools/ftnright.pdf b/macros/latex/required/tools/ftnright.pdf
index e98cb88633..1085686752 100644
--- a/macros/latex/required/tools/ftnright.pdf
+++ b/macros/latex/required/tools/ftnright.pdf
Binary files differ
diff --git a/macros/latex/required/tools/hhline.dtx b/macros/latex/required/tools/hhline.dtx
index 98d6802451..74143d1373 100644
--- a/macros/latex/required/tools/hhline.dtx
+++ b/macros/latex/required/tools/hhline.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -148,7 +148,7 @@
% program, or if this is not possible, increasing "\arrayrulewidth"
% may help to reduce the effect.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Macros}
%
diff --git a/macros/latex/required/tools/hhline.pdf b/macros/latex/required/tools/hhline.pdf
index 188fd037f7..47076e83e9 100644
--- a/macros/latex/required/tools/hhline.pdf
+++ b/macros/latex/required/tools/hhline.pdf
Binary files differ
diff --git a/macros/latex/required/tools/indentfirst.dtx b/macros/latex/required/tools/indentfirst.dtx
index e54df284ae..dff777d29d 100644
--- a/macros/latex/required/tools/indentfirst.dtx
+++ b/macros/latex/required/tools/indentfirst.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -59,7 +59,7 @@
%
% \CheckSum{4}^^A Still I think a record:-)
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \begin{macro}{\if@afterindent}
% \LaTeX\ uses the switch |\if@afterindent| to decide whether to indent
diff --git a/macros/latex/required/tools/indentfirst.pdf b/macros/latex/required/tools/indentfirst.pdf
index f6460af970..dbc58d7de9 100644
--- a/macros/latex/required/tools/indentfirst.pdf
+++ b/macros/latex/required/tools/indentfirst.pdf
Binary files differ
diff --git a/macros/latex/required/tools/layout.dtx b/macros/latex/required/tools/layout.dtx
index de61aeae8c..323705e9ba 100644
--- a/macros/latex/required/tools/layout.dtx
+++ b/macros/latex/required/tools/layout.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -92,7 +92,7 @@
% \layout
% \end{figure}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The implementation}
%
diff --git a/macros/latex/required/tools/layout.pdf b/macros/latex/required/tools/layout.pdf
index 153ffc0a8a..911f310408 100644
--- a/macros/latex/required/tools/layout.pdf
+++ b/macros/latex/required/tools/layout.pdf
Binary files differ
diff --git a/macros/latex/required/tools/longtable.dtx b/macros/latex/required/tools/longtable.dtx
index b66aef075e..72b8727d81 100644
--- a/macros/latex/required/tools/longtable.dtx
+++ b/macros/latex/required/tools/longtable.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -770,7 +770,7 @@
% \end{verbatim}
% \endgroup
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \finalclearpage
% \section{The Macros}
diff --git a/macros/latex/required/tools/longtable.ins b/macros/latex/required/tools/longtable.ins
index 92a04e00d4..7f53df7c5e 100644
--- a/macros/latex/required/tools/longtable.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/required/tools/longtable.pdf b/macros/latex/required/tools/longtable.pdf
index 77ab8c2bbc..009110e47c 100644
--- a/macros/latex/required/tools/longtable.pdf
+++ b/macros/latex/required/tools/longtable.pdf
Binary files differ
diff --git a/macros/latex/required/tools/multicol-2019-10-01.sty b/macros/latex/required/tools/multicol-2019-10-01.sty
new file mode 100644
index 0000000000..221f62f68e
--- /dev/null
+++ b/macros/latex/required/tools/multicol-2019-10-01.sty
@@ -0,0 +1,1105 @@
+%% This is a rollback file for multicol to the last version within release 2019-10-01
+%% =======================
+%%
+%%
+%% This is file `multicol.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% multicol.dtx (with options: `package,badness,check,marktrace,nobalance')
+%%
+%% 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-2021
+%% 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 `multicol' to use with LaTeX2e
+%% Copyright 1989-2019 Frank Mittelbach
+%%
+%% In addition to the terms of LPPL any distributed version
+%% (unchanged or modified) of multicol has to keep the statement
+%% about the moral obligation for using multicol. In case of major
+%% changes where this would not be appropriate the author of the
+%% changed version should contact the copyright holder.
+%%
+%%
+%% Moral obligation for using multicol:
+%% ------------------------------------
+%%
+%% Users of multicol who wish to include or use multicol or a modified
+%% version in a proprietary and commercially market product are asked
+%% under certain conditions (see below) for the payment of a license
+%% fee. The size of this fee is to be determined, in each instance,
+%% by the commercial user, depending on his/her judgment of the value of
+%% multicol for his/her product.
+%%
+%%
+%% The conditions for this are as follows:
+%%
+%% The producer of a proprietary and commercially market product
+%% that involves typesetting using multicol is asked to determine
+%% the value of a license fee for using multicol if
+%%
+%% - the product is a document and the producer has decided to
+%% include multicol to typeset (parts of) the document or has
+%% directed the author of the document to include multicol (for
+%% example, by providing a class file to be used by the author)
+%%
+%% - the product is a LaTeX class or package that includes multicol
+%%
+%%
+%% There is no moral obligation in case
+%%
+%% - the product is a document but producer has not directed
+%% the author to include multicol (in that case the moral obligation
+%% lies with the author of the document)
+%%
+%% - the product does not involve typesetting, e.g., consists, for
+%% example, of distributing multicol and its documentation.
+%%
+%% - the product is not proprietary, i.e., is made available as free
+%% software itself (which doesn't prohibit its commercial marketing)
+%%
+%% - multicol is used for non-commercial purposes
+%%
+%%
+%% Determining a license fee might result in a license fee of zero
+%% (i.e., no payment) in case a producer has determined that the use
+%% of multicol has no enhancing effect on the product. This is a
+%% plausible scenario, i.e., in the above two cases the producer is
+%% only asked to evaluate the value of multicol for the product
+%% not for the payment of a license fee per se (which might or might
+%% not follow from this evaluation).
+%%
+%% The license fee, if any, can be payed either to the LaTeX fund
+%% (see ltx3info.txt in the base LaTeX distribution) or to the author of
+%% the program who can be contacted at
+%%
+%% Frank.Mittelbach@latex-project.org
+%%
+\NeedsTeXFormat{LaTeX2e}[2018-04-01]
+
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+
+\DeclareRelease{}{2017-04-11}{multicol-2017-04-11.sty}
+\DeclareCurrentRelease{}{2018-04-01}
+
+\ProvidesPackage{multicol}
+ [2019/12/09 v1.8y multicolumn formatting (FMi)]
+%%
+\DeclareOption{twocolumn}
+ {\PackageWarning{multicol}{May not work
+ with the twocolumn option}}
+\newcount\c@tracingmulticols
+\DeclareOption{errorshow}
+ {\c@tracingmulticols\z@}
+\DeclareOption{infoshow}
+ {\c@tracingmulticols\@ne}
+\DeclareOption{balancingshow}
+ {\c@tracingmulticols\tw@}
+\DeclareOption{markshow}
+ {\c@tracingmulticols\thr@@}
+\DeclareOption{debugshow}
+ {\c@tracingmulticols5\relax}
+\let\mc@gridwarn\maxdimen
+\DeclareOption{grid}{\def\mc@gridwarn{\@maxdepth}}
+\DeclareOption{colaction}{%
+ \def\mc@col@status@write{%
+ \protected@write\@auxout{}%
+ {\string\mc@col@status
+ {\ifmc@firstcol 1\else 2\fi}}%
+ \mc@firstcolfalse}%
+ \def\mc@lastcol@status@write{%
+ \protected@write\@auxout{}%
+ {\string\mc@col@status{3}}}%
+}
+\let\mc@col@status@write\relax
+\let\mc@lastcol@status@write\relax
+\ProcessOptions
+\def\multicols#1{\col@number#1\relax
+ \ifnum\col@number<\tw@
+ \PackageWarning{multicol}%
+ {Using `\number\col@number'
+ columns doesn't seem a good idea.^^J
+ I therefore use two columns instead}%
+ \col@number\tw@ \fi
+ \ifnum\col@number>20
+ \PackageError{multicol}%
+ {Too many columns}%
+ {Current implementation doesn't
+ support more than 20 columns.%
+ \MessageBreak
+ I therefore use 20 columns instead}%
+ \col@number20 \fi
+ \ifx\@footnotetext\mult@footnotetext\else
+ \let\orig@footnotetext\@footnotetext
+ \let\@footnotetext\mult@footnotetext
+ \fi
+ \@ifnextchar[\mult@cols{\mult@cols[]}}
+\long\def\mult@footnotetext#1{\begingroup
+ \columnwidth\textwidth
+ \orig@footnotetext{#1}\endgroup}
+\def\mult@cols[#1]{\@ifnextchar[%
+ {\mult@@cols{#1}}%
+ {\mult@@cols{#1}[\premulticols]}}
+\def\mult@@cols#1[#2]{%
+ \par
+ \ifinner \@boxedmulticolstrue
+ \else
+ \ifnum \doublecol@number>\z@
+ \@boxedmulticolstrue
+ \fi
+ \fi
+ \mult@info\z@
+ {Starting environment with
+ \the\col@number\space columns%
+ \if@boxedmulticols\MessageBreak
+ (boxed mode)\fi
+ }%
+ \enough@room{#2}%
+ #1\par\addvspace\multicolsep
+ \ifdim \prevdepth = -\@m\p@
+ \else
+ \@tempcnta\prevdepth
+ \@tempcntb\baselineskip
+ \divide\@tempcnta\@tempcntb
+ \advance\@tempcnta\@ne
+ \dimen@\prevdepth
+ \advance\dimen@ -\@tempcnta\baselineskip
+ \advance\dimen@ \topskip
+ \kern-\dimen@
+ \fi
+ \begingroup
+ \prepare@multicols
+ \if@boxedmulticols
+ \setbox\mult@box\vbox\bgroup
+ \color@setgroup
+ \fi
+ \ignorespaces}
+\newif\if@boxedmulticols
+\@boxedmulticolsfalse
+\newbox\mult@box
+\def\enough@room#1{%
+ \if@boxedmulticols\else
+ \par
+ \bgroup\@nobreakfalse\addpenalty\z@\egroup
+ \page@free \pagegoal
+ \advance \page@free -\pagetotal
+ \@tempskipa#1\relax
+ \mult@info\z@
+ {Current page:\MessageBreak
+ height=%
+ \the\pagegoal: used \the\pagetotal
+ \space -> free=\the\page@free
+ \MessageBreak
+ needed \the\@tempskipa
+ \space(for #1)}%
+ \ifdim \page@free <#1\newpage \fi
+ \fi}
+\def\prepare@multicols{%
+ \multicol@leftmargin\@totalleftmargin
+ \@totalleftmargin\z@
+ \parshape\z@
+ \doublecol@number\col@number
+ \multiply\doublecol@number\tw@
+ \advance\doublecol@number\mult@rightbox
+ \if@boxedmulticols
+ \let\l@kept@firstmark\kept@firstmark
+ \let\l@kept@botmark\kept@botmark
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+ \else
+ \nointerlineskip {\topskip\z@\null}%
+ \output{%
+ \global\setbox\partial@page\vbox
+ {%
+ \ifvoid\partial@page\else
+ \PackageError{multicol}%
+ {Error saving partial page}%
+ {The part of the page before
+ the multicols environment was
+ nearly full with^^Jthe result
+ that starting the environment
+ will produce an overfull
+ page. Some^^Jtext may be lost!
+ Please increase \premulticols
+ either generally or for this%
+ ^^Jenvironment by specifying a
+ suitable value in the second
+ optional argument to^^Jthe
+ multicols environment.}
+ \unvbox\partial@page
+ \box\last@line
+ \fi
+ \unvbox\@cclv
+ \global\setbox\last@line\lastbox
+ }%
+ \prep@keptmarks
+ \global\let\kept@topmark\firstmark
+ }\eject
+ \advance\@colroom-\ht\partial@page
+ \set@mult@vsize\relax
+ \output{\multi@column@out}%
+ \init@mult@footins
+ \reinsert@footnotes
+ \def\clearpage{%
+ \ifx\@deferlist\@empty\else
+ \PackageError{multicol}%
+ {Deferred floats not cleared}%
+ {A \string\clearpage\space inside multicols acts like
+ \string\newpage\space and doesn't clear floats.\MessageBreak
+ Move it before the multicols environment if you need it.}%
+ \fi
+ \newpage}%
+ \fi
+ \vbadness\@Mi \hbadness5000
+ \tolerance\multicoltolerance
+ \pretolerance\multicolpretolerance
+ \setemergencystretch\col@number\hsize
+ \set@floatcmds
+ \advance\baselineskip\multicolbaselineskip
+ \hsize\linewidth \advance\hsize\columnsep
+ \advance\hsize-\col@number\columnsep
+ \divide\hsize\col@number
+ \full@width\linewidth
+ \linewidth\hsize
+ \columnwidth\hsize
+}
+\def\init@mult@footins{%
+ \multiply\count\footins\col@number
+ \multiply\skip \footins\col@number
+}
+\def\set@mult@vsize#1{%
+ \vsize\@colroom
+ \@tempdima\baselineskip
+ \advance\@tempdima-\topskip
+ \advance\vsize\@tempdima
+ \vsize\col@number\vsize
+ \advance\vsize-\@tempdima
+ \advance\vsize\col@number\baselineskip
+ #1\advance\vsize
+ \c@collectmore\baselineskip}
+\newdimen\multicol@leftmargin
+\mathchardef\@Mvi=10006 % 10005 is \columnbreak
+\def\endmulticols{\par
+ \if@boxedmulticols
+ \remove@discardable@items\color@endgroup\egroup
+ \balance@columns
+ \return@nonemptymark{first}%
+ \kept@firstmark
+ \return@nonemptymark{bot}%
+ \kept@botmark
+ \page@sofar
+ \global\let\kept@firstmark
+ \l@kept@firstmark
+ \global\let\kept@botmark
+ \l@kept@botmark
+ \mult@info\tw@
+ {Restore kept marks to\MessageBreak
+ first: \meaning\kept@firstmark
+ \MessageBreak bot\space\space:
+ \meaning\kept@botmark }%
+ \else
+ \ifdim\pagegoal=\maxdimen
+ \ifvoid\colbreak@box\else
+ \mult@info\@ne{Re-adding forced
+ break(s) for splitting}%
+ \unvbox\colbreak@box\fi
+ \fi
+ \penalty\z@
+ \penalty-\@Mvi
+ \ifvbox\partial@page
+ \unvbox\partial@page\fi
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+ \mult@info\tw@
+ {Make kept marks empty}%
+ \fi
+ \@checkend{multicols}%
+ \endgroup
+ \global\c@unbalance\z@
+ \if@boxedmulticols
+ \mc@col@status@write
+ \else
+ \reinsert@footnotes
+ \ifdim \pagegoal=\maxdimen
+ \global\vsize\@colroom
+ \else
+ \enough@room\postmulticols
+ \fi
+ \fi
+ \addvspace\multicolsep
+ \prevdepth\z@
+ \mult@info\z@
+ {Ending environment
+ \if@boxedmulticols
+ \space(boxed mode)\fi
+ }}
+\newcount\c@unbalance
+\newcount\c@collectmore
+\newcount\doublecol@number
+\newcount\multicoltolerance
+\newcount\multicolpretolerance
+\newdimen\full@width
+\newdimen\page@free
+\newdimen\premulticols
+\newdimen\postmulticols
+\newskip\multicolsep
+\newskip\multicolbaselineskip
+\newbox\partial@page
+\newbox\last@line
+\c@unbalance = 0
+\c@collectmore = 0
+\multicoltolerance = 9999
+\multicolpretolerance = -1
+\premulticols = 50pt
+\postmulticols= 20pt
+\multicolsep = 12pt plus 4pt minus 3pt
+\multicolbaselineskip=0pt
+\def\process@cols#1#2{\count@#1\relax
+ \loop
+ #2%
+ \advance\count@\tw@
+ \ifnum\count@<\doublecol@number
+ \repeat}
+\def\page@sofar{%
+ \process@cols\mult@rightbox
+ {\ifvoid\count@
+ \setbox\count@\hbox to\hsize{}%
+ \else
+ \wd\count@\hsize
+ \fi}%
+ \count@\col@number \advance\count@\m@ne
+ \mult@info\z@
+ {Column spec: \the\full@width\space = indent
+ + columns + sep =\MessageBreak
+ \the\multicol@leftmargin\space
+ + \the\col@number\space
+ x \the\hsize\space
+ + \the\count@\space
+ x \the\columnsep
+ }%
+\ifvmode\else\errmessage{Multicol Error}\fi
+ \nointerlineskip
+ \setbox\z@\hbox{p}\global\dimen\tw@\dp\z@
+ \moveright\multicol@leftmargin
+ \hbox to\full@width{%
+ \mc@align@columns
+ \rlap{\phantom p}%
+ }%
+ \prevdepth\z@
+ \kern-\dimen\tw@
+ \ifdim\dimen\tw@ > \mc@gridwarn
+ \PackageWarning{multicol}%
+ {Very deep columns!\MessageBreak
+ Grid alignment might be broken}%
+ \fi
+}
+\def\columnseprulecolor{\normalcolor}
+\def\reinsert@footnotes{\ifvoid\footins\else
+ \insert\footins{}\fi}
+\def\vfilmaxdepth{\vskip \z@ \@plus .0001fil
+ \@minus \@maxdepth}
+\def\multi@column@out{%
+ \ifnum\outputpenalty <-\@M
+ \speci@ls \else
+ \ifvoid\colbreak@box\else
+ \mult@info\@ne{Re-adding forced
+ break(s) for splitting}%
+ \setbox\@cclv\vbox{%
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \unvbox\@cclv}%
+ \fi
+ \splittopskip\topskip
+ \splitmaxdepth\@maxdepth
+ \boxmaxdepth\@maxdepth
+ \dimen@\@colroom
+ \divide\skip\footins\col@number
+ \ifvoid\footins \else
+ \leave@mult@footins
+ \fi
+
+ \ifvbox \@kludgeins
+ \advance \dimen@ -\ht\@kludgeins
+ \ifdim \wd\@kludgeins>\z@
+ \shr@nkingtrue
+ \fi
+ \fi
+ \process@cols\mult@gfirstbox{%
+ \setbox\count@
+ \vsplit\@cclv to\dimen@
+ \set@keptmarks
+ \setbox\count@
+ \vbox to\dimen@
+ {\unvbox\count@
+ \ifshr@nking\vfilmaxdepth\fi}%
+ }%
+ \setbox\mult@rightbox
+ \vsplit\@cclv to\dimen@
+ \set@keptmarks
+ \setbox\mult@rightbox\vbox to\dimen@
+ {\unvbox\mult@rightbox
+ \ifshr@nking\vfilmaxdepth\fi}%
+ \ifvoid\@cclv \else
+ \unvbox\@cclv
+ \ifnum\outputpenalty=\@M
+ \else
+ \penalty\outputpenalty
+ \fi
+ \ifvoid\footins\else
+ \PackageWarning{multicol}%
+ {I moved some lines to
+ the next page.\MessageBreak
+ Footnotes on page
+ \thepage\space might be wrong}%
+ \fi
+ \ifnum \c@tracingmulticols>\thr@@
+ \hrule\allowbreak \fi
+ \fi
+ \ifx\@empty\kept@firstmark
+ \let\firstmark\kept@topmark
+ \let\botmark\kept@topmark
+ \else
+ \let\firstmark\kept@firstmark
+ \let\botmark\kept@botmark
+ \fi
+ \let\topmark\kept@topmark
+ \mult@info\tw@
+ {Use kept top mark:\MessageBreak
+ \meaning\kept@topmark
+ \MessageBreak
+ Use kept first mark:\MessageBreak
+ \meaning\kept@firstmark
+ \MessageBreak
+ Use kept bot mark:\MessageBreak
+ \meaning\kept@botmark
+ \MessageBreak
+ Produce first mark:\MessageBreak
+ \meaning\firstmark
+ \MessageBreak
+ Produce bot mark:\MessageBreak
+ \meaning\botmark
+ \@gobbletwo}%
+ \boxmaxdepth\maxdimen
+ \setbox\@cclv\vbox{\unvbox\partial@page
+ \page@sofar}%
+ \@makecol\@outputpage
+ \global\let\kept@topmark\botmark
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+ \mult@info\tw@
+ {(Re)Init top mark:\MessageBreak
+ \meaning\kept@topmark
+ \@gobbletwo}%
+ \global\@colroom\@colht
+ \global \@mparbottom \z@
+ \global \@textfloatsheight \z@
+ \process@deferreds
+ \@whilesw\if@fcolmade\fi{\@outputpage
+ \global\@colroom\@colht
+ \process@deferreds}%
+ \mult@info\@ne
+ {Colroom:\MessageBreak
+ \the\@colht\space
+ after float space removed
+ = \the\@colroom \@gobble}%
+ \set@mult@vsize \global
+ \fi}
+\def\leave@mult@footins{%
+ \advance\dimen@-\skip\footins
+ \advance\dimen@-\ht\footins
+}
+\def\speci@ls{%
+ \ifnum\outputpenalty <-\@Mi
+ \ifnum \outputpenalty<-\@MM
+ \PackageError{multicol}{Document end
+ inside multicols environment}\@ehd
+ \@specialoutput
+ \else
+ \ifnum\outputpenalty = -\@Mv
+ \mult@info\@ne{Forced column
+ break seen}%
+ \global\advance\vsize-\pagetotal
+ \global\setbox\colbreak@box
+ \vbox{%
+ \ifvoid\colbreak@box
+ \else
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \fi
+ \boxmaxdepth\@maxdepth
+ \setbox\@cclv\vbox{%
+ \unvbox\@cclv
+ \remove@discardable@items}%
+ \dimen@\dp\@cclv
+ \unvbox\@cclv
+ \kern-\dimen@
+ }%
+ \reinsert@footnotes
+ \else
+ \ifnum\outputpenalty = -\@Mvi
+ \mult@info\@ne{End penalty of multicols seen}%
+ \outputpenalty\@M % pretend we had a natural forced break
+ \balance@columns@out
+ \else
+ \PackageWarningNoLine{multicol}%
+ {Floats and marginpars not
+ allowed inside `multicols'
+ environment!}%
+ \unvbox\@cclv\reinsert@footnotes
+ \xdef\@freelist{\@freelist\@currlist}%
+ \gdef\@currlist{}%
+ \fi
+ \fi
+ \fi
+ \else \@doclearpage \fi
+}
+\def\process@deferreds{%
+ \@floatplacement
+ \@tryfcolumn\@deferlist
+ \if@fcolmade\else
+ \begingroup
+ \let\@tempb\@deferlist
+ \gdef\@deferlist{}%
+ \let\@elt\@scolelt
+ \@tempb \endgroup
+ \fi}
+\newif\ifshr@nking
+\def\raggedcolumns{%
+ \@bsphack\shr@nkingtrue\@esphack}
+\def\flushcolumns{%
+ \@bsphack\shr@nkingfalse\@esphack}
+\def\balance@columns@out{%
+ \setbox\mult@box\vbox{%
+ \ifvoid\colbreak@box\else
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \mult@info\@ne{Re-adding
+ forced break(s) in balancing}%
+ \fi
+ \unvbox\@cclv
+ \remove@discardable@items
+ }%
+ \balance@columns
+ \iftoo@bad
+ \mult@info\@ne
+ {Balancing failed ...
+ cut a normal page}%
+ \setbox\@cclv\vbox
+ {\vskip\topskip
+ \vskip-\splittopskip
+ \unvbox\mult@box
+ \penalty-\@Mvi
+ }%
+ \multi@column@out
+ \else
+ \global\vsize\@colroom
+ \global\advance\vsize\ht\partial@page
+ \ifvbox\@kludgeins\insert\@kludgeins
+ {\unvbox\@kludgeins}\fi
+ \unvbox\partial@page
+ \return@nonemptymark{first}\kept@firstmark
+ \return@nonemptymark{bot}\kept@botmark
+ \page@sofar
+ \penalty\z@
+ \fi
+}
+\def\balance@columns{%
+ \get@keptmarks\mult@box
+ \setbox\mult@box\vbox{%
+ \penalty-\@M
+ \unvbox\mult@box
+ }%
+ \@tempdima\topskip
+ \splittopskip\@tempdima
+ \@plus\multicolundershoot
+ \@minus\multicolovershoot
+ \splitmaxdepth\@maxdepth
+ \boxmaxdepth\@maxdepth
+ \setbox\@tempboxa\vsplit\mult@box to\z@
+ \@tempdima\ht\mult@box
+ \advance\@tempdima\dp\mult@box
+ \divide\@tempdima\col@number
+ \count@\@tempdima
+ \divide\count@\baselineskip
+ \dimen@\count@\baselineskip
+ \advance\dimen@\topskip
+ \ifdim \dimen@ >\@tempdima
+ \advance\dimen@-\baselineskip
+ \fi
+ \@tempdima\dimexpr
+ \topskip +\c@minrows\baselineskip-\baselineskip\relax
+ \ifnum\dimen@<\@tempdima
+ \mult@info\@ne
+ {Start value
+ \the\dimen@ \space ->
+ \the\@tempdima \space (corrected for minrows)}%
+ \dimen@\@tempdima
+ \fi
+ \advance\dimen@\c@unbalance\baselineskip
+ \mult@info\@ne
+ {Balance columns\on@line:
+ \ifnum\c@unbalance=\z@\else
+ (off balance=\number\c@unbalance)\fi
+ \@gobbletwo}%
+ \ifnum\dimen@<\topskip
+ \mult@info\@ne
+ {Start value
+ \the\dimen@ \space ->
+ \the\topskip \space (corrected)}%
+ \dimen@\topskip
+ \fi
+ \vbadness\@M
+ \vfuzz \maxdimen
+ \last@try-\p@
+ \loop
+ {\process@cols\mult@grightbox
+ {\global\setbox\count@
+ \box\voidb@x}}%
+ \global\setbox\mult@grightbox
+ \copy\mult@box
+ \too@badfalse
+ \forcedbreak@leftoverfalse
+ {\process@cols\mult@firstbox{%
+ \global\setbox\count@
+ \vsplit\mult@grightbox to\dimen@
+ \global\setbox\count@
+ \vbox to\dimen@
+ {\unvbox\count@}%
+ \ifnum\c@tracingmulticols>\@ne
+ \@tempcnta\count@
+ \advance\@tempcnta-\mult@grightbox
+ \divide\@tempcnta \tw@
+ \message{^^JColumn
+ \number\@tempcnta\space
+ badness: \the\badness\space}%
+ \fi
+ \ifnum\badness>\c@columnbadness
+ \ifnum\c@tracingmulticols>\@ne
+ \message{too bad
+ (>\the\c@columnbadness)}%
+ \fi
+ \too@badtrue
+ \fi
+ }}%
+ \global\setbox\mult@grightbox
+ \vbox{\unvbox\mult@grightbox}%
+ \setbox\mult@nat@firstbox
+ \vbox{\unvcopy\mult@firstbox}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{^^JFirst column
+ = \the\dimen@\space
+ (\the\ht\mult@nat@firstbox)}\fi
+ \ifnum\c@tracingmulticols>\@ne
+ \message{<> last column =
+ \the\ht\mult@grightbox^^J}%
+ \fi
+ \ifdim\ht\mult@grightbox >\dimen@
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Rejected: last
+ column too large!}%
+ \fi
+ \else
+ \setbox\@tempboxa
+ \copy\mult@grightbox
+ \setbox\z@\vsplit\@tempboxa to\maxdimen
+ \ifvoid\@tempboxa
+ \global\setbox\mult@grightbox
+ \vbox to\dimen@
+ {\unvbox\mult@grightbox}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{Final badness:
+ \the\badness}%
+ \fi
+ \ifnum\badness>\c@finalcolumnbadness
+ \global\setbox\mult@grightbox
+ \vbox to\dimen@
+ {\unvbox\mult@grightbox\vfil}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{ setting natural
+ (> \the\c@finalcolumnbadness)}%
+ \fi
+ \fi
+ \else
+ \@tempdima\@colroom
+ \advance\@tempdima \maxbalancingoverflow
+ \ifdim \dimen@ < \@tempdima
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Rejected: unprocessed
+ forced break(s) in last column!}%
+ \fi
+ \else
+ \forcedbreak@leftovertrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Failed: columns too large
+ with unprocessed forced break(s)!}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifdim\ht\mult@nat@firstbox<\dimen@
+ \ifdim\ht\mult@nat@firstbox>\last@try
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Retry: using natural
+ height of first column!}%
+ \fi
+ \dimen@\ht\mult@nat@firstbox
+ \last@try\dimen@
+ \advance\dimen@-\p@
+ \fi
+ \fi
+ \iftoo@bad
+ \advance\dimen@\p@
+ \repeat
+ \ifforcedbreak@leftover
+ \too@badtrue
+ \else
+ \if@boxedmulticols\else
+ \ifdim\dimen@>\@colroom
+ \dimen@\@colroom
+ \fi
+ \fi
+ \process@cols\mult@rightbox
+ {\@tempcnta\count@
+ \advance\@tempcnta\@ne
+ \vfuzz\z@
+ \setbox\count@\vbox to\dimen@
+ {%
+ \vskip \z@
+ \@plus-\multicolundershoot
+ \@minus-\multicolovershoot
+ \unvbox\@tempcnta
+ \ifshr@nking\vfilmaxdepth\fi
+ }%
+ \ifnum\badness>\@M
+ \vfuzz\maxdimen % no overfull warning
+ \setbox\@tempboxa \vbox to\dimen@
+ {\vskip-\maxbalancingoverflow
+ \unvcopy\count@}%
+ \ifnum\badness>\@M
+ \mult@info\@ne
+ {Balanced column more than
+ \the\maxbalancingoverflow\space
+ too large}%
+ \too@badtrue
+ \else
+ \mult@info\@ne
+ {Balanced column
+ too large, but less than
+ \the\maxbalancingoverflow}%
+ \fi
+ \fi
+ }%
+ \fi
+}
+\newdimen\maxbalancingoverflow
+\maxbalancingoverflow=12pt
+
+\ifnum\numexpr \count20-\count14-1<41 % = 2 * 20 + 1
+ \count14=\@cclv
+\fi
+\newbox\mult@rightbox
+\newbox\mult@grightbox
+\newbox\mult@gfirstbox
+\newbox\mult@firstbox
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa
+\let\@tempa\relax
+\@ifundefined{emergencystretch}
+ {\newdimen\emergencystretch}{}
+\def\setemergencystretch#1#2{%
+ \emergencystretch 4pt
+ \multiply\emergencystretch#1}
+
+\def\set@floatcmds{%
+ \let\@dblfloat\@dbflt
+ \def\end@dblfloat{\@endfloatbox
+ \@largefloatcheck
+ \outer@nobreak
+ \ifnum\@floatpenalty<\z@
+ \@cons\@deferlist\@currbox
+ \fi
+ \ifnum\@floatpenalty=-\@Mii
+ \@Esphack
+ \fi}}
+\def\kept@topmark{{}{}}
+\let\kept@firstmark\@empty
+\let\kept@botmark\@empty
+\def\return@nonemptymark#1#2{%
+ \ifx#2\@empty
+ \else
+ \mult@info\tw@
+ {Returned #1 mark:\MessageBreak
+ \meaning#2}%
+ \toks@\expandafter{#2}%
+ \mark{\the\toks@}%
+ \nobreak
+ \fi}
+\def\get@keptmarks#1{%
+ \begingroup
+ \vbadness\@M
+ \setbox#1\copy#1%
+ \setbox#1\vsplit#1to\maxdimen
+ \set@keptmarks
+ \endgroup
+}
+\def\set@keptmarks{%
+ \ifx\kept@firstmark\@empty
+ \expandafter\gdef\expandafter
+ \kept@firstmark
+ \expandafter{\splitfirstmark}%
+ \ifx\kept@firstmark\@empty\else
+ \mult@info\tw@
+ {Set kept first mark:\MessageBreak
+ \meaning\kept@firstmark%
+ \@gobbletwo}%
+ \fi
+ \fi
+ \expandafter\def\expandafter\@tempa
+ \expandafter{\splitbotmark}%
+ \ifx\@tempa\@empty\else
+ \global\let\kept@botmark\@tempa
+ \mult@info\tw@
+ {Set kept bot mark:\MessageBreak
+ \meaning\kept@botmark%
+ \@gobbletwo}%
+ \fi}%
+\def\prep@keptmarks{%
+ \if@boxedmulticols \else
+ \get@keptmarks\partial@page
+ \fi}
+\skip0=0pt
+\edef\the@zero@skip{\the\skip0}
+\def\remove@discardable@items{%
+ \unpenalty
+ \edef\@tempa{\the\lastskip}%
+ \unskip
+ \ifx\@tempa\the@zero@skip
+ \edef\@tempb{\the\lastskip}%
+ \ifx\@tempb\the@zero@skip
+ \else
+ \unskip
+ \ifnum \lastpenalty=\@M
+ \vskip\@tempb\vskip\@tempa\relax
+ \else
+ \remove@discardable@items
+ \fi
+ \fi
+ \else
+ \remove@discardable@items
+ \fi
+}
+\newif\iftoo@bad
+\def\too@badtrue{\global\let\iftoo@bad\iftrue}
+\def\too@badfalse{\global\let\iftoo@bad\iffalse}
+\newif\ifforcedbreak@leftover
+\newcount\c@minrows
+\c@minrows=1
+\newcount\c@columnbadness
+\c@columnbadness=10000
+\newcount\c@finalcolumnbadness
+\c@finalcolumnbadness=9999
+
+\newdimen\last@try
+
+\newdimen\multicolovershoot
+\newdimen\multicolundershoot
+\multicolovershoot=0pt
+\multicolundershoot=2pt
+\newbox\mult@nat@firstbox
+\def\mult@info#1#2{%
+ \ifnum\c@tracingmulticols>#1%
+ \GenericWarning
+ {(multicol)\@spaces\@spaces}%
+ {Package multicol: #2}%
+ \fi
+}
+ \@namedef{multicols*}{%
+ \ifinner
+ \PackageWarning{multicol}%
+ {multicols* inside a box does
+ not make sense.\MessageBreak
+ Going to balance anyway}%
+ \else
+ \def\balance@columns@out
+ {\multi@column@out \penalty-\@Mvi }%
+ \fi
+ \begin{multicols}
+}
+\@namedef{endmulticols*}{%
+ \par
+ \ifdim\lastskip>\z@ \vskip-\lastskip \fi
+ \ifdim \prevdepth>\z@
+ \vskip-\ifdim\prevdepth>\boxmaxdepth
+ \boxmaxdepth
+ \else \prevdepth \fi
+ \fi
+ \ifshr@nking\else
+ \vfil
+ \fi
+ \end{multicols}}
+\mathchardef\@Mv=10005
+\def\columnbreak{%
+ \ifnum\col@number<\tw@
+ \PackageError{multicol}%
+ {\noexpand\columnbreak outside multicols}%
+ {This command can only be used within
+ a multicols or multicols* environment.}%
+ \else
+ \ifvmode
+ \penalty -\@Mv\relax
+ \else
+ \@bsphack
+ \vadjust{\penalty -\@Mv\relax}%
+ \@esphack
+ \fi
+ \fi}
+\newbox\colbreak@box
+\def\LR@column@boxes{%
+ \process@cols\mult@gfirstbox{%
+ \ifdim\dp\count@>\dimen\tw@
+ \global\dimen\tw@\dp\count@ \fi
+ \mc@col@status@write
+ \box\count@
+ \hss{\columnseprulecolor\vrule
+ \@width\columnseprule}\hss}%
+ \ifdim\dp\mult@rightbox>\dimen\tw@
+ \global\dimen\tw@\dp\mult@rightbox \fi
+ \mc@lastcol@status@write
+ \box\mult@rightbox
+}
+
+\def\RL@column@boxes{%
+ \process@cols\mult@gfirstbox{%
+ \hskip\hsize
+ \hss{\columnseprulecolor\vrule
+ \@width\columnseprule}\hss
+ }%
+ \hskip\hsize
+ \process@cols\mult@gfirstbox{%
+ \ifdim\dp\count@>\dimen\tw@
+ \global\dimen\tw@\dp\count@ \fi
+ \hskip-\hsize
+ \mc@col@status@write
+ \box\count@
+ \hskip-\hsize
+ \hskip-\columnsep
+ }%
+ \ifdim\dp\mult@rightbox>\dimen\tw@
+ \global\dimen\tw@\dp\mult@rightbox \fi
+ \hskip-\hsize
+ \mc@lastcol@status@write
+ \box\mult@rightbox
+ \hskip-\hsize
+ \hskip\full@width
+ }
+\newcommand\RLmulticolcolumns
+ {\let\mc@align@columns
+ \RL@column@boxes}
+\newcommand\LRmulticolcolumns
+ {\let\mc@align@columns
+ \LR@column@boxes}
+\LRmulticolcolumns
+\newcount\mc@col@check@num
+
+\newcommand\docolaction{%
+ \ifx\mc@col@status@write\relax
+ \PackageError{multicol}%
+ {Option 'colaction' not selected}%
+ {\string\docolaction\space
+ requires the use of the 'colaction'
+ option on the package}%
+ \fi
+ \global\advance\mc@col@check@num\@ne
+ \edef\mc@col@type{\expandafter\ifx
+ \csname mc@col-\the\mc@col@check@num
+ \endcsname\relax
+ 0\else
+ \csname mc@col-\the\mc@col@check@num
+ \endcsname
+ \fi}%
+ \@ifstar
+ {\@docolactionstartrue \@docolaction}%
+ {\@docolactionstarfalse\@docolaction}%
+}
+\newcommand\@docolaction[4][1]{%
+ \edef\@docolactioncheck{\write\@auxout
+ {\string\mc@set@col@status
+ {mc@col-\the\mc@col@check@num}%
+ {\mc@col@type}}}%
+ \if@docolactionstar \@docolactioncheck \fi
+ \ifcase \mc@col@type\relax
+ \ifcase #1\or #2\or#3\or#4\fi
+ \or
+ #2% % 1 First col
+ \or
+ #3% % 2 any middle col
+ \or
+ #4% % 3 last col
+ \else
+ \ERRORwrongdefaultgiven
+ \fi
+ \if@docolactionstar \else \@docolactioncheck \fi
+}
+\newif\if@docolactionstar
+\def\mc@col@status#1{%
+ \gdef\mc@curr@col@status{#1}}
+\def\mc@set@col@status#1#2{%
+ \global\expandafter\let\csname #1\endcsname
+ \mc@curr@col@status}
+\AtEndDocument{\def\mc@set@col@status#1#2{%
+ \ifnum #2=\mc@curr@col@status\else
+ \@tempswatrue
+ \fi}%
+}
+\newif\ifmc@firstcol
+\mc@firstcoltrue
+\endinput
+%%
+%% End of file `multicol.sty'.
diff --git a/macros/latex/required/tools/multicol.dtx b/macros/latex/required/tools/multicol.dtx
index 8d868357da..aa21d75f07 100644
--- a/macros/latex/required/tools/multicol.dtx
+++ b/macros/latex/required/tools/multicol.dtx
@@ -92,17 +92,19 @@
%<package>\providecommand\DeclareCurrentRelease[2]{}
%<package>
%<package>\DeclareRelease{}{2017-04-11}{multicol-2017-04-11.sty}
-%<package>\DeclareCurrentRelease{}{2018-04-01}
+%<package>\DeclareRelease{v1.8}{2019-10-01}{multicol-2019-10-01.sty}
+%<package>\DeclareCurrentRelease{}{2021-11-15}
%<package>
%<package>\ProvidesPackage{multicol}
%<driver> \ProvidesFile{multicol.drv}
% \fi
% \ProvidesFile{multicol.dtx}
- [2021/10/28 v1.9b multicolumn formatting (FMi)]
+ [2021/11/30 v1.9d multicolumn formatting (FMi)]
%
%
%%
%
+% \changes{v1.9c}{2021/11/30}{Added rollback to v1.8}
% \changes{v1.5n}{1997/06/05}{Applied improvement of documentation,
% kindly done by Robin Fairbairns.}
% \changes{v1.4h}{1992/06/04}{Added mark tracing with
@@ -844,7 +846,7 @@
% \changes{v1.5l}{1996/01/13}{Try hard to explain unresolved reference
% that happens if \cs{OnlyDescription} is used}
%
-% \StopEventually{\PrintIndex \PrintChanges
+% \MaybeStop{\PrintIndex \PrintChanges
% \ifx\Finale\relax
% \typeout{**********************************}
% \typeout{* Info: Typesetting this document with
@@ -4149,7 +4151,11 @@
a multicols or multicols* environment.}%
\else
\ifvmode
- \nobreak\vfill\penalty -\@Mv\relax
+% \end{macrocode}
+% We need to guard the \cs{vfill} from disappearing.
+% \changes{v1.9d}{2021/12/05}{Guard the \cs{vfill} (sx/624940)}
+% \begin{macrocode}
+ \nobreak\vfill\kern\z@\penalty -\@Mv\relax
\else
\@bsphack
\vadjust{\nobreak\vfill\kern\z@\penalty -\@Mv\relax}%
diff --git a/macros/latex/required/tools/multicol.ins b/macros/latex/required/tools/multicol.ins
index c8838f8be2..9bbf2780ad 100644
--- a/macros/latex/required/tools/multicol.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/required/tools/multicol.pdf b/macros/latex/required/tools/multicol.pdf
index 28fca20e96..206491447a 100644
--- a/macros/latex/required/tools/multicol.pdf
+++ b/macros/latex/required/tools/multicol.pdf
Binary files differ
diff --git a/macros/latex/required/tools/rawfonts.dtx b/macros/latex/required/tools/rawfonts.dtx
index f54aeaf44d..cbd1ba89ea 100644
--- a/macros/latex/required/tools/rawfonts.dtx
+++ b/macros/latex/required/tools/rawfonts.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -63,7 +63,7 @@
% \end{verbatim}
% to your |latex209.cfg| \LaTeX~2.09 compatibility configuration file.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section*{Implementation}
%
diff --git a/macros/latex/required/tools/rawfonts.pdf b/macros/latex/required/tools/rawfonts.pdf
index 7f9906149f..0e773a6289 100644
--- a/macros/latex/required/tools/rawfonts.pdf
+++ b/macros/latex/required/tools/rawfonts.pdf
Binary files differ
diff --git a/macros/latex/required/tools/shellesc.dtx b/macros/latex/required/tools/shellesc.dtx
index 54027cada7..4f60ff8d03 100644
--- a/macros/latex/required/tools/shellesc.dtx
+++ b/macros/latex/required/tools/shellesc.dtx
@@ -1,6 +1,6 @@
% \iffalse
%% Source File: shellesc.dtx
-%% Copyright (C) 2015-2021
+%% Copyright (C) 2015-2022
%%
%% The LaTeX Project and any individual authors listed elsewhere
%% in this file.
diff --git a/macros/latex/required/tools/shellesc.pdf b/macros/latex/required/tools/shellesc.pdf
index c67ea825d4..2eca7d5446 100644
--- a/macros/latex/required/tools/shellesc.pdf
+++ b/macros/latex/required/tools/shellesc.pdf
Binary files differ
diff --git a/macros/latex/required/tools/showkeys-2014-10-28.sty b/macros/latex/required/tools/showkeys-2014-10-28.sty
new file mode 100644
index 0000000000..b4d7b19028
--- /dev/null
+++ b/macros/latex/required/tools/showkeys-2014-10-28.sty
@@ -0,0 +1,272 @@
+%%
+%% This is file `showkeys.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% showkeys.dtx (with options: `package')
+%%
+%% 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-2021
+%% 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'.
+%%
+%% File: showkeys.dtx Copyright (C) 1992-1997 David Carlisle
+%% File: showkeys.dtx Copyright (C) 2006-2019 David Carlisle, LaTeX Project
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{showkeys}
+ [2014/10/28 v3.17 Show cite and label keys (DPC, MH)]
+\DeclareOption{notref}{\let\SK@ref\@empty}
+\DeclareOption{notcite}{\let\SK@cite\@empty}
+\let\SK@refcolor\relax
+\let\SK@labelcolor\relax
+\DeclareOption{color}{\AtEndOfPackage{%
+ \RequirePackage{color}%
+ \definecolor{refkey}{gray}{.75}%
+ \definecolor{labelkey}{gray}{.75}%
+ \def\SK@refcolor{\color{refkey}}%
+ \def\SK@labelcolor{\color{labelkey}}}}
+\DeclareOption{final}{%
+ \providecommand*\showkeyslabelformat[1]{}%
+ \endinput}
+\DeclareOption{draft}{}
+\ProcessOptions
+\let\SK@label\label
+\let\SK@bibitem\@bibitem
+\let\SK@lbibitem\@lbibitem
+\def\label#1{%
+ \@bsphack
+ \SK@\SK@@label{#1}%
+ \begingroup
+ \SK@label{#1}%
+ \endgroup
+ \@esphack}
+\def\@bibitem#1{%
+ \SK@bibitem{#1}\SK@\SK@@label{#1}\ignorespaces}
+\def\@lbibitem[#1]#2{%
+ \SK@lbibitem[{#1}]{#2}\SK@\SK@@label{#2}\ignorespaces}
+\def\SK@#1#2{%
+ \protected@edef\@tempa{#2}%
+ \expandafter#1\meaning\@tempa\SK@}
+\providecommand*\showkeyslabelformat[1]{%
+ \fbox{\normalfont\small\ttfamily#1}}
+\def\SK@@label#1>#2\SK@{%
+ \gdef\SK@lab{\smash{\SK@labelcolor\showkeyslabelformat{#2}}}%
+ \ifvmode
+ \if@inlabel
+ \global\setbox\@labels\hbox{%
+ \llap{\SK@lab\SK@lab@relax
+ \kern\@totalleftmargin\kern\marginparsep}%
+ \box\@labels}%
+ \else
+ \dimen@\prevdepth
+ \nointerlineskip
+ \ifinner
+ \skip@\lastskip\unskip
+ \advance\skip@\lastskip\unskip
+ \setbox\z@\lastbox
+ \ifvoid\z@
+ \llap{\SK@lab\SK@lab@relax\kern\marginparsep}%
+ \else
+ \hbox{\box\z@\rlap{\kern\marginparsep\SK@labx}}%
+ \fi
+ \vskip\skip@
+ \else
+ \llap{\SK@lab\SK@lab@relax\kern\marginparsep}%
+ \fi
+ \prevdepth\dimen@
+ \fi
+ \else
+ \csname SK@\@currenvir\endcsname
+ \ifSK@equation\else
+ \ifmmode
+ \SK@labx
+ \else
+ \ifinner
+ \rlap\SK@lab
+ \else
+ \vadjust{\llap{\SK@lab\kern\marginparsep}}%
+ \fi
+ \SK@lab@relax
+ \fi
+ \fi
+ \fi}
+\AtBeginDocument{%
+ \let\SK@eqnnum\@eqnnum
+ \@ifpackageloaded{amsmath}{%
+ \let\SK@tagform@\tagform@
+ \let\SK@maketag@@@\maketag@@@
+ \iftagsleft@
+ \def\tagform@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+ \llap{\SK@lab\kern\marginparsep}%
+ \SK@lab@relax\SK@tagform@{#1}}%
+ \def\maketag@@@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+ \llap{\SK@lab\kern\marginparsep}\SK@lab@relax
+ \SK@maketag@@@{#1}%
+ }%
+ \def\@eqnnum{%
+ \llap{\SK@lab\kern\displaywidth\kern\marginparsep}%
+ \SK@lab@relax\SK@eqnnum}%
+ \else
+ \def\tagform@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+ \SK@tagform@{#1}%
+ \rlap{\kern\marginparsep\SK@lab}\SK@lab@relax}%
+ \def\maketag@@@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+ \SK@maketag@@@{#1}%
+ \rlap{\kern\marginparsep\SK@lab}\SK@lab@relax
+ }%
+ \def\@eqnnum{\SK@eqnnum\rlap{\kern\marginparsep\SK@lab}%
+ \SK@lab@relax}%
+ \fi
+ }%
+ {%
+ \@ifundefined{ver@leqno.clo}{%
+ \def\@eqnnum{\SK@eqnnum\rlap{\kern\marginparsep\SK@lab}%
+ \SK@lab@relax}%
+ }{%
+ \def\@eqnnum{%
+ \llap{\SK@lab\kern\displaywidth\kern\marginparsep}%
+ \SK@lab@relax\SK@eqnnum}%
+ }%
+ }%
+}
+\def\SK@labx{\rlap\SK@lab\global\let\SK@lab\relax}
+\def\SK@lab@relax{\global\let\SK@lab\relax}\SK@lab@relax
+\newif\ifSK@equation
+\let\SK@equation\SK@equationtrue
+\let\SK@eqnarray\SK@equationtrue
+\toks@\expandafter{\eqnarray}
+\edef\eqnarray{\let\noexpand\tagform@\noexpand\SK@tagform@\the\toks@}
+\let\SK@align\SK@equationtrue
+\let\SK@alignat\SK@equationtrue
+\let\SK@xalignat\SK@equationtrue
+\let\SK@xxalignat\SK@equationtrue
+\let\SK@gather\SK@equationtrue
+\let\SK@multline\SK@equationtrue
+\let\SK@flalign\SK@equationtrue
+\expandafter\let\csname SK@align*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@alignat*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@flalign*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@gather*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@multline*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@equation*\endcsname\SK@equationtrue
+\def\SK@def#1{%
+ \edef\@tempa{\expandafter\@gobble\string#1}%
+ \@ifundefined{\@tempa\space}%
+ {\expandafter\let\csname SK@\@tempa\endcsname#1}%
+ {\expandafter\let\csname SK@\@tempa\expandafter\endcsname
+ \csname\@tempa\space\endcsname}%
+ \expandafter\def\expandafter#1\expandafter{%
+ \expandafter\protect\csname\@tempa\space\endcsname}%
+ \expandafter\def\csname\@tempa\space\endcsname}
+\ifx\SK@ref\@empty
+\AtBeginDocument{%
+ \@ifpackageloaded{varioref}{%
+ \SK@def\@@vpageref#1[#2]#3{{%
+ \let\label\SK@label
+ \SK@@@vpageref{#1}[{#2}]{#3}}}%
+ \def\vr@f#1{%
+ \leavevmode\unskip\vref@space
+ \ref{#1}%
+ {\let\label\SK@label
+ \vpageref[\unskip]{#1}}}%
+ }{}}
+\else
+\AtBeginDocument{%
+ \SK@def\ref#1{\SK@\SK@@ref{#1}\SK@ref{#1}}%
+ \SK@def\pageref#1{\SK@\SK@@ref{#1}\SK@pageref{#1}}%
+ \@ifpackageloaded{varioref}{%
+ \SK@def\@@vpageref#1[#2]#3{{%
+ \let\label\SK@label\let\ref\SK@ref\let\pageref\SK@pageref
+ \leavevmode\unskip\SK@\SK@@ref{#3}\SK@@@vpageref{#1}[{#2}]{#3}}}%
+ \def\vr@f#1{%
+ \leavevmode\unskip\vref@space
+ \ref{#1}%
+ \let\label\SK@label\let\ref\SK@ref\let\pageref\SK@pageref
+ \vpageref[\unskip]{#1}}%
+ }{}}
+\fi
+\ifx\SK@cite\@empty
+\AtBeginDocument{%
+ \ifx\HAR@checkdef\@undefined\else
+ \expandafter\let\expandafter
+ \SK@HAR@bi\csname\string\harvarditem\endcsname
+ \expandafter\def\csname\string\harvarditem\endcsname[#1]#2#3#4{%
+ \SK@HAR@bi[{#1}]{#2}{#3}{#4}\SK@\SK@@label{#4}}%
+ \fi}
+\else
+\AtBeginDocument{%
+ \ifx\HAR@checkdef\@undefined
+ \ifx\citen\@undefined
+ \SK@def\@citex[#1]#2{\SK@citex[{#1}]{#2}}%
+ \else
+ \SK@def\citen#1{\SK@\SK@@ref{#1}\SK@citen{#1}}%
+ \fi
+ \SK@def\citeauthor#1{\SK@\SK@@ref{#1}\SK@citeauthor{#1}}%
+ \SK@def\citefullauthor#1{\SK@\SK@@ref{#1}\SK@citefullauthor{#1}}%
+ \SK@def\citeyear#1{\SK@\SK@@ref{#1}\SK@citeyear{#1}}%
+ \else
+ \SK@def\HAR@checkdef#1#2{%
+ \expandafter\SK@\expandafter\SK@@ref\expandafter{#1}%
+ \SK@HAR@checkdef{#1}{#2}}%
+ \expandafter\let\expandafter
+ \SK@HAR@bi\csname\string\harvarditem\endcsname
+ \expandafter\def\csname\string\harvarditem\endcsname[#1]#2#3#4{%
+ \SK@HAR@bi[{#1}]{#2}{#3}{#4}\SK@\SK@@label{#4}}%
+ \fi}
+\def\SK@citex[#1]#2{%
+ \SK@\SK@@ref{#2}\SK@@citex[{#1}]{#2}}
+\fi
+\def\SK@@ref#1>#2\SK@{%
+ \leavevmode\vbox to\z@{{%
+ \vss
+ \SK@refcolor
+ \rlap{\vrule\raise .75em%
+ \hbox{\underbar{\normalfont\footnotesize\ttfamily#2}}}}}}
+\endinput
+%%
+%% End of file `showkeys.sty'.
diff --git a/macros/latex/required/tools/showkeys.dtx b/macros/latex/required/tools/showkeys.dtx
index 3c9236f2ef..3aed90d304 100644
--- a/macros/latex/required/tools/showkeys.dtx
+++ b/macros/latex/required/tools/showkeys.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -28,11 +28,18 @@
\ProvidesFile{showkeys.dtx}
%</dtx>
%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>
+%<package>\providecommand\DeclareRelease[3]{}
+%<package>\providecommand\DeclareCurrentRelease[2]{}
+%<package>
+%<package>\DeclareRelease{}{2014-10-28}{showkeys-2014-10-28.sty}
+%<package>\DeclareCurrentRelease{}{2022-06-01}
+%<package>
%<package>\ProvidesPackage{showkeys}
%<driver> \ProvidesFile{showkeys.drv}
% \fi
% \ProvidesFile{showkeys.dtx}
- [2014/10/28 v3.17 Show cite and label keys (DPC, MH)]
+ [2022/04/12 v3.18 Show cite and label keys (DPC, MH)]
%
% \iffalse
%<*driver>
@@ -70,7 +77,8 @@
% {Support harvard, varioref and natbib packages,}
% \changes{v3.02}{1995/03/17}
% {Support new AMS files}
-%
+% \changes{v3.18}{2022/04/12}
+% {Support starred references}
% \section{Introduction}\label{sec:intro}
%
% |showkeys.sty| modifies the |\label|, |\ref|, |\pageref|, |\cite|, and
@@ -248,7 +256,7 @@
%
% \end{thebibliography}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Macros}
%
@@ -749,18 +757,10 @@
% \changes{v3.13}{2006/01/09}{Updated varioref support, for latex/3373}
% \changes{v3.15}{2006/06/19}
% {Prevent loss of brackets}
+% \changes{v3.18}{2022/04/12}
+% {update varioref support: it no longer uses label, so no patch
+% needed if notref is used.}
% \begin{macrocode}
-\AtBeginDocument{%
- \@ifpackageloaded{varioref}{%
- \SK@def\@@vpageref#1[#2]#3{{%
- \let\label\SK@label
- \SK@@@vpageref{#1}[{#2}]{#3}}}%
- \def\vr@f#1{%
- \leavevmode\unskip\vref@space
- \ref{#1}%
- {\let\label\SK@label
- \vpageref[\unskip]{#1}}}%
- }{}}
\else
% \end{macrocode}
%
@@ -775,22 +775,26 @@
% {Make redefinition conditional on notref option}
% \changes{v3.15}{2006/06/19}
% {Prevent loss of brackets}
+% \changes{v3.18}{2022/04/12}
+% {support new kernel commands with starred versions}
+% \changes{v3.18}{2022/04/12}
+% {update varioref support: it no longer uses label}
% \begin{macrocode}
\AtBeginDocument{%
- \SK@def\ref#1{\SK@\SK@@ref{#1}\SK@ref{#1}}%
- \SK@def\pageref#1{\SK@\SK@@ref{#1}\SK@pageref{#1}}%
+ \let\@kernel@ref@\@kernel@ref
+ \let\@kernel@sref@\@kernel@sref
+ \SK@def\@kernel@ref#1{\SK@\SK@@ref{#1}\SK@@kernel@ref{#1}}%
+ \SK@def\@kernel@sref#1{\SK@\SK@@ref{#1}\SK@@kernel@sref{#1}}%
+ \SK@def\@kernel@pageref#1{\SK@\SK@@ref{#1}\SK@@kernel@pageref{#1}}%
+ \SK@def\@kernel@spageref#1{\SK@\SK@@ref{#1}\SK@@kernel@spageref{#1}}%
+ \SK@def\@kernel@Ref#1{{\let\@kernel@ref\@kernel@ref@\SK@\SK@@ref{#1}\SK@@kernel@Ref{#1}}}%
+ \SK@def\@kernel@sRef#1{\let\@kernel@sref\@kernel@sref@\SK@\SK@@ref{#1}\SK@@kernel@sRef{#1}}%
% \end{macrocode}
% varioref support.
% \begin{macrocode}
\@ifpackageloaded{varioref}{%
\SK@def\@@vpageref#1[#2]#3{{%
- \let\label\SK@label\let\ref\SK@ref\let\pageref\SK@pageref
- \leavevmode\unskip\SK@\SK@@ref{#3}\SK@@@vpageref{#1}[{#2}]{#3}}}%
- \def\vr@f#1{%
- \leavevmode\unskip\vref@space
- \ref{#1}%
- \let\label\SK@label\let\ref\SK@ref\let\pageref\SK@pageref
- \vpageref[\unskip]{#1}}%
+ \leavevmode\unskip\SK@\SK@@ref{#3}\SK@@@vpageref{#1}[{#2}]{#3}}}%%
}{}}
% \end{macrocode}
%
diff --git a/macros/latex/required/tools/showkeys.pdf b/macros/latex/required/tools/showkeys.pdf
index 96b4c88ab0..49429fdeb6 100644
--- a/macros/latex/required/tools/showkeys.pdf
+++ b/macros/latex/required/tools/showkeys.pdf
Binary files differ
diff --git a/macros/latex/required/tools/somedefs.dtx b/macros/latex/required/tools/somedefs.dtx
index 825a93ec66..24916b4286 100644
--- a/macros/latex/required/tools/somedefs.dtx
+++ b/macros/latex/required/tools/somedefs.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -87,7 +87,7 @@
% For a longer example of the use of the |somedefs| package, look at the
% |rawfonts| package.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section*{Implementation}
%
diff --git a/macros/latex/required/tools/somedefs.pdf b/macros/latex/required/tools/somedefs.pdf
index 7599f073cd..0a7116d3fd 100644
--- a/macros/latex/required/tools/somedefs.pdf
+++ b/macros/latex/required/tools/somedefs.pdf
Binary files differ
diff --git a/macros/latex/required/tools/tabularx.dtx b/macros/latex/required/tools/tabularx.dtx
index a0f75fc4fa..0d1cbeac34 100644
--- a/macros/latex/required/tools/tabularx.dtx
+++ b/macros/latex/required/tools/tabularx.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -261,7 +261,7 @@
% This behaviour of the package can be customised slightly
% as noted in the documentation of the code section.
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Macros}
%
diff --git a/macros/latex/required/tools/tabularx.ins b/macros/latex/required/tools/tabularx.ins
index a0d39c2564..0c6d26e940 100644
--- a/macros/latex/required/tools/tabularx.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/required/tools/tabularx.pdf b/macros/latex/required/tools/tabularx.pdf
index f07adf175a..84eb73e06f 100644
--- a/macros/latex/required/tools/tabularx.pdf
+++ b/macros/latex/required/tools/tabularx.pdf
Binary files differ
diff --git a/macros/latex/required/tools/theorem.dtx b/macros/latex/required/tools/theorem.dtx
index 8543ff9d7c..2dc0412efb 100644
--- a/macros/latex/required/tools/theorem.dtx
+++ b/macros/latex/required/tools/theorem.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -332,7 +332,7 @@
% (looking everything over) and many others providing useful
% suggestions.
%
-% \StopEventually{%
+% \MaybeStop{%
% \begin{thebibliography}{9}
% \bibitem{bk:GMS94} \textsc{M.~Goossens}, \textsc{F.~Mittelbach}
% and \textsc{A.~Samarin}.
diff --git a/macros/latex/required/tools/theorem.pdf b/macros/latex/required/tools/theorem.pdf
index 767812d4af..3c78214b6d 100644
--- a/macros/latex/required/tools/theorem.pdf
+++ b/macros/latex/required/tools/theorem.pdf
Binary files differ
diff --git a/macros/latex/required/tools/tools-overview.pdf b/macros/latex/required/tools/tools-overview.pdf
index b52db51d7d..a8c55fbe0a 100644
--- a/macros/latex/required/tools/tools-overview.pdf
+++ b/macros/latex/required/tools/tools-overview.pdf
Binary files differ
diff --git a/macros/latex/required/tools/tools-overview.tex b/macros/latex/required/tools/tools-overview.tex
index a2dae49e8f..882a2ae77f 100644
--- a/macros/latex/required/tools/tools-overview.tex
+++ b/macros/latex/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-2021
+% Copyright (C) 2006-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
diff --git a/macros/latex/required/tools/tools.ins b/macros/latex/required/tools/tools.ins
index 15c64ac80a..b93f649153 100644
--- a/macros/latex/required/tools/tools.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/required/tools/trace.dtx b/macros/latex/required/tools/trace.dtx
index d10243f690..93906eb76b 100644
--- a/macros/latex/required/tools/trace.dtx
+++ b/macros/latex/required/tools/trace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -278,7 +278,7 @@
% \small \texttt{\$} \stop
%\end{verbatim}
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{Implementation}
%
diff --git a/macros/latex/required/tools/trace.pdf b/macros/latex/required/tools/trace.pdf
index 8e407516eb..03c5e05f66 100644
--- a/macros/latex/required/tools/trace.pdf
+++ b/macros/latex/required/tools/trace.pdf
Binary files differ
diff --git a/macros/latex/required/tools/varioref.dtx b/macros/latex/required/tools/varioref.dtx
index faf8b0383c..579c411868 100644
--- a/macros/latex/required/tools/varioref.dtx
+++ b/macros/latex/required/tools/varioref.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -40,7 +40,7 @@
%<package>\DeclareCurrentRelease{}{2019-10-01}
%<package>
%<package>\ProvidesPackage{varioref}
-%<package> [2021/07/07 v1.6f package for extended references (FMi)]
+%<package> [2022/01/09 v1.6f package for extended references (FMi)]
% \fi
%
%%
@@ -149,7 +149,7 @@
% |\pageref| when the difference is larger. The word `facing' is used
% when label and reference both fall onto a double spread. However,
% if a special page numbering scheme is used instead of the usual
-% arabic numbering (e.g., |\pagenumbering{roman}|) then there will be
+% Arabic numbering (e.g., |\pagenumbering{roman}|) then there will be
% no distinction between one or many pages off.
%
%\DescribeMacro\vpageref Sometimes one wants to refer only to page
@@ -172,7 +172,7 @@
% A space in front of |\vpageref| it will be ignored if
% the command doesn't produce any text at all.
%
-% But in fact |\vpageref| allows even more control. If has two
+% But in fact |\vpageref| allows even more control. It has two
% optional arguments. With the first one, one can specify the text
% that should be used if label and reference fall on the same page.
% This is very helpful if both are near to each other, so that they
@@ -293,7 +293,7 @@
% Another command for conditional processing is |\vpagerefnearby|. It
% takes three arguments: a label and a \meta{true} and \meta{false}
% argument. It compares the page reference to the label with the
-% current page number and if both are arabic number and only differ by
+% current page number and if both are Arabic number and only differ by
% $\pm1$ the \meta{true} argument is executed otherwise the
% \meta{false} argument. In other words it tells you if a |\vpageref|
% to the label would result in a textual reference to the previous,
@@ -330,19 +330,19 @@
% space in front. Of course you are then responsible to always add it
% when necessary, but that does make the source more readable so it is
% a good thing. This also has the advantage that the star forms are
-% now unnecessary again and can be used in the way implemeented by
+% now unnecessary again and can be used in the way implemented by
% \pkg{hyperref} if both packages are used together.
%
% In fact it would be much nicer to make that the
% default but the package has been used by many people for so many
-% years that changing the default would break way to many older documents.
+% years that changing the default would break way too many older documents.
%
%
% \DescribeMacro\labelformat
% A reference via |\ref| produces by default the data associated with
% the corresponding |\label| command (typically a number); any
% additional formatting has to be provided by the user. With
-% |\labelformat| it is possible to declare scuch formatting for each
+% |\labelformat| it is possible to declare such formatting for each
% ``reference'' counter, e.g.,
%\begin{verbatim}
% \labelformat{section}{section~#1}
@@ -454,7 +454,7 @@
%\DescribeMacro\reftextvario To allow a bit random variation in the
% generated strings one can use the command |\reftextvario| inside the
% string macros. It takes two arguments and selects one or the other
-% for printing depending on the number of already seens |\vref| or
+% for printing depending on the number of already seen |\vref| or
% |\vpageref| commands. As an example see the definitions of
% |\reftextbefore| etc.\ \vpageref[below]{reftextbefore}.
%
@@ -485,7 +485,7 @@
% \DescribeMacro\fullrefformat
% In some languages (currently only for Japanese) the generated text
% has to typeset in different word order to most other (Western) languages.
-% To accomodate for this \cs{vrefformat}, etc.\ has been
+% To accommodate for this \cs{vrefformat}, etc.\ has been
% added to allow to alter this on a per language basis.
% There should be normally no need to alter the setup. For details see
% the code section.
@@ -572,7 +572,7 @@
% know for sure that label and reference can't fall onto nearby pages.
%
%
-% \StopEventually{\PrintIndex\PrintChanges}
+% \MaybeStop{\PrintIndex\PrintChanges}
%
%
% \section{The documentation driver file}
@@ -701,7 +701,7 @@
% \label{reftextbefore} The options do set the macros that
% generate the textual strings. Note, that they do not start with a
% space, the space is already added in the main macro below.
-% \changes{v1.2a}{1998/08/22}{Added american defaults for
+% \changes{v1.2a}{1998/08/22}{Added American defaults for
% \cs{reftextpagerange} and \cs{reftextlabelrange}}
% \changes{v1.4d}{2002/11/11}{Changed default for \cs{reftextbefore}}
%
@@ -1335,7 +1335,7 @@
% \end{macrocode}
% Defaults for Japanese. It needs a special \cs{vrefformat},
% \cs{Vrefformat}, \cs{fullrefformat} and \cs{vrefrangeformat}
-% for gramatical reasons. As our standard documentation
+% for grammatical reasons. As our standard documentation
% workflow uses pdf\TeX{} the Japanese letters can't be displayed
% easily, so you will see missing glyphs below. To see the real
% letters you have to look at the source or package file.
@@ -1354,7 +1354,7 @@
\def\reftextpagerange#1#2{\pageref{#1}から\pageref{#2}ページ}%
\def\reftextlabelrange#1#2{\ref{#1}から\ref{#2}}%
% \end{macrocode}
-% Note that the parentheses beow are not normal ones but full width
+% Note that the parentheses below are not normal ones but full width
% ones U+FF08 and U+FF09!
% \begin{macrocode}
\def\vrefformat#1#2{\ref{#2}(\vpageref[#1]{#2})}%
@@ -1376,7 +1376,7 @@
%
% The option assumes that there is a command |\aza| defined which
% helps resolving this problem.\footnote{This information is actually quite
-% old but unfortunately never made it into varioref. In case any work
+% old but unfortunately never made it into \pkg{varioref}. In case any work
% has been undertaken to resolve this please inform the author about it.}
% \changes{v1.2a}{1998/08/22}{Added defaults for magyar}
% \changes{v1.4j}{2005/01/22}{Defined \cs{reftextfaceafter} and
@@ -1505,7 +1505,7 @@
\let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
-% The portuguese default text has been provided by
+% The Portuges default text has been provided by
% Jos\'e Carlos Oliveira Santos \verb=jcsantos@fc.up.pt=.
% \changes{v1.2b}{1999/11/25}{Added portuguese defaults}
% \changes{v1.2c}{1999/12/02}{Added more portuguese defaults}
@@ -1552,7 +1552,7 @@
\let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
-% The text for russian was taken from the book in Russian by
+% The text for Russian was taken from the book in Russian by
% I.~A.~Kotelnikov and P.~Z.~Chebotaev, and adapted
% to the encoding-independent form by Vladimir Volovich
% (\verb=vvv@vsu.ru=).
@@ -1589,7 +1589,7 @@
\let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
-% The text for slovak defaults was contributed by Miroslav Sedivy\\
+% The text for Slovak defaults was contributed by Miroslav Sedivy\\
% (\verb=<miro@slovensko.com>=).
% \changes{v1.4b}{2002/03/11}{Contributed defaults added}
% \begin{macrocode}
@@ -1613,7 +1613,7 @@
\let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
-% The text for slovene defaults was contributed by Roman Maurer\\
+% The text for Slovene defaults was contributed by Roman Maurer\\
% (\verb=<roman.maurer@amis.net>=).
% \changes{v1.4a}{2002/03/05}{Contributed defaults added}
% \begin{macrocode}
@@ -1633,7 +1633,7 @@
\let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
-% Text for spanish defaults was contributed by Julio Sanchez
+% Text for Spanish defaults was contributed by Julio Sanchez
% (\verb=jsanchez@gmv.es=) and Fernando Dobladez (\verb=<ferd@fuego.com>=).
% \changes{v1.0f}{1994/03/16}{Inserted missing hash mark}
% \changes{v1.0k}{1994/06/05}{Corrected misspelled cmd `extrasspanish}
@@ -1657,7 +1657,7 @@
\let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
-% The text for swedish was contributed by Mats Dahlgren
+% The text for Swedish was contributed by Mats Dahlgren
% (\verb=matsd@sssk.se=).
% \changes{v1.0p}{1995/01/10}{Added swedish strings}
% \changes{v1.2a}{1998/08/22}{Added swedish defaults for
@@ -1729,7 +1729,7 @@
}}
% \end{macrocode}
% We support francais as an alternative to french since people
-% might be used to it, but we discurrage it.
+% might be used to it, but we discourage it.
% \begin{macrocode}
\DeclareOption{francais}{%
\typeout{Please use `french' instead of `francais'}%
@@ -1757,7 +1757,7 @@
%
%
% Whether or not \pkg{varioref} uses its own white space and
-% removes the one in the source document is handeled by the
+% removes the one in the source document is handled by the
% following two options. For historical reasons the default is to
% handle the space, but the recommendation these days is to use
% \texttt{nospace}.
@@ -1814,7 +1814,7 @@
% space either. Thus in this case the star form doesn't
% have any effect and below |\vp@gerefstar| is let to
% |\vp@geref|. This allows a package like \pkg{hyperef} to redefine
-% it and useit for its own tasks (like denoting that no link should
+% it and use it for its own tasks (like denoting that no link should
% be produced).
% \begin{macrocode}
\DeclareRobustCommand\vpageref{\@ifstar
@@ -1859,7 +1859,7 @@
% By default the second optional argument is empty.
% \changes{v1.0h}{1994/06/11}{Pass first argument in both cases}
% \changes{v1.0i}{1994/06/20}{Do it correctly}
-% \changes{v1.6a}{2019/08/25}{Default for optional argumet changed}
+% \changes{v1.6a}{2019/08/25}{Default for optional argument changed}
% \begin{macrocode}
{\@@vpageref{#1}}{\@@vpageref{#1}[]}}
% \end{macrocode}
@@ -2169,7 +2169,7 @@
% \pkg{varioref} by testing
%\begin{verbatim}
% \ifdefined\vp@gerefstar
-% ... code fore noew varioref
+% ... code for new varioref
% \else
% ... code for old varioref
% \fi
@@ -2638,7 +2638,7 @@
% \begin{macro}{\vpagerefcomparenearby}
% \changes{v1.6a}{2019/08/25}{Macro added}
-% True if the two pages have arabic page numbers are at most off by
+% True if the two pages have Arabic page numbers are at most off by
% one so that |\vpageref| would produce a special string.
%
% This is in some sense a general version of |\vpagerefnearby| for
diff --git a/macros/latex/required/tools/varioref.ins b/macros/latex/required/tools/varioref.ins
index 559f1f2854..cef11f9c2f 100644
--- a/macros/latex/required/tools/varioref.ins
+++ b/macros/latex/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-2021
+%% Copyright (C) 1993-2022
%% 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-2021
+Copyright (C) 1993-2022
The LaTeX Project and any individual authors listed elsewhere
in this file.
diff --git a/macros/latex/required/tools/varioref.pdf b/macros/latex/required/tools/varioref.pdf
index e1a3f52c5f..32259ea3a4 100644
--- a/macros/latex/required/tools/varioref.pdf
+++ b/macros/latex/required/tools/varioref.pdf
Binary files differ
diff --git a/macros/latex/required/tools/verbatim.dtx b/macros/latex/required/tools/verbatim.dtx
index fcbaf28172..c7cb2f02a9 100644
--- a/macros/latex/required/tools/verbatim.dtx
+++ b/macros/latex/required/tools/verbatim.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -242,7 +242,7 @@
% This command has also a |*|-variant that prints spaces as \verb*+ +.
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
%
% \section{Interfaces for package writers}
diff --git a/macros/latex/required/tools/verbatim.pdf b/macros/latex/required/tools/verbatim.pdf
index 6c1dd55c35..357918e255 100644
--- a/macros/latex/required/tools/verbatim.pdf
+++ b/macros/latex/required/tools/verbatim.pdf
Binary files differ
diff --git a/macros/latex/required/tools/xr.dtx b/macros/latex/required/tools/xr.dtx
index c0d0b90c0f..33e096c6cd 100644
--- a/macros/latex/required/tools/xr.dtx
+++ b/macros/latex/required/tools/xr.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -89,7 +89,7 @@
% For compatibility with |xcite|, |\externalcitedocument| is made available
% as an alias for |\externaldocument|
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The macros}
%
diff --git a/macros/latex/required/tools/xr.pdf b/macros/latex/required/tools/xr.pdf
index b48bceadb4..f918a9664d 100644
--- a/macros/latex/required/tools/xr.pdf
+++ b/macros/latex/required/tools/xr.pdf
Binary files differ
diff --git a/macros/latex/required/tools/xspace.dtx b/macros/latex/required/tools/xspace.dtx
index adcfe154da..7b29b7b0be 100644
--- a/macros/latex/required/tools/xspace.dtx
+++ b/macros/latex/required/tools/xspace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 1993-2021
+% Copyright (C) 1993-2022
%
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
@@ -199,7 +199,7 @@
% \end{verbatim}
%
%
-% \StopEventually{}
+% \MaybeStop{}
%
% \section{The Macros}
%
diff --git a/macros/latex/required/tools/xspace.pdf b/macros/latex/required/tools/xspace.pdf
index e562c76f96..acf4f25ef1 100644
--- a/macros/latex/required/tools/xspace.pdf
+++ b/macros/latex/required/tools/xspace.pdf
Binary files differ